A tap wizard with zero LLM calls
Neurowire 0.8.0 generates CSS-selector taps by ranking candidates from page structure and gating every one behind eight deterministic checks, with no model and no API key anywhere in the loop.
A tap is a set of CSS selectors that turns a site publishing no feed into a real feed. Two things capped the idea for a long time. Somebody had to hand-write the selectors, and when the site redesigned, the tap broke silently, which is worse than breaking loudly. An empty feed looks exactly like a quiet week.
Neurowire 0.8.0 ships @neurowire/tap-wizard to close both gaps. It suggests the selectors, and it refuses to write a tap that does not pass a gate. The interesting part is what is not in it: no model, no API key, no network beyond the single fetch of the page you are tapping.
Why this is not an AI problem
Finding the repeating block that holds the articles sounds like a job for a language model. It is not. It is a structural question the DOM already answers.
The candidate is an element that repeats somewhere between 3 and 300 times, contains a link, and shares a common ancestor with its siblings. That description is a query, not an inference. suggestCandidates runs it over the fetched page and ranks what comes back. previewTemplate shows exactly what a given pick extracts. createTapSession holds the one fetched page in memory so choosing the title selector, then the link selector, then the date selector never refetches the site.
What makes it work is not intelligence, it is iteration with feedback. You see the extraction after every choice, so a wrong pick is obvious in a second rather than in a week.
The gate is the actual product
The suggestion engine is the convenient half. The half that matters is verifyTemplate, which runs eight deterministic checks: items, titles, links, link-host, unique-links, dates, extract, and ancestor.
Nothing writes a tap without passing them. Not the wizard, not --yes, not the healer. There is no path through the package that produces an unverified tap, which is the only way a gate stays meaningful.
Three of the checks earn their place on their own:
unique-linkscatches the classic failure where a selector grabs one shared anchor per item, so ten entries all point at the same URL. The feed looks full and is worthless.ancestorrejects selectors that match navigation and footer elements alongside the real items. Those repeat too, and they repeat convincingly.extractruns the real ingest engine rather than a simplified preview path. A preview can never disagree with a real fetch, because it is the same fetch.
--yes and the healer.Rot is now a build failure
The second half of the problem was silence. A tap that stopped working used to be discovered by a person noticing an empty feed, usually weeks late.
tap check runs that same eight-check gate against the live site and exits 1 when it fails. That single exit code is the whole idea: rot becomes a red build instead of an absence nobody notices. tap heal then re-runs suggestion against the redesigned page and proposes a repair, which still has to pass the gate before it is written.
The CLI surface is three commands, documented at tap wizard, tap check, and tap heal.
Where to start
The concept page, Taps, is the full story, and the verification gate section explains each of the eight checks. The API surface is at /reference/tap-wizard.
If you would rather copy something that runs, the recipe author a tap and keep it working includes a GitHub Actions workflow that runs tap check on a schedule, so a site redesign reaches you as a failed job.
Neurowire is open source on GitHub, and there is a hosted reader at neurowire.app. More open-source work sits under projects.