Skip to content

How Hansard works

Hansard separates source preservation, normalized data, derived views, and search indexes. Each layer can be refreshed at the narrowest safe boundary.

  1. Discover and read source history. Importers locate supported local agent stores or read an export supplied explicitly to an import command.

  2. Preserve source material. Every source file touched by an importer is recorded in a raw manifest with its original path, timestamp, size, and content hash. Small sources are copied into the session archive; large shared stores can be preserved once and referenced by multiple sessions.

  3. Write normalized records. Each conversation receives metadata, a transcript processed under the active redaction configuration, canonical events, a Markdown rendering, and a prebuilt viewer payload. Attachments are stored as content-addressed sidecars.

  4. Build derived indexes. Search, list, activity, memory, and tool-usage surfaces use normalized archive data rather than repeatedly parsing provider stores.

  5. Serve the same archive everywhere. The CLI, local web viewer, native app, and recall integrations all read the normalized records and indexes.

Import

Re-read provider sources and add or refresh archived sessions.

Rebuild

Re-derive viewer payloads from existing transcript and event files without touching provider history.

Index rebuild

Refresh the local indexes used by history, recall, memories, and lists.

Update

Perform the destructive full-refresh path: clear rebuildable local agent archive objects and derived state, then reimport configured sources while keeping preferences and original provider history.

The watcher monitors configured sources and imports new activity. It also runs scheduled tasks such as optional plan-usage sampling, memory backup, and remote sync when those features are enabled.

Local import, search, and viewing do not require hosted storage. Remote sync, signed Team sharing, Slack notifications, cloud-source import, and hosted viewer access each introduce a separate network boundary and must be configured explicitly.