jun is a tiny terminal game for the age of AI coding. It runs in its own pane beside Claude Code. Every tool call your agent makes becomes prey — catch it in rhythm, chain combos, and raise a daemon that's a portrait of how you actually code.
pip install jun
jun init # connect Claude Code, then restart it
jun # the hunt begins
daemon getting too powerful?
jun off.
Claude Code works. you hunt.
The instant your agent picks up a task, the hunt is live. Its tool calls fly in as tokens — catch them in the green, chain a combo, trigger a surge. Every catch feeds the daemon you're raising.
| call | becomes |
|---|---|
edit |
a strike |
bash |
a heavy hit — land it in two |
read / grep |
a wide, gentle scan |
| a quiet agent | your daemon catches its breath |
The daemon's form is generative, shaped by how you actually code. Lots of edits grow more limbs. Lots of test runs grow armor. Lots of reading grows more eyes. No two daemons are alike, and yours is the thing you screenshot and share.
·˘˘˘·
╭─────────╮
│ ● ● ● ● │
│ ‿ ‿ │
╰─────────╯
│ │ │ │ │
╨ ╨ ╨ ╨ ╨
what works
- Live hunts that start on their own — driven by your agent's real tool calls, not a simulation.
- Per-kind cursor motion — a read drifts, a test run races, a thinking pause makes the cursor waver. The kind tells you how to time the catch.
- Heavy tokens — a test run takes two timed hits, one per cursor pass.
- Golden tokens — a rare jackpot, claimed with a quick double-tap in the zone. A perfect golden catch can permanently mutate the daemon with a spark.
- Focus as the stakes — misses drain it, a quiet agent lets it recover, and at zero the hunt collapses.
- Combo surges every five clean catches.
- Evolutions — four permanent forks, sixteen possible daemons.
- Daily streaks with a one-miss shield, and daily objectives that re-seed at midnight.
- Training mode — practice against a simulated agent. Banks nothing; the daemon records only real work.
jun card— a shareable daemon card with your best run.?help, first-run intro, crash-safe atomic saves.
controls
| key | action |
|---|---|
space |
catch a token · start a training run |
1 2 |
choose a form at an evolution fork |
esc |
end the hunt · leave a screen |
? |
help — the loop and the controls |
q |
quit (always saved) |
A live hunt starts on its own when your agent works — that is the game,
and it is what grows your daemon. With no agent, space starts a training
run. The daemon is a record of your real coding.
how it connects to Claude Code
jun is standalone — it never launches or wraps Claude Code. Run it in
a separate pane. jun init adds three hooks to ~/.claude/settings.json:
PostToolUse— each tool call becomes a hunt eventStop— ends the huntNotification— surfaces "⚠ Claude needs you" in jun, so you never miss a permission prompt while you're catching tokens
The hook is written as an absolute <python> -m jun ... command, so it
works even when jun isn't on Claude Code's PATH. Restart Claude
Code after jun init — it only loads hooks at startup. jun off
removes them cleanly.
If you installed jun with uvx (ephemeral), jun init would record a
path that disappears after the run — install jun persistently instead
(pip install jun, or uv tool install jun).
all commands
jun # play (the default)
jun init # connect Claude Code's hooks (run once, then restart Claude Code)
jun off # remove the hooks
jun card # print the shareable daemon card
jun new # release your daemon and start fresh
development
uv sync
uv run jun
Issues and PRs welcome — bug reports especially. Release notes live in CHANGELOG.md.
jun is not productivity software
It is not a SaaS. It will not 10× your output. It's a daemon. It lives in your terminal. It's a little bit feral — and that's the whole point.
the AI doesn't need you. your daemon does.
Never be bored vibe coding again.
Released under the Apache License 2.0.
Metadata
Release files for jun 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| jun-0.2.0.tar.gz | 33.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jun-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 67.5 kB
Release files / jun-0.2.0.tar.gz
| Download URL | jun-0.2.0.tar.gz |
|---|---|
| Size | 33.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f440c5d270fc90de778b3e521db39ef42b8717775b31e68ca160147851deda0e
|
|
BLAKE2b-256 checksum How to use checksums |
52b0489f4a2e5b94473bdde18e0b0b4522d4f73a4878a363efef7fc950539bb6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 19, 2026.
Transparency logRelease files / jun-0.2.0-py3-none-any.whl
| Download URL | jun-0.2.0-py3-none-any.whl |
|---|---|
| Size | 33.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
10fa68fdedb17bfa3abe9dc85531fa9258f6fc4e3f7acd9e23e035e3375e1769
|
|
BLAKE2b-256 checksum How to use checksums |
787ce1b744f905e0ba3b4b34c8a0d052a851cbaa85379662ee8b8d9097235cae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 19, 2026.
Transparency log