A pixel-art companion for real work

One pet. Every session. Every agent.

EvoPet is a pixel-art creature that lives on your desktop and in your agent's terminal, and grows from the work you actually do. It is one pet: every session, in every profile, across every agent you run, feeds the same creature.

EvoPet, drawn from its own sprite atlas: one idle cell of the pet at four times the atlas size.
one idle cell of the shipped atlas, 4×

Two halves, one creature

EvoPet is a fork of a pet project and a fork of a desktop app, joined at one idea. They are separate trees with separate jobs, and both are needed for the thing to exist. The pet half descends from TamaCodex by way of TamaHermes, which continues on its own; the shell half descends from Petdex.

The pet

The mechanics. It owns XP, the level ladder, the stats, the life stages and evolution, and it draws the sprite atlas: a grid of 192×208 cells, 8 columns by 9 rows, 1536×1872 in all. Python.

Every surface renders that one atlas, so the terminal pet, the desktop pet and the preview are the same creature and cannot drift apart.

The desktop shell

The app that floats the creature above your other windows and gives it a HUD. It also taps the hook payload every hooked agent sends, so the ledger sees Claude Code, Codex, opencode and Gemini CLI as well as Hermes.

Growth events are read at turn boundaries only. A turn in one agent is worth a turn in another.

One pet, not nine

This is the idea the whole project exists for, and it is worth stating plainly: you do not get a pet per tool. Profiles, group chats and agents are all sources, and they add up in one place.

There are two routes into the combined ledger, and each source is counted on exactly one of them. Hermes turns arrive from the per-profile ledgers, which know the details the plugin can see. Foreign agents arrive from a spool file the desktop shell writes as their events pass through it. A Hermes event seen on the spool is ignored, because the profile ledger already counted it.

How every agent feeds one pet Hermes profiles feed their per-profile ledgers, which the drain reads. Claude Code, Codex, opencode and Gemini CLI post to the desktop shell's hook server, which spools them. Both routes land in one combined ledger, which the compiler renders into one sprite atlas that the terminal and the desktop both display. sources Hermes profiles Claude Code Codex, opencode, Gemini two routes, counted once each one combined ledger levels, stats, stage, gates no prompts, no paths the compiler draws one 1536x1872 atlas and installs it everywhere the pet appears terminal prompt and desktop same creature, same stage, both places

Because the desktop mirror is one pet shown machine-wide, exactly one writer owns it: the drain that renders it from the combined ledger. A per-profile build that tries to write that same mirror is refused, by name, rather than silently fighting over it.

How it works

Four steps, and none of them need a network or an account. Everything the pet knows is numbers on your disk.

Step 1

An agent does something

A hook fires: a prompt, a successful turn, a failure, a review, a session start or end.

Step 2

The ledger records it

The event is applied as XP plus stat changes, at the turn boundary. One turn, one entry, whichever agent ran it.

Step 3

The compiler redraws

The pet's atlas is rebuilt and installed. Rebuilds are coalesced, so a burst of tool calls is one redraw, not forty.

Step 4

Every surface renders it

The terminal prompt and the desktop both draw the same sheet, with the same HUD.

The ladder: 99 levels, 100,000 XP

Every pet climbs the same curve, so a level means the same amount of work in every package. It is cheap at the start and long at the end: xp_for_level(L) = round(100_000 × ((L − 1) ÷ 98) ²). The first level costs 10 XP, which one prompt and one success covers with room to spare.

  • egg 0 XP
  • hatchling 1,041 XP
  • child 5,040 XP
  • teen 10,006 XP
  • adult 20,158 XP

Those are the default pet's evolution gates. A gate is a level your pet reaches, and when it does, it changes form. The numbers above are the levels and the XP that opens each one. Fifty thousand XP, half the cap, lands inside level 70.

Evolution is the creator's call

EvoPet fixes the ladder. How many times a pet changes form, and at which levels, is declared by whoever made it, in the package's own manifest:

"evopet": { "evolutionGates": [11, 23, 32, 45] }

One to four gates, strictly increasing, one more form than gates: so between two and five forms. Names are positional and not yours to choose, starting at egg and running hatchling, child, teen, adult. Three gates and your pet never reaches adult.

The gates are checked against the art the pet actually ships, at install, while the mistake is still fixable. You cannot declare five forms for a line that has two.

Evolution stages and gates has the full contract, including how to pick gates you will not regret.

What earns XP

XP is awarded at turn boundaries, never per tool call.
eventXPfires on
task_success 14 a turn ends successfully, once per turn
recovery 6 a success after a failure in the same turn
task_failure 5 a turn fails
review_opened 5 a review or critique is opened
prompt_sent 4 every prompt you send
care 3 you tend the pet yourself
session_start 2 an agent session begins
rest, idle_minute 0 these move stats and energy only

A good turn is about 18 XP, and a failing turn about 9 to 11. Telling a pet to work harder than that is not a setting; there is no cap on the ladder and no way to buy a level.

Where things stand

Said plainly, because the rest of this site is documentation and documentation should not shade the truth:

  • The pet's mechanics, the combined ledger and the drain that fills it are in the pet tree.
  • The desktop shell runs as a local build on macOS. A notarized download does not exist yet, so there is nothing to install on a machine that did not build it.
  • The library service is written and passes its own end-to-end round trip, but it is not deployed. The library page here will say it cannot reach the library, and that is the honest answer rather than an empty list.
  • EvoPet's own repository is public as of 11 September 2026.