toc.json that describes the full tree — the crawler ignores it and tries to discover pages by following anchor tags.
| Component | Description |
|---|---|
repo.index.json |
The source of truth for all known repos. Contains domain, strategy type, known TOC endpoints, noise filter patterns, seed URLs, and metadata. Rabbit Runner reads this before spawning any worker. |
| Rabbit (worker) | A single worker instance. Has a type (toc | crawl | github | sitemap), a target repo ID, a job queue (array of URLs/paths to fetch), a visited set, and a results buffer. |
| Job queue | Ordered array of work units. Can be pre-populated from toc.json or grown dynamically by link-following. Queue is serialisable — can be saved and resumed. |
| Filter index | Per-domain array of URL pattern strings that indicate noise. Stored in repo.index.json. Applied before any URL enters the job queue. |
| Director commands | spawn rabbit, kill rabbit, status rabbits, pause rabbit, resume rabbit, add filter, show index |
| Emit events | RABBIT_START, RABBIT_PROGRESS, RABBIT_COMPLETE, RABBIT_ERROR, RABBIT_PAUSED. Same event bus as current HANDSHAKE/COMPLETE. |
toc.json endpoint first. Parse it into a flat URL list. Use that as the job queue. No link-following needed — the TOC is the scenegraph.
raw.githubusercontent.com.
sitemap.xml or robots.txt first, parses URL list, queues targeted fetches. Faster than crawl when a sitemap exists.
{
"bedrock_docs": {
"id": "bedrock_docs",
"label": "Bedrock Creator Docs",
"domain": "learn.microsoft.com",
"baseUrl": "https://learn.microsoft.com/en-us/minecraft/creator/",
"strategy": "toc",
"toc": "https://learn.microsoft.com/en-us/minecraft/creator/toc.json",
"seeds": [
"https://learn.microsoft.com/en-us/minecraft/creator/reference/content/entityreference/",
"https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/"
],
"noiseFilters": [
"/azure/", "/edge/", "/windows/", "/visualstudio/",
"download-microsoft-edge", "privacy", "terms-of-use",
"lifecycle-faq", "entra-id", "subscription"
],
"meta": {
"addedBy": "Director",
"addedAt": "2026-02-24",
"crawlCount": 0,
"lastCrawl": null
}
}
}
repo.index.json. Before any URL is added to a rabbit's job queue, it is tested against the filter list.
add filter learn.microsoft.com /azure/
"/azure/" to the noiseFilters array for the learn.microsoft.com domain in repo.index.json, and takes effect immediately for any running or future rabbit on that domain.
repo.index.json for strategy and config. Emits RABBIT_START. Shows progress in STREAM.
repo.index.json for the given domain. Takes effect immediately.
repo.index.json to STREAM — all known repos, strategies, noise filters.
toc.json for each documentation tree. Rabbit Runner flattens this tree into a URL list — this becomes the complete job queue before any fetching begins.
| Step | Description |
|---|---|
| Step 1 — Fetch TOC | Rabbit fetches toc.json via the CORS proxy. Parses the nested tree, flattens all hrefs into absolute URLs. Applies noise filters. Result: clean URL list of every Bedrock doc page. |
| Step 2 — Seed priority | Any URLs in the seeds array for this repo are moved to the front of the queue. Entity reference pages, block reference pages are fetched first. |
| Step 3 — Paginated fetch | Rabbit works through the queue in batches of 5 (configurable). Each fetch goes through the proxy. Results scored against query, added to hits if relevant. |
| Step 4 — Checkpoint | After every 10 fetches, rabbit writes its queue state and visited set to sessionStorage. If interrupted, resume picks up from here. |
| Step 5 — Complete | When queue is empty, rabbit emits RABBIT_COMPLETE with stats: pages fetched, hits found, noise URLs discarded, duration. |
traverseProxy() in the HTML is the interim implementation — single strategy, no index, no filteringproxy.js) is the transport layer that Rabbit Runner will use — it does not changerepo.index.json does not exist yet — it will be created alongside the first Rabbit implementationtraverseProxy() will be replaced by a spawn call. The interface stays the same — DEEP_CRAWL button, STREAM output, hits in the panel. The worker layer is invisible to the user.
| Component | Relationship |
|---|---|
proxy.js |
Transport. Rabbit Runner calls the proxy for every fetch. The proxy has no knowledge of repos, strategies, or filters — it just fetches and returns. This separation stays. |
ashDB.js |
Observation and command layer. Receives RABBIT_* events and displays them in STREAM. Provides the command bus that Director uses to control rabbits. Does not execute jobs. |
ashlight_v31 HTML |
Display and collection layer. Receives hits from Rabbit Runner via the same state.hits array. No changes to rendering logic needed. |
repo.index.json |
Shared knowledge base. Written by Director, read by Rabbit Runner. The bridge between human intent and machine execution. |
| Bedrock vertical | The first complete Rabbit configuration. bedrock_docs entry in the index, toc strategy, entity reference seeds, noise filters for Azure/Edge. Template for all future verticals. |