openclaw transcripts CLI: list, show, and export transcripts

Reference for the openclaw transcripts command, covering list, show, and export of meeting transcripts. Useful for developers and admins managing stored transcripts via CLI.

Read this when

  • You want to read stored transcript summaries from the terminal
  • You need the path to a transcripts markdown summary
  • You are debugging the core transcripts storage layout
  • You want an agent or the Control UI to read past meeting notes
  • You want to browse meetings or configure capture in the Control UI

openclaw transcripts

The inspector and export commands handle durable meeting transcripts. Browser participants in Google Meet, Microsoft Teams, and Zoom capture notes on their own; provider capture and manual import are also supported through the transcripts agent tool.

The canonical transcript state resides in the shared SQLite database located at $OPENCLAW_STATE_DIR/state/openclaw.sqlite. User-facing artifacts are explicitly materialized under the state directory by show and path:

$OPENCLAW_STATE_DIR/transcripts/YYYY-MM-DD/<session>/
  metadata.json
  transcript.jsonl
  summary.json
  summary.md

These files serve as exports, not as a secondary runtime store. During capture, summarization, or listing, OpenClaw never reads them back. The default state directory is ~/.openclaw, and OPENCLAW_STATE_DIR overrides it. The date directory derives from when the session started; the session directory is a filesystem-safe slug built from the session id.

Commands

openclaw transcripts list
openclaw transcripts show <session>
openclaw transcripts show YYYY-MM-DD/<session>
openclaw transcripts path <session>
openclaw transcripts path YYYY-MM-DD/<session>
openclaw transcripts path <session> --dir
openclaw transcripts path <session> --metadata
openclaw transcripts path <session> --transcript
openclaw transcripts list --json
openclaw transcripts show <session> --json
openclaw transcripts path <session> --json
CommandDescription
listShow sessions that are stored.
show <session>Print and materialize summary.md.
path <session>Materialize and print the summary.md path.
path <session> --dirMaterialize all artifacts and print their directory.
path <session> --metadataMaterialize and print metadata.json.
path <session> --transcriptMaterialize and print transcript.jsonl.
--jsonPrint machine-readable output (any subcommand).

A bare session id or a date-qualified selector (YYYY-MM-DD/<session>) is accepted by <session>. When the same session id shows up on multiple days, go with the qualified form, for instance openclaw transcripts show 2026-05-22/standup. Timestamps and random suffixes make up default session ids; assign a fixed id to a session only if that id stays unique within the day.

When the filesystem-safe export name goes past 255 bytes, OpenClaw trims it to a prefix plus a deterministic SHA-256 hash of the full original session ID. Only the derived export name and its selector change; the raw session ID, provider stop handle, and stored notes remain untouched. Names that already fit stay as they are. For the shortened name, use the selector that list prints. To fix derived selectors for existing sessions with oversized stored names, run openclaw doctor --fix; stored notes are not altered.

Output

One tab-separated line per session is printed by list: selector, start time, title, summary path.

2026-05-22/standup  2026-05-22T09:00:00.000Z  Weekly standup  /Users/user/.openclaw/transcripts/2026-05-22/standup/summary.md

Passing the selector back to show or path is the safest option.

Objects with sessionId, selector, date, title, startedAt, stoppedAt, source, path, summaryPath, and hasSummary are returned by list --json. Before persistence, query strings, fragments, and embedded credentials are stripped from stored meeting source URLs, leaving only the origin and path.

The stored session metadata, selector, session directory, summary path, and summary Markdown text are all returned by show --json.

The selected path and whether that artifact could be materialized are returned by path --json. For a stored session, metadata and transcript exports always exist; a summary path reports exists: false until a summary is available for the session.

Many sessions per day

Sessions are grouped by date first, then by session id. Ten meetings on a single day become ten sibling folders:

~/.openclaw/transcripts/2026-05-22/
  transcript-2026-05-22T09-00-00-000Z-a1b2c3d4/
  transcript-2026-05-22T10-30-00-000Z-b2c3d4e5/
  standup/

For automation, rely on default generated ids. Use a fixed id such as standup only when it will not repeat on the same date.

Missing summaries

Active capture subscriptions, not historical notes, are what the tool's status action lists. When a provider ends or replaces a subscription, OpenClaw records stoppedAt and stores its summary; the transcript stays available to list, show, and the tool's summarize action. A temporary transport disconnect does not end a subscription. Stopping historical notes neither stops a newer capture nor changes the recorded stop time.

The summary is stored by provider-driven completion without exporting files. Explicit tool stop, import, summarize, and configured auto-start shutdown also try to materialize summary.md. If terminal persistence fails, status reports the ended capture under pendingFinalization, separate from active captures. To retry persistence for that session without stopping the provider again, use the tool's stop action.

A session can show up in list without a summary while capture is still active, if a provider failed during stop, or if metadata was stored before any utterances arrived.

Use path <session> --transcript to view the unmodified append-only transcript, or invoke the transcripts tool's summarize action to regenerate the Markdown summary.

Prior to any optional artifact export, summaries are stored in SQLite. Should the export fail, the stored summary remains accessible even when summary.md is absent. During shutdown, configured auto-start captures log warnings for failed exports or provider stop errors. Fix the export destination issue, then execute openclaw transcripts path <session> or openclaw transcripts show <session> to attempt the export again; a warning mentioning an intended path does not confirm that a file was exported.

Historical sessions lacking complete account-owner metadata stay on a local recovery path. For an agent-owned row, recover it with a local turn belonging to that agent; a row without agent attribution requires a local main-agent turn. Sources without account binding keep main-agent access across their usual surfaces. Missing providers, partial owner metadata, and accountless historical sources also remain on this local recovery path.

openclaw agent --agent <owning-agent-or-main> --local --message \
  "Use transcripts summarize for session <session>."

Upgrading the legacy file store

OpenClaw releases older than the SQLite store wrote canonical runtime state directly under $OPENCLAW_STATE_DIR/transcripts/. Run:

openclaw doctor --fix

Doctor imports the full legacy tree into SQLite, checks row counts and ordering, records migration receipts, and relocates the verified source tree to a timestamped transcripts.migrated-* archive. Runtime commands do not fall back to the legacy files. Retain the archive until you have confirmed the imported sessions and any exports you depend on.

Configuration

Meeting transcript capture is turned on by default. To disable it globally:

{
  "transcripts": {
    "enabled": false
  }
}
  • enabled (default true): enables automatic meeting notes, the transcripts tool, and configured auto-start sources. Set it to false when meeting notes should not be persisted on the host. An explicitly requested meeting transcribe mode retains its existing bounded live-caption tail, but writes no durable rows while this setting is false. Configure auto-start sources with transcripts.autoStart. Each entry is enabled simply by being present; omit an entry to disable that source. discord-voice is the bundled auto-start-capable source and needs guildId and channelId. When exactly one configured Discord account has credentials and voice enabled, OpenClaw picks it automatically. When multiple accounts are voice-capable, OpenClaw picks a capable channels.discord.defaultAccount. Otherwise, set accountId to the matching key under channels.discord.accounts; an omitted account is rejected as ambiguous:
{
  "transcripts": {
    "enabled": true,
    "autoStart": [
      {
        "providerId": "discord-voice",
        "accountId": "work",
        "guildId": "1234567890",
        "channelId": "2345678901"
      }
    ]
  }
}

The meeting provider ids are google-meet, teams, and zoom. Their aliases are googlemeet/meet, teams-meetings/microsoft-teams/msteams, and zoom-meetings, respectively. Meeting providers attach to an already-active meeting bot session; normal meeting joins do not require an autoStart entry.

1,196 words · updated Aug 28, 2026