The Portal Go sits in my kitchen. It’s a 10-inch touchscreen with a decent microphone and camera, and out of the box it’s mostly a video-calling device I barely used. Meta’s stopped making them, but that doesn’t matter much here: the app I sideloaded onto it would run on pretty much any Android tablet. If you’re starting from scratch, a Samsung Galaxy Tab A9+ or a Lenovo Tab M11 would do the same job — 10-11 inch screen, microphone, speaker, Wi-Fi. That’s the whole hardware requirement for the front end.

Behind it sits a Raspberry Pi and a small mini PC.

The Portal itself is deliberately dumb. It’s a thin client: it renders cards, records voice, and plays audio. All the thinking happens elsewhere. That’s a design decision, not a limitation — the Portal runs Android 9 and I don’t want to fight its constraints any more than I have to.

Here’s the shape of it:

  • Portal — the app. Displays cards (calendar, weather, music), records voice, plays back speech.
  • Raspberry Pi — the bridge. Runs the board service over HTTPS. Receives voice recordings, forwards them on, serves the display state the Portal polls.
  • Mini PC — the heavy lifter. Runs Kokoro, a text-to-speech model, plus a private calendar service.

Voice is the interesting path. Saying “Hey Muse” is detected on-device with a small ONNX model, so no audio leaves the Portal until the wake word fires. Then it records (up to 20 seconds, with end-of-speech detection), uploads the audio to the Pi, and the Pi forwards it through to Muse for transcription and a reply. Muse’s reply text goes to the mini PC, where Kokoro renders it to speech, streams the audio back to the Portal, and the Portal plays it.

The whole round trip — me talking to a reply I can hear — runs on my own LAN. Nothing goes through a cloud voice service. If the TTS box is down, the app falls back to Android’s built-in TTS, so it still talks, just with a worse voice.

The board side is simpler. The Portal polls the Pi for display state every couple of seconds (the same poll the self-updater rides on, which I wrote about last time). Cards carry revisions so the display only redraws what changed. Music controls drive YouTube Music running in Chrome on the Portal itself, with the queue tracked on the Pi. Calendar comes from a private CalDAV bridge to the family calendar. Weather is just Open-Meteo.

Everything talks HTTPS with pinned certificates, all on the LAN. No port forwarding, no inbound holes in the router. The Portal reaches the Pi and the mini directly.

Why split it across three machines? Mostly because each box was already doing its job. The Pi was always on for automation anyway. The mini PC has the CPU headroom for a full-precision TTS model that would choke the Pi. And keeping the Portal dumb means I can replace the front end without touching the backend — or hang another screen on it later without duplicating logic.

It’s been running a while now. The thing I use most isn’t the voice, it’s glancing at the calendar while making coffee. The voice is for the moments my hands are full.

As an Amazon Associate, Headless Diaries earns from qualifying purchases made through links on this page.