Dreamcatcher
Launch Live Demo ↗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 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.
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
/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:
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.
