Omahub
← All plugins
G

Bitmochi

by Ghaith Alsirawan

A pixel pet that lives in the panel and wanders its room in real time. Feed it, play with it, clean up after it, watch it grow through an egg, a baby, a child and one of three adults decided by how well you cared for it — and if you neglect it long enough, a small ceremony and a new egg, with a generation counter that never resets. Pixel art, drawn at a whole-number scale so it stays crisp at any panel size, in a panel that takes your theme's colours. No network, no accounts, no telemetry.

Security review

Review recommended · 1 finding

Deterministic scan — not a security guarantee

Low
Risk level
Low
Analyzed commit
36d0e42
Scanned
1 month ago

Flagged patterns appear only in documentation files (README / docs) — descriptive examples, not executable code.

  • Docs external_hosts README.md:120

    Downloads or connects to an external HTTP(S) host.

    git clone https://github.com/Gsirawan/Bitmochi.git \

Automated analysis only — not a security guarantee.

AI advisory review

No obvious issues detected

Language-model assessment · ~deepseek/deepseek-v4-flash-latest — advisory only

None
AI risk level
None
Recommendation
install
Model
~deepseek/deepseek-v4-flash-latest
Analyzed commit
36d0e42
Reviewed
1 month ago

The deterministic scan's medium finding is a `git clone` command in the README, which is documentation only and not executed by the plugin. The runtime code is a self-contained QML pet widget that writes only to its own state directory, reads /proc/loadavg, and makes no network calls. No dangerous or malicious behavior was found.

How this check works

This review combines the deterministic scan (the rule-based results above) with an independent look at the plugin's code by a language model. The model reads a trimmed sample of the repository's files, the manifest, and the README, then gives a plain-language risk level and a recommendation: install (no notable danger), review (look closer first), or avoid (clearly dangerous).

It runs on the same analyzed commit as the deterministic scan and is strictly advisory — it is not a security guarantee and never blocks a plugin by itself. A human moderator still reviews plugins before they are listed.

AI advisory only — automated analysis, not a security guarantee.

Install
$ omarchy plugin add https://github.com/Gsirawan/Bitmochi --enable
Widgets #bar #quickshell

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.