Deploy Heimdall
One page of tiles linking to every app and service you run
heimdall
Just deployed
/config
Deploy and Host Heimdall on Railway
Heimdall is an application dashboard and launcher: one clean page holding a tile for every service you run, with a search bar and live status for apps that expose an API. Built by the LinuxServer.io team in PHP and Laravel and MIT-licensed, it is the default start page for tens of thousands of homelabs and small teams tired of hunting through bookmarks for an internal tool's URL. Pick an app from a catalogue of roughly 700 services and Heimdall fills in its name, colour, description and icon.
This template runs Heimdall as a single Railway service — nginx, PHP-FPM and Heimdall's background queue worker in one container, with a volume at /config holding the SQLite database, uploaded icons, backgrounds, sessions and the app catalogue. Railway's edge terminates HTTPS and proxies to nginx, which serves the dashboard and hands PHP requests to PHP-FPM. Self-host Heimdall with no database to size, no mail relay to configure, and an admin password set before the app accepts a request.

Getting Started with Heimdall on Railway
Open the deployed URL and you land on a login page, not an open dashboard. Sign in with the username in HEIMDALL_ADMIN_USERNAME (admin unless you changed it) and the password in HEIMDALL_ADMIN_PASSWORD; if you left that blank, one was generated and printed once in the deploy log. Change it later by editing the variable, or from the user page inside Heimdall, which redeploys will not overwrite. Then click the grid icon in the right-hand rail, press ADD, and pick a service from the Application Type dropdown: Heimdall fills in the title, colour and description, so all you supply is the URL. Toggle PINNED and save. Repeat for the services you use daily, add a tag to group them into a folder, and set a background from the settings cog. If the tiles render with their real logos the deployment is working end to end, because those icons are downloaded by the background worker.

About Hosting Heimdall
Heimdall solves a small problem that gets worse the more you self-host: remembering where everything lives. A team running Grafana, Gitea, a media server and three internal tools ends up with four port numbers and no single door. Heimdall is that door.
Key features:
- A catalogue of ~700 applications with icons, brand colours and descriptions filled in
- Enhanced apps that poll a supported service's API and show live figures on the tile
- Search from the dashboard via Google, Bing, DuckDuckGo, Startpage or your own provider
- Tags that behave as folders, so fifty entries still fit on one screen
- Multiple users with their own tiles, plus an optional public front page
- Custom icon uploads and background images
The dashboard, the API and the worker share one container, and the volume is the whole backup story: snapshot /config and you have the deployment.
Why Deploy Heimdall on Railway
Railway removes the parts of self-hosting Heimdall nobody enjoys.
- HTTPS, a public domain and certificate renewal handled for you
- A persistent volume at
/configthat survives every redeploy - An admin password set at boot, so the dashboard is never briefly open
- One service to watch, with logs and metrics in the same place
- Redeploys pick up new Heimdall releases automatically
- No database, cache or mail service to provision
Common Use Cases for Self-Hosted Heimdall
- A homelab start page listing every container you run, set as the default browser tab
- An internal tool index so new joiners find the wiki, CI server and metrics dashboard on day one
- A shared kiosk screen using the public front page, readable without signing in
- A per-user launcher, where each account keeps its own tiles on one instance
Dependencies for Heimdall
lscr.io/linuxserver/heimdall:latest— the LinuxServer.io image, bundling nginx, PHP-FPM and Heimdall- A Railway volume at
/config— SQLite database,.env, uploads, sessions and the app catalogue - Outbound HTTPS to
appslist.heimdall.siteand GitHub on first boot, for the catalogue and icons
No database, cache, queue broker or object storage is required. Heimdall's queue runs on the same SQLite file and shares the container so it can write icons to the volume.
Environment Variables Reference
| Variable | Default | What it does |
|---|---|---|
HEIMDALL_ADMIN_USERNAME | admin | Username of the first Heimdall user |
HEIMDALL_ADMIN_PASSWORD | generated | Password applied to that user at boot |
APP_URL | public domain | Root of every URL Heimdall generates |
TRUSTED_PROXIES | 0.0.0.0/0,::/0 | Lets Heimdall read the real client address |
ALLOW_INTERNAL_REQUESTS | false | Allows lookups of private or reserved addresses |
LOG_LEVEL | info | Laravel log verbosity |
TZ | Etc/UTC | Timezone for the container and PHP |
Deployment Dependencies
- Source repository: github.com/gridalpha/heimdall-railway
- Heimdall upstream: github.com/linuxserver/Heimdall
- Container image: github.com/linuxserver/docker-heimdall
- Runtime: PHP 8.5, Laravel 13, nginx, SQLite
Hardware Requirements for Self-Hosting Heimdall
| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 0.25 vCPU | 0.5 vCPU |
| RAM | 256 MB | 512 MB |
| Storage | 1 GB volume | 5 GB volume |
| Runtime | PHP 8.3+, SQLite | PHP 8.5, SQLite |
Heimdall is light: server-rendered HTML, a database measured in hundreds of kilobytes, and no sustained work beyond fetching an icon when you add an app.
Self-Hosting Heimdall with Docker
The upstream image runs anywhere Docker does. The minimal Docker command:
docker run -d --name=heimdall \
-e PUID=1000 -e PGID=1000 -e TZ=Etc/UTC \
-p 8080:80 -v /srv/heimdall:/config \
--restart unless-stopped \
lscr.io/linuxserver/heimdall:latest
The same thing as Docker Compose:
services:
heimdall:
image: lscr.io/linuxserver/heimdall:latest
environment: [PUID=1000, PGID=1000, TZ=Etc/UTC]
volumes: ["./config:/config"]
ports: ["8080:80"]
restart: unless-stopped
Note what the stock image does not do: it creates its first user with an empty password, and every route stays open until you set one. Upstream's answer is to run htpasswd in the container by hand and uncomment a block in the nginx config. This template does it for you, before nginx starts.
How Much Does Heimdall Cost to Self-Host?
Heimdall is free and open source under the MIT licence, with no paid tier, licence key or hosted edition. The only cost is the infrastructure it runs on: on Railway, a small always-on container and a volume, billed by usage with no per-user or per-tile pricing.
Heimdall vs Homer, Dashy and Homarr
| Heimdall | Homer | Dashy | Homarr | |
|---|---|---|---|---|
| Configuration | Web UI | YAML file | YAML or UI | Web UI |
| App catalogue | ~700 built in | manual | manual | integrations |
| Live app stats | Yes | No | Widgets | Widgets |
| Multi-user | Yes | No | Single auth | Yes |
| Storage | SQLite | Static files | Static files | Database |
FAQ
What is Heimdall?
Heimdall is an open-source application dashboard from LinuxServer.io: a single page of tiles linking to the services you run, with a search bar, tags and a catalogue of around 700 applications supplying each one's icon, colour and description.
What does this Railway template deploy?
One service running the official lscr.io/linuxserver/heimdall:latest image with a volume at /config, a public HTTPS domain, and an admin account created from HEIMDALL_ADMIN_USERNAME and HEIMDALL_ADMIN_PASSWORD before the app serves its first request.
Why does Heimdall need a volume instead of a database service?
Heimdall stores everything in a single SQLite file, and also writes uploaded icons, avatars, backgrounds and its app catalogue to disk. A volume covers both, so backing up /config backs up the whole deployment.
Is self-hosted Heimdall secured by default on Railway?
Yes. A stock container creates its first user with no password and leaves every route open; this template hashes your password onto that user at boot, closes the registration and password-reset routes, and marks session cookies Secure and HttpOnly.
How do I add an application with live stats to my Heimdall dashboard?
Add the app, then edit it and open the Application Type section. For a supported service — Sonarr, Radarr, Pi-hole, Nextcloud and many more — Heimdall asks for the URL and API key and the tile shows live figures. The request is server-side, so the target must be reachable from the container.
Can Heimdall link to services on my private network?
It can link to anything, because your browser follows the link, not the server. Server-side features differ: the website lookup and icon fetch refuse private and reserved addresses unless ALLOW_INTERNAL_REQUESTS is true, which suits an instance not exposed to the internet.
Template Content
heimdall
gridalpha/heimdall-railway