ai · flagship
BEBO the PET
Your AI desktop companion. Always on. One click. Done.
BEBO is a free, open-source AI assistant that lives on your Windows desktop as a small animated pet. Click it and a focused panel opens with the writing tasks you actually repeat — summarize, draft, fix, simplify, humanize, ask — powered by GPT-OSS 120B through Groq, with an automatic GPT-OSS 20B fallback if the primary model is ever busy. No browser, no tabs, no sign-in.
BEBO launched in May 2026 on Llama 3.3 70B. Then Groq retired every Llama model, effective 16 August 2026. I moved BEBO to GPT-OSS 120B with a 20B fallback and shipped v2.0 before the shutdown. The old model now returns HTTP 404. BEBO kept working. Current release: v2.1.0, 10 October 2026.
See it in action






The problem
Every time you want quick AI help, you pay a tax: open a browser, find the right tab, sign in, paste your text, wait, copy the result back. It's only about thirty seconds — but you pay it a dozen times a day, and it breaks your focus every single time.
What BEBO does
BEBO collapses that to one click. It sits on your desktop as a small pet; clicking it opens a compact panel built around the tasks people actually repeat:
- Summarize — turn long text into a clear, short summary
- Draft Email — turn notes or intent into a professional email
- Fix Grammar — clean up grammar, spelling, and punctuation
- Simplify — rewrite complex text in plain language
- Humanize — make robotic AI text sound natural
- Ask AI — a general prompt for when the fixed tools don't fit
The day its model was retired
BEBO launched in May 2026 on Llama 3.3 70B. A few months later Groq announced it was retiring every Llama model, with the shutdown set for 16 August 2026. The whole product sat on one of them.
I migrated to GPT-OSS 120B, added GPT-OSS 20B as an automatic fallback on a separate quota, and shipped v2.0 before the deadline. Today the old model returns HTTP 404.
A dependency died. The product didn't.
A one-second blink took a scheduler rewrite
2.1's headline feature is a blink. Every ten seconds or so, BEBO closes its eyes for one second. The hard part wasn't drawing it. It was timing it.
Blinking was one entry in a weighted expression scheduler, competing with every other idle animation. At the default pace that came out to about one blink every 13 minutes: technically a blink, perceptually a twitch. It needed its own timer, jittered between 8.6 and 11.4 seconds so it never feels mechanical.
There was a second constraint. BEBO's eyes are painted into a fixed 512px PNG, and the character couldn't be redrawn. So the eyelids are CSS shapes positioned from pixel coordinates measured off the artwork.
Prompts measured, not guessed
Each action is its own tuned prompt — structured as Role → Objective → Context → Instructions — with a temperature calibrated to the task: 0.05 for Fix Grammar (near-deterministic), up to 0.65 for Humanize (more creative). Every response runs through a stripMarkdown() step so the output drops cleanly into whatever you were already writing.
For 2.1 I rewrote all six prompts and didn't ship them on feel. I built an A/B harness that runs old and new prompts on the same inputs, against the same model, and scores both against a machine-checkable contract. It caught two bugs that would have shipped otherwise.
See the A/B harness on GitHubHow it's built
BEBO is an Electron app with two windows: a transparent, always-on-top pet, and an assistant panel that opens beside it. They talk over IPC — the panel sends your input to the main process, which calls the Groq API and returns clean plain text to the UI. The frontend is deliberately vanilla HTML, CSS, and JavaScript: for a desktop utility, speed and reliability matter more than framework complexity.
- Electron 29 + Node.js — the native desktop shell
- Groq API + GPT-OSS 120B, with automatic GPT-OSS 20B fallback — inference
- Two-window architecture (transparent always-on-top pet + panel) wired over IPC
- contextIsolation on, nodeIntegration off, with a preload bridge for each window
- Windows 10 and 11 · MIT licensed, with a GitHub Actions CI build pipeline
A decision I cared about
I deliberately did not make BEBO another giant chatbot window. The panel stays focused on repeated micro-tasks — 'summarize this', 'make this email sound professional', 'fix this paragraph'. That constraint is the product: it keeps BEBO fast, light, and something that respects your attention instead of competing for it.
Why Groq + GPT-OSS
BEBO isn't trying to be the smartest AI — it's trying to be the most usable one. Groq's LPUs run GPT-OSS 120B at roughly 500 tokens per second, about 5× faster than GPT-4o, so a typical task finishes in about a second. The free tier allows 1,000 requests a day — still far more headroom than the big chat apps' free tiers — and the 20B fallback runs on a separate quota, so a busy primary model never turns into a dead button. Fast, free, and one click away beats marginally smarter but ten clicks and a login away.
The telemetry decision
v1 claimed "zero telemetry". When I added an install counter in v2, the honest move was not to quietly keep the old claim — it was to change every place it appeared. BEBO now says exactly what it sends: a version number and a random id, once a day, never your text or anything personal. It is a single tick-box in the settings panel to turn off. A counter is worth having; a claim you have quietly outgrown is not.
What 2.1 added
- A real eyelid blink every ~10 seconds, on its own timer
- Ctrl+Shift+E grabs selected text from any app, then restores your clipboard
- Streaming answers with a Stop button, plus Regenerate for a different take
- Ambient life: it sways, glances around, stretches in the morning, yawns after 11pm, sleeps after 10 idle minutes, wakes when you return, and celebrates every 10th task
- A Liveliness setting (Lively / Normal / Calm / Off) that also respects Windows reduce-motion
- Change your API key in settings, validated before it saves, and errors that tell you how to fix them
What I learned
Desktop AI needs a different rhythm than web AI: if opening the tool feels heavy, people just go back to the browser. And in Electron, the small product details — panel positioning, always-on-top behaviour, global shortcuts, clean IPC boundaries — are most of what makes an app feel polished instead of like a web page in a wrapper.
- Constraints beat compression settings: the website's hero animation first exported at 2.9 MB, enough to wreck Core Web Vitals. A 5px idle float moved every pixel in every frame, so WebP had nothing to reuse between frames. Holding the body still made 90 of 124 frames byte-identical. Same length, same resolution, 82 KB.
- Migrate with a fallback, not a hard cutover: shipping a primary model plus an automatic second one meant the switch had a safety net instead of a single point of failure.
- Ship the docs with the code: a model migration touches the README, the website, the FAQ, the carousel, the deck, and the app's own footer. Updating the code and leaving the marketing stale is its own kind of bug — and the one people actually see.
- Shortcut choices are product choices: the default hide key moved to Ctrl+Shift+B specifically so Windows' Win+H voice typing stayed free.