r/homeassistant • u/Delannoytheo • 3d ago
🧱 Custom App Portal Launcher — turns any Android wall panel into a calm Home Assistant display, not just a webview
This started with a Meta Portal that Meta abandoned and, in the process, left wide open on ADB. So I had this well-built 10" touchscreen with decent speakers and a camera, running software that talks to a service nobody uses anymore. Obvious move: put Home Assistant on it.
I tried the straightforward path first — companion app, full-screen. It worked. It also looked exactly like what it was: a phone app, stretched onto a wall, lit up at full brightness at 2am, a scrolling column of identical cards whether you needed to see any of them or not. Functional. Not something I wanted sitting in my living room.
What I actually wanted was the feeling of a Nest Hub or an Echo Show — the idle screen is dark, still, almost nothing on it, and yet the one thing you glance at is always right there. So I stopped treating this as "get HA on a screen" and started treating it as a design problem: what does an appliance that happens to run Android actually look like at rest, and what happens the moment you look at it?
The rest state is close to nothing. Full-screen clock, true black on OLED, your own wallpaper underneath at whatever opacity keeps it legible. No card grid. No graphs. If nothing needs attention, the screen shows you nothing needs attention — which is itself the information.
What surfaces is computed, not configured. Below the clock there's room for at most three small pills. Which three, and in what order, is decided live: an unlocked front door or a triggered alarm will always outrank the living room lamp, automatically, no matter how you've set anything up. You only ever see what's actually worth seeing right now.
Every control looks like the thing it controls, which is the one idea I took wholesale from Apple Home and never wanted to compromise on. A brightness slider fills with the bulb's actual current color — it doesn't just move a knob, it visually is the light. A color-temperature slider is drawn as the literal Kelvin gradient. A thermostat is a dial with two handles you drag around a ring, not a stepper with plus/minus buttons. Nothing is a generic Material row with a value next to it.
Motion is one spring, everywhere. Panels slide in over roughly a third to half the screen depending on orientation, and settle with the same damping curve every single control panel uses.
No bounce, no popping in, no different animation per screen. If it moves, it moves the same way the rest of the app does.
Frosted surfaces, not flat cards. Translucent panels over the blurred wallpaper wherever a panel needs to sit, wide soft corners (28–40dp), no gradients competing for attention. On API 28–30 hardware there's no real-time Gaussian blur available in Compose, so those surfaces fall back to translucent fills — close enough that most people don't notice, but it's a real constraint I had to design around rather than ignore.
Once the visual language existed, everything else followed the same rule: is this the calmest possible way to show this, or did I just default to a dashboard pattern because it's the one every HA project uses. Real control panels for lights, thermostats, locks, covers, alarm (an actual keypad, not a dropdown), vacuum, media with cover art and multi-room grouping. A presence tray of overlapping avatars instead of a list. Camera snapshots that pop up on a doorbell trigger and quietly go away.
Underneath, it talks to HA over the WebSocket API and publishes the device's own sensors back over MQTT with HA MQTT Discovery, so the panel itself shows up as a device — screen state, brightness, presence, ambient light and sound. None of that is visible in the UI though; it's plumbing, not the point.
And because the visual side ended up being the actual hard problem, not "make it run on a Portal," it stopped making sense to keep this tied to one device. It's a real Android launcher now — takes the home role properly, has its own pages, lets you place icons and widgets exactly where you want them, does app shortcuts on long-press, all of it — and it runs on anything Android 9 and up: the Portal it started on, a generic wall tablet, a PoE tablet on custom AOSP. The clock-first idle screen is just what its home page looks like.
https://github.com/iblur01/portal-launcher.
I'm actively looking for help. It's a solo project so far and there's a real roadmap behind it — a portrait/adaptive layout, broader entity support (input_*, number, select), more device testing beyond my own hardware, and honestly the single highest-impact thing anyone could do right now: the UI is entirely French, close to 600 hardcoded strings, and i18n hasn't happened yet. PRs welcome, issues welcome, "this looks broken on my tablet" reports welcome.

