
Codex History Ingest
- 2.3k installs
- 3.1k repo stars
- Updated August 4, 2026
- ar9av/obsidian-wiki
codex-history-ingest imports Codex CLI rollout logs into an Obsidian wiki with topic clustering and provenance.
About
The codex-history-ingest skill mines past Codex CLI sessions and distills durable knowledge into an Obsidian wiki vault. It resolves config via OBSIDIAN_VAULT_PATH and CODEX_HISTORY_PATH defaulting to ~/.codex, reads .manifest.json and index.md before processing. Append mode ingests only new or modified rollout and index files; full mode reprocesses everything after wiki-rebuild. It surveys session_index.jsonl for inventory, parses rollout JSONL events prioritizing user intent and assistant messages while filtering telemetry, secrets, and raw system prompts. Knowledge clusters by topic across sessions into projects, concepts, skills, entities, and synthesis paths with provenance markers extracted, inferred, or ambiguous. Manifest updates track ingested_at, source_type, pages created or updated, and project summaries. After vault writes it optionally runs qmd update and embed for search index refresh. Privacy rules require redaction and distillation rather than verbatim transcript dumps.
- Append or full ingest modes driven by .manifest.json deltas.
- Parses session_index.jsonl then rollout JSONL with noise filters.
- Clusters sessions by topic into wiki paths, not one page per session.
- Adds provenance markers and confidence frontmatter on new pages.
- Optional qmd update and embed after vault writes for search refresh.
Codex History Ingest by the numbers
- 2,254 all-time installs (skills.sh)
- +29 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #173 of 1,879 Documentation skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
codex-history-ingest capabilities & compatibility
- Capabilities
- manifest driven append and full ingest modes · session_index and rollout jsonl parsing with pri · topic clustering into projects, concepts, skills · provenance frontmatter and manifest project summ · optional qmd search index refresh after writes
- Use cases
- documentation · memory · research
What codex-history-ingest says it does
Session logs are rich but noisy: focus on durable knowledge
Do not create one wiki page per session.
Do not ingest verbatim system/developer prompts or secrets.
npx skills add https://github.com/ar9av/obsidian-wiki --skill codex-history-ingestAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 2.3k |
|---|---|
| repo stars | ★ 3.1k |
| Security audit | 3 / 3 scanners passed |
| Last updated | August 4, 2026 |
| Repository | ar9av/obsidian-wiki ↗ |
How do I mine my ~/.codex sessions into searchable wiki knowledge?
Ingest Codex CLI session history into an Obsidian wiki, distilling durable knowledge from rollout logs and session index.
Who is it for?
Users with Codex history who maintain an Obsidian wiki via obsidian-wiki skills.
Skip if: Skip for live Codex sessions or wikis without vault config and manifest setup.
When should I use this skill?
User asks to process Codex history, import ~/.codex, or mine past coding sessions.
What you get
Updated vault pages, manifest entries, and index log from distilled session knowledge.
- Parsed session inventory
- Queryable Codex transcript datasets
By the numbers
- Documents 5 ~/.codex path types: sessions/, archived_sessions/, session_index.jsonl, history.jsonl, config.toml
- Session logs stored as rollout-*.jsonl under sessions/YYYY/MM/DD/
Files
Codex History Ingest — Conversation Mining
You are extracting knowledge from the user's past Codex sessions and distilling it into the Obsidian wiki. Session logs are rich but noisy: focus on durable knowledge, not operational telemetry.
This skill can be invoked directly or via the wiki-history-ingest router (/wiki-history-ingest codex).
Before You Start
1. Resolve config — follow the Config Resolution Protocol in llm-wiki/SKILL.md (walk up CWD for .env → ~/.obsidian-wiki/config → prompt setup). This gives OBSIDIAN_VAULT_PATH and CODEX_HISTORY_PATH (defaults to ~/.codex) 2. Read .manifest.json at the vault root to check what has already been ingested 3. Read index.md at the vault root to understand what the wiki already contains
Ingest Modes
Append Mode (default)
Check .manifest.json for each source file. Only process:
- Files not in the manifest (new session rollouts, new index files)
- Files whose modification time is newer than
ingested_atin the manifest
Use this mode for regular syncs.
Full Mode
Process everything regardless of manifest. Use after wiki-rebuild or if the user explicitly asks for a full re-ingest.
Codex Data Layout
Codex stores local artifacts under ~/.codex/.
~/.codex/
├── sessions/ # Session rollout logs by date
│ └── YYYY/MM/DD/
│ └── rollout-<timestamp>-<id>.jsonl
├── archived_sessions/ # Archived rollout logs
├── session_index.jsonl # Lightweight index of thread id/name/updated_at
├── history.jsonl # Local transcript history (if persistence enabled)
├── config.toml # User config (contains history settings)
└── state_*.sqlite / logs_*.sqlite # Runtime DBs (usually skip)Key data sources ranked by value
1. session_index.jsonl — best inventory source for IDs, titles, and freshness 2. sessions/**/rollout-*.jsonl — rich structured transcript events 3. history.jsonl — useful fallback/timeline aid if enabled
Avoid ingesting SQLite internals unless the user explicitly asks.
Step 1: Survey and Compute Delta
Scan CODEX_HISTORY_PATH and compare against .manifest.json:
~/.codex/session_index.jsonl~/.codex/sessions/**/rollout-*.jsonl~/.codex/archived_sessions/**(optional; only if user asks for archived history)~/.codex/history.jsonl(optional fallback)
Classify each file:
- New — not in manifest
- Modified — in manifest but file is newer than
ingested_at - Unchanged — already ingested and unchanged
Report a concise delta summary before deep parsing.
Step 2: Parse Session Index First
session_index.jsonl typically has entries like:
{"id":"...","thread_name":"...","updated_at":"..."}Use it to:
- Build a canonical session inventory
- Prioritize recent/high-signal sessions
- Map rollout IDs to human-readable thread names
Step 3: Parse Rollout JSONL Safely
Each rollout-*.jsonl line is an event envelope with:
{
"timestamp": "...",
"type": "session_meta|turn_context|event_msg|response_item",
"payload": { ... }
}Extraction rules
- Prioritize user intent and assistant-visible outputs
- Favor
response_itemrecords with user/assistant message content - Use
event_msgselectively for meaningful milestones; ignore pure telemetry - Treat
session_metaas metadata (cwd, model, ids), not user knowledge
Skip/noise filters
- Token accounting events
- Tool plumbing with no semantic content
- Raw command output unless it contains reusable decisions/patterns
- Repeated plan snapshots unless they add novel decisions
Critical privacy filter
Rollout logs can include injected instructions, tool payloads, and sensitive text. Do not ingest verbatim system/developer prompts or secrets.
- Remove API keys, tokens, passwords, credentials
- Redact private identifiers unless relevant and approved
- Summarize instead of quoting raw transcripts
Step 4: Cluster by Topic
Do not create one wiki page per session.
- Group by stable topics across many sessions
- Split mixed sessions into separate themes
- Merge recurring concepts across dates/projects
- Use
cwdfrom metadata to infer project scope
Step 5: Distill into Wiki Pages
Route extracted knowledge using existing wiki conventions:
- Project-specific architecture/process ->
projects/<name>/... - General concepts ->
concepts/ - Recurring techniques/debug playbooks ->
skills/ - Tools/services ->
entities/ - Cross-session patterns ->
synthesis/
For each impacted project, create/update projects/<name>/<name>.md (project name as filename, never _project.md).
Writing rules
- Distill knowledge, not chronology
- Avoid "on date X we discussed..." unless date context is essential
- Add
summary:frontmatter on each new/updated page (1-2 sentences, <= 200 chars) - Add confidence and lifecycle fields to every new page:
base_confidence: 0.42
lifecycle: draft
lifecycle_changed: <ISO date today>Leave lifecycle unchanged on update.
- Add provenance markers:
^[extracted]when directly grounded in explicit session content^[inferred]when synthesizing patterns across events/sessions^[ambiguous]when sessions conflict- Add/update
provenance:frontmatter mix for each changed page
Step 6: Update Manifest, Log, and Index
Update .manifest.json
For each processed source file:
ingested_at,size_bytes,modified_atsource_type:codex_rollout|codex_index|codex_historyproject: inferred project name (when applicable)pages_created,pages_updated
Add/update a top-level project/session summary block:
{
"project-name": {
"source_path": "~/.codex/sessions/...",
"last_ingested": "TIMESTAMP",
"sessions_ingested": 12,
"sessions_total": 40,
"index_updated_at": "TIMESTAMP"
}
}Update special files
Update index.md and log.md:
- [TIMESTAMP] CODEX_HISTORY_INGEST sessions=N pages_updated=X pages_created=Y mode=append|full`hot.md` — Read $OBSIDIAN_VAULT_PATH/hot.md (create from the template in wiki-ingest if missing). Update Recent Activity with a one-line summary — e.g. "Ingested 12 Codex sessions; surfaced recurring patterns in CLI tooling and shell scripting." Keep the last 3 operations. Update updated timestamp.
Privacy and Compliance
- Distill and synthesize; avoid raw transcript dumps
- Default to redaction for anything that looks sensitive
- Ask the user before storing personal/sensitive details
- Keep references to other people minimal and purpose-bound
Reference
See references/codex-data-format.md for field-level parsing notes and extraction guidance.
QMD Refresh After Vault Writes
QMD is a search index, not the source of truth. If $QMD_WIKI_COLLECTION is empty or unset, skip this step. Run it only after this skill has written or rewritten vault markdown. If QMD refresh fails, do not roll back the vault changes; report the QMD status separately.
Use $QMD_CLI if set; otherwise use qmd.
${QMD_CLI:-qmd} updateIf the output says vectors are needed or embeddings may be stale, run:
${QMD_CLI:-qmd} embedVerify the collection with either:
${QMD_CLI:-qmd} ls "$QMD_WIKI_COLLECTION"or, when a specific page path is known:
${QMD_CLI:-qmd} get "qmd://$QMD_WIKI_COLLECTION/<page>.md" -l 5Record one of:
QMD refreshed: update + embed + verifiedQMD refreshed: update only + verifiedQMD skipped: QMD_WIKI_COLLECTION unsetQMD skipped: qmd CLI unavailableQMD failed: <short error summary>
Codex Data Format — Detailed Reference
This reference describes practical, observed structures for Codex local history ingestion.
Root Layout
~/.codex/ usually contains:
sessions/YYYY/MM/DD/rollout-*.jsonl— primary structured session logsarchived_sessions/— archived rolloutssession_index.jsonl— session id/name/update indexhistory.jsonl— transcript history (depends on config)config.toml— history persistence controls
Session Index
~/.codex/session_index.jsonl entries are one JSON object per line, commonly:
{"id":"<thread-id>","thread_name":"<title>","updated_at":"<timestamp>"}Use this as the inventory backbone for append/full mode deltas.
Rollout JSONL
rollout-*.jsonl files are event streams with envelope fields:
{
"timestamp": "2026-04-12T09:40:02.337Z",
"type": "session_meta|turn_context|event_msg|response_item",
"payload": { "...": "..." }
}Common type values:
session_meta— run metadata (id, cwd, model/provider, etc.)turn_context— turn-scoped context envelopeevent_msg— runtime events (task lifecycle, token/accounting, tool-call markers)response_item— model response items (messages, tool calls, reasoning blocks)
Typical payload subtypes
Observed examples include:
event_msg.payload.type:task_started,user_message,agent_message,mcp_tool_call_end,exec_command_end,token_countresponse_item.payload.type:message,function_call,function_call_output,reasoning
Extraction Strategy
Keep
- User intent from user-message records
- Assistant conclusions/decisions from assistant message records
- High-signal tool outputs that encode reusable knowledge
Skip
- Pure telemetry (
token_count, low-level plumbing events) - Internal reasoning traces unless user explicitly asks to retain them
- Verbose execution dumps with no durable insight
Privacy Notes
Rollouts can contain sensitive data:
- Injected instruction layers
- Tool inputs/outputs
- Potential secrets in command output
Always redact secrets and summarize instead of copying raw transcript content.
Config Interaction
~/.codex/config.toml keys that affect ingestion completeness:
history.persistence = "save-all" | "none"history.max_bytes = <int>(truncation/compaction cap)
codex exec --ephemeral runs may not persist rollout files.
Related skills
How it compares
Pick codex-history-ingest over generic log parsers when you need Codex-specific rollout JSONL and session_index.jsonl field semantics.
FAQ
What is append versus full mode?
Append processes only new or modified files per manifest; full re-ingests everything.
Does it create one page per session?
No. It clusters by stable topics across many sessions into existing wiki conventions.
How are secrets handled?
Redact API keys and credentials; summarize instead of quoting raw transcripts.
Is Codex History Ingest safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.