Hazzel
A terminal coding agent you can actually read.
Bring your own key. No subscription. Every change shown as a diff before it touches disk.
First external PR merged in v1.5.1 — good first issues are open.
Recently shipped: NO_COLOR support — piped logs and dumb terminals stay plain (#12, @DYNOSuprovo) · v1.5.3 SEO landing page · confirmation prompts accept yes — first external contribution (@Gambit-Checkmate, 1.5.1) · /review (1.5.0) · background !cmd & jobs (1.4.9) — full changelog
Try it in your project
Every agent claims transparency. Hazzel is ~10k lines of Python you can trace end to end — agent/core.py is the whole loop, tools/ is every action it can take, safety.py is the entire undo system — and it stops before every write to show you what's about to happen.
uvx hazzel # try it — nothing installed, no venv touched (or: pipx run hazzel)
pip install hazzel # to keep it (or: uv tool install hazzel · pipx install hazzel)
export GROQ_API_KEY="..." # or skip this and pick a provider inside with /model
cd your-project
hazzel
❯ Fix the failing test in tests/test_agent.py
● read_file tests/test_agent.py
● edit_file src/hazzel/agent/core.py
● run_command pytest -q — passed
Things you can say on day one
❯ /review --staged
❯ /commit
❯ what does agent/fastpath.py do — is it just caching?
❯ @screenshot.png make the nav match this
No project quiz, no config ceremony — the read-only commands answer instantly, and anything that touches disk stops at a diff first.
Why it's built this way
Most agents ask you to trust a black box. Hazzel asks you to trust three specific, inspectable mechanisms instead:
- Every write is a diff you approve, first. Shell commands too — except a small allowlist of true read-onlys (
ls,cat,git status) that skip the queue. - Every write is checkpointed, automatically. Prior bytes snapshotted to
~/.config/hazzel/undo/(200 events, 20 per file) before anything lands./undorestores them. - Commands are sandboxed to your project root.
git reset --hardandcleanare blocked outright; rawgit commitis steered into/commitwith its own diff preview.
You can verify all three claims in about 200 lines: src/hazzel/safety.py, src/hazzel/tools/run_command.py.
flowchart LR
you["you — prompt, @file, slash command"] --> repl["__main__.py"]
repl --> loop["agent/core.py — the whole loop"]
loop --> fast["agent/fastpath.py — zero-LLM answers for reads"]
loop --> dispatch["agent/dispatch.py"]
dispatch --> gate["safety.py — approve · sandbox · checkpoint"]
gate --> tools["tools/ — 15 actions"]
loop --> llm["providers/ — 8 backends, your key"]
loop --> term["ui.py + formatter.py — your terminal"]
How it compares
Where Hazzel stands out, measured against the tools people actually compare it to:
| Capability | Hazzel | Aider | Cloud agents |
|---|---|---|---|
| Price model | free · BYOK | free · BYOK | subscription |
| Local models | Ollama, keyless, zero config | supported, needs env setup | no |
| Readable end to end | ~10k lines | tens of thousands | closed source |
/undo without git |
byte-level snapshots | git-commit based | varies |
| MCP client | stdio, zero new deps | — | varies |
Aider is excellent — this is about fit, not superiority.
What it actually does
| What | In practice |
|---|---|
| Understands your repo | Reads, searches, lists. @path pins a file into context; /init drafts an AGENTS.md map so every session starts oriented. |
| Ships real changes | Diff-preview editing, /undo checkpoints, shell with timeouts, !cmd & background jobs via /jobs, fetch <url> for docs, @image.png for vision-capable models. |
| Speaks fluent git | /status · /diff --staged · /review · /commit (auto-drafted Conventional message) · /log — reads run instantly, zero LLM round-trip. |
| Extends without lock-in | Minimal MCP stdio client — standard library only, any server via .hazzel/mcp.json. SKILL.md skills load on demand. Neither needs Hazzel-specific tooling to author. |
| Shows you the bill | Provider-reported tokens parsed into real dollars, logged locally — not estimated. Live tokens · $ line every turn; /usage today|week|month --by-model, /budget. |
| Remembers between sessions | Per-project sessions persist with /session restore. /plan on explores read-only first; /think on buys extended reasoning for hard edits. |
| Works in a pipeline | hazzel -p "prompt" runs one turn and exits — pipe a diff in, get a summary out. --output-format json + real exit codes for CI. |
Worked transcripts of /review, /commit, @image, background jobs, and hazzel -p live in docs/EXAMPLES.md.
Providers — bring your own key, no subscription
Eight providers, one env var each. Set the one you want and skip the in-app prompt:
| Provider | Env var | Notes |
|---|---|---|
| Groq | GROQ_API_KEY |
default model runs here |
| OpenAI | OPENAI_API_KEY |
|
| Anthropic | ANTHROPIC_API_KEY |
|
| Mistral | MISTRAL_API_KEY |
|
| Gemini | GEMINI_API_KEY |
|
| DeepSeek | DEEPSEEK_API_KEY |
|
| OpenRouter | OPENROUTER_API_KEY |
100+ models behind one key |
| Ollama | (none) | fully local, keyless, OLLAMA_HOST override |
Switch anytime with /model. Nothing is metered by Hazzel — you pay your provider directly, or nothing at all if you're running local.
Commands at a glance
| Group | Commands |
|---|---|
| Modes | /model · /plan on|off · /think on|off · /goal [@objective] |
| Git | /status · /diff [--staged] · /review [--staged] · /commit · /log |
| Cost | /usage [today|week|month|--by-model] · /budget |
| Extend | /mcp [server [tool]] · /skills [name] · /init |
| Transcript | /export · /copy · /retry · /jobs · /undo [n] · /session restore · /clear |
Type / to filter live, @ to attach a file, /docs to page the full guide without leaving the terminal — see docs/EXAMPLES.md for worked transcripts.
What it's honest about not being
v1.5.3 + NO_COLOR (unreleased), early-stage. No autonomous PRs, no cloud dashboard, no session sync across machines. It doesn't replace your editor — it sits in the terminal next to it, and it stays small on purpose.
If you need a heavier, more automated agent, better options exist. If you want to see exactly what's about to happen to your files before it happens, this is built for that.
Support Hazzel
If Hazzel is useful, the cheapest support costs nothing — use it, report what breaks, or send a PR. It's free and open-source, and it plans to stay both.
If you'd rather throw money at the problem, that works too. It goes straight into maintainer time for docs, fixes, and reviews:
Contributors
every PR lands through the same door — reviewed, CI-verified on four Python versions, credited in the release notes.
Contributing
Issues and PRs genuinely welcome — ROADMAP.md tracks what's next, CONTRIBUTING.md has the ground rules (small, inspectable, no new deps without asking), and good first issues are labeled as such.
License
AGPL-3.0-or-later. See LICENSE.
Why AGPL? It keeps hosted clones open — if you run Hazzel as a service, share your changes back. Normal use (install it, use it at work, ship code it helped you write) is unaffected — only re-hosting Hazzel itself triggers share-alike. If the license blocks adoption at your company, open an issue — dual-licensing is on the table with enough demand.
Small tools stay small because people who find them useful say so.
If Hazzel is now sitting in your terminal next to your editor,
a star is how the next person finds it too.
Release files for hazzel 1.5.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| hazzel-1.5.4.tar.gz | 157.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| hazzel-1.5.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 310.8 kB
Release files / hazzel-1.5.4.tar.gz
| Download URL | hazzel-1.5.4.tar.gz |
|---|---|
| Size | 157.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2e0c9ab92b33fc3fbc5e1493fcb7ca33df8bf641e839cd99f058cb0e69097ba8
|
|
BLAKE2b-256 checksum How to use checksums |
bb5156c7bd6b0624ee1a3d52145305f926d06100a8391088ae80780027eee4d8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.9
|
Release files / hazzel-1.5.4-py3-none-any.whl
| Download URL | hazzel-1.5.4-py3-none-any.whl |
|---|---|
| Size | 152.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d0b1ef766127da23037868bdc6f6ca204f467f819c324fb5b57928ff1517ac48
|
|
BLAKE2b-256 checksum How to use checksums |
5bfb7045568c9fd46f6cfce3b93cc79bf39c21aa82815c409c3378c41be21d62
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.9
|