Every past session, subagent, and workflow -- queryable by your agent, browsable by you
$ npx -y skills add tommy0103/obelisk --agent claude-code
Run the curl in your terminal, the rest in Claude Code.
Repo: tommy0103/obelisk
What's inside
Past Claude Code, Codex, Kimi Code, and Pi sessions -- queryable by your agent, browsable by you.
Obelisk has two sides that share one SQLite index:
Agent side โ the obelisk CLI owns the local runtime, while a separate
agent skill teaches coding agents how to search and query their session history.
The agent writes JS queries, runs them locally, and answers in plain language.
App side โ an Electron desktop app for humans to browse sessions, manage memories, view usage stats, and see weekly recap cards.
Both read from the same ~/.obelisk/obelisk.sqlite database. The indexer reads Claude Code transcripts from ~/.claude/projects, Codex transcripts from ~/.codex/sessions, Kimi Code sessions from ~/.kimi-code/sessions (or $KIMI_CODE_HOME/sessions), and Pi sessions from ~/.pi/agent/sessions.
Obelisk indexes every provider into the same SQLite schema instead of keeping separate databases. Rows carry a source value, and non-Claude IDs are provider-prefixed so they cannot collide.
Codex root threads become normal Obelisk sessions. Codex child threads are attached through the same subagents table when parent-thread metadata is available. Codex does not emit Claude-style workflow metadata, so workflow tables may be empty for Codex-only history.
Kimi session directories become one Obelisk session each. Main and child-agent
wire.jsonl streams are projected into the same messages, tools, summaries and
subagents tables. Undo/clear is handled as a full session replay, so retracted
wire records do not remain in the index.
Pi JSONL v1-v3 sessions are projected through the same provider contract. Pi's tree, branch summaries, compactions, durable leaf, retained checkpoint tail, custom messages, bash records, tool calls, token usage, and raw JSONL evidence stay inside the adapter; no Pi-specific database or renderer branch is needed. Active visibility follows Pi's own context rules: a retained tail replaces pre-compaction ancestors even when those physical entries still exist and bounds any later legacy compaction, while a legacy-only chain retains ancestors beginning at firstKeptEntryId. Missing parents form orphan branch roots, matching Pi's recovery behavior. Pi entries that the source explicitly superseded are stored as inactive: the app and normal agent queries omit them, while supported query helpers can include them with includeInactive: true. Display-suppressed or transport-only records remain hidden and are never returned by those helpers.
| Provider | Superseded-history support |
|---|---|
| Pi | Branch, leaf, and compaction state attests inactive history |
| Kimi Code | Undo/clear can attest supersession; preservation is a follow-up |
| Claude Code | The source does not attest rewind or current-leaf state |
| Codex | Sessions have no branching semantics |
Because Pi's explicit --session-id is project-local, Obelisk combines the header ID with a deterministic hash of the normalized header cwd; this keeps the identity stable across file moves and v1-v3 migration while allowing two projects to use the same custom ID. Replacement and deletion replay is provenance-aware, so stale session snapshots are retracted atomically; compaction and branch-summary model usage is included in usage totals.
For live app refresh, Obelisk watches the roots declared by every registered provider, including ~/.claude/projects, ~/.codex/sessions, ~/.kimi-code/sessions, and ~/.pi/agent/sessions. Codex's session_index.jsonl is used as lightweight title/update metadata during indexing, not as the message transcript source.
Pi chooses its session directory in this order: --session-dir, PI_CODING_AGENT_SESSION_DIR, sessionDir in settings, then the default under ~/.pi/agent/sessions. Obelisk automatically follows absolute or ~-prefixed environment/global settings and the project setting for Obelisk's launch cwd; a relative project setting is resolved against that cwd. CLI-only roots, relative environment/global settings, and project settings from another launch cwd cannot be inferred safely, so select the resolved directory in Obelisk Settings instead of letting Obelisk guess.
You can use obelisk like:
/obelisk ไธๆฌก auth bug ๆๅๅฐๅบๆนไบๅชไบๆไปถ๏ผไธบไปไน่ฟไนๆน
/obelisk ่ฟไธชๆไปถๆ่ฟๅจๅชไบ sessions ้่ขซๅๅคไฟฎๆน
/obelisk ๆพๅบๆ่ฟๅคฑ่ดฅ็ tool calls๏ผๅฎไปฌๅๅซๅ็ๅจๅชไบไปปๅก้
/obelisk ้ฃไธช review workflow ็ subagents ๅ่ช็ป่ฎบๆฏไปไน
/obelisk recap this week
The shortest path is to give the bootstrap guide directly to a coding agent with shell access. Paste this as a prompt into Claude Code, Codex, or another agent โ not into your terminal:
Install Obelisk by fetching and following this guide:
curl -fsSL https://raw.githubusercontent.com/tommy0103/obelisk/main/SKILL.md
The agent will ask before changing your machine, install and verify the CLI,
then ask whether the formal /obelisk skill should be installed for the current
project or globally. The bootstrap guide is only for one-time setup; it is not
the query skill itself.
Obelisk requires Node.js 22.13 or newer. Install the platform-neutral CLI:
npm install --global @obelisk-apps/cli
obelisk --version
On macOS, Linux, or WSL, the CLI-only installer is equivalent:
curl -fsSL https://raw.githubusercontent.com/tommy0103/obelisk/main/install.sh | sh
Then install the agent skill:
obelisk install
obelisk install delegates to the standard skills installer for
tommy0103/obelisk-skill.
Then in any Claude Code session:
/obelisk <your question>
First run builds the index (~5 seconds for 100 sessions). After that it rebuilds incrementally.
You ask a question
โ
Agent writes a JS query against the SQLite index
โ
Runs it via obelisk --query <script>
โ
Reads the JSON result, answers in natural language
Core API: search(), context(), sql(), plus structured helpers (sessions, memories, summaries, workflows, failures, fileHistory, etc).
When a retrieval produces a conclusion worth keeping, the agent proposes a markdown memory file. After user approval, it registers the file with obelisk --attune <script>. Memories are recalled via memories() in future sessions โ a synthesis cache, not a replacement for raw evidence.
A companion desktop app for browsing the same index maintained by the CLI or the app daemon.
Prebuilt releases are currently available for macOS from Releases. The source app can be run locally on macOS, Windows, and Linux.
Install Node.js 22 and npm, then run the app from its own package directory:
git clone https://github.com/tommy0103/obelisk.git
cd obelisk/app
npm ci
npm run dev
electron-vite starts the renderer dev server and launches Electron. On first run, Obelisk creates ~/.obelisk/obelisk.sqlite, indexes the available registered-provider transcripts, and then watches them for changes. The default sources include ~/.claude/projects, ~/.codex/sessions, ~/.kimi-code/sessions, and ~/.pi/agent/sessions; use Settings to point the app at different directories. On Windows, Obelisk also checks common WSL distributions for the Claude Code directory.
Cmd+Option+I on macOS or Ctrl+Shift+I on Windows/Linux.npm run dev;
their source changes are rebuilt by electron-vite.npm run dev -- --inspect=5858, then attach your debugger to port 5858.~/.obelisk index. Back it up
before testing destructive rebuilds. For an isolated run, launch with a
disposable home directory (HOME=/tmp/obelisk-dev npm run dev on
macOS/Linux, or set a temporary USERPROFILE first on Windows), then select
fixture source directories in Settings.better-sqlite3 provides prebuilt binaries for common platforms. If npm ci
falls back to compiling it locally, install the platform's C/C++ build tools and
run npm ci again.
| Layer | Source | What's captured |
|---|---|---|
| Sessions | Claude <project>/<sessionId>.jsonl; Codex sessions/YYYY/MM/DD/*.jsonl; Kimi session directories; Pi recursive *.jsonl | Title, project, timestamps, git branch, source |
| Messages | user + assistant turns | Full text, model, token usage, parent chain |
| Tool calls | every tool invocation | Tool name, input, file paths |
| Subagents | Claude subagents/agent-<id>.jsonl; Codex child threads | Agent type, description, full conversation |
| Workflows | Claude workflows/wf_<runId>.json | Script, result, agent count |
| Workflow agents | Claude subagents/workflows/wf_<runId>/ | Per-agent transcripts |
| Memories | registered markdown files | Conclusions linked to source sessions |
Full-text search via FTS5 covers all layers.
packages/core/ # @obelisk/core npm workspace (TypeScript + ESM)
โโโ src/
โ โโโ providers/
โ โ โโโ types.ts # Provider + TranscriptRecord contract
โ โ โโโ claude.ts # Claude Code adapter (line-incremental)
โ โ โโโ codex.ts # Codex adapter (full-reparse)
โ โ โโโ kimi.ts # Kimi Code adapter (session projection)
โ โ โโโ pi.ts # Pi adapter (tree-aware full-reparse)
โ โโโ session-detail.ts # Provider-independent transcript projection
โ โโโ persist.ts # Binding-agnostic record writer (upsert/merge)
โ โโโ tx.ts # Write transaction + connection config
โ โโโ write-coordinator.ts # Bounded retry policy
โ โโโ writer-lease.ts # Cross-process single-writer lease (SQLite lock DB)
โ โโโ core.ts # buildIndex / searchText / executeQuery / executeAttune
โ โโโ indexer.ts # Skill orchestration (discover โ persist โ finalize)
โ โโโ parsing.ts # Pure helpers (node:sqlite-free, app-consumable)
โ โโโ db.ts # node:sqlite lifecycle + migrations
โ โโโ query.ts # Query/attune sandbox API (helpers)
โ โโโ schema.sql # SQLite schema (single source of truth)
โโโ package.json
โโโ dist/ # Generated package JS, declarations, and schema
packages/cli/ # @obelisk-apps/cli npm workspace
โโโ src/obelisk.ts # CLI shell + skill installer delegation
โโโ scripts/build.mjs # Compiles CLI + readable Core into one package
โโโ package.json
โโโ dist/ # Generated platform-neutral npm payload
skill-doc/ # Source for the docs-only obelisk agent skill
โโโ SKILL.md # Query and memory workflow
โโโ references/ # Progressive-disclosure API/schema/pattern docs
โโโ recap/ # Per-card recap retrieval + writing references
app/ # Electron desktop app (electron-vite + Vue)
โโโ src/main/ # TypeScript main process (consumes shared core)
โโโ src/preload/ # CJS preload (sandbox)
โโโ src/renderer/ # Vue renderer
โโโ electron.vite.config.ts
packaging/ # Skill publish infrastructure
โโโ build-skill.mjs # Builds the docs-only skill artifact
โโโ skill-package.json
โโโ skill-README.md
โโโ skill-LICENSE # MIT (relicensed for the skill artifact)
โโโ publish-skill.sh
SKILL.md # Remote one-time CLI + skill bootstrap guide
install.sh # POSIX CLI-only installer
CONTEXT.md # Project glossary
docs/adr/ # Architecture decision records (0001โ0006)
The optional /obelisk recap flow is loaded only for explicit /obelisk recap intent.
It starts at skill-doc/references/recap/overview.md and proceeds card-by-card:
skill-doc/references/recap/pattern1-cover.md + skill-doc/references/recap/writing1-cover.mdskill-doc/references/recap/pattern2-thinking.md + skill-doc/references/recap/writing2-thinking.mdskill-doc/references/recap/pattern3-vibe.md + skill-doc/references/recap/writing3-vibe.mdskill-doc/references/recap/pattern4-workflow.md + skill-doc/references/recap/writing4-workflow.mdskill-doc/references/recap/pattern5-closing.md + skill-doc/references/recap/writing5-closing.mdpackages/core/dist/ is produced by npm run build:core. It is the compiled
internal @obelisk/core workspace: JavaScript, type declarations, and
schema.sql.packages/cli/dist/ is produced by npm run build:cli. It is the publishable
@obelisk-apps/cli payload: the thin command shell, readable compiled Core,
and schema.sql.dist/obelisk-skill/ is produced by npm run build:skill. It is the
docs-only skill artifact: SKILL.md, references, and skill package metadata.skills/obelisk/ in the
obelisk-skill repository; only README.md and LICENSE remain at the
repository root for npx skills discovery.Both directories are generated and should not be edited by hand. The Electron
app imports packages/core/src/ directly so electron-vite can bundle Core.
The index rebuilds incrementally โ only new or modified JSONL files are re-parsed.
When the optional app is running, it is the active indexer: it watches Claude
project files and builds in a worker thread. A fresh __app_heartbeat__ alone
means the daemon owns writes, so CLI invocations remain read-only; a separate SQLite
writer lease prevents cross-process writes from overlapping. The
__app_last_successful_build__ marker records index freshness, not ownership.
The CLI has zero runtime npm dependencies and uses Node 22's built-in
node:sqlite with FTS5. The formal skill contains instructions and references,
not a second executable runtime.
20K lines of scattered JSONL โ something the agent can search() and sql() against in milliseconds.
Contributions are welcome. Read CONTRIBUTING.md before opening a PR โ it is short, and it is written from what actually blocked past PRs rather than from generic style rules.
The parts worth knowing up front:
shell.*, fs.*, innerHTML, or DDL is
deny-by-default.CONTRIBUTING.md also carries hard constraints per area โ renderer/Electron,
provider adapters, schema migrations, main process, and indexing/daemon
ownership. The PR template mirrors them as per-area checklists.
AGPL-3.0 @tommy0103
.github/
assets/
app-screenshot.png
demo.png
obelisk-wordmark-d.svg
obelisk-wordmark-d2.svg
obelisk-wordmark-dark.svg
obelisk-wordmark-l.svg
obelisk-wordmark-l2.svg
obelisk-wordmark-light.svg
pull_request_template.md
workflows/
cli.yml
publish-skill.yml
.gitignore
app/
electron.vite.config.ts
package-lock.json
package.json
src/
main/
file-reference.ts
index.ts
indexer-service.ts
indexer-worker-client.ts
indexer-worker.ts
indexer.ts
provider-settings.ts
recap-capture-query.ts
preload/
index.ts
renderer/
index.html
src/
activity-ledger.mjs
App.vue
assets/
recap-cards.html
components/
ActivityLedger.vue
ActivityLedgerRow.vue
FlapNumber.vue
recap/
archetypes.js
card-base.css
ClosingCard.vue
CoverCard.vue
PathCard.vue
seals.js
VibeCard.vue
WorkflowCard.vue
SessionImage.ce.vue
SessionTimelineRow.vue
data.js
file-references.mjs
flap-number.mjs
keyboard-shortcuts.mjs
main.js
markdown-image-renderer.js
mock/
recap-2026-W24.json
router.js
session-disclosures.mjs
session-global-refresh.mjs
session-image-contract.js
session-image-element.js
session-live-reload.mjs
session-live.mjs
session-reader-state.mjs
session-timeline-items.mjs
session-timeline-presentation.mjs
session-timeline-scroll-policy.mjs
session-timeline-viewport.mjs
session-timeline.mjs
session-user-scroll.mjs
sidebar-projects.mjs
source-catalog.mjs
store.js
tool-renderer.js
utils.js
views/
Activity.vue
MemoryList.vue
RecapDetail.vue
RecapExport.vue
RecapList.vue
SessionDetail.vue
SessionList.vue
Settings.vue
SubagentDetail.vue
styles/
base.css
detail.css
list.css
sidebar.css
toolbar.css
shared/
ipc-types.ts
session-detail-assembly.mjs
session-detail-types.ts
session-patch.mjs
tests/
electron-concurrency-child.mjs
electron-concurrency.mjs
electron-file-references.mjs
electron-session-images.mjs
electron-session-reader-state.mjs
electron-session-virtualization.mjs
run-electron-suites.mjs
tsconfig.json
yarnball.md
CONTEXT.md
CONTRIBUTING.md
docs/
adr/
0001-parse-core-and-persist-layers.md
0002-two-tier-runtime-contract.md
0003-core-typescript-esm-precompiled.md
0004-skill-artifact-readable-not-bundled.md
0005-app-electron-vite-ts-esm.md
0006-write-transaction-rollback-and-concurrency.md
0007-canonical-transcript-session-detail-seam.md
superpowers/
specs/
2026-06-02-obelisk-claude-code-benchmark-design.md
eslint.config.js
install.sh
LICENSE
package-lock.json
package.json
packages/
cli/
package.json
README.md
scripts/
build.mjs
src/
obelisk.ts
tsconfig.build.json
core/
package.json
src/
core.ts
db.ts
indexer.ts
parsing.ts
persist.ts
provider-indexing.ts
provider-settings.ts
providers/
builtins.ts
claude.ts
codex.ts
kimi.ts
pi.ts
registry.ts
types.ts
query.ts
schema-migrations.ts
schema.sql
session-detail.ts
sqlite-types.ts
tx.ts
write-coordinator.ts
writer-lease.ts
tsconfig.build.json
tsconfig.json
packaging/
build-skill.mjs
publish-skill.sh
skill-LICENSE
skill-package.json
skill-README.md
stage-skill-repo.sh
PRODUCT.md
README.md
skill-doc/
references/
api-reference.md
pitfalls.md
query-patterns.md
recap/
recap-patterns.md
recap-writing.md
overview.md
pattern1-cover.md
pattern2-thinking.md
pattern3-vibe.md
pattern4-workflow.md
pattern5-closing.md
writing1-cover.md
writing2-thinking.md
writing3-vibe.md
writing4-workflow.md
writing5-closing.md
retrieval-semantics.md
schema.md
SKILL.md
SKILL.md
skills-lock.json
tests/
app-activity-ledger.test.mjs
app-activity-usage.test.mjs
app-file-reference.test.mjs
app-file-references.test.mjs
app-indexer-service.test.mjs
app-indexer-worker-client.test.mjs
app-indexer.test.mjs
app-kimi-index.test.mjs
app-main-settings.test.mjs
app-pi-index.test.mjs
app-provider-indexer.test.mjs
app-rollback-guard.test.mjs
app-tool-renderer.test.mjs
app-writer-lease.test.mjs
claude-parse.test.mjs
cli-bootstrap-install.test.mjs
cli-package.test.mjs
cli-test-helpers.mjs
codex-index.test.mjs
codex-parse.test.mjs
codex-replay-tool-identity.test.mjs
contract-helper-shapes.test.mjs
core-package-build.test.mjs
daemon-arbitration.test.mjs
db-schema.test.mjs
fixtures/
pi/
harness-checkpoint-fork.jsonl
harness-null-leaf.jsonl
harness-source.jsonl
pi-0.83.0-context-oracle.mjs
real-model-session.jsonl
tool-session.jsonl
flap-number.test.mjs
incremental-index.test.mjs
indexer-upsert-drift.test.mjs
indexer.test.mjs
kimi-parse.test.mjs
kimi-runtime.test.mjs
markdown-image-renderer.test.mjs
persist.test.mjs
pi-parse.test.mjs
pi-randomized-differential.test.mjs
pi-runtime.test.mjs
provider-inventory.test.mjs
provider-registry.test.mjs
provider-schema-stability.test.mjs
provider-session-detail.test.mjs
provider-settings.test.mjs
publish-skill-layout.test.mjs
query-provider-raw.test.mjs
query.test.mjs
recap-capture-query.test.mjs
recap-patterns.test.mjs
renderer-shortcuts.test.mjs
runtime-cli-envelope.test.mjs
runtime.test.mjs
session-detail-assembly.test.mjs
session-disclosures.test.mjs
session-global-refresh.test.mjs
session-live-patch.test.mjs
session-live-reload.test.mjs
session-live.test.mjs
session-reader-state.test.mjs
session-timeline-items.test.mjs
session-timeline-scroll-policy.test.mjs
session-timeline-virtualization.test.mjs
session-timeline.test.mjs
session-user-scroll.test.mjs
settings-view.test.mjs
sidebar-projects.test.mjs
skill-doc-artifact.test.mjs
source-catalog.test.mjs
write-transaction.test.mjs
writer-lease.test.mjs
tsconfig.build.json
tsconfig.jsonFAQ
obelisk is a Claude Code plugin with 1 hand-picked skill for development work, indexed on Flowy. Install it with the command on its page. It includes obelisk. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.