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.

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. External Meilisearch is allowed, with namespaced indexes (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)

Search is optional (features.meilisearch, on by default) and local: the bundled Meilisearch listens on 127.0.0.1:7656 like the webapi on 127.0.0.1:7650 (ADR 0020). Only the webapi writes to it, from the ingest routes and by following CouchDB's _changes feed; the hook never touches it.

The exception is an external Meilisearch, which ADR 0028 makes safe from collisions but not private: the turns index holds conversation text, so pointing MEILI_HOST at another host is the one configuration in which recorded content leaves the machine. The bundled instance stays the default for that reason.