Bitmochi
A pixel pet that lives in your Omarchy bar. Click its icon and a panel opens onto a small room; the pet walks around in there in real time. Feed it, play with it, clean up after it, and watch which of three adults it grows into.
<picture> <source media="(prefers-color-scheme: dark)" srcset="docs/img/panel-dark.png"> <img src="docs/img/panel-light.png" alt="The Bitmochi panel: a header reading BITMOCHI with a settings gear, a line below it reading Nib · Adult with a Gen 1 badge, a tall empty room with a purple dragon standing on the floor line near the left, then four stat bars — Hunger 92, Energy 88, Happy 90, Clean 86 — and a row of four buttons: Feed, Play, Clean, Sleep."> </picture>Everything around the art — the card, the text, the stat bars, the badges — takes your Omarchy theme's colours. The pet, its props and the bar icon are pixel art, drawn at a whole-number scale with nearest-neighbour filtering, so one source pixel is exactly two (or three, or four) screen pixels wide and the art stays crisp at every panel size instead of going soft.
Watch the first sixty seconds
The panel opens on an egg, wobbling. It hatches in about a minute — and that minute is counted from the first time you open the panel, not from when you installed the plugin or logged in. The egg waits, however long that takes. Install it in the morning, open it after lunch, and you still see the hatch instead of finding a grown pet and a moment you missed.
Everything after that first hatch runs on real time: an hour as a baby, three as a child, and then it becomes one of three adults.
Click the pet to pet it. That is the best interaction in here; try it first. Clicking the egg does something too — a small bump — even though there is nothing to feed or play with yet.
It is alive while you are looking at it
<img src="docs/img/room.gif" alt="An animation of the panel: the dragon stands and breathes on the right of the room, then walks to the left — turning to face left as it sets off — stands a while at the far side, and walks back to the right, turning again as it goes.">
The pet picks somewhere to stand every couple of seconds, walks there, and faces the way it is going. Nothing about that is scripted per install: the destination, the pauses and how far it is willing to roam all come out of how well it is doing.
It grows up, and how you treat it decides into what
<picture> <source media="(prefers-color-scheme: dark)" srcset="docs/img/stages-dark.png"> <img src="docs/img/stages-light.png" alt="Six panes side by side, each a slice of room floor with one pixel dragon standing on it, labelled underneath: Egg, a speckled cream egg; Baby, a small four-legged purple dragon; Child, a longer one; Adult A, standing upright with horns; Adult B, the same dragon wearing a satchel; Adult C, the same dragon wearing a crown, with wings and sparkles around it."> </picture>The three adults are the same dragon with different standing: A is the plain one, B carries a satchel, C wears a crown. Which one you get is decided by how well you kept it fed, rested, happy and clean on the way up. Two pets with the same generation number can look completely different — that is the point, not a bug.
It shows you what it needs
<picture> <source media="(prefers-color-scheme: dark)" srcset="docs/img/moods-dark.png"> <img src="docs/img/moods-light.png" alt="Five panes of the same adult dragon in five different states: thinking about a bowl of food; crying, with a tear down its cheek; curled up on the floor asleep; standing green-skinned with a thermometer in its mouth; and glaring with a puff of steam beside its head."> </picture>A pet that needs something does not just lose points — it is drawn differently. There is a separate set of frames for hungry, sad, tired, sick and cross, so you can read it from across the room. Left to right above: hungry, sad, tired, sick, cross.
Two gaps in that, said plainly rather than left for you to notice. A cross child is drawn with the sad frames; every other square of the stage-by-mood grid has a set of its own. And an adult in any mood is drawn as the plain adult, so a satchel or a crown steps out for as long as the mood lasts and is back as soon as the pet is looked after.
It also moves like it. The worse it feels, the less it roams and the longer it stands still, until a badly neglected one barely moves at all.
In the bar
<picture> <source media="(prefers-color-scheme: dark)" srcset="docs/img/bar-dark.png"> <img src="docs/img/bar-light.png" alt="Two slices of bar, enlarged: in the first, the pixel dragon sits in one bar slot at its normal size; in the second, the same icon carries a small red dot in its top-right corner, the mark that says the pet needs something."> </picture>The bar icon is its own cut of the art at 20 pixels square, drawn one source pixel per screen pixel and never scaled — a shrunken 64-pixel sprite is a smudge at that size. It is the pet's current stage, so the bar changes as it grows up. A small dot appears in the corner when something needs doing. (Both slices above are enlarged so you can see them; in your bar the icon is the size of any other bar icon.)
Install
omarchy plugin add https://github.com/Gsirawan/Bitmochi.git --enable
Then click the pet icon in the bar. That opens the panel — your room.
If it does not appear straight away:
omarchy restart shell
To update it later:
omarchy plugin update io.github.gsirawan.bitmochi
You can also install it by hand. Omarchy's plugin loader refuses a symlink, so
copy the whole folder into ~/.config/omarchy/plugins/ under the plugin's
id, with manifest.json directly inside it rather than one level deeper:
git clone https://github.com/Gsirawan/Bitmochi.git \
~/.config/omarchy/plugins/io.github.gsirawan.bitmochi
omarchy plugin enable io.github.gsirawan.bitmochi --section right
Any section works — left, center or right.
Remove
omarchy plugin remove io.github.gsirawan.bitmochi
Your pet's state lives on its own, at
~/.local/state/omarchy/io.github.gsirawan.bitmochi/pet.json, and nothing but
this plugin ever touches it. Removing the plugin without deleting that folder
leaves your pet exactly where it was, generation and all, ready to pick up
again if you reinstall.
If you want the history gone too — there is no way back from this, your generation counter goes with it:
rm -rf ~/.local/state/omarchy/io.github.gsirawan.bitmochi
What death means
A pet you stop caring for gets ill and then dies. The numbers, straight out of the simulation: hygiene is the first stat to bottom out, 2 h 17 min from full, because the room also gets messier every forty minutes and an uncleaned room drags hygiene down faster. That is when the pet falls ill, and the ceremony is twelve hours after that — 14 h 17 min of being completely ignored, from full to gone.
Any single act of care that lifts every stat back above zero closes the illness window, and the next one starts from scratch. Forgetting it overnight is survivable. Forgetting it for a day is not.
When it does die you get a memorial card with its name, its generation and how long it lived. Dismiss it and a new egg is waiting, one generation higher. The counter never resets.
A few consequences of that, on purpose:
- Coming back after a very long absence produces at most one ceremony, never a cascade of generations you never got to see.
- If your system clock jumps backwards for any reason, that is treated as zero time passing — never as negative neglect.
- If the save file is ever missing, empty or corrupted you get a fresh egg instead of a crash. The generation counter survives that if it is still readable in the broken file; if it is not, it starts fresh at 1.
How it lives while the panel is closed
Bitmochi does not run a clock in the background. Every stat is computed from how long it has actually been, the moment you next open the panel or glance at the bar — so your pet genuinely keeps living while the shell, or your computer, is off, instead of freezing the instant you stop looking at it.
Panel size
Behind the gear in the top-right corner: width from 260 px to 700 px, height from 240 px to 800 px, both remembered next time. The pet is drawn at whichever whole-number scale fits both dimensions, so a bigger panel means a bigger pet, and a short one means a smaller pet that still stands entirely on the floor rather than being cut off by the stat bars. Whatever height is left over is headroom for it to wander in. Escape backs out of settings; a second Escape closes the panel.
Scope, and what it does not do
No network access anywhere in this plugin. No account, no API key, no
telemetry, nothing phoned home. It writes nothing outside its own state
directory. The one thing it reads from your machine is the load average in
/proc/loadavg, purely so the pet is a little livelier when the computer is
busy and a little drowsier when it is idle — that is the whole of its contact
with the outside world.
Deliberately small, too: no minigames, no shop, no currency, no second room, no furniture, no sound. Those were left out so that what is here works properly.
Dependencies: none beyond Omarchy 4 (Quickshell) itself. No other packages, no accounts, no network of any kind.
License
MIT. See LICENSE.