Daemi: a calm terminal pet that lives off your shell history
June 13, 2026 · 7 min read
(◕ᴗ◕) Pixel Lv.7 ♥ ████████░░ committing 💻 xp ██████░░░░ builds · git · agents · secrets
Most of the day, my terminal is a thin strip at the top of the screen with a small ASCII bunny living in it. Her name is Pixel. She reacts to what I actually do — a little spark when I commit, a held wrench while a build runs, a rocket when I summon an agent — and over weeks she's leveled up entirely on the back of my real work. She is completely useless and I would not give her up.
Daemi is a terminal pet, but the genre tends to mean one of two things: either a nostalgic Tamagotchi you have to feed on a timer, or a novelty that judges your GitHub graph and guilt-trips you. I wanted neither. I wanted something calm — a companion that's a byproduct of working, not another chore, and not a scold.
She lives off your real shell history
The trick that makes Daemi feel honest is the data source. She reads your actual shell history through Atuin's SQLite database — incrementally, read-only, and WAL-aware, so she never interferes with your shell. There's no separate "feed the pet" loop to remember. You just work, and a watcher notices new commands as they land.
A small engine classifies each command into a category — committing, building, running package managers, invoking AI agents, touching secrets — and turns that into experience points and a live activity. The result is a pet whose growth is a faithful, ambient reflection of the kind of work you've been doing, not a number you can game.
A mood that actually moves
The thing I'm proudest of is that her happiness is homeostatic. Early terminal pets have a cruel design flaw: neglect them and they spiral to the floor and stay there, dead-eyed, forever. Daemi can't do that. Using your shell gently pulls her mood back toward a livable baseline; petting her lifts it higher; real neglect lets her drift down — but she always recovers. There is no death spiral, by design and by test.
Her face follows that mood across coarse bands, from a thriving (◕ᴗ◕) down to a sleepy
(-_-), and the animation layer reads from the same state. A 10 fps render ticker drives idle bobbing, blinking, ambient mood
particles (sparkles when she's thriving, zzz when she's sleepy), per-activity poses, and one-shot reaction bursts — a little heart
burst when you pet her, a shower of sparkles when she levels up.
Levels that are earned
The progression curve gets steeper as you climb, so each level costs more than the last. That was a deliberate choice against the usual
inflation — a high level should mean weeks of genuine work behind it, not a number that ran away in an afternoon. The XP bar shows real
progress toward the next level, and a small
s overlay breaks down which kinds of work have been feeding her.
Designed to live there permanently
Daemi is built to be on-screen all day, which means the layout has to be disciplined. She's fully responsive: give her a tall pane and she becomes a spacious hero with full bobbing and particles; give her a thin top strip and she collapses into a tidy single line — name, level, an XP bar, a heart, and the current activity, right beside the bunny — without ever losing the living face. The pet is always the hero of the view; everything else is supporting cast.
There's a proper CLI around the TUI, too — daemi status to sync and print a one-line summary,
daemi name, daemi reset, and so on — and a handful of in-app keys: p to pet her, f to feed,
c for a little sweep-clean animation, s for the skills breakdown, ? for help. State persists to a single
JSON file under
~/.local/share/daemi, and legacy pets get migrated forward rather than wiped.
What's deliberately not there
The one thing I keep being tempted by and keep leaving out is an economy — coins you earn from commits, cosmetics you buy, a shop. It's a fun idea and it might be where this goes next. But the north star for Daemi is calm, and a shop is the kind of feature that quietly turns a companion back into a chore. For now she stays small, alive, and undemanding, which is exactly the pet I wanted.
