A tiny computer, a custom operating system, and a website served straight from my home. This is the story of the Kevynx Pi project.
These numbers are read by PHP from the Raspberry Pi 5 every time you load this page.
Most people flash Raspberry Pi OS and call it a day. I wanted to understand every layer, so I built my own.
The base system is Buildroot, a build system that produces a small, fast Linux tailored to the hardware. No bloat, only what I choose to include.
Buildroot has no package manager by default, so I added opkg with the Entware and OpenWrt feeds. Now installing software is one command.
A full Alpine Linux userland lives in a chroot. I get apk, a huge package catalog, and a desktop, without touching the base system.
This site runs on nginx + PHP-FPM on the Pi and reaches the internet through a Cloudflare Tunnel, so no ports are opened on my router.
Everything running on this one little board.
Raspberry Pi 5 (aarch64), 8 GB RAM, a 256 GB NVMe SSD on the PCIe bus as the only drive, USB mouse and keyboard, HDMI display.
Buildroot 2026.08 with a 6.12 Linux kernel. BusyBox init, Dropbear SSH, and a tiny footprint: the whole root filesystem is a few hundred MB.
nginx and PHP 8 FPM from Entware, running as an unprivileged user. Cloudflare Tunnel (cloudflared) brings in the traffic.
XFCE on Xorg inside the Alpine chroot, drawn straight to the framebuffer on HDMI. One command, load_desktop, starts it.
No port forwarding and no public IP. The Pi reaches out to Cloudflare, and visitors come in through that connection.
index.php and builds this page, including the live statsGetting Alpine and a desktop running on a Buildroot system was the fun part. A chroot makes a folder look like a whole separate Linux install.
# mount the pseudo filesystems, then step inside Alpine # mount -t proc proc /opt/alpine/proc # mount -t sysfs sysfs /opt/alpine/sys # mount -t devtmpfs devtmpfs /opt/alpine/dev # chroot /opt/alpine /bin/sh -l # now it's Alpine, with apk / # apk add nano htop curl git xfce4 / # cat /etc/alpine-release 3.24.2 # back on the Buildroot side, one command opens the desktop # load_desktop
How the system came together, step by step.
Configured and compiled a Buildroot image for the Pi 5 and booted it from the SD card.
Set up opkg with the Entware and OpenWrt repositories, then fixed the feed and signature quirks until installs worked.
Installed nginx and PHP, then connected them to a Cloudflare Tunnel so the Pi is reachable from anywhere.
Unpacked the Alpine minirootfs, mounted proc, sys and dev, and got apk installing packages.
Installed XFCE and Xorg inside the chroot, drove the screen through the framebuffer, and fixed the mouse by running udev.
Switched SSH to key-only login, moved the web server to an unprivileged user, and made everything start on boot.
Wiped the SSD, split it into a small FAT boot partition and an ext4 root, and copied the whole system over. The Pi now boots from the NVMe with no SD card at all.
A custom login banner and colour prompts, an alpine command to jump into the chroot, text games from bsd-games, and a private Git repo to back up every config.
The problems that took the longest, and what fixed them.
pgrep and no sftp, so scripts have to use ps | grep and scp -O.Plenty of ideas in the pipeline.
The whole system now runs from the NVMe, so installs, builds and the desktop are much quicker than on the SD card.
Text classics like snake and klondike work today. Emulators are next.
The desktop is stuck at 640ร480 for now. Time to tune the boot configuration.
GPIO projects, sensors and automation, with their data shown right here on this site.
Detailed guides for each part of this build, so you can follow along on your own Pi.
Automatic images of the SD card and the Alpine chroot, because every good system needs a way back.
Small web apps and scripts, hosted and demoed on the Pi itself.