That phone in your drawer has an 8-core CPU, a hardware video encoder, gigabytes of RAM, Wi-Fi,
a battery that works as a built-in UPS, and it sips about as much power as an LED bulb.
**Homedroid turns it into a self-hosted home server**: a media server, a NAS for your USB drive
or microSD card, a photo backup, a torrent box, a web host, a network-wide ad blocker, a private AI and a smart-home hub,
all managed from a beautiful web dashboard. **No root, no Termux, no Linux skills needed:
one APK.**
- π¬ **Jellyfin** streams your movies to every screen, transcoded by the **phone's own video
encoder**.
- πΎ **A pocket NAS.** Plug in a USB drive or microSD card and reach it from any browser or over
SFTP.
- π§ **AI on the phone.** llama.cpp runs models locally, with an OpenAI-compatible API for your
other apps.
- π **Online in minutes.** Cloudflare Tunnel or Tailscale, so it works behind CGNAT with no
port forwarding.
- π‘οΈ **Ad blocking everywhere.** AdGuard Home filters ads and trackers for every device on your
tailnet, at home or on mobile data.
- β‘ **Wake on LAN from anywhere.** Turn on your desktop from the other side of the world.
- π **Network tools.** See who's on your network, scan ports, look up DNS and run speed tests.
- π **Deploy from GitHub.** Node.js, Python and static sites, rebuilt when you push.
- π± **Several phones, one dashboard.** Pair old phones into a cluster and move apps between them.
## Walkthrough
A 4Β½-minute tour: the phone app, the dashboard, files on an SD card, a Linux shell in
the browser, Jellyfin, AI on the phone, a deployment from GitHub and two phones working as
one. [Watch the full video (MP4, 13 MB)](https://github.com/sudiptacmd/homedroid/releases/download/v0.9.4-beta/homedroid-walkthrough.mp4)
or see the clips on the [website](https://sudiptacmd.github.io/homedroid/).
## Download
Homedroid is in **beta (0.9.4)** and free. Get the APK from the
[latest release](https://github.com/sudiptacmd/homedroid/releases):
| Your phone | APK |
|------------|-----|
| Almost every phone from the last ~8 years (64-bit) | `homedroid--arm64-v8a.apk` |
| Older 32-bit phones | `homedroid--armeabi-v7a.apk` |
| Emulators, Chromebooks | `homedroid--x86_64.apk` |
| Not sure | `homedroid--universal.apk` (larger, runs everywhere) |
Open it on the phone and allow installing from your browser or file manager, or run
`adb install homedroid--arm64-v8a.apk`. `SHA256SUMS` in each release lets you check
the download. Every release is signed with the same key, so newer versions install over older
ones and keep your data.
**Updating:** in the dashboard open **Settings β App updates β Download and install**. The phone
fetches the right APK itself and Android asks you to confirm (on Android 12 and later, updates
after the first install without a prompt). The server comes back on the new version by itself.
## What you get
| Module | What it does | Port |
|--------|--------------|------|
| **Dashboard** | Manage everything from any browser: live load, files, a terminal, apps, logs, updates | 8800 |
| **SSH & SFTP** | A real shell and file transfer, public-key login, `ssh -L` port forwarding | 8022 |
| **Web hosting** | Caddy serving `~/www`, plus sites deployed from GitHub | 8080 |
| **Cloudflare Tunnel** | Publish services on the internet without port forwarding; works behind CGNAT | β |
| **Tailscale** | Reach every module privately from your own devices, anywhere; optional HTTPS, exit node and subnet routes. No root, no VPN slot | β |
| **Jellyfin** | Media server with **hardware transcoding on the phone's video encoder** | 8096 |
| **Immich** | Google Photos-style backup of your photos and videos | 2283 |
| **qBittorrent** | Torrents download in order into the media library and show up in Jellyfin; `torrent ` over SSH | 8081 |
| **Home Assistant** | Home automation (network and cloud integrations) | 8123 |
| **IPCam** | Live view from any camera, photos, video, motion recording, the microphone, and spoken announcements | 8800 |
| **AI** | Chat and an OpenAI-compatible API, with models **on the phone** (llama.cpp, GPU or CPU) or cloud services; scheduled **routines** that brief you by voice or push | 8090 |
| **AdGuard Home** | Network-wide ad and tracker blocking, with blocklists, statistics and a query log; tailnet devices can use the phone as their DNS server | 3000 (DNS 1053) |
| **Network tools** | This phone's network, device discovery, ping, traceroute, DNS lookups, port scans, HTTP checks, LAN and internet speed tests | 8800 |
| **Wake on LAN** | Wake computers at home from anywhere the dashboard reaches; also from scripts and phone shortcuts | 8800 |
| **Cluster** | Several phones, one dashboard: pick which phone runs each app, move apps with their data, every camera on one page | 8801 |
- **Everything is a module.** Add, remove, turn on or off at any time. Nothing you don't use runs.
- **Your storage, your choice.** Keep app data inside the app (no permissions needed) or put
media and photos on internal storage, a **microSD card or a USB drive**, per app.
- **Built to stay up.** A foreground service, wakelocks, start on boot, automatic restarts with
backoff, and per-service logs. Crash loops show their reason right in the UI.
- **Light.** One APK under 50 MB per ABI; apps are downloaded only when you install them.
## Getting started
1. Install the APK from [Download](#download) (or [build it](#building)) and open Homedroid.
2. Tap **Start server**. The overview shows the dashboard address, like `http://192.168.1.20:8800`,
and **Dashboard login** shows its password.
3. Let it run in the background: **Settings β Battery settings β allow**. On Samsung also add
Homedroid to *Battery β Background usage limits β Never sleeping apps*. On Android 12+ turn
off the phantom process killer (the app shows you how).
4. Open the dashboard from your computer, or tap **Open control panel** on the phone.
5. For SSH, paste your public key (`~/.ssh/id_ed25519.pub`) under **Settings β SSH public keys**.
6. Keep the phone cool and, if your phone supports it, limit charging to about 80%.
```bash
ssh -p 8022 # a shell; `alpine` opens a root shell in Alpine Linux
sftp -P 8022 # files; put your website in www/
ssh -p 8022 torrent 'magnet:?β¦' # download, in order, into Media/Downloads
ssh -p 8022 torrent list # progress
```
**Reach it from anywhere.** Turn on the **Tailscale** module and log in with the link it shows:
every module is then at `http://homedroid:` on your tailnet. Or publish a service on the
internet with a **Cloudflare Tunnel**: create a tunnel in Cloudflare Zero Trust, point a public
hostname at `http://localhost:` and paste the tunnel token. Both modules have a
step-by-step **Setup guide** in the dashboard.
## Tour
### The dashboard
Open `http://:8800` on a computer or a phone. It works without internet access:
everything it needs is inside the app.
- **Overview:** CPU load, temperature, network speed, battery, memory and storage, and every
service with its logs and a restart button.
- **Modules:** install, remove and turn modules on or off; set up Cloudflare Tunnel and
Tailscale with built-in guides. **Clear data** resets an app like a fresh install.
- **Files:** the media and photo libraries, the SSH home with your website, phone storage, and
**SD cards and USB drives**. Upload files or whole folders (drag and drop works), download
files or folders as zip, play videos and music and open pictures and PDFs in the browser,
rename, move and delete.
- **Terminal & SSH:** a terminal in the browser, in the phone's shell or straight into Alpine
Linux; the SSH keys that may log in; a log of every SSH and terminal session (who, from where,
what they ran, and rejected logins).
- **Deployments**, **AI**, **IPCam** and **Cluster**, below.
### A NAS in your pocket: USB drives and SD cards
Plug a USB drive into the phone (with an OTG adapter) or insert a microSD card, and it shows up
in **Files** next to the phone's own storage. Stream a video straight from it, drop a folder of
photos onto it, or download a whole folder as a zip. Over SFTP the drive is at
`/storage/`, so `sshfs`, rclone, WinSCP, Cyberduck or your file manager's
`sftp://` support can mount it like a network drive.
Apps can live there too: choose **Storage location** on an app and pick the card. On Android
11+ the data goes to a visible `Homedroid/` folder (this needs *All files access*, which
the app asks for). Databases and settings always stay in internal storage, because cards and
drives are usually FAT32 or exFAT. If the card is removed, apps wait for it instead of writing
somewhere else, and the location simply disappears from Files until it's back. With storage
access every volume also appears inside Alpine at `/storage/β¦`, so existing folders can be added
to Jellyfin.
> Good to know: FAT32 can't hold files over 4 GB (use exFAT for movies), and on Android 10 apps
> can only write to their own folder on removable storage, which Android deletes if Homedroid
> is uninstalled. The storage picker tells you when that applies.
### Media: Jellyfin and qBittorrent
Jellyfin and qBittorrent share one *Media* folder. Installing both adds a *Downloads* library
to Jellyfin that picks up finished torrents within a minute, and torrents download in order so
you can start watching before they finish. Jellyfin transcodes with the phone's video encoder,
so the CPU stays cool (see [how](#hardware-transcoding-on-a-phone)).
### Deploying from GitHub
Give a repository URL, branch and port. Node.js, Python and static sites are detected; build
and start commands and environment variables can be set. Apps get `$PORT`; static sites are
served by Caddy. **Redeploy** pulls and rebuilds, and a failed build keeps the old version
running. **Auto-deploy** checks the branch every 5 minutes, so no public webhook is needed. For
private repositories use `https://@github.com/you/repo` with a read-only token; it is
never shown back in the dashboard.
### AI on your phone
Turn on **AI** in Modules, then open the AI page:
- **On this phone:** install llama.cpp (built for Android by this project, about 17 MB) and
download a model (Gemma 4 E2B, Qwen2.5, Llama 3.2 or Gemma 3), paste any Hugging Face `.gguf` link, or
upload one. The page **recommends** the best model your phone runs well, from its memory, free
space and measured speed. Nothing leaves the phone.
- **GPU or CPU:** the **Benchmark** measures both and *Auto* uses the faster: Vulkan on most
phone GPUs, OpenCL on Qualcomm Adreno. A GPU whose driver crashes llama.cpp is detected and
never used.
- **Cloud services:** connect OpenAI, Google Gemini or any OpenAI-compatible API (OpenRouter,
Groq, Ollama or LM Studio on your computer). Keys stay on the phone, and a cloud model can
stand in when the phone is too hot.
- **For your other apps:** `http://:8090/v1` is an OpenAI-compatible API with its own
key. Use `local/` or `/` as the model name.
- **Routines** run on a schedule: they read news feeds, web pages, the weather, your phones'
health and unread email (IMAP with an app password; nothing is marked read), and write a brief
that is read aloud on any phone, kept under *Briefs*, or pushed with ntfy or Telegram.
Expect a few to a dozen words a second with small (0.5β3B) models. llama.cpp needs a 64-bit
phone.
### IPCam
Turn on **IPCam**, then tap **Enable camera access** in the phone app once. From the dashboard
you can watch a live view from any camera, take photos, record video, toggle the torch, listen
to or record the microphone, and **Announce** a typed message with the phone's voice.
- **Continuous monitoring** keeps one camera ready with the browser closed and saves a clip only
when something moves. Each camera has its own resolution (240pβ1080p), frame rate, rotation,
motion threshold, quiet period and clip length.
- **Capture storage** has a shared limit (128 MBβ100 GB); the oldest captures make room
automatically and active recordings are never touched.
- Android requires camera and microphone services to start while the app is visible, so after a
reboot tap **Enable camera access** again. Android's privacy indicators stay on while IPCam is
active, and its notification has a **Stop** button.
### Ad blocking with AdGuard Home
Install **AdGuard Home** from Modules and it filters ads and trackers out of DNS lookups for
every device you point at it, with blocklists, statistics and a query log in its web UI (port
3000; the login is on the app card).
Android won't let an app use port 53, the port every device asks for DNS on, so AdGuard Home
listens on **1053**. The easiest way round that is Tailscale: Homedroid's Tailscale passes port
53 on the phone's tailnet address to 1053, so in the Tailscale admin console you add the phone
as a custom nameserver, turn on **Override DNS servers**, and every device on your tailnet is
filtered, at home or on mobile data. Routers that can forward DNS to a port (OpenWrt, pfSense,
anything with dnsmasq) can send the whole home network there too. The **Setup guide** on the
card walks through both.
### Network tools
Turn on **Network tools** and a **Network** page shows this phone's addresses, gateway, DNS
servers and live throughput, and finds the devices around it (mDNS, SSDP/UPnP and quick TCP
probes of the local network). Its tools run on the phone and stream their output to the page:
ping, traceroute, DNS lookups (handy for testing AdGuard Home), port scans with nmap, HTTP
checks with timings and certificate expiry, whois, LAN speed tests with iperf3 (the phone can be
the server too) and an internet speed test. Live packet capture needs root, so there's no
Wireshark capture; everything else works as an app.
### Wake on LAN
Turn on **Wake on LAN**, add your computers with their MAC addresses, and wake them with one
click from anywhere the dashboard reaches: over Tailscale, through a Cloudflare tunnel, or from
another phone in your cluster. Homedroid sends the magic packet on every network the phone is
on, and shows whether a computer is on when you give it an address. Scripts and phone shortcuts
can call `POST /api/wol/wake` with the dashboard password as a Bearer token.
### Cluster: several phones, one dashboard
Got more than one old phone? Open **Cluster β Add a phone**: phones on the same network show up
by themselves (or enter an address, for example over Tailscale). Both phones show the same
6-digit code; approve it on the phone being added.
- **One dashboard.** Pick a phone at the top of the sidebar and every page shows that phone.
- **Where apps run.** See every app and deployment on every phone. **Move** an app and its
settings, database and (if you like) library go with it; deployments are rebuilt from Git.
- **All cameras** on one page, and **Copy/Move to another phone** for files and folders.
Phones talk over mutual TLS on port 8801 and trust only phones they were paired with. A phone
in the cluster can fully control the others, so give each one a strong dashboard password.
### Home-screen widget
Add **Homedroid status** from your launcher's widgets: every phone in the cluster (online,
battery, temperature) and the services running on this one, refreshed every minute.
## How it works: the clever bits
Android was never meant to run servers, and apps don't get root. Here's how Homedroid gets a
full Linux server stack running inside an ordinary app, without asking you to root anything.