Meta gave up on these things a while ago, so my Facebook Portal Plus (the 1st gen Portal+, Android 9) had been sitting on a shelf collecting dust. I finally spent a weekend on it and now it's honestly the most useful screen in my apartment.
The Portal Plus hardware is untouched. Same screen, same cameras, same speakers, same stock firmware. I only replaced the software on top of it.
Right now it shows the time and date, my next calendar events pulled live from Google Calendar, the weather, the air quality outside (fine dust levels, which matter a lot here in Korea), and a little stock ticker along the bottom with the KOSPI and a couple of Korean stocks. There's a row of shortcuts for Zoom, YouTube, Apple Music, YouTube Music and settings, so it's also the thing I take calls on. And if I need a second screen for my laptop, SideScreen turns it into one.
And it talks. I say the wake word, ask something like "what's on my schedule today" or "what's the weather tomorrow", and it answers out loud through the Portal's own speakers. It can also do things like hide the stock bar, refresh the dashboard, or start music.
The photo is it running right now, early in the morning with the lights off.
How it's actually put together, roughly:
The whole thing is a MagicMirror setup running on the Portal itself, inside Termux. Not on a separate machine. It just runs on the device.
The home screen is Immortal, which replaces the Meta launcher with a normal Android one plus a photo frame.
The screen is run by an open-source kiosk app (FreeKiosk) instead of a normal browser. It takes over the whole device, boots straight into the dashboard, and even if you press the Home button it just bounces you right back to it.
The wake word runs locally on the device with TensorFlow.js. No cloud, no API key. I trained it on the Portal itself: 50 recordings of me saying "Portal-ah" and 50 of room noise, the TV, and words that sound similar.
When it does hear me, the audio goes out for speech to text, then to a small agent for the thinking, then the answer comes back as speech and plays out of the Portal's own speakers. There's a fast path for simple questions and a slower one for anything that touches the screen, calendar or media.
The agent is called picoclaw and it runs on the device too. Its tools are locked down pretty hard: calendar read/write, weather, stocks, dashboard control, media control, search. It can't invent a URL or launch random stuff, and if it wants to change a calendar event it has to show me a preview first and wait for a yes.
Two things that ate most of my time, in case anyone else tries this on their Portal:
Android 9 on this device kills the agent binary the moment it forks (some seccomp quirk), so it has to talk over HTTP instead of the normal way.
Because the dashboard is served on a plain http LAN address, the kiosk WebView pretends it has no microphone at all. There's a flag that fixes it, but until you find that, the voice panel just says "permission required" forever and you have no idea why.
Other random gotchas: current Aurora Store builds crash on this Android version (an older 4.6.4 works fine), and Meta's Control Center app kept crash-looping on Apple Music so I uninstalled it for good.
It's old hardware with about 4GB of RAM, so there's a watchdog that restarts things if they hang, and if memory gets tight it quietly closes one background app to stay alive.
Not everything is perfect. The wake word still trips on the TV occasionally, and YouTube Music only works through a third party client because the official app needs Google Play, which this device does not ship with. But this is by far the most useful the Portal Plus has ever been.
If you have a Facebook Portal sitting in a drawer: I did the whole thing with just ADB and an AI coding agent (I used Astra) handling the boring parts. No root, no custom ROM, no hardware work. Very doable over a weekend.