Your AI coding sessions forget.
Gari keeps what you decided.

Gari reads your Claude Code sessions every 10 minutes, keeps the decisions and open questions in your own words, and hands them to the next session — so you don't explain it twice.

Open source (MIT) · needs a Claude API key · your data stays on your Mac

Demo above: a Claude Code session on Thursday, Gari tidying it into decision cards, and Friday's session starting from Gari's briefing instead of a recap.

Decisions, not transcripts

Every 10 minutes Gari reads the new turns in your CLI logs and keeps only what mattered: decisions, open questions, your corrections, and what went well. Each card quotes your own words — the AI's claims never become memory.

reads
~/.claude/projects (Claude Code)
writes
store/cards/YYYY-MM-DD.jsonl
model
distill_model: "haiku"
$ tail -4 store/cards/2026-10-08.jsonl
{"type": "decision", "text": "Pricing page offers one plan, monthly only",
 "quote": "monthly only for now", "tool": "claude", "project": "launch-site"}
{"type": "decision", "text": "Annual plan waits until 50 paying users",
 "quote": "annual after 50 users", "tool": "claude", "project": "launch-site"}
{"type": "pending", "text": "FAQ section is still empty — needs copy before launch",
 "quote": "do the faq later", "tool": "claude", "project": "launch-site"}
{"type": "correction", "text": "Don't add an annual tier to the pricing table",
 "quote": "no, drop the annual one", "tool": "claude", "project": "launch-site"}

# launch-site

Identity: marketing site for the v1 launch
Why it exists: first place new users land from the waitlist email
Success criteria: UNDEFINED — no metric in the cards yet
Valid decisions
  • One plan, monthly only
  • Annual plan waits until 50 paying users
Open pendings
  • FAQ section is still empty
store/wiki/launch-site.md · UNDEFINED slots become tomorrow's question
$ gari northstar
Gari north star — zero re-explaining (last 7 days vs previous 7)
  Re-explanations (repeat cards): 2  (prev 7)  ↓ good
  Context handoffs (briefings + answers): 38  (prev 21)  ↑ good
the one number every feature is judged against · example output

A report waiting at 9

Each morning Gari turns yesterday into what got decided, what's still open, and one step for today — plus a short review held to a senior product bar, not to yesterday's you.

when
report_hour: 9 (launchd)
where
reports/2026-10-09.md
model
deep_model: "sonnet"
reports/2026-10-09.md

Gari morning report — 2026-10-09

Overnight tidy-up is done. 14 cards from yesterday.
Decided
  • [launch-site] One plan, monthly only
  • [api] Rate limit stays at 60 req/min per key
Pending — pick these up today
  • (c41f09a2) FAQ section is still empty
Today's one step (north star)
Next step: write the three FAQ answers people asked about in the waitlist replies
Why: the launch is blocked on copy, not code
Mentor review
Critique: the pricing decision came before anyone wrote down who it's for. Today's drill: when you lock a price, write the buyer in one line first.
gari resolve c41f09a2 — close a pending item by its 8-character ID

Ask the fish

Click the pet and ask. Memory questions come back in seconds with where they came from. Planning questions go to a deeper model that lays out the forks before recommending one — and ends with a nudge when you're skipping something.

memory
ask_model: "haiku"
judgment
deep_model: "sonnet" + 11 methodology sources
also
gari ask "…" · Telegram gateway
Gari's chat panel answering a memory question with a nudge

Hand it off. It checks the work.

Say what you want, approve with "go". Gari packs the context into instructions, hands it to Claude Code in an isolated git worktree, then opens the real files before calling it done. Merging stays your call.

isolation
git worktree, never your working copy
done means
output verified in the repo
never
auto-merge, auto-push
zsh — ~/Projects/launch-site
$ gari do "add the three FAQ answers from the waitlist replies" --write
Gari: handing ~/Projects/launch-site to claude (write allowed)…
Delegated — I'll report with a notification when it's done. (background)
 
[worktree] The output is in an isolated copy (original untouched).
           After review, one `gari merge wt-20261009-1012` merges it.
 
$ gari merge wt-20261009-1012
Merged: gari/wt-20261009-1012 → launch-site (copy removed, branch cleaned up). Pushing is up to you.

Runs on the Claude API

One key in secrets.env. Text-only work — distilling, memory answers, judging nudges, wikis, the morning review — goes straight to the Messages API. Work that needs tools runs through Claude Code on the same key. Aliases like haiku resolve to the newest model.

metered
store/usage.jsonl, per call
budget
monthly_budget_usd warns once
config
prices_per_mtok for dollar totals
zsh — ~/gari
$ gari cost 7
Gari LLM usage — last 7 days: 412 calls, $3.8120
  ask-deep      31 calls  $1.4410
  distill      226 calls  $0.9032
  mentor         7 calls  $0.5121
  wiki          18 calls  $0.4380
  ask           96 calls  $0.3307
  nag-judge     34 calls  $0.1870
 
$ tail -1 store/usage.jsonl
{"kind": "distill", "model": "claude-haiku-…", "via": "api", "sec": 2.1,
 "tokens": {"in": 6182, "out": 311, "cache_read": 4096}, "ok": true}
illustrative numbers — your own appear after a day of use

Install

macOS, Python 3, Xcode Command Line Tools, and a Claude API key from console.anthropic.com. Claude Code is optional — it's needed for gari do and document search.

1 · Clone and install
git clone https://github.com/airudotsh/gari.git ~/gari && cd ~/gari && ./install.sh

Builds the pet, registers hooks and schedules, asks four onboarding questions.

2 · Add your key
echo 'ANTHROPIC_API_KEY=sk-ant-…' >> ~/gari/secrets.env

The file is created with mode 600 and is never committed.

3 · Check
gari doctor

Live call, schedules, hooks, last sweep. Then keep working — the first morning report arrives on day two.

Questions

What leaves my Mac?

Only model calls. To build cards, excerpts of new conversation turns are sent to the Claude API with your key. There's no Gari server, no telemetry, and your original logs are never copied — Gari only remembers how far it has read.

Which tools does it read?

Claude Code session logs. Codex and gjc logs are also supported if you use them. Use allowlist_paths / denylist_paths in config.json to decide which projects are collected at all.

Does it inject itself into my other agents?

At Claude Code session start, a hook prints a short factual briefing — recent decisions and open items, explicitly marked as not instructions. You can remove the hook and pull it on demand with gari brief instead.

What does it cost?

Whatever your API usage costs. Most calls are small haiku distills; every call is logged with token counts, and gari cost shows the spend by kind. A monthly budget gate warns you once if you go over.

Will it change my code?

Only when you delegate and approve. Delegated work happens in an isolated git worktree; nothing is merged or pushed without gari merge, and pushing is always yours.

Windows or Linux?

Not yet. Scheduling uses launchd and the pet is a native Cocoa app.

About Airu

Airu is an independent software company. Gari is its first product: a local-first agent for people who build software with AI coding tools. It turns decisions made inside Claude Code sessions into a ledger, briefs the next session, and points out what is being missed.

Company
Airu (airu.sh)
Product
Gari — macOS app and CLI
Stage
Pre-release, bootstrapped (no outside funding)
Built on
Claude API: the Messages API for text tasks (distilling conversations into cards, memory answers, nudge judging, wikis, morning reviews); Claude Code for tool use (repository reading, web search, delegated coding)
Models
Claude Haiku for distillation and memory answers; Claude Sonnet for planning, mentor reviews and verification
Timeline
First version July 2026; Claude API-first rebuild October 2026
Next
30-day early-access pilot with about 20 users, measuring cost per user per day (estimated under $2)
Source
github.com/airudotsh/gari (MIT, history from July 2026)
Contact
airu@airu.sh