Apps

Chibi

Edit on GitHub · last edited

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 default PCM must route to PipeWire, which is what the pipewire-alsa package's /etc/alsa/conf.d symlink does. Without it default falls back to dmix on card 0 — and on a box whose card 0 is an HDMI-only GPU there is no device 0, so every aplay/arecord dies and Chibi comes up mute. pipewire-alsa is 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/bin isn'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-linux tree.

See also: synapd (her brain), synguard + kmod (her security feed), and Vibe (the coding-assistant sibling on the same model).