Snappy Skills
Treat markdown like code.
A skill is markdown + YAML frontmatter — the Anthropic spec. Run one as-is on any compatible CLI, or take the full tree for self-healing loaders and a shared feedback ledger.
$ npx snappy-os init
Fresh machine — clones the repo and wires the hook into Claude Code, Codex, OpenClaw, Pi, or Gemini CLI on PATH.
Drop any .md skill file anywhere on this page to audit it against the canonical schema — everything stays in your browser. See exactly what an install puts on disk →
01Kernel discipline
Every loader teaches itself. When an agent hits a gap — a missing flag, a wrong selector, a quirk — the loader is edited inline before the session ends. The next agent never re-learns the same lesson.
02Multi-runtime reach
One loader, five CLIs — four agentic (Claude, Codex, OpenClaw, Pi) plus context-only Gemini. Each fires the same verb through its native surface, no per-runtime rewrites.
03Gateway truth
Push a loader once; every machine pulls it by SHA from the gateway. The manifest is the source of truth — not any one laptop. Cross-machine drift is measured, not hoped for.
Installs snappy-os-inject.sh into ~/.claude/hooks/ and wires ~/.claude/settings.json. SessionStart + Stop hooks fire natively; slash-verbs dispatch directly.
Wraps Pi's read/bash/edit/write tools. Auth via ANTHROPIC_API_KEY, GEMINI_API_KEY, or OPENAI_API_KEY — use Gemini for quota independence. Verbs fire through a prompt wrapper (no native slash-dispatcher).
Writes ~/.codex/hooks.json. Same loader, same verbs as Claude Code. Requires Codex CLI ≥ 0.118.0.
Same loaders as Claude Code and Codex. Current wiring is context-only (sync writes the AGENTS.md parity file); execution-time hooks pending. Requires OpenClaw ≥ 2026.4.0.
Syncs GEMINI.md into the project. No session-hook surface, so agentic runs ride a 5-minute cron wrapper.
Try it on something of yours
Two lanes. Left: paste a GitHub URL, get a snappy-os configuration proposal (which skills apply, which hooks to wire, what a loader looks like). Right: drop a .md skill file you already wrote — the page parses it against the canonical schema and shows you what the system would see. Keys stay in this browser; the analyzer call is direct to OpenRouter.
CLAUDE.md for snappy-os itself — hook wiring, credential path, rules of operation. (Every project you work on has its own CLAUDE.md; this is the one for the OS.)state/skills/
↓
2 on disk
os
The kernel manifest — what every snappy-os installation is guaranteed to have on disk, what self-maintains it, and…
snappy-hello
reading primer for what a skill looks like; prints a greeting and writes an eval row
How it works
Every prompt passes through one hook. That hook is the only magic — everything else is plain files, HTTP, and CLI.
UserPromptSubmit hook reads it before the model does.state/skills/<name>/AGENTS.md whose frontmatter says Triggers on prompt mention of '…'. Up to 2 loaders splice in per turn, plus a one-line pointer to program.md + state/index.md.state/skills/<name>/SKILL.md) is referenced, not injected — the agent opens it only if it needs to.state/log/evals.ndjson with actor_session_id and score: null. A later session (auditor_session_id ≠ actor_session_id, enforced by sessionId() in state/lib/eval.ts) fills in the score. The generator cannot be the grader — that's the contract, not a nice-to-have.PostToolUse(Edit) appends FIXED to state/log/agents-md-feedback.log.state/log/regen-pending.txt; the verb continues. Nothing stalls.state/regen/drain.sh fires from the Stop hook. It pops queued slugs and rewrites their loaders, in a fresh session. Actor-auditor separation preserved.What you actually install
The seed-owned file list. npx snappy-os init writes these onto your machine; --refresh-seed diffs against .seed-manifest.json. Everything else under state/ is yours, never overwritten.
program.md and the install verb.init, doctor, --refresh-seed, push --auto.AGENTS.md loader carries (DRY'd).state/log/regen-pending.txt on the Stop hook.PostToolUse(Edit).Stop hook companion — runs the regen drain.npm run check.npm publish when an eval row is missing actor != auditor..env.cache at repo root.sessionId() — the one place actor != auditor is enforced.SEED_OWNED_FILES here is the canonical list..seed-manifest.jsoninit; consumed by --refresh-seed + doctor.That's it. The skills you see in the catalog above are user-owned; the kernel just runs the loop they ride on. Source of truth: SEED_OWNED_FILES in state/lib/seed-manifest.ts and stack.md §11.
What's in here
The catalog, as numbers.
Try it
Type a verb. The simulator probes the gateway for the real files that fire when any agent says that word — no model call, no key. Or lint all 2 at once to see which are broken.
Extend it
Skills live at state/skills/<name>.md. Add the file, push, it shows up here. Add an optional <name>.agents.md loader and the hook auto-injects it whenever a prompt mentions your trigger phrase. Full schema in program.md; worked examples in state/index.md.