A coding companion for CLI agents

It codes with you.
And grows with you.

Siltpoke is an independent second mind that rides along while you build with your CLI coding agent. It catches what you missed, helps you understand the codebase you shipped, and learns what you actually care about — a pet that earns its opinions, remembers your projects, and is wholly yours. On the token budget you already have.

$ git clone github.com/Victoriakaey/siltpoke ~/siltpoke
$ cd ~/siltpoke && bun install
$ bun run setup_
Install in 90 seconds ★ Star on GitHub
siltpoke · just now

 /\_/\
 (o.o)
 > ^ <
~/myapp · main · 12:34 PDT · 2.1k tokens
statusline · live
/\_/\
(>.<)
> _ <
Mochi
Apprentice
L7 820/1500
"looks clean — 2 hunks, tests green. ship it."
Integrates with
Claude Code Codex soon
Reviews every turn· maps your codebase· remembers across sessions· levels up· → one companion, keyed to your project
Not five tools — one nervous system

Everything is wired to everything.

Critic, chat, repo-graph, memory and traces aren't separate features — they're one loop. What the critic learns, chat recalls. What repo-graph maps, chat is anchored to. Every call lands in traces. All of it keyed to one project.

Critic

Reviews every agent turn with real tool evidence.

→ writes rules to memory
→ logs cost to traces
Repo Graph

Structural map of your code — arch, files, symbols.

→ anchors chat
→ grounds explain citations
Memory

Semantic · episodic · procedural. The shared long-term brain.

← rules from critic
→ recall into chat
Chat

Conversations pinned to a node, with working memory.

← subgraph from repo-graph
← recall from memory
Traces

Per-turn cost, tokens, cache hits, per-model spend.

← every Brain call from
critic · chat · explain
one shared key proj_hash = sha256(project_root)[:12] — one project, one brain. Memory, repo-graph and traces all namespace to it.
Front door 1 · in your terminal

The statusline

An ASCII face + one-line bubble layered into your agent's status bar. Glanceable, always-on, never interrupts.

Front door 2 · in your browser

The dashboard 127.0.0.1:9876

Home Critic Memory Chat Traces Repo Graph
The budget gate

Siltpoke runs on your existing Claude Code login — no separate bill — so what matters is tokens. Prompt caching keeps a ~70k-token prefix warm, so each second opinion barely adds new tokens, and a hard daily cap means it can never surprise you.

~70k tokens / review · mostly cached
Prompt caching

The warm prefix means follow-up reviews barely add tokens.

Daily budget cap

Soft at 80%, hard at 100% of your token limit → pet sleeps till midnight.

Quiet hours

Mutes Brain overnight. Off by default — set your own window.

Skip on no-change

sha256 dedupe — identical context never re-runs.

Setup · 90 seconds

Four prompts and a restart.

Needs Claude Code (logged in) and Bun ≥ 1.0. The installer is idempotent and backs up your settings — uninstall restores everything.

1

Clone + install

$ git clone github.com/Victoriakaey/siltpoke ~/siltpoke
$ cd ~/siltpoke && bun install
2

Run the wizard

$ bun run setup
# name · species · language · wrap?
3

Restart Claude Code

Quit and relaunch. An ASCII face appears at the left of your statusline.

4

Say hi

Send any message. Within ~3 seconds, a one-line bubble appears. Siltpoke is alive.

A companion, not a linter

Pick a buddy. Tune its character. Grow together.

The ASCII pet is the friendly face on a system that's with you for the long haul — it levels up as you forward good calls, accumulates rules from your feedback, and remembers your projects. Five species, five 0–10 dials, a name and a language of its own.

1

Set it up

in the 90-second wizard

Three ways to set the 5 dials

Three ways to set the dials in the setup wizard — re-roll anytime with bun run first-run.

01
Set them by hand
Type each of the five dials, 0–10. Full control.
02
Take the quiz
A 6-question personality test (~90s, a few hundred tokens) scores the dials and names an archetype.
03
Read your memory
Derives a character from your ~/.claude/ files — CLAUDE.md, rules, memory.
give it any name
? name your pet Mochi
how should it relate to you?
mirrormatches your vibe
complementfills your gaps
hybrid ★matches you, fills your blindspots
and it speaks your language
2

Its personality

five dials → one of 16 archetypes

Pick a species for a preset, then read what each dial changes. Their high/low pattern lands on one of the 16 archetypes below.


            
archetype

Each dial defaults to a neutral 5/10. These presets are illustrative — yours are whatever you set.

What each dial does

Each runs 0–10 (default 5). Their high/low pattern picks the archetype below.

The 16 archetypes

snark × patience × rigor × chattiness · your pick is highlighted
dials: curiosity adds a Curious / Steady prefix
3

It grows up

XP, levels & 9 titles

Earn XP, level up

L12

XP only ever climbs — a wrong call gets dismissed, never docks you.

Forward a good critique+10 XP
Pet it+5 XP · 2/day
Unlock an achievementbonus
3,180 / 6,000 XP
level curve · lv1–5: 100×n · lv5–10: 250×n · lv10–20: 500×n · lv20+: 1000×n
The 9 titles
Under the hood — critic internals · repo-graph · memory · config & commands
§ Full documentation →
Catches what you missed · the critic

Five questions your transcript can't answer on its own.

Not "there's an error" — but which agent action caused it, pointed at file:line, fingerprinted against every session before this one.

why did it fail

The action, not the symptom

Pinpoints which agent action broke the build — not just that the build is broken.

this if branch never matches — upstream filtered it at parser.ts:88.
which component

Pointed at file:line

The single component most likely broken, with the exact line to open first.

missing await on db query → critic.ts:L68
is this a regression

Fingerprinted across sessions

Same error pattern in the same module? Siltpoke flags the regression so you don't have to.

regressed since 5/14 — same fingerprint, 3rd time.
seen it before

Count, first-seen, last fix

Remembers how the same bug was resolved last time — so you don't re-debug it from scratch.

seen . last fix: add LIMIT in query.ts:50.
where to look

The next move

A file, a function — sometimes the exact follow-up prompt to send your agent next.

ask your agent: "why is auth.ts:23 still nullable?"
 /\_/\
 (-.-)
 > ^ <

Every claim cites real tool output. No hallucinated findings — or it stays quiet.

Under the hood

Your agent reviewing its own work is a blind spot. Siltpoke is a second, independent one.

It spawns a separate claude -p subprocess — different prompt, different personality, different blind spots — on the login you already have. No extra LLM bill.

01

Stop hook fires

Your agent finishes a turn. The hook hands off your transcript, diffs and tool output.

02

Gate chain

Skips on quiet hours, budget cap, or no-change since last run. Never blocks your agent.

03

Brain reasons

A separate claude -p reviews with tsc / eslint / ripgrep evidence.

04

Routes by confidence

High → critique file. Medium → state. Low → log only. Pull, never push.

Pull, not push. Critiques are written to disk — never auto-injected into your chat. You decide what gets surfaced (/siltpoke-forward), dismissed, or ignored. A dismiss trains it via Reflexion so it won't repeat the miss.

Understand what you built · /repo-graph

Your agent codes it out. Siltpoke helps you read it back.

The fastest way to end up with a codebase you don't understand is to vibe-code one. /siltpoke-index turns your repo into a structural graph you can explore — so the thing you shipped becomes the thing you know.

architecture · C4 container view ● 92% grounded
siltpoke system boundary
surfaces
statuslinedashboard
│ calls ▾
core
criticbrainrepo-graph
│ reads ▾
state
memoryconfig.json
infra
daemon (hono)claude -p
drill arch → file → symbol·click a box to descend

See the shape at a glance

A C4 container diagram — system boundary, four layer bands, verb-labeled edges. The whole architecture on one screen, then drill from arch → file → symbol.

Trace a path through it

Path Highlight follows the spine from any entrypoint — how a request actually flows, call by call — with a deterministic graph-confidence score so you know how much is pinned vs. guessed.

Ask it, grounded

Explain any node in plain language. An evidence guard checks every [file:line] citation against the real graph — no hand-wavy answers, with a grounded % to prove it.

Chat anchored to a node

Open a conversation pinned to a part of the graph — the surrounding subgraph rides along as context, and the chat remembers across sessions.

Cross-session memory

It remembers. Then it self-corrects.

Two stores, one brain. A global store is the pet — identity, personality, XP — and it travels with you. A per-project store holds everything it learned in this repo. Both feed one Brain prompt, assembled in cache-friendly order so last week's bug informs today's critique.

GLOBAL · ~/.siltpoke/global.json

The pet — travels with you

Name, species & look · a 5-dial base personality · the XP ledger, level, streak and bond meter. One identity across every project.

PER-PROJECT · projects/<sha>/memory.json

What it learned here

Facts · learned rules · recent verdicts · a long-term summary · personality drift over the base · your goals & constraints. Scoped to one repo.

Every review, assembled in cache-friendly order
1
Personality — base + per-project drift · cached prefix, so calls 2+ barely add tokens
2
Core memory — long-term summary + learned rules picked by the files you touched
3
Recent feedback — your last forward / dismiss verdicts
4
Tool evidence — tsc / eslint / ripgrep output
5
Caller impact — who breaks if this changes from repo-graph
6
Anti-examples — past dismissals it must not repeat
Consolidation

Every ~10 stops or 7 days, facts + critiques + dismissals compact into the long-term summary.

Decay & prune

Stale, low-confidence facts retire on their own — but are never hard-deleted.

Facts you control

New facts wait as candidates until you /approve or /reject.

Regression fingerprint
⚠ this SQL bug — seen 3× now.
  first: 5/14 · query.ts:50
  last fix: added a LIMIT clause
  → regressed again at L62.
Reflexion after a dismiss
$ /siltpoke-dismiss 4f2 "intentional"
+ learned_rule: skip await-warnings
  on fire-and-forget loggers.
# won't repeat that critique.
Better together · siltpoke × project-life-cycle

The hardware and the software.

Siltpoke doesn't work alone. It's the companion; project-life-cycle is the method. Together they let anyone — even a non-developer — build a real project the way a professional would: a disciplined workflow, with a pet that keeps you honest the whole way through.

the hardware ships slowly · stable
 /\_/\
 (o.o)
 > ^ <

siltpoke

The pet that lives in your terminal and dashboard. Reviews, remembers, maps your code, grows with you. Like hardware, it changes carefully — it's the steady foundation everything else builds on.

the software always updating
 [>_]
 |=|
 '-'

project-life-cycle

A Claude Code skill that turns ad-hoc AI sessions into a repeatable, traceable workflow — a harness, not a code generator. Because it's a skill, it evolves constantly — new gates, sharper checklists — without you reinstalling a thing.

claude plugin install
project-lifecycle@project-life-cycle
the 3-command lifecycle it runs
/init-harness
Bootstrap once — detect the stack, scaffold the project's rules & handlers.
/ship× per feature
One feature, end to end: research → story → spec → build → verify → validate → PR.
/release
Cut a SemVer release from the CHANGELOG when enough has shipped.
entry
intent-gate — sharpens a fuzzy ask into a precise prompt before any code.
exit
close-gate — nothing is "done" until a pre-push hook the model can't talk around says so.

Same DNA as the pet: local-first, evidence-grounded, pull-not-push. The skill drives the process and catches builder lies; siltpoke watches, critiques, and remembers. Nothing slips.

The goal: let anyone develop projects the way a professional would — from idea to shipped.
One file, every knob · config.json

Tune it without fear.

Personality, budget, triggers and quiet hours all live in ~/.siltpoke/config.json. Every field is optional, and malformed JSON silently falls back to defaults — Siltpoke will never block your agent over a typo.

~/.siltpoke/config.json
{
  "name": "Mochi",
  "species": "cat",
  "language": "zh-CN",
  "snark": 7, "patience": 4, "rigor": 8,
  "chattiness": 5, "curiosity": 6,
  "triggerMode": "gates",
  "budget": { "dailyTokenLimit": 500000 },
  "quietHours": { "start": "23:00", "end": "08:00" }
}
Global, with per-project overrides
One pet, one budget at ~/.siltpoke/; a {cwd}/.siltpoke/ file overrides per repo.
triggerMode
always / gates (default) / on_demand / hybrid — how eagerly Brain fires.
budget.dailyTokenLimit: 0
Disables the budget gate entirely. Set a number to cap daily spend.
Safe by default
Old debug_skill auto-migrates to rigor. Re-roll personality anytime with bun run first-run.
Slash commands

You stay in the driver's seat.

Every action is a command you run — Siltpoke never acts on its own. The ones you'll actually reach for, grouped by what they're for.

The review loop
/siltpoke-inboxList pending critiques (read-only)
/siltpoke-lastSurface the most recent critique
/siltpoke-forward <id>Pull a critique into chat · +10 XP if fresh
/siltpoke-forward-allSurface every pending critique at once
/siltpoke-ack <id>Acknowledge — neutral, no XP
/siltpoke-dismiss <id> <reason>Reject + learn via Reflexion
/siltpoke-undismiss <id>Reverse a dismissal, undo its rule
/siltpoke-reviewReview my work now (bypass gates)
Understand your code
/siltpoke-indexBuild / refresh the repo-graph (no LLM)
/siltpoke-explain <target>Explain a file or symbol via Brain
/siltpoke-graphOpen the repo-graph dashboard
Dashboard & daemon
/siltpoke-reportStart the dashboard server · :9876
/siltpoke-report-stopStop the background server
/siltpoke-daemonManage the daemon (start / stop / status)
Memory
/siltpoke-remember <text>Save a fact, goal, or constraint
/siltpoke-approve <id>Approve a pending fact
/siltpoke-reject <id>Reject a pending fact
Pet, budget & health
/siltpokeState card — level, XP, mood, spend
/siltpoke-pet+5 XP, capped 2/day
/siltpoke-statsToday's spend, budget stage, mode
/siltpoke-wakeOne-shot bypass of budget + quiet hours
/siltpoke-mute · unmuteSilence the critic (mute beats wake)
/siltpoke-doctorInstall-health diagnostic · 7 checks
/siltpoke-helpDaily flow, every command, config
Get involved

Come build it with me.

siltpoke and project-life-cycle are open and always evolving — star them, file an issue, join the chat, or just say hi.

GitHubStar · issues · PRs · coming soon Discorddiscord.gg/CEKyzEJdQ LinkedIncompany/siltpoke Founderin/jiaqi-duan Emailjd.victoria.work@gmail.com
Message the creator

Want to say hi, ask something, or share an idea directly? Drop a note — it comes straight to me.

Found a bug or want to contribute? Open a GitHub issue →

 /\_/\
 (o.o)
 > ^ <

Meet the companion.

An independent second mind that reviews your work, maps what you built, remembers what you care about, and grows with you — on the token budget you already have.

Install in 90 seconds ★ Star on GitHub
Zero added leak surface.

siltpoke keeps all memory and state on your machine — no siltpoke cloud, no analytics, no phone-home. To review or chat, it calls the same claude CLI you already use, so your code takes the exact same path to Anthropic as Claude Code itself — and goes nowhere else.

siltpoke A coding companion that reviews, remembers, and grows with you.