Deploy homepage
Modern, highly-configurable app dashboard with 100+ service integrations.
homepage
Just deployed
/app/config
Deploy and Host
> Canonical code: homepage — deploy URL: https://railway.com/new/template/homepage
Homepage is a modern, highly-configurable self-hosted application dashboard with 100+ service integrations. Deploy it on Railway in minutes to turn your stack into a beautiful start page.
About Hosting
Homepage runs as a single container with a persistent Railway volume for config (/app/config). Railway provides the compute, TLS at the edge, and a public URL. The service restarts automatically on failures via Railway's built-in health check. No external database or cache is needed — everything runs in one container.
Why Deploy
- 100+ service integrations — Plex, Sonarr, Radarr, Grafana, GitHub, Docker, Kubernetes, Home Assistant, Uptime Kuma, and many more widgets with live status.
- Zero external dependencies — Single container with a persistent volume. No PostgreSQL, no Redis, no sidecars.
- Drag-and-drop layout — Widgetized cards, collapsible groups, search bar with keyboard shortcuts, and per-user settings.
- Themeable UI — Dark, light, neon, glassmorphism, and more. Custom backgrounds supported.
- Persistent config — All settings survive redeploys via the Railway volume mount.
- Ships with sensible defaults — Dark theme, Railway PORT binding, English locale — ready out of the box.
Common Use Cases
- Personal dashboard — Aggregate all your self-hosted services into one beautiful start page.
- Team operations hub — Share a dashboard with your team showing CI/CD status, monitoring, and deployment links.
- Homelab control center — Monitor and access all your homelab services from a single pane of glass.
- New tab replacement — Set Homepage as your browser's new tab page for instant access to everything.
- Status board — Display live service status on a dedicated monitor or kiosk.
Dependencies for Homepage
Deployment Dependencies
Homepage requires no external dependencies on Railway. It runs as a standalone Next.js server with a persistent Railway volume for configuration files. No database, cache, or third-party services are needed.
🚀 One-Click Deploy
Click the button above to deploy Homepage to Railway instantly. The build uses our pinned, reproducible Dockerfile (Homepage v1.13.2).
📋 Description
Homepage is a modern, highly-configurable self-hosted application dashboard with 100+ service integrations. It turns your Railway stack into a beautiful start page featuring live status, monitoring widgets, bookmarks, and custom service cards — everything you need at a glance when you open a new tab.
This template ships a production-ready single-container deployment:
- ✅ Pinned upstream (Homepage
v1.13.2, released June 9 2026) - ✅ Auto-injected persistent Railway volume for
/app/config - ✅ Sensible defaults — dark theme, Railway PORT binding, language
en - ✅ Healthcheck endpoint tuned for Railway's monitoring
- ✅ Non-root runtime (upstream image convention preserved)
- ✅ Env-var-driven config — a few
HOMEPAGE_VAR_*tokens inject into your YAML{{...}}placeholders (manual file editing also fully supported) - ✅ GitHub Actions security lint on every PR
✨ Features
- 100+ service integrations: Plex, Sonarr, Radarr, Grafana, GitHub, Docker, Home Assistant, Uptime Kuma, and many more — full list.
- Drag-and-drop layout with widgetized cards, collapsible groups, search bar, and per-user settings.
- Live status synced every 30s — click any service to open its web UI.
- Themeable — dark, light, neon, glassmorphism and others. Custom backgrounds supported.
- Persistent config survives every Railway redeploy via volume mount.
- No external dependencies — single container, no database or cache required.
🖼️ Screenshots
(The Publisher stage normally captures 3 screenshots of the live deployment and inserts them here. For this offline build, see the preview image above.)
🏗️ Architecture
Railway Container
├── Homepage (Next.js) → :$PORT, healthcheck GET /
└── Persistent Volume → /app/config (settings, services, bookmarks, widgets, icons)
Single web service. One Railway volume. No database, no Redis, no extra sidecars. Healthcheck: GET / → 200 OK. Restart: ON_FAILURE (5 retries). HTTPS at Railway edge (TLS automatic).
🔧 Environment Variables
| Variable | Required | Default | Description |
|---|---|---|---|
PORT | no | 8080 | Container port. Railway injects this automatically; Homepage (Next.js) honors it. |
HOMEPAGE_ALLOWED_HOSTS | yes | * | Comma-separated hosts allowed to serve Homepage (required by Homepage v1.0+). Railway serves from a dynamic *.railway.app domain, so * disables the host check. For tighter security set your real domain(s), e.g. mydash.railway.app. Without this, requests are rejected with a "Disallowed Host" error. |
HOMEPAGE_VAR_DEFAULT_THEME | no | dark | UI theme on first load (dark, light, neon, glassmorphism, …). Applied only if your config YAML uses the {{HOMEPAGE_VAR_DEFAULT_THEME}} placeholder. |
HOMEPAGE_VAR_TITLE | no | (empty) | Optional: title shown in the browser tab. Applied only if config YAML uses {{HOMEPAGE_VAR_TITLE}}. |
HOMEPAGE_VAR_LANGUAGE | no | (empty) | UI language code (e.g., en, fr, de). Applied only if config YAML uses {{HOMEPAGE_VAR_LANGUAGE}}. |
> HOMEPAGE_VAR_* tokens substitute into your config YAML {{HOMEPAGE_VAR_XXX}} placeholders on container start. With an empty /app/config they have no visible effect until a matching settings.yaml is added. There is no HOMEPAGE_PORT or LOG_LEVEL env var in Homepage — port binding is handled by Railway's injected PORT.
🧩 Configuring your dashboard
> Homepage is config-file driven — there is no in-browser editor or admin panel.
> The dashboard has no "Edit" / "Settings" page and no save button. Every control at
> the bottom-right of the UI (⚙️ revalidate, 🎨 color, 🌓 theme, version) only changes
> the view for your current browser session — it does not edit the config.
> All real configuration is done by editing YAML files in /app/config (see below).
Homepage reads YAML config files from the persistent volume at /app/config. The files are:
| File | Purpose |
|---|---|
settings.yaml | Global settings (title, theme, layout, providers, features) |
services.yaml | Service groups and links shown on the dashboard |
widgets.yaml | Widget definitions (status, monitoring, integrations) |
bookmarks.yaml | Bookmark links |
Reference:
Option A — Railway file browser (easiest on Railway)
- In the Railway project, open the Homepage service → Files tab.
- Navigate to
/app/config. - Create or edit a YAML file (e.g.
services.yaml), paste your config, and save. - Click the ⚙️ revalidate icon (bottom-right of the dashboard) to reload, or redeploy.
Config persists to the Railway volume automatically.
Option B — CLI / repo
# Upload a local YAML file into the running service
railway service files upload ./services.yaml /app/config/services.yaml
Or clone the repo, edit config/*.yaml, and redeploy. The volume at /app/config
loads your files on start. See .
🛠️ Local Development
git clone https://github.com/INAPP-Mobile/railway-homepage.git && cd railway-homepage
cp .env.example .env && $EDITOR .env
docker build -t railway-homepage .
docker run -d --name homepage -p 3000:3000 -v "$(pwd)/config:/app/config" --env-file .env railway-homepage
curl -sf http://localhost:3000/ | head -20
Open in your browser.
🧪 Testing
docker build -t railway-homepage .
docker run --rm -p 3000:3000 railway-homepage & sleep 10
curl -sf http://localhost:3000/ && echo OK
🐛 Troubleshooting
| Issue | Solution |
|---|---|
| Container exits immediately | Check Railway logs — usually a malformed HOMEPAGE_VAR_*. |
| Theme/Widgets reset on redeploy | Confirm /app/config volume is still mounted. |
| Health checks failing | Raise start-period in railway.json; first-build cold cache may take longer. |
| Port already in use | Railway auto-routes via the injected PORT; no HOMEPAGE_PORT override exists. |
| "Disallowed Host" error | Set HOMEPAGE_ALLOWED_HOSTS to include your Railway domain (or * to disable the check). |
For upstream-specific issues, consult .
🔄 Updating
This template pins Homepage to v1.13.2. To upgrade:
- Edit the
FROMline inDockerfileto a newer tag (e.g.v1.14.0). - Rebuild — Railway auto-detects a Dockerfile change.
- Confirm the new version against the release notes.
A GitHub Actions workflow (.github/workflows/publish-lint.yml) prevents publishing regressions.
📄 License
Homepage upstream is MIT-licensed. Template by INAPP-Mobile. Issues/PRs: .
Template Content
homepage
INAPP-Mobile/railway-homepage