diff --git a/website/.nojekyll b/website/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/website/assets/checkpoint-detail.png b/website/assets/checkpoint-detail.png new file mode 100644 index 0000000..f788d2e Binary files /dev/null and b/website/assets/checkpoint-detail.png differ diff --git a/website/assets/cli-state-and-metrics.png b/website/assets/cli-state-and-metrics.png new file mode 100644 index 0000000..de88d95 Binary files /dev/null and b/website/assets/cli-state-and-metrics.png differ diff --git a/website/assets/lineage-dashboard.png b/website/assets/lineage-dashboard.png new file mode 100644 index 0000000..d18fe5a Binary files /dev/null and b/website/assets/lineage-dashboard.png differ diff --git a/website/index.html b/website/index.html new file mode 100644 index 0000000..730b0eb --- /dev/null +++ b/website/index.html @@ -0,0 +1,230 @@ + + + + + + Smriti — Version control for project reasoning state + + + + + + + + + + + +
+ + +
+
+

Code has Git.
Multi-agent reasoning does not.

+

Smriti is version control for project reasoning state — versioned, structured, branchable snapshots of what was decided, what's still open, and what each agent is doing right now. So multiple coding agents can coordinate on the same codebase without overwriting each other's thinking.

+ +
+
+ + +
+
+

The problem

+

Run Claude Code and Codex on the same project — or two Claude Code sessions — and they share no state. Each agent starts from scratch, re-discovers decisions already made, and occasionally duplicates work another agent is already doing.

+

The standard workaround is HANDOFF.md / NOTES.md. That works until reasoning needs to branch, be compared, be restored, or be validated against the actual repo. Markdown is prose; it stops working the moment more than one agent needs to coordinate.

+
+
+ + +
+
+

The Git analogy

+

Git preserves code history: what changed, when, by whom, on which branch. Smriti preserves project reasoning: what was decided, what's still open, what each agent is doing right now, and how the recorded state compares to the live repo.

+
+ + + + + + + + + + + + + + +
Code (Git)Reasoning state (Smriti)
commitcheckpoint — structured snapshot of reasoning state
branchfork from any checkpoint to explore an alternative
diffsmriti compare — structured diff of two checkpoints
revert / checkoutsmriti restore — return to a clean checkpoint
working-tree driftrepo-state drift — flags when the repo has moved past the checkpoint
—active claims — advisory coordination so agents see each other coming
—freshness checks — "has state moved since my base?" before checkpointing
—structured tasks + IDs — collision detection at the task level
+
+

The first five rows extend the Git analogy. The last three are coordination primitives Git doesn't have — because Git is built for one human committing serial code, and Smriti is built for multiple agents writing reasoning state in parallel.

+
+
+ + +
+
+

How it works

+
    +
  1. +

    1. Attach the repo

    +

    smriti init my-project creates a Space, installs the Claude Code and Codex skill packs into the project directory, writes the SessionStart hook, and drops a .smriti.json at the repo root. Per-project — attach once, multiple repos isolate cleanly.

    +
  2. +
  3. +

    2. Agents read state first

    +

    At session start, the agent reads the current state brief — objective, decisions, assumptions, tasks, open questions, artifacts — plus the ## Repo state section comparing the working repo to the HEAD and branch the last checkpoint recorded.

    +
  4. +
  5. +

    3. Declare claims before working

    +

    The agent calls smriti claim with a scope before starting work. Claims are advisory, time-bounded, and visible in every other agent's state brief. Two agents see each other coming.

    +
  6. +
  7. +

    4. Checkpoint at inflection points

    +

    At a real decision or handoff the agent writes a structured checkpoint. The next session — same agent or a different one — reads it as if it had been there for the work.

    +
  8. +
+

Inside an attached repo, the everyday commands resolve the Space automatically — no <space> argument needed:

+
smriti state                   # continuation brief — read first each session
+smriti current                 # compact snapshot: direction, attention, open work
+smriti metrics                 # project coordination KPIs
+
+
+ + +
+
+

What Smriti is not

+
+
+

Not markdown

+

HANDOFF.md / NOTES.md work until you need claims, freshness, branching, drift detection, or coordination at all.

+
+
+

Not memory

+

Smriti stores structured snapshots at inflection points, not a running log of everything an agent said or saw. State is queryable, not narrative.

+
+
+

Not an orchestrator

+

Smriti describes state. It does not assign tasks, schedule work, or route agents. Agents make their own decisions from shared metadata.

+
+
+

What markdown can't reliably provide

+
    +
  • Active claims — who is working on what right now, with a TTL
  • +
  • Freshness checks — has the state moved since my base before I checkpoint?
  • +
  • Task IDs tied to claims — collision detection at the task level
  • +
  • Repo-state drift detection — recorded state vs the live repo, with N-commits-ahead / branch-mismatch surfacing
  • +
  • Branchable, comparable, restorable reasoning — smriti fork, smriti compare, smriti restore
  • +
  • A current-state surface — one well-defined brief multiple agents read at session start
  • +
+
+
+ + +
+
+

Built with Smriti

+

The coordination substrate was built with Claude Code and Codex working in parallel on the same codebase, coordinating through Smriti's own state. smriti metrics smriti-dev:

+
+
117checkpoints
+
70 / 47Claude Code / Codex
+
61cross-agent continuations
+
77claims, 96% completion
+
7milestones
+
+

The strongest proof: two agents started near-simultaneously, read the same task surface (four tasks with stable IDs and intent hints), and independently picked different complementary tasks — one chose [test], the other chose [implement] — without any human routing. No orchestrator. No task queue. Just structured metadata on shared state.

+
+
+ + +
+
+

What it looks like

+
+ Smriti dashboard — project timeline with checkpoint cards, author badges, and attention signals +
Project timeline — checkpoint cards with author attribution, note indicators, and needs-attention signals.
+
+
+ Smriti CLI — output of smriti state --compact and smriti metrics +
What every agent reads at session start (smriti state --compact) and the project health KPIs (smriti metrics).
+
+
+ Smriti checkpoint detail with structured tasks and a milestone note +
A structured checkpoint — tasks with intent badges and stable IDs, plus a founder milestone note.
+
+
+
+ + +
+
+

Try it in 5 minutes

+

The core coordination loop runs entirely on a local SQLite file. No Docker, no API keys, no cloud required. API keys come in only for optional LLM-assisted features (extract, draft, review).

+

You'll need Python 3.11+ and Node 20.19+ / 22.12+.

+
    +
  1. +

    1. Install

    +
    git clone https://github.com/himanshudongre/smriti
    +cd smriti
    +make setup-local              # backend venv + CLI + frontend, no Docker
    +make dev-local                # backend on http://localhost:8000
    +source backend/.venv/bin/activate
    +
  2. +
  3. +

    2. Confirm — smriti doctor

    +
    smriti doctor
    +

    Backend reachable, CLI/backend versions aligned, providers configured. If anything's off, doctor tells you what.

    +
  4. +
  5. +

    3. See it work — smriti quickstart

    +
    smriti quickstart
    +

    Seeds a demo Space (a rate-limit feature built by two agents, with a branch explored and dropped) and prints a guided ~3-minute walkthrough. Works without API keys.

    +
  6. +
  7. +

    4. Attach your own project

    +
    cd /path/to/your-project
    +smriti init my-project
    +

    Writes the skill packs, the SessionStart hook, and .smriti.json into the project directory, binding the repo to the new Space.

    +
  8. +
  9. +

    5. Daily workflow — no <space> needed

    +
    smriti state                   # continuation brief
    +smriti current                 # compact snapshot
    +smriti metrics                 # coordination KPIs
    +
  10. +
+
+
+ + +
+
+

Try it. Star it. Build with it.

+

Smriti is open source. It works today for solo builders running multi-agent workflows.

+ +
+
+ +
+ + + + diff --git a/website/styles.css b/website/styles.css new file mode 100644 index 0000000..68ddec8 --- /dev/null +++ b/website/styles.css @@ -0,0 +1,499 @@ +/* ========================================================================== + Smriti — landing page styles + Pure HTML + CSS. No JS framework, no webfonts. System font stack so the + page loads instantly anywhere. + ========================================================================== */ + +/* ── Tokens ──────────────────────────────────────────────────────────────── */ + +:root { + --bg: #0c0c10; + --bg-elevated: #15151b; + --bg-code-inline: rgba(255, 255, 255, 0.06); + --border: #26262e; + --border-subtle: rgba(255, 255, 255, 0.08); + --text: #e8e8ec; + --text-muted: #a0a0aa; + --accent: #f5c773; + --accent-hover: #f8d28d; + --accent-on: #1a1208; +} + +/* ── Reset + base ────────────────────────────────────────────────────────── */ + +*, *::before, *::after { box-sizing: border-box; } + +html { + -webkit-text-size-adjust: 100%; + scroll-behavior: smooth; +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, + Ubuntu, Cantarell, "Helvetica Neue", Arial, sans-serif; + font-size: 17px; + line-height: 1.6; + color: var(--text); + background: var(--bg); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +img { max-width: 100%; height: auto; display: block; } + +a { color: var(--accent); text-decoration: none; } +a:hover { text-decoration: underline; } + +code, pre { + font-family: ui-monospace, "SF Mono", Menlo, "Cascadia Mono", "Roboto Mono", + "Liberation Mono", Consolas, monospace; + font-size: 0.92em; +} + +code { + background: var(--bg-code-inline); + border: 1px solid var(--border-subtle); + padding: 0.1em 0.4em; + border-radius: 4px; + color: var(--text); +} + +pre { + background: var(--bg-elevated); + border: 1px solid var(--border); + border-radius: 6px; + padding: 1rem 1.25rem; + overflow-x: auto; + line-height: 1.55; + margin: 1rem 0; +} + +pre code { + background: transparent; + border: none; + padding: 0; +} + +/* ── Layout container ────────────────────────────────────────────────────── */ + +.container { + max-width: 880px; + margin: 0 auto; + padding: 0 1.5rem; +} + +/* ── Header / nav ────────────────────────────────────────────────────────── */ + +.site-header { + border-bottom: 1px solid var(--border); + padding: 1.1rem 0; + position: sticky; + top: 0; + background: rgba(12, 12, 16, 0.85); + backdrop-filter: blur(8px); + -webkit-backdrop-filter: blur(8px); + z-index: 10; +} + +.header-row { + display: flex; + align-items: center; + justify-content: space-between; +} + +.brand { + font-weight: 700; + font-size: 1.1rem; + letter-spacing: -0.01em; + color: var(--text); +} + +.brand:hover { text-decoration: none; } + +.site-header nav { + display: flex; + gap: 1.5rem; + font-size: 0.95rem; +} + +.site-header nav a { + color: var(--text-muted); +} + +.site-header nav a:hover { color: var(--text); text-decoration: none; } + +/* ── Hero ────────────────────────────────────────────────────────────────── */ + +.hero { + padding: 5rem 0 4rem; +} + +.hero h1 { + font-size: clamp(2.2rem, 6vw, 3.6rem); + line-height: 1.1; + letter-spacing: -0.02em; + margin: 0 0 1.5rem; + font-weight: 700; +} + +.hero-em { color: var(--accent); } + +.hero-sub { + font-size: 1.15rem; + color: var(--text-muted); + max-width: 680px; + margin: 0 0 2.5rem; + line-height: 1.55; +} + +.hero-sub em { + color: var(--text); + font-style: normal; + font-weight: 500; +} + +.hero-cta { + display: flex; + gap: 0.75rem; + flex-wrap: wrap; +} + +.btn { + display: inline-block; + padding: 0.7rem 1.4rem; + border-radius: 6px; + font-weight: 500; + font-size: 0.95rem; + text-decoration: none; + border: 1px solid transparent; + transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease; + cursor: pointer; +} + +.btn-primary { + background: var(--accent); + color: var(--accent-on); +} + +.btn-primary:hover { + background: var(--accent-hover); + text-decoration: none; +} + +.btn-secondary { + background: transparent; + color: var(--text); + border-color: var(--border); +} + +.btn-secondary:hover { + border-color: var(--text-muted); + text-decoration: none; +} + +/* ── Sections (shared) ───────────────────────────────────────────────────── */ + +.section { + padding: 4rem 0; + border-top: 1px solid var(--border); +} + +.section h2 { + font-size: clamp(1.6rem, 3vw, 2.1rem); + margin: 0 0 1.25rem; + line-height: 1.2; + letter-spacing: -0.01em; +} + +.section h3 { + font-size: 1.05rem; + margin: 0 0 0.5rem; + letter-spacing: -0.01em; +} + +.section .subhead { + margin-top: 2.5rem; + margin-bottom: 1rem; + font-size: 1.05rem; + color: var(--text); +} + +.section p { margin: 0 0 1rem; } + +.section .lede { + font-size: 1.1rem; + max-width: 740px; +} + +.section em { + font-style: italic; + color: var(--text); +} + +.section .caption { + font-size: 0.92rem; + color: var(--text-muted); + margin-top: 1.25rem; + max-width: 720px; +} + +.section .muted { color: var(--text-muted); } + +/* ── Git analogy table ───────────────────────────────────────────────────── */ + +.analogy-table { + margin: 1.5rem 0 0; + overflow-x: auto; +} + +.analogy-table table { + width: 100%; + border-collapse: collapse; + font-size: 0.95rem; +} + +.analogy-table th, +.analogy-table td { + padding: 0.75rem 1rem; + text-align: left; + border-bottom: 1px solid var(--border); + vertical-align: top; +} + +.analogy-table th { + font-weight: 600; + font-size: 0.8rem; + text-transform: uppercase; + letter-spacing: 0.06em; + color: var(--text-muted); +} + +.analogy-table td:first-child { + width: 32%; + color: var(--text-muted); + font-family: ui-monospace, "SF Mono", Menlo, monospace; + font-size: 0.9rem; +} + +.analogy-table tr:last-child td { + border-bottom: none; +} + +/* ── How it works ────────────────────────────────────────────────────────── */ + +.how-steps { + list-style: none; + padding: 0; + margin: 2rem 0; + display: grid; + gap: 1rem; +} + +.how-steps > li { + padding: 1.25rem 1.5rem; + background: var(--bg-elevated); + border: 1px solid var(--border); + border-radius: 8px; +} + +.how-steps h3 { + color: var(--accent); + font-size: 1rem; + margin-bottom: 0.5rem; +} + +.how-steps p { + margin: 0; + color: var(--text-muted); +} + +.how-steps p code { color: var(--text); } + +/* ── What Smriti is not ──────────────────────────────────────────────────── */ + +.not-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 1rem; + margin: 1.5rem 0; +} + +.not-item { + background: var(--bg-elevated); + border: 1px solid var(--border); + border-radius: 8px; + padding: 1.25rem; +} + +.not-item h3 { + color: var(--accent); + font-size: 1rem; + margin-bottom: 0.5rem; +} + +.not-item p { + margin: 0; + color: var(--text-muted); + font-size: 0.95rem; +} + +.constraints { + list-style: none; + padding: 0; + margin: 1rem 0 0; +} + +.constraints li { + padding: 0.65rem 0; + border-bottom: 1px solid var(--border-subtle); + color: var(--text-muted); + font-size: 0.95rem; +} + +.constraints li:last-child { border-bottom: none; } + +.constraints strong { + color: var(--text); + font-weight: 600; +} + +/* ── Metrics / proof ─────────────────────────────────────────────────────── */ + +.metrics { + display: grid; + grid-template-columns: repeat(5, 1fr); + gap: 0.75rem; + margin: 2rem 0; +} + +.metric { + background: var(--bg-elevated); + border: 1px solid var(--border); + border-radius: 8px; + padding: 1.25rem 0.75rem; + text-align: center; +} + +.metric-value { + display: block; + font-size: clamp(1.5rem, 2.5vw, 1.9rem); + font-weight: 700; + color: var(--accent); + line-height: 1.1; + margin-bottom: 0.4rem; + letter-spacing: -0.01em; +} + +.metric-label { + font-size: 0.82rem; + color: var(--text-muted); + display: block; + line-height: 1.35; +} + +.proof-text { + color: var(--text-muted); + max-width: 740px; +} + +/* ── Screenshots ─────────────────────────────────────────────────────────── */ + +.screenshots figure { + margin: 1.75rem 0 2.5rem; +} + +.screenshots img { + border: 1px solid var(--border); + border-radius: 8px; + width: 100%; +} + +.screenshots figcaption { + font-size: 0.92rem; + color: var(--text-muted); + margin-top: 0.75rem; + text-align: center; + font-style: italic; +} + +.screenshots figcaption code { font-style: normal; } + +/* ── Try it ──────────────────────────────────────────────────────────────── */ + +.try-steps { + list-style: none; + padding: 0; + margin: 1.75rem 0 0; +} + +.try-steps > li { margin-bottom: 1.75rem; } + +.try-steps h3 { + color: var(--text); + margin-bottom: 0.6rem; + font-size: 1.1rem; +} + +.try-steps p { + color: var(--text-muted); + margin-top: 0.5rem; +} + +/* ── CTA + footer ────────────────────────────────────────────────────────── */ + +.cta { + text-align: center; +} + +.cta p { + color: var(--text-muted); + max-width: 600px; + margin: 0 auto 0.5rem; +} + +.cta-buttons { + display: flex; + gap: 0.75rem; + justify-content: center; + margin-top: 1.5rem; + flex-wrap: wrap; +} + +.site-footer { + border-top: 1px solid var(--border); + padding: 2rem 0; + font-size: 0.9rem; + color: var(--text-muted); + text-align: center; +} + +.site-footer p { margin: 0; } +.site-footer a { color: var(--text-muted); } +.site-footer a:hover { color: var(--text); text-decoration: none; } + +/* ── Responsive ──────────────────────────────────────────────────────────── */ + +@media (max-width: 720px) { + body { font-size: 16px; } + .hero { padding: 3.5rem 0 2.5rem; } + .hero-sub { font-size: 1.05rem; } + .section { padding: 3rem 0; } + .not-grid { grid-template-columns: 1fr; } + .metrics { + grid-template-columns: repeat(2, 1fr); + } + .metrics .metric:nth-child(5) { grid-column: 1 / -1; } + .analogy-table { font-size: 0.88rem; } + .analogy-table th, + .analogy-table td { padding: 0.6rem 0.6rem; } + .analogy-table td:first-child { width: 38%; } + .site-header nav { gap: 0.9rem; font-size: 0.9rem; } + .container { padding: 0 1.25rem; } + pre { font-size: 0.85rem; } +} + +@media (max-width: 420px) { + .hero-cta { flex-direction: column; align-items: stretch; } + .hero-cta .btn { text-align: center; } +}