Claude Transcripts docs GitHub
Work in progressUnder active development — not tested as ready for use. Breaking changes land without notice, stored data may need to be discarded between revisions, and there is no auth or security model. These docs describe the intended design as much as the current state.

9. Meilisearch for search (Phase 2)

Date: 2026-06-06

Status

Accepted — the search layer is built and running on Meilisearch. GET /api/search serves session-metadata and conversation-content hits; the indexes are kept current by a CouchDB _changes follower and rebuildable with POST /api/search/reindex.

The Typesense evaluation below never happened — Meilisearch was implemented directly. That's a decision by default rather than by comparison; switching now would be a superseding ADR, and the fact that the index is disposable and rebuilt from CouchDB is what keeps that cheap. Whether the engine may live outside the bundled stack is open: ADR 0028.

Context

Phase 1 deliberately excludes search (see README). But the stack reserves a search engine now so the architecture accounts for it. The corpus is the session log in CouchDB (transcripts, events, summaries) and, in future, content from outside this stack worth searching as Claude Code context.

Decision

Provisionally adopt Meilisearch as the search engine, kept as a loosely coupled, optional component.

Alternatives considered

Consequences

Where indexing happens (Tier 1)

Worth stating plainly, because "search" often implies something leaving the machine and here it doesn't.

The caveat that comes with ADR 0028

ADR 0028 makes an external Meilisearch supported and safe from a collision standpoint. It does not make it private: the turns index holds conversation text. Point MEILI_HOST at another host and transcript content goes there — the one configuration in which this project's data leaves the machine it was recorded on.

That's a legitimate thing to want and an easy thing to do by accident, so it belongs next to the decision that enabled it rather than only in the ADR that discussed namespacing. The bundled instance remains the default precisely because it has this property by construction.