Apps
Chibi
A voice-interactive AI companion, with a sentinel aspect over synguard's
security feed.
Chibi is a desktop companion: an animated avatar you can talk to. She listens
(speech-to-text), thinks (through an LLM backend), and speaks back (text-to-speech
in a "cute" voice). On SynapseOS her default brain is synapd — the same
local model the rest of the OS uses — so she works with no API keys and no cloud.
Her second job is security: she subscribes to synguard's verdict feed and
can surface threats out loud.
Upstream: velle999/chibi-llm. Packaged
for SynapseOS as chibi and shipped on the ISO.
Running her
chibi
The launcher exports CHIBI_LLM_BACKEND=synapd and points at synapd's socket,
so she talks through the OS's own model. Override to use Ollama instead:
CHIBI_LLM_BACKEND=ollama chibi
Buddy mode
Press ✦ in her window (or F4) and Chibi leaves it to wander the desktop: along the bottom of the screen, up onto the tops of windows, talking in a bubble over her head. To start straight into it:
chibi --buddy
Click her to pet her, double-click to type to her, drag her anywhere, and right-click for her menu — Go home in it puts her back in her window. Voice, alarms and the sentinel aspect keep working while she is out, and the rest of the desktop stays clickable around her.
She roams the monitor her window was on. To choose another, or change her size,
set these in ~/.config/chibi/config.local.py:
buddy_output = "DP-1" # connector name, as `synctl outputs` lists it
buddy_scale = 0.7 # default 0.55
Asking her to do things
Some requests Chibi carries out herself, without the model, so they happen straight away:
| Say or type | What happens |
|---|---|
| "play music" | starts cliamp, shuffled, in a terminal window — or resumes it if it is already running |
| "open YouTube" | opens YouTube in your default browser |
| "open downloads", "open firefox", "open the display settings" | opens the folder, app or settings panel |
| "what's in my documents" | lists the folder |
| "pc stats", "how much ram do I have" | reads the hardware |
| "lock the screen", "take a screenshot" | asks first, then does it |
| "move the bar to the bottom", "turn the dock off" | asks first, then does it |
| "wake me up at 7am", "cancel alarm", "what alarms do I have" | sets, cancels or lists her alarms |
Her name and "please" are fine — "Chibi, open YouTube please" works. The request has to be the whole line, though: "how do I open YouTube?" is a question, and she answers it.
When she asks first, answer yes (or yeah, sure, ok, go ahead) and she does it; anything else leaves it alone. When an alarm rings, say snooze (or "five more minutes") for five more minutes; anything else turns it off.
Folders, apps, settings and the screen go through Vibe's desktop tools; music and YouTube through synsh's intents.
What's in the box
| Piece | Role |
|---|---|
| STT | faster-whisper with the small model, from synapse-voice (shipped on the ISO — she hears you with no network) |
| TTS | piper with the en_GB-cori-medium voice, from synapse-voice, pitch-shifted via sox for the "cute" timbre; espeak-ng is the last-resort fallback |
| LLM | synapd by default (llm_client.py), or Ollama |
| Sentinel | read-only subscriber to synguard's secfeed; the security aspect never writes |
| Desktop requests | Vibe's desktop tools and synsh's intents, called without the model |
| Avatar | pygame/SDL2 sprite renderer |
| Buddy mode | a GTK 4 layer-shell overlay (gtk4-layer-shell) that draws her with the same renderer |
Python deps are vendored under /usr/lib/chibi/pydeps with pip --target
(not a venv — a venv bakes a build-time absolute path that breaks when installed
elsewhere); the launcher puts that dir on PYTHONPATH.
Gotchas we already hit
- Silent and deaf with no error. ALSA's
defaultPCM must route to PipeWire, which is what thepipewire-alsapackage's/etc/alsa/conf.dsymlink does. Without itdefaultfalls back todmixon card 0 — and on a box whose card 0 is an HDMI-only GPU there is no device 0, so everyaplay/arecorddies and Chibi comes up mute.pipewire-alsais a hard dependency for this reason; do not drop it. - Text-only when you expected voice. The venv gives voice; system Python is silently text-only. The packaged build vendors the deps so this is handled, but a from-source run must use the right interpreter.
~/.local/binisn't on the synui session PATH — install launchers to/usr/bin(the package does).- Three copies of every module. The upstream repo ships per-resolution app
trees; a fix applied to one copy but not the others drifts. The package builds
from the
1080x1920-linuxtree.
See also: synapd (her brain), synguard + kmod (her security feed), and Vibe (the coding-assistant sibling on the same model).