Onidia walks along the bottom of your display, blinks, stretches, naps on schedule, and
answers you out loud. Pick her up, throw her, talk to her — or let your apps talk to her
for you.
drag to move her · click beside her and she walks over
So, what is it?
A friend for your desktop, not another app to manage.
You go about your day. She stays at the bottom of the screen, doing her own thing —
wandering, stretching, napping. Every now and then she says something. If you have something to ask,
she listens, thinks, and talks back.
01
She lives there
A small always-on-top window with per-pixel transparency — only Onidia and her speech cloud are
visible. No taskbar entry, no window decorations, no desktop clutter. She walks back and forth,
blinks, sways her tail, and bobs gently. Double-click and she hops. Grab her and carry her around.
02
She talks back
Type at her and she answers in comic speech bubbles, in her own voice, with a face that matches
the mood of what she says. Speak into your mic and she transcribes it. Four AI backends, from a
local Ollama model to Gemini, Bedrock or OpenRouter — your call, switchable with one flag.
03
She does things
Celebrations, confetti, hearts, a lightbulb over her head, a disco ball, a guitar, a jump rope,
a skateboard, a hovercar, an iron-man suit-up. She naps on your schedule, reacts when you throw
her, and parachutes down if you drop her from the top of the screen.
For your tools, too
Any program on your machine can write one line to her speech pipe and she'll say it — a build
finished, a deploy shipped, a server down. Build a green and she celebrates; a failure and she
gets genuinely upset about it.
Whichever character you like
Onidia is the teal-haired chibi girl. Kama is the boy in the red hoodie. Both have their own
palette, art and phrase list, selectable at launch. And because a character is just a Go package,
making your own is a weekend, not a rewrite.
The other half
Give her a brain and a voice.
Onidia is the body. onidia-chat is the mind: a tiny chat window, also pure Go on raw
X11, that talks to a real language model — then hands every answer to the buddy so she says it out
loud with a matching expression.
Ask anything. She answers twice.
The reply appears in the chat bubble
and is spoken by the buddy, in sync with the audio. The call runs on its own goroutine, so the
window never freezes — it just shows a ... bubble while it thinks. The last 20 turns
stay as context, and the model is invited to tag each answer with a mood so her face matches.
GeminiAmazon BedrockOllama (local, no key)OpenRouter / any OpenAI-compatible
# you type in the chat window you› what should I do about the build? # the model answers, tagged with a mood bot›[happy] all green - nice one! # onidia-chat forwards it to the buddy's speech pipe buddy→[happy] all green - nice one! # ...and Onidia says it, out loud, smiling
Speaks & listens
Replies play through the Typecast API. The mic button records a take, transcribes it (Amazon
Transcribe or local faster-whisper) and drops the words in the box for you to edit before sending.
Pictures too
Ask about a place or a thing and she fetches a real photo from Pixabay or Wikipedia, or has Gemini
generate an illustration — and it shows up inside her speech bubble, too.
Pluggable agents
She can call real abilities: play a song, play a movie, read a story, or animate the buddy. Drop in a
folder with an agent.json and she can use it. No rebuild.
Checks itself first
Before the window opens, a preflight gate verifies your backend is really reachable and the
environment is sane — and tells you exactly what to fix instead of failing mysteriously later.
Get her onto your desktop
One line. That's the whole install.
One package carries both halves — the buddy, the chat window, her config, and the agents that
make her act. It's static Go: no runtime to provision, no toolkit, no build step.
one line — debian, ubuntu, raspberry pi os
curl -fsSL https://onidia.babeh.com/install.sh | sh
The script asks dpkg what this machine actually is, fetches the build that
matches — arm64, amd64, armhf, armel or
i386 — checks that what came back really is a package and really is for your
CPU, then hands it to apt. You never pick a filename, so you cannot pick the wrong one.
It asks dpkg, not uname, and on a Raspberry Pi that difference is the
whole ballgame: 64-bit kernel with 32-bit userland (normal on Pi OS) says
aarch64 to uname but armhf to dpkg, and
armhf is the one you want.
One exception, and it exists for a good reason: Pi OS calls every 32-bit board
armhf, including the ARMv6 ones — the original Pi Zero and Pi 1.
There uname says armv6l, and the CPU outranks the userland: you get
armel, because the armhf build targets ARMv7 and would die with an
illegal instruction on that chip. Run --arch and it will tell you which it picked.
look before you leap
curl -fsSL https://onidia.babeh.com/install.sh | sh -s -- --dry-run # what it would fetch
curl -fsSL https://onidia.babeh.com/install.sh | sh -s -- --arch # just print the architecture
apt rather than dpkg -i on purpose: it resolves the audio and PipeWire packages
she needs in the same step. The one exception is the Pi Zero above, where the package's
architecture isn't the system's — there it forces it through dpkg instead, which is
safe precisely because she is a static binary with no hard dependencies, and fetches those
extras by name. One thing is left for you: the package installs her config to
/opt/onidia/share/chat-app.ini rather than into your home, so it can never end up
root-owned and uneditable. Copy it across, add your key, start onidia before
onidia-chat, and she's awake. Both programs read that one file — the buddy
resolves it exactly as the window does — so the sleep window and busy window in
there reach her too.
After the one line above. Both binaries land in
/opt/onidia/bin with /usr/bin symlinks, and her bundled agents in
/opt/onidia/share/agents.
first launch
# terminal 1 - the body. It creates the speech pipe and logs it.
onidia
[buddy] speech: talk to the buddy with:
echo "hello buddy!" > /tmp/desktop-pet--0.say# terminal 2 - the brain
mkdir -p ~/.config/chat-app
cp -n /opt/onidia/share/chat-app.ini ~/.config/chat-app/ # -n: never clobber yours
nano ~/.config/chat-app/chat-app.ini # your API key lives here
onidia-chat
# not sure this machine is ready? ask her before the window opens
onidia-chat -preflight warn
# what she can do, and what's switched off
onidia-chat -agents-list
# ...and let any program talk to her, from anywhere
echo "deploy finished, great job!" > /tmp/desktop-pet--0.say
Before you install
What she needs, and what she can live without.
Short version: an X11 display, and a key for one model provider. Everything else is either
installed for you in the same apt step, or genuinely optional.
Required — she won't start without these
1
An X11 displayNative Xorg, or XWayland on a Wayland session. $DISPLAY must be set — she draws in software straight into the X server.
2
Debian-family LinuxThe package targets amd64, arm64, armhf and armel: Ubuntu, Raspberry Pi OS and friends.
3
A key for one model providerA free Google AI Studio key, an OpenRouter key, or nothing at all if you run Ollama locally.
Installed for you — in the same apt step
♫
PipeWire or ALSApipewire-bin / pipewire-utils, alsa-utils and pulseaudio-utils. A microphone to listen from, a speaker to talk through.
●
Python 3Most of her agents — playing music, animating the buddy — are small Python scripts. This is the one real dependency.
⚙
xdg-utilsSo the launchers in your applications menu can actually find her.
Optional — switch any of these on later
Whisper, so you can talk to her
Typing is the fallback; this is how she actually listens. It's a faster-whisper model,
and it is not small — so it is deliberately opt-in rather than something the package drags in for you.
Only if you want her running on Claude. She talks to AWS through the Go SDK and reads the
standard credential chain — ~/.aws/credentials, environment variables, or an
instance role. You do not need the AWS CLI installed.
terminal
# ~/.aws/credentials
[default]
aws_access_key_id = AKIA...
aws_secret_access_key = ...
# ~/.aws/config
[default]
region = eu-central-1
# then start her with
onidia-chat -provider bedrock
Fully local
No key, and nothing leaves the machine. Ollama can be the brain and Whisper can be the ears —
together that is a chat window that never touches the internet.
She needs one of these to think.
Pick whichever suits you — they are independent, and only one is ever needed. Each guide has the
exact commands and the exact lines for chat-app.ini.
All five guides in one list →
Separately from the mind: every reply she
writes is also spoken, in a voice you choose. She ships with a demo one, so this is only worth doing
if you want her to sound like somebody in particular.
Found a bug, want a feature, or fancy writing your own personality? The repositories are
the fastest way in — and issues are genuinely read. If you'd rather just say hello, the form works too.