signal · slot 01 on the gledach shelf

Competitive intelligence
your agents can query.
On your own machine.

Ten watchers and one inbox read what a market publishes. Everything they find is typed, scored, attributed and handed to a machine as structured data rather than a page to read.

MIT licensed · no account to start · 3 runtime dependencies · offline on a fresh clone

mcp · signal coverage: fresh
> search_signals { company: "cursor", since: "7d", minImpact: 70 }

{
  "signals": [
    {
      "hashId":      "8f2a1c…",
      "signalType":  "pricing_change",
      "impactScore":        84,
      "source":      "email-google-alert",
      "publishedAt": "2026-10-11T06:14:00Z"
    }
  ],
  "coverage": {
    "status":            "fresh",
    "lastCollectedAt":   "2026-10-16T05:30:11Z",
    "trustEmptyResult":  true,
    "warnings":          []
  }
}
Every signal-reporting tool returns that coverage block. It is how an agent tells a quiet market apart from a watcher that stopped running.

The collection

Eleven ways in, and three of them speak before anyone announces anything.

Each tile says what the watcher actually reads and how often it runs, not what it promises. The three marked leading hear a move while it is still infrastructure, before anyone has written a sentence about it.

01

Feedsnpm run fetch

Around sixty RSS feeds across the roster and the whole category: Google News, Reddit, vendor blogs, GitHub releases. The list derives from the roster, so retargeting rewrites it rather than leaving it behind.

every 30 min

02

Google Alertsnpm run watch:gmail

Alerts arrive in a mailbox, a parser reads them, and the result fills a local inbox database. Two zones, and the second is easy to forget: nothing reaches the dashboard until email:promote runs. The refresh token stays on your machine and is never shipped to the scheduler.

local only

03

Certificate logsnpm run watch:certs

Public certificate transparency, per competitor domain. A new subdomain gets a certificate before the thing on it is announced, which makes this the earliest free view of a vertical launch there is.

every 6 h · leading

04

Sitemaps, robotsnpm run watch:sites

Fetch, diff against the last snapshot, emit on new paths, removed paths and rule changes. A page exists before anything links to it.

every 6 h · leading

05

Hacker Newsnpm run watch:hn

Through the Algolia search API, filtered on points and recency. Points, comments, author and timestamps arrive as structured fields rather than prose scraped out of a feed summary.

daily

06

GitHubnpm run watch:github

Releases, breaking-change tags and issue complaints. Sixty requests an hour unauthenticated, five thousand with a token.

daily

07

YouTube captionsnpm run watch:youtube

Captions over HTTP: no audio download and no transcription, which is free for roughly four videos in five. A caption-less video still gets a signal recording that captions were unavailable. Local transcription is opt in.

daily

08

Answer enginesnpm run watch:aeo

Asks the shortlist question a buyer asks and records which brands each engine names back. Detection is a deterministic word-boundary match, not a model judging another model's output.

weekly

09

Model routingnpm run watch:routing

A public, openly licensed data API: which models the market routes its tokens to, and which applications process them. Only movement past a threshold is emitted, so a flat week is silent instead of noisy.

daily · leading

10

Search discoverynpm run watch:tavily

Mention discovery past the feeds, two queries per company, guarded against a free monthly credit tier with a cooldown between runs.

daily

11

Search interestnpm run watch:trends

Brand queries and alternative to queries, batched to the eight stalest per run. The upstream limiter refuses thirty two in a row, so the full set rotates across four passes.

weekly, 4 passes

12

[UNDECIDED]

A watcher is added when a source is public, readable without an account, and says something the eleven above do not. Those three questions are the whole bar.

not built

Why those eleven

Infrastructure moves weeks before the press release does.

The list is not long for its own sake. It is ordered by how early each source speaks, and most monitoring products start at the bottom of it.

  • Infrastructureweeks ahead
  • Hiringmonths, vague
  • Documentationhours
  • Changeloghours
  • Marketingat launch
  • Pressafter

Lead time before a move becomes public knowledge. The three watchers flagged leading above are the three at the top of this chart. The reasoning, with measured precision per source, is in signal-patterns.

What happens to one item

Five stages between a feed entry and an answer.

The panel below darkens as it goes, which is the point: each stage is one step further from raw data, and the tool reports which one it reached.

Stage 01Classify

Haiku reads the item and types it: product launch, pricing change, funding, customer win, review complaint. With no model key a keyword classifier runs instead, free and less precise, and the method used is recorded on the row either way so you can re-run the ones that matter.

Stage 02Score

Business impact from 0 to 100, re-weighted for this job rather than for news: a product launch outranks generic press coverage, which is the opposite of how a headline ranker would order the same two items.

Stage 03Store

One row, keyed on a hash of its own content, so every write is idempotent and two operators plus a scheduler can run the same pass without producing duplicates. A local file by default. A hosted database only once you point it at one.

Stage 04Correlate

Theme and count rules fire a convergence: a pattern several independent publishers corroborate. A launch, a hiring push and a certificate change all pointing at the same vertical is one finding rather than three unread rows. Each carries a structured citation graph back to its evidence and dedupes per calendar week.

Stage 05Synthesise, and label it

Battlecards from Sonnet, deep research from Opus across a hundred and eighty days of signal, five analyst modes driven by a written persona, and a weekly report that uses no model at all because its arithmetic is deterministic. Every piece of model output is marked as model output, and a claim the evidence does not support is published as unverified rather than asserted quietly.

Signals stored
2,600+

in the deployment behind the live preview

Companies tracked
13

across two segments, and it is configuration

Runtime deps
3

no build step, offline on a fresh clone

Monthly spend
$15–25

at the shipped models. Database and search on free tiers

What you actually look at

Three views, running on your own machine.

Real captures of a real deployment, not mockups. npm run view puts this exact dashboard on 127.0.0.1:5180, pointed at your companies instead of these, and signal.gledach.de is the same thing live if you would rather click around than read.

Live Feed · the one you leave open

Not a list of headlines. A convergence is the unit: a pattern several independent publishers corroborate, scored from its own evidence rather than against a fixed floor.

Each row states the rule that fired it and how many independent publishers back it, so you can judge the finding without opening it. The top row in this capture is a convergence at impact 96 built from events across independent outlets in 45 days. One line to read instead of forty.

Signal's Live Feed: convergences ranked by business impact, each one showing the rule that fired it and how many independent pieces of evidence support it, with eight views and thirteen tracked companies in the left rail.

Compare · anchor plus up to three rivals

One company set against another, section by section: positioning, target segment, pricing, strengths, weaknesses.

Thirteen companies sit in the left rail, read out of the one file you edit, and any of them can be the anchor. The [unverified against competitor signals] in the pricing cell is the tool declining to assert something its own evidence does not support, which is the reason to believe the cells that are filled.

Signal's Compare view: Claude Code as the anchor company beside Cursor, set against each other across positioning, target segment, pricing model, strengths and weaknesses.

Battle · call prep for one competitor

The strongest points to make, and the objections you should expect back, ranked against the deal in front of you rather than dumped as a list.

Filtered by deal context, so a two-person team and a thousand-engineer org do not get the same page. This view is model output and the tool labels it as model output, which is why every claim on it carries the collected evidence it came from.

Signal's Battle view: kill shots and the objections to expect back for a single competitor, ranked against deal context such as codebase size and team size.

These are 1519px captures. On a phone they are a texture rather than a screen, which is why the words above each one carry the meaning and the live preview is where you go to actually read it.

What builds up

The useful part is the history, and it is a file on your machine.

Every pass appends to a local database rather than refreshing a feed. After a few weeks you are not reading today's news, you are querying months of attributed, scored, deduplicated history that nobody else holds a copy of.

Ask an agent what changed

Eight tools over MCP plus signal:// resources, so Claude Code or any other MCP client answers from your collected history instead of from whatever it remembers about the market. Wiring one in is a single line.

Read only by default: the one tool that spends money ships with permission withheld, behind a daily ceiling shared with the scheduler and the command line.

The agent surface →

Search it yourself

It is plain SQL over a libSQL file, with no ORM and no schema-deploy step, so anything that can open a database can read it. JSON endpoints and --json on the CLI cover the rest.

YouTube transcripts are archived as excerpts and searchable on their own, which is a question you cannot ask a feed at all. The two commands for that are under these cards.

Compare one week with the next

npm run report:weekly writes a snapshot per calendar week: convergences, the top signals and a line per competitor. It uses no model at all, because the arithmetic is deterministic, and it is idempotent, so you can backfill a week you missed.

The watchers keep their own baselines too, which is what lets a new subdomain or a changed sitemap path be reported as new rather than merely present.

The manual →

npm run transcripts -- --stats       # word counts per competitor
npm run transcripts -- "pricing"     # every mention, with up to 3 snippets each

What is actually kept, so the claim stays honest. Attributed signals with a link back to the source, 2,600 and counting in the deployment behind the preview. Excerpts of YouTube transcripts rather than whole videos. Weekly report snapshots, generated briefs and battlecards, the per-call model cost ledger, and each watcher's own baseline. It is not a copy of the web: it keeps what it collected and what it computed. Every row is keyed by a hash of its own content, so re-running a pass collapses duplicates rather than growing the file, and the default is a file on your machine that nothing uploads anywhere.

Set it up

You edit one file: the list of companies you care about.

You do not have to be a developer. Three commands put this on your own laptop with a real example dataset already loaded, and from there the only thing you change is who it watches. No account, no card, and nothing you collect ever leaves your machine.

  1. Step 01Get it running

    The first command downloads it. The second builds a small database on your machine and fills it with real collected data. The third opens the dashboard in your browser. You can stop there and look around: everything in the three screens above is already populated.

    git clone https://github.com/gledach/signals && cd signals
    npm install
    npm run db:migrate   # your own database, with example data in it
    npm run view         # the dashboard, at 127.0.0.1:5180

    What you need: a Mac, a Windows PC or a Linux machine, and Node 22. That is the whole list. The install guide assumes you have never used a terminal before and takes about fifteen minutes. If you have, it is closer to two. Run npm run doctor at any point and it will tell you what is working and what each thing you have not set up yet would unlock. The package name is gledach-signal. There is no signal command. npm already publishes unrelated packages named signal and signals.

  2. Step 02Tell it who to watch

    It arrives watching thirteen AI coding tools, because a tool that opens empty teaches you nothing. Pointing it at your own market is one file: copy the example, write in the companies you care about, save.

    # copy the example, then edit your copy
    cp config/companies.default.mjs config/companies.local.mjs
    config/companies.local.mjs the only file most people edit
    export const companies = {
      acme: {
        id: 'acme', name: 'Acme', domain: 'acme.com',
        query: '"Acme Corp" OR "acme.com"',
        repos: ['acme/platform'],
        subreddits: ['acme'],
      },
      // one block like that per competitor
    };

    The one field worth a moment's thought is query, because a company name is often an ordinary word. Cursor is also the thing blinking in a text box, so the query is written to catch the company and not the word. The shipped file has thirteen worked examples to copy the pattern from, each with a note on what it collides with.

    Everything else follows on its own. The news feeds it reads, the searches it runs, the code repositories it checks and the labels down the side of the dashboard are all rebuilt from that one list. There is no second place to keep in sync.

  3. Step 03Leave it collecting

    One command runs every watcher once and leaves the day in your database. Put it on a schedule and you have a standing picture of the market that updates while you are not looking at it.

    npm run start      # one pass over every source, on whatever schedule you like
    npm run brief      # a 200-word morning read of what changed

    From there you either read the dashboard, or you point an AI assistant at it and ask. Connecting it to Claude Code or any other MCP client is a single line, and the assistant then answers from your collected data rather than from whatever it remembers about the market.

Three things that are easy to worry about

Your setup survives everything.

Updates will not overwrite your list. Your file sits beside the shipped example rather than replacing it, so you can pull the latest version of the tool whenever you like and nothing you wrote is touched.

The example market cannot be left behind by accident. The project refuses to build if any of the thirteen shipped names are still hiding somewhere in the code, or if the dashboard's own labels have drifted away from your list. That is a check that runs, not a promise in a readme.

Collecting is free. A model key, a few dollars a month at this volume, turns on the written analysis: the classification, the battlecards and the briefs. Without one a simpler keyword classifier runs instead and everything else still works exactly the same.

The rest of the shelf · 8 of 12 slots filled

Same author. Different shapes.

A tool earns a slot when it runs on someone else's machine, not only on mine. Each takes whatever shape suits it, from a single command to a dashboard, and what they share is the promise rather than the plumbing: free, installable, and honest about what each one cannot see.

Slot 03 · shipped

whenrun

Watches day-ahead power prices and renewable share, then starts your job in the cheapest or greenest window that still meets its deadline. Zero runtime dependencies and nothing to install.

Open the page →

Slot 04 · shipped

phonehome

A local resolver that records which domains every device on your network contacts, and says when one starts talking somewhere new. Blocks nothing, uploads nothing.

Open the page →

Slot 05 · shipped

recall

Checks four public registers against a list of the things you actually own, and grades how sure each match is. A register it could not reach is reported as unreachable, never as clean.

Open the page →

Slot 02 · reference

signal-patterns

The written reasoning behind all of it: what is watchable, what it costs, and the eight engineering decisions that only became obvious after something broke. Nothing to install.

Open the page →

Slot 06 · shipped

talk

Samples TCP connections on Windows, follows each process up to its parent, and reads the certificate name of a new public host. A Node helper under Cursor counts as Cursor. It does not close a socket.

Open the page →

Slot 07 · shipped

snare

Remembers the hooks a coding agent runs at startup, and the editor tasks that run when a folder opens. The first check records a baseline. Later checks print only when that set changes. It does not delete a hook.

Open the page →

Slot 08 · shipped

leash

Takes a snapshot before an agent session and another after, then shows what changed outside that repo. In this preview the report is system-wide: other apps running at the same time appear too. It does not delete, kill or block anything.

Open the page →

Slot 09 · not built

[UNNAMED]

The shelf holds a dozen. What lands here next is not decided, and the honest version of this card is a placeholder rather than a roadmap. Is there something you keep checking by hand that a tool could watch for you?

Ask in the open →

The queue is public, including what was turned down and why. The form asks the three questions that decide whether anything is watchable at all: what you check by hand, where it is published, and whether seeing it needs an account. Requests go there rather than to an inbox, so everyone can see what was asked and what happened to it.

House rules

What is true of everything on this shelf.

The tools vary. These six do not. They are the reason a tool gets published here at all.

  • Free, and the source is public

    MIT unless a dependency makes that impossible, in which case the licence is stated on the tool's own page.

  • Your machine is the runtime

    Cloud is for sharing state between machines you own. It is not where your data has to live.

  • No account to start

    Clone it and see something real. Keys, hosted databases and schedules are opt in, later, each listed with what it buys you.

  • Honest about blind spots

    Every tool ships a written audit of what it cannot see, kept beside the documentation rather than buried in it.

  • Read only until you say otherwise

    Nothing spends your money because an agent found a button. Paid actions ship disabled and behind a ceiling.

  • Generated text is labelled

    Model output is marked as model output. A tool that cannot tell you what it does not know is not finished.