origin story

The Minecraft Server That Wasn't

Samsung S20 FE 5G

Samsung Galaxy S20 FE 5G — broken screen, dead fingerprint scanner, perfect server.

About a month ago I had an old Samsung S20 FE 5G lying around with a cheap replacement screen — no 120Hz, dead fingerprint scanner. I repurposed it to host a Minecraft server because roughly 25 friends swore they'd play. Day one: 10 showed up. Day three: I was managing a server for exactly 4 regulars.

After shutting it down, the phone went back to collecting dust. Then I stumbled into the self-hosting community. The idea of running my own services was incredible — but there was a catch: almost zero tutorials exist for doing this on Android. Most people use Raspberry Pis or old PCs. I decided to forge ahead anyway. The phone draws a fraction of the power of a desktop, has a built-in UPS (battery), and produces zero fan noise.


the stack

Every Service Running

Jellyfin Private streaming — movies, TV shows, live IPTV routing online
Navidrome Self-hosted music library with Subsonic API online
Uptime Kuma Service health monitoring & alert dashboard online
Homepage Unified dashboard — CPU, RAM, all apps in one place online
Tailscale Zero-config WireGuard VPN — global secure access online
🎬
Jellyfin
Open-source media server. Streams your library anywhere with full Intro Skipper plugin support and live IPTV routing.
media
🎵
Navidrome
Self-hosted Spotify. Phenomenal Subsonic API. Used with Aonsoku on web/PC and Navic on Android.
music
📊
Uptime Kuma
Beautiful health monitor for the whole stack. Instant alerts when any service drops.
monitoring
🏠
Homepage
Daily-driver frontend dashboard. One-click access to all services with live server stats.
dashboard
🔒
Tailscale
Zero-config VPN magic. No static IP, no port forwarding. Fastest service to set up in the entire stack.
networking
Navidrome Base UI
Base Web UI
Aonsoku Web Client
Aonsoku (Web/PC)
Navic Android Client
Navic (Android)

hitting the ceiling

Android's Hard Limits

What takes an hour on a standard Linux machine took five weeks of troubleshooting on Android. Two walls in particular nearly ended the project:

Port Restrictions
Android blocks access to privileged ports below 1024 — including port 80 (HTTP) and port 53 (DNS). This made network-wide ad blockers like Pi-hole completely non-viable without root access.
Phantom Process Killer
Even with 8 GB of RAM, Android's aggressive memory manager flagged the entire server stack as a rogue background process and terminated it the moment memory usage climbed above ~5 GB. Services would silently die mid-stream.
the fix

ADB to the Rescue

adb_fix.sh — disable phantom process killer
laptop@home:~$ adb devices
List of devices attached
S20FE_5G device
laptop@home:~$ adb shell "/system/bin/device_config set_sync_disabled_for_tests persistent"
Success.
laptop@home:~$ adb shell "/system/bin/device_config put activity_manager max_phantom_processes 2147483647"
Success. Phantom Process Killer disabled.
laptop@home:~$ # server stack now stable above 5GB RAM usage ✓
Phantom Process Killer — Defeated
Two ADB commands over USB from a laptop permanently reconfigured Android's process limit to its maximum integer value. The stack has been stable ever since, even under full load.

monitoring

Watching the Stack

Uptime Kuma Dashboard

Uptime Kuma — every service monitored, every outage alerted.

Homepage Dashboard

Homepage — the daily-driver front door to the entire stack.

Tailscale Admin Panel

Tailscale — the entire stack exposed to the internet in minutes, zero port forwarding required.

Jellyfin UI

Jellyfin — with Intro Skipper and a custom theme from awesome-jellyfin.


takeaway

Pushing the Limits

Conclusion

Building a home server usually involves buying specialized hardware. But sometimes, the best hardware is the hardware you already have. Pushing an old mobile OS to act as a headless Linux server required a lot of workarounds — but it resulted in a completely free, silent, and highly capable cloud infrastructure.

It's proof that you don't need enterprise gear to build enterprise-grade solutions. The biggest investment wasn't money — it was five weeks of patience and stubborn curiosity.

Linux mindset zero-cost infra self-hosted ADB scripting 5 weeks debugging