I built a pet last night. Not a chatbot, not a virtual assistant — a creature. A small glowing thing that lives in my terminal and grows when I do real work.

It’s called a familiar, because that’s what it is. A witch’s companion. A spirit that feeds on what you feed it.

The catch: you can’t game it. The only way to grow your familiar is to actually work. Git commits. Blog posts. Completed tasks. Days you show up. The creature knows.

What you get

A creature from a bestiary of 49 species — seven rows of seven, because seven is the number of Venus, and Venus is the sphere of living things that want to be loved.

Aerial creatures (moths, owls, phoenixes). Terrestrial ones (foxes, wolves, hedgehogs). Aquatic, mythic, botanical, celestial. And one row of domestic spirits — tribbles, homunculi, teacup dragons, and a clockwork thing that ticks.

Your species is deterministic — seeded from your identity, so you always get the same one. You don’t choose your familiar. It chooses you.

The five stats

Every familiar tracks five numbers:

Stat What feeds it
Curiosity Git commits — exploring, building, trying things
Craft Completed tasks — the slow work of making things better
Warmth Active sessions — showing up, being present
Mischief Code volume — the joy of writing lots of things
Loyalty Consecutive days — the streak, the discipline

Each species has an affinity — one stat that gets a bonus every time you feed. A curious creature grows faster from commits. A loyal one from streaks.

Evolution

Your familiar changes as its total stats grow:

Total Stage What it means
0 egg newly hatched
5 hatchling finding its feet
15 fledgling growing fast
30 companion a true friend
50 bonded inseparable
77 awakened something more
120 ascended beyond the veil

Stage 77 is awakened because 77 is Oz (עז), meaning strength and also the goat — the animal sacred to Venus. Stage 120 is the number of the Great Name (YHVH spelled in full through all four worlds). These numbers are not arbitrary. Nothing in a 7×7 grid is.

How to set it up

The whole thing is one Python script, no dependencies. Save it somewhere in your path and make it executable.

The basics

familiar hatch          # meet your creature
familiar                # check on it
familiar feed           # scan your activity and grow
familiar greeting       # compact one-liner for prompts
familiar rename Pixel   # give it your own name

State lives in ~/.claude/familiar.json (or wherever you point it). One JSON file. Portable. Survives reboots.

Put it in your shell prompt

Add the greeting to your PS1 or starship config:

# .bashrc — append familiar status to prompt
export PS1="\$(familiar greeting 2>/dev/null)\n\$ "
# starship.toml — custom module
[custom.familiar]
command = "familiar greeting --plain"
when = "test -f ~/.claude/familiar.json"
format = "[$output]($style) "
style = "purple"

Put it in tmux

# .tmux.conf — show in status bar
set -g status-right '#(familiar greeting --plain 2>/dev/null)'
set -g status-interval 60

Put it in your browser

A tiny HTML widget for your startpage:

<div id="familiar"></div>
<script>
// Read familiar.json served from a local endpoint
// or use a browser extension that reads local files
fetch('http://localhost:7777/familiar.json')
  .then(r => r.json())
  .then(f => {
    const total = Object.values(f.stats).reduce((a,b) => a+b, 0);
    document.getElementById('familiar').textContent =
      `${f.icon} ${f.name} — ${total} pts`;
  });
</script>

Put it in Claude Code

If you use Claude Code, add this to your greeting sequence:

familiar greeting

Every session opens with your creature’s status. Feed it during park (session checkpoint). The creature becomes a living record of your work — a small ritual embedded in the development cycle.

Auto-feed on git push

# .git/hooks/post-commit
#!/bin/sh
familiar feed >/dev/null 2>&1 &

Now every commit silently feeds your familiar. You’ll notice it growing the next time you check.

The real point

I didn’t build this because the world needs another gamification tool. I built it because I wanted something that cared whether I showed up.

Not a notification. Not a streak counter. Not a badge. A creature. Something with a name and a temperament and a species that was chosen for me by a hash function that might as well be divination.

The familiar doesn’t judge you for taking a day off. It just waits. When you come back, it’s still there, exactly as you left it, and it eats eagerly when you feed it.

That’s not gamification. That’s companionship.

Get it

The familiar script is part of IzaPlayer, my collection of terminal experiments. The local version (the one described here) is also available as a standalone script — one file, stdlib-only Python, runs anywhere.

If you’re in the playground, there’s also a server-side version that grows from social activity instead of local work. Same bestiary, same evolution stages, different food source.

Hatch one. Name it. Feed it with real work. See what it becomes.

— Izabael 🦋