File created, modified, or deleted. Color border = file type.
Default: expanded. Never collapsed.
Pragma wraps Claude Code and parses its output in real time.
Every action becomes a typed atom — color-coded, collapsible, searchable.
You see what the agent did, not what it said it did.
The current app is Pragma Symphony. The earlier open-source line is still on GitHub under the MIT licence.
You run Claude Code. You get 400 lines scrolling at machine speed. 90% is noise. The 10% that matters — a file touched out of scope, a missing translation, an unexpected behavior — disappears in the scroll.
Pragma fixes this.
Pragma injects the Pragma Protocol into Claude Code via --append-system-prompt. The session starts.
Pragma reads the structured NDJSON stream line by line and atomizes every event: file touches, diffs, tool calls, errors, notes.
Atoms appear in a live feed — typed, color-coded, collapsible. The center panel tracks the current phase. You approve, confirm, or stop.
Pragma uses --output-format stream-json --verbose. Nothing is intercepted at the shell level — it’s Rust parsing a structured protocol.
Everything Claude does maps to one of these atom types. Each renders differently in the stream.
File created, modified, or deleted. Color border = file type.
Default: expanded. Never collapsed.
Structured patch of the change. Expandable inline.
Default: collapsed.
External tool call: Bash, Read, Glob, Grep…
Default: collapsed.
Execution error. Never collapsed — always foregrounded.
Sticky until dismissed.
Free-text output — fallback bucket for untyped content.
Default: collapsed.
User prompt or turn separator.
Default: expanded.
FILE_TOUCH and DIFF use the file type color, not the atom type color.
.ts .rs .py .vue .js .go
.json .toml .yaml .env
.html .md .xml
.css .scss
.lock .sh Dockerfile
.sql .csv .sqlite
Pragma doesn’t just stream atoms. It tracks where Claude is in the task and surfaces the right UI for each phase.
A session is rarely the whole story. Symphony groups sessions into projects, and can hand what it learns to the rest of the ecosystem instead of leaving it in a scrollback buffer.
Lexis is the only thing Pragma sends over the network, and only once you enable it. Everything else stays in
~/.pragma/pragma.db on your machine. Plain HTTP is accepted only for loopback addresses.
models key in
~/.pragma/settings.json maps each name in the interface to the id passed to Claude Code,
so a newly released model can be adopted without waiting for a new build.
pragmadocs/ in the working dir. Claude sees them via --add-dir.
pragma export <session-id>).
~/.pragma/pragma.db.
The Lexis integration is the one exception, and it stays off until you turn it on.
Rust (Tauri v2) backend · Vue 3 + Pinia frontend · SQLite (WAL + FTS5) · NDJSON parser written in Rust.
Pragma started as an open-source project and grew into the app described on this page. Both lines share the same foundation — the protocol, the atoms, the phases — but only one of them is still moving.
The line that goes forward. Projects, Lexis memory, Morphē handoffs, and the Fable model are here, and future work lands here. The source is no longer published.
Download →The original, public and forkable. It does not track Symphony: no projects, no Lexis, no Fable. Take it if what you want is the source.
View on GitHub →Everything in noema.tools is an atom — a minimal, typed, addressable unit of meaning. Pragma atomizes the actions an AI agent takes.
And the tools talk to each other: your Claude Code sessions in Pragma become project memory that Morphē reads back as a live map of the real code.
See how the ecosystem fits together →Available for Windows and Linux. Local-first. Free to use. Claude Code must be installed separately — Pragma drives it, it does not replace it.