Case Study

Dreamcatcher

JavaScriptReactNode PostgreSQLOpenAIChrome ExtensionDocker ● Live Demo
Launch Live Demo ↗
Dreamcatcher — the Today screen: priorities, workspace pulse, and the captured fragments waiting to be filed
Every
Graph edge is a citation
0
Confidence scores, anywhere
1
Human ratifies every split

The Problem

Most real project thinking now happens inside AI conversations, and almost all of it evaporates. A chat closes, a thread sinks under a hundred others, and the idea that could have anchored a project is gone or scattered across three tools. Worse, the ideas that do get kept early tend to land in one bucket: a single "project" that is really four, conflated before anyone knew they were separate.

Dreamcatcher catches the fragments — a quote from a chat, a decision, a half-formed plan — and nets them into dreams: project notebooks with a wiki, todos, versions, a timeline and a retrospective. It started as an idea backlog kept in ChatGPT, before it had a name; the name came from the offhand phrase "throwing dreams into the backlog". Personal knowledge management, specialised for the way AI-assisted work actually produces knowledge.

Two Things the Linked-Notes Tools Don't Do

Notion, Obsidian, Mem and Tana all match the table stakes here — fast capture, tags, a graph of linked notes. Two workflows are the reason this exists, and the demo carries both end to end.

  • Revisions — retro-tracing. When early fragments were conflated into one dream that is really several projects, a trace walks the dream's captured statements and proposes an artifact-anchored split: which statements belong to which artifact (a repo, a folder, a graph), the inter-dream links each one implies, former-name candidates, and an honest count of statements it could not anchor. Every proposed link quotes the statement it patterns on. Nothing applies until a human ratifies it; reject leaves the dream exactly as it was, and ratification is recorded and reversible.
  • Graph — citation-edged. A map of how dreams relate in which every edge is a verbatim quote or a commit. Click an edge and the citation opens beside it. Nothing is drawn from similarity or co-occurrence — which is how most linked-notes graphs draw theirs — so an edge you cannot explain does not exist. Nodes are laid out deterministically in capture order; statements the graph cannot yet anchor are counted in the margin rather than guessed at.
The Graph view with one edge selected and its verbatim citation open in the side panel
The Graph with one edge selected. The panel shows the statement that justifies the edge — the demo's edge-and-citation contract is the production one; only the dataset is fixture data.
Revisions after ratifying the split: the four created dreams, the origin archived, and a Revert control
Revisions after ratify. The split is applied to the workspace — four dreams created from the origin backlog, each holding the fragments the trace attributed to it; the origin archived with the reason recorded; the Graph re-derived — and revert restores it exactly. Recorded and reversible, the production contract, on mock data.
Walkthrough (silent). A screen recording of the live demo on fixture data: a capture session replays and its fragments are filed into a dream; a suggestion cites what it patterns on; the retro-trace split is ratified and applied; the Graph gains the quoted links as edges; the phone companion. Nothing is rendered or staged beyond the caption band.

The First Split Was Its Own

The demo's Revisions fixture is modeled on the engine's first real proposal against live data. Before Dreamcatcher had a name it was an idea backlog in a chat, and that one backlog held four things that later became separate projects: Connex (the client integration layer that Aether SDK was extracted from), Nexus, PipelineOS, and Dreamcatcher itself. Asked to trace that dream apart, the engine anchored the statements to four artifacts, proposed the split with quoted inter-dream links and two former-name candidates, and stopped — the proposal is recorded as proposed and is still awaiting the owner's ratification. Nothing auto-applies, not even to the system's own history.

The same record fixes the spark. The origin backlog's first captured statement is dated 2 June 2025 — four months before the first commit — and it has kept collecting since. That is why the timeline on this page starts where the idea started rather than where the code did: Dreamcatcher is built to hold a project from spark to delivered output, and its own history is the first project it held.

GET /api/ai/revisions (engine, self-hosted, 2026-09-16) revision 83f743dc status: proposed opened: 2026-08-09 anchors: connex · dreamcatcher · nexus · pipelineos name-link candidates: 2 nothing applied — awaiting owner ratification revision a7684ab1 status: rejected opened: 2026-08-09 anchors: dreamcatcher GET /api/dreams/<origin> the origin backlog itself created: 2025-06-02T14:03Z (first captured statement — the spark) fragments: 33 · latest capture 2026-06-18 · first commit of the engine: 2025-10-11

Cited, Not Scored

The credibility test for anything "AI-powered" is whether it says what it actually computes. Dreamcatcher draws the line explicitly, and the demo is held to it by a gate.

  • Deterministic where it matters. Suggestions are labeled trajectory projections that cite the dreams they pattern on. The matcher is deterministic pattern-and-graph logic; the engine computes no confidence score, so the demo shows none. A grep gate fails the build on any "N% confidence / match / accuracy" phrasing.
  • Real model calls where they exist. Summaries, tagging and project-name detection in the engine are OpenAI-backed and read as what they are. The two are never blurred: a surface either shows a model call or says it is deterministic.
  • One event log behind every number. The workspace pulse, badges, the activity heatmap, streaks and the insight list all derive from the same dated records the screens render. A unit gate fails the build if a view hand-types a figure; the assistant's "insights" are the same list the Analytics page shows, so it can never quote a number the screen beside it does not.
  • Anchored to today. The whole fixture dataset slides with the clock, so relative ages, timelines and history stay internally consistent whenever the demo is viewed.

Architecture

Capture Chrome extension (ChatGPT · Claude · Copilot-experimental) · VS Code · direct REST token-gated /api/capture → Inbox triage → filed into a dream ↓ Formation dreams · fragments · statements · wiki · todos · versions artifact links: folder · github · code-graph (a dream may link MANY) ↓ Retro-trace statements attributed to artifacts → proposed split inter-dream links (quoted) · former-name candidates · unattributed count ↓ Ratify owner-only · recorded · reversible — nothing auto-applies ↓ Derived evolution chains → Timeline · labeled trajectory projections → Suggestions citation-edged Graph (ratified links only) · scheduled re-link ↓ Storage / AI local-first, single-user edition · Postgres on a Synology NAS · Docker OpenAI for summaries, tags, name detection — never for edges or scores

Built Like a Product

The engine is deployed on the owner's own hardware (v3.0.0, Postgres on a NAS, image identity recorded per deploy) and sits in release stabilization: its blockers are lifecycle and operational correctness, not missing features. It carries 1,287 tests, a cohesion compiler that fails the build when a screen and its data disagree, and real-Postgres smokes for the write paths, ratification and re-link. Receipts, taken the day before this page went live:

GET /api/health {"status":"ok","version":"3.0.0","revision":"aef676f","buildTime":"2026-08-25T17:10:25Z","migrationLevel":"018_captures.sql"} npx vitest run develop @ 2991538 · Test Files 125 passed · Tests 1287 passed · 14.2s node tools/cohesion/compile.mjs Total: 63 (the Wave-2 migration manifest — a non-zero count is the expected baseline)

The cockpit ships behind its own gate suite: lint, an anchor-coherence unit gate, the view-honesty gate, an axe-core WCAG A/AA gate over every screen at desktop and phone width with no exclusions, end-to-end smoke, and white-glove, mobile and viewport sweeps across twenty screen sizes. The phone is a scoped companion — Today, Dreams, Inbox, Revisions — with authoring surfaces labelled as desk-only rather than squeezed.

Access: the live demo is a frontend-only cockpit on mock data — the cockpit, not the engine. The capture path, the retro-tracing and graph modules, the Postgres store and the model-backed assistant are a private codebase, available to walk through in a working session. The Chrome extension is real and separate; it is not part of the public showcase.
← Aether SDK All projects →