Part of the Brigade fleet from Escoffier Labs

Export local agent session logs to portable adapter JSONL.

StationTrail is a local scanner and exporter for agent session logs. It reads sessions from Codex, Claude Code, OpenClaw, OpenCode, and Hermes, normalizes them into portable miseledger.adapter.v1 records, and writes JSONL to a file or stdout. It makes no network calls.

View on GitHub →

Chef de partie: every station keeps its log.

How it works

Read · local sessions

  • Discovers default roots or a path you pass
  • Walks supported JSONL and JSON session files
  • Parses Codex, Claude, OpenClaw, Hermes, and OpenCode shapes
  • Keeps raw references with path, hash, and ordinal
  • Reports counts and manifests without printing item text

Write · adapter JSONL

  • Normalizes messages, tools, artifacts, actors, and relations
  • Applies --since, --limit, and requested redactions
  • Emits one miseledger.adapter.v1 object per line
  • Writes to a file or stdout, never the network
  • Pipe into MiseLedger, which owns archive, search, and bundles

StationTrail is the source-specific adapter layer. It discovers, normalizes, redacts, and exports, then stops. Storage, search, relations, and evidence bundles happen downstream. See the evidence pipeline below for how the pieces fit together.

The evidence pipeline

StationTrail is one of three tools that share a single contract. Two scanners export to the same miseledger.adapter.v1 JSONL format, and one archive ingests both. StationTrail covers agent-session harnesses, SourceHarvest covers everything else local, and MiseLedger stores and analyzes what they emit. Each tool owns its own station.

StationTrail

Exports harness session logs from Codex, Claude Code, OpenClaw, OpenCode, and Hermes to miseledger.adapter.v1 JSONL. Reads local files, normalizes them into portable adapter records, redacts per run, and writes to a file or stdout. This is the site you are on.

SourceHarvest

Exports outside sources to the same adapter format: notes, chat archives, crawler output, issue exports, and git history. It is the sibling scanner for non-harness local records, reading files and exports without crawling live services.

MiseLedger

Imports the shared adapter contract, then stores, dedupes, indexes, searches, and relates the records in a local SQLite evidence graph. It emits Brigade-ready evidence bundles from everything StationTrail and SourceHarvest send it.

What it gives you

Local only, no network

StationTrail reads files on disk and writes adapter JSONL to a file or stdout. It makes no network calls. Nothing leaves the machine unless you pipe it somewhere yourself.

Portable adapter records

Every line is one miseledger.adapter.v1 JSON object: source kind, collection, item, and optional actor, artifacts, links, and relations. One contract, five sources.

Scanner, not an archive

StationTrail discovers, normalizes, and exports. Storage, indexing, dedupe, search, relations, and evidence bundles stay in MiseLedger. Each tool keeps its own station.

Per-export redaction

Request redaction at export time: paths, secrets, emails, urls, hostnames, the safe profile, or all. Redaction is opt-in per run, never silently applied.

Diagnostics that stay quiet

discover, doctor, inspect, and --dry-run report file manifests, structural keys, counts, and warnings. They never print generated transcript text.

Scriptable and pipeable

Add --json for machine-readable summaries, --out - to stream to stdout, and --since and --limit to bound a scan. Pipe straight into MiseLedger import.

Supported sources
SourceDefault inputNotes
Codex~/.codex/sessionsSession JSONL.
Claude Code~/.claude/projectsProject JSONL.
OpenClaw~/.openclaw/agentsAgent sessions and trajectories.
Hermes~/.hermes/sessionssession_*.json snapshots and trajectory JSONL. state.db is observed, not parsed.
OpenCodeExplicit file, directory, or session IDSanitized export JSON from opencode export <session-id> --sanitize.

stationtrail all scans Codex, Claude, OpenClaw, and Hermes default roots. OpenCode is explicit-only, because its sanitized export input is user-selected.

Command reference
CommandWhat it does
stationtrail discoverReport candidate source roots and JSONL counts. Structure only, no transcript text.
stationtrail doctorReport source readiness and warnings. Add --live to dry-run ready roots for counts and manifests.
stationtrail inspect <source> <path>Inspect file manifests, structural keys, and record counts without exporting item text.
stationtrail allScan Codex, Claude, OpenClaw, and Hermes default roots and export one adapter stream.
stationtrail codex [path]Export Codex session JSONL from ~/.codex/sessions.
stationtrail claude [path]Export Claude project JSONL from ~/.claude/projects.
stationtrail openclaw [path]Export OpenClaw agent sessions and trajectories from ~/.openclaw/agents.
stationtrail hermes [path]Export Hermes session snapshots and trajectory JSONL from ~/.hermes/sessions.
stationtrail opencode <export-json>Export a sanitized OpenCode export produced by opencode export <session-id> --sanitize.
stationtrail versionPrint the StationTrail version.

Export every default source, redacted, and pipe it into MiseLedger:

Privacy boundary

StationTrail treats exported session text as untrusted evidence, not instructions. The diagnostic commands are built to stay quiet. discover reports candidate roots and JSONL counts only. doctor reports source readiness and warnings only. doctor --live runs dry-run scanners and reports counts, file manifests, and warnings only. None of them print transcript content.

inspect and --dry-run --json report file manifests, structural keys, record counts, and warnings without printing generated item text. Export commands preserve raw references with path, hash, and ordinal while keeping searchable item text compact. Redaction is requested per export, so you decide what each run keeps or strips.