Dino Angelov Software Architect

Building a Home HQ: When a Tablet Just Won't Do

• 6 minute read

As a software engineer, I’ve learned that there are two types of solutions to any problem: the practical one, and the one that lets you play with new toys. So, as one of these days my girlfriend and I were discussing ways to better organize our household chores and upcoming events, I could have simply grabbed a tablet and called it a day. But where’s the fun in THAT?

The Vision

What I wanted was an info center – something that would blend seamlessly into our home while providing at-a-glance information about our daily lives. But I wanted something less cookie cutter, something that didn’t need a battery (due to the fire risk and the fact that we have a whole wall made of wood), and something that was as simple as possible to use. So I went for a custom-built “HomeHQ” powered by a Raspberry Pi and featuring an ultra-wide display, set vertically – so I guess you could call it ultra tall instead. From what I gathered, it seems to be a display for monitoring CPU and GPU usage in custom-built PC cases.

Note: Click the image to see the full size. It’s blurrier than in real life, due to some weird PopOS/scaling issue that I didn’t wanna sink too much time into investigating.

The Hardware

There’s not much to it hardware wise. The Raspberry Pi is just powerful enough to run this. It doesn’t seem like it can handle much more, but I guess that’s fine.

Close up of the mounted display showing the calendar and todo interface

The Software Stack

The software stack is where things get interesting. I really wanted to keep things simple, so I went with:

The whole app has no backend in the classical sense at all, which is great for ease of deployments. The frontend is a single-page React app that communicates with the Supabase database via REST API. The Spotify integration is done via the Web API, and the calendar and todo-list are fetched from the Supabase database. Because of TailScale, we can access it anywhere and we don’t have to worry about any auth system.

For development, I work on my main laptop and use a custom deploy script that SSHs into the Raspberry Pi and copies over the built site. It’s not exactly CI/CD, but it gets the job done faster than you can say “Why didn’t you just buy a tablet?”

The Setup Process

Now, things that sound simple rarely are. And this is really my main beef with Linux even after all this time: the moment you step slighly out of a “standard” hardware build, everything simple becomes hard.

As an aside and another reason for my comment above, I use PopOS for my personal HP laptop, and getting it to do scaling right with an external monitor, it’s own touchscreen orientation, or even just re-connect my Logitech MX Vertical mouse is always so finicky. But that’s a story for another post.

Back to the Pi - getting the touch input working correctly was… an adventure. Since the monitor’s default orientation is landscape, and I wanted it to show vertically, the touchscreen was not working right. After sifting through literally dozens of pages of search results and Claude questions, I figured things out (and had to switch from Wayland to X11). First, xinput list showed me this little gem:

⎜   ↳ PIXCIR Inc. PIXC65 Touch                    id=8    [slave  pointer  (2)]
⎜   ↳ PIXCIR Inc. PIXC65 Touch                    id=9    [slave  pointer  (2)]

The touch input needed to be mapped to the screen orientation, and after messing with touchscreen coordinates manually, I finally accomplished it by asking xinput to map the touchscreen to the HDMI orientation with:

xinput list | grep "Touch" | awk '{print $7}' | cut -d= -f2 | xargs -I {} xinput --map-to-output {} HDMI-1

Glad it worked, but it was likely one of the bigger time sinks of the whole project – and least fun.

The Autostart Dance

Since I needed this to boot straight to a fullscreen Firefox window, I had to create a bunch of autostart files to get things running. The silliest one is probably the close-overview.sh script – it continuously checks if the “overview” mode when logging in is active and closes it if necessary. Wish this was just a regular setting somewhere, but couldn’t find it.

#!/usr/bin/bash

# Monitoring time in tenths of seconds
for i in {1..100}
do
	read -r DUMMY DUMMY IS_OVERVIEW <<< "$(dbus-send --print-reply=literal --session --dest=org.gnome.Shell --type=method_call /
hell org.freedesktop.DBus.Properties.Get string:org.gnome.Shell string:OverviewActive)"
	if [[ "${IS_OVERVIEW}" = "true" ]] ; then
		/usr/bin/dbus-send --session --dest=org.gnome.Shell --type=method_call /org/gnome/Shell org.freedesktop.DBus.Propert
ing:org.gnome.Shell string:OverviewActive variant:boolean:false
		exit
	fi
	sleep 0.25
done

I also set up a simple HTTP server using Busybox to serve the web application:

#!/usr/bin/bash
cd /home/dangelov/homehq && busybox httpd -f -p 3000

The whole system is tied together with Firefox in kiosk mode, which launches on startup and displays the custom interface. One issue I had was that on abrupt shutdowns, Firefox’s profiles directory would get corrupted and it would fail to launch. To fix this, the startup script basically nukes the Firefox directory and then starts Firefox in Kiosk mode. This works fairly OK since everything is fetched from Supabase anyway.

rm -rf ~/.mozilla/firefox && firefox --kiosk http://pop-os:3000/

The Code

While all of the code is custom-built for this project, I also used it as a bit of an experimental playground to understand the current state of codegen AI when it comes to greenfield projects and I was honestly utterly impressed. Claude (with Double Bot) was able to generate the entire frontend, backend, and even the autostart scripts for me with the proper guidance. Definitely a huge amplifier of my productivity.

Note: The code isn’t open source since it’s highly specific to our household’s needs and I’m not looking to add more complexity to the project.

The Result

The final product is exactly what we needed - a simple centralized system that keeps track of our household tasks and upcoming events. The ultra-widetall display gives us plenty of real estate to show our calendar, todo-list, and even what’s currently playing on Spotify. And being able to use it’s touch functionality to easily mark things as done on the spot has been great.

Final setup showing the Home HQ integrated into our living space

Last Words…

Sometimes the best solutions are the ones you had the most fun with. This project not only helped us feel a bit more organized but also gave me an excuse to tinker with hardware and create something unique for our home. Plus, it’s a great conversation starter :)