
I back up my Nextcloud AIO and Immich services with local Borg repositories, then sync those repositories to Backblaze B2 with rclone and systemd timers.
Benjamin Looi / October 25, 2025
I had an old Android phone sitting in a drawer. I also had a homelab where I kept shutting down machines to save power, then walking over to press the power button when I needed them again. Wake-on-LAN exists, but it needs a device on the network to send the magic packet. I did not want to buy a Raspberry Pi for that.
So I built WOLE. It turns any Android phone into a WOL relay by running a small HTTP server as a foreground service. You send it a POST request with a MAC address, it broadcasts the magic packet on the local network, and your machine wakes up.
That is the whole idea.
react-native-background-actions to keep it alive while the app is in the background. The server listens on a configurable port (default 8080) and exposes a POST /wol endpoint.To wake a machine, you hit that endpoint with the target's MAC address:
curl -X POST "http://<phone-ip>:8080/wol" \
-H "X-Auth-Token: your-secret" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data "mac=AA:BB:CC:DD:EE:FF"
255.255.255.255:9) work for most setups. Authentication uses a shared secret token: set it in the app, then include it in your requests.The phone needs to be on the same LAN as the devices you want to wake. If you're remote, connect the phone to your network through Tailscale, WireGuard, or ZeroTier, and you can reach it from anywhere.
UpSnap is a proper web-based WOL dashboard that you run on a server. The catch is that you need a server running. If you are trying to wake your only server, you have the chicken-and-egg problem.
An old phone doesn't have that problem. It sips power on its own, it's already on your Wi-Fi, and it doesn't need a separate machine to host it. Plug it in, install WOLE, and forget about it.
Beyond the WOL relay, WOLE includes:
/api/devices.POST /api/ping checks whether a device is online. Useful for confirming that a wake worked.GET /health returns ok. Good for monitoring with something like Uptime Kuma.adb logcat.If Android kills the service, go into the battery optimization settings (there's a shortcut in the app) and exclude WOLE. Android is aggressive about killing background services, so this step matters.
For remote access, I use Tailscale. The phone gets a stable VPN IP, and I can reach the WOLE server from any of my devices without exposing anything to the internet.
If you want to build it yourself:
npm install
npx expo prebuild -p android
WOLE also has a web UI that gets bundled into the APK. Build that first:
# Build the web UI, then build the APK
cd web && npm run build && cd ..
cd android && ./gradlew assembleRelease
WOLE does what I need right now. Next I want a better web dashboard, scheduled wakes, and stronger security beyond the shared token. The code is on GitHub if you want to contribute or poke around.
Thanks for reading! 😁
I back up my Nextcloud AIO and Immich services with local Borg repositories, then sync those repositories to Backblaze B2 with rclone and systemd timers.
An Android foreground service that turns a phone into a Wake-on-LAN relay reachable over LAN, Tailscale, or WireGuard.
A resume builder with AI coaching, server-side rendering, local state persistence, and Cloudflare Workers deployment.