Skip to content

Repository files navigation

HomeStack Banner

HomeStack

A self-hosted web UI for deploying and managing Docker Compose stacks on your Linux homeserver.

Built for homelabbers who want a clean, modern interface to deploy, monitor, update, and organise their self-hosted services — without touching the terminal every time.

License: MITPythonFastAPIDockerNginx

Quick Install · Features · Screenshots · Marketplace · Plugins · Configuration


Screenshots

🚀 Deploy
DarkLight
📦 Stacks
DarkLight
🛒 Templates & Marketplace
DarkLight
🖥️ System
DarkLight
🌐 Networks
DarkLight
🖼️ Images
DarkLight
🔌 Plugins
DarkLight
⚙️ Settings
DarkLight

Features

Deploy & Manage

FeatureDescription
🚀One-click deployDeploy from the marketplace, a custom template, or paste raw docker-compose.yml
🛒App marketplace47+ pre-built apps — Jellyfin, Nextcloud, Immich, Sonarr, Authentik, WireGuard and more
🧩Custom template builderCreate reusable templates with {{PLACEHOLDER}} variables
📥Import existing containersAuto-generate a compose file from any running container
♻️One-click updatePull latest images and redeploy with a single button
🔍Update checkerDetect when a newer image digest is available on Docker Hub
📋Copy composeCopy the deployed docker-compose.yml to clipboard from any stack card

Visibility & Monitoring

FeatureDescription
🟢Live container statusEvery container on the host with state, image, and ports
📡Live log streamingStream logs from any container in real time directly in the UI
📈Resource graphsRolling CPU and memory sparklines per container, sampled every 30 seconds
💾Disk usage dashboardDocker image, container, volume, and build cache usage at a glance
🏥Health checksConfigure a URL per stack — HomeStack polls it and shows pass/fail status
🔁Auto-refreshContainer and stack status refreshes automatically
🔍Search and filterSearch stacks and filter by category tab

Organisation

FeatureDescription
📌Pin stacksPin frequently used stacks to the top of the list
🏷️CategoriesTag each stack with a category and filter by tab
Scheduled restartsSet a cron schedule per stack for automatic restarts
🌐Network managerView, create, inspect, and delete Docker networks from the UI
🖼️Image managerList all Docker images and delete unused ones

Safety & Access

FeatureDescription
⚠️Duplicate detectionWarns on stack name or port conflicts before deploying
Confirm dialogsStop and restart actions require confirmation
🔐Local authenticationJWT-based login — first account becomes admin
👥Multi-user rolesAdmin and viewer roles — viewers can browse but cannot make changes
🔑Authelia / SSOOptional SSO via reverse proxy header
🔔NotificationsSend alerts to Discord, ntfy, or a generic webhook on deploy, delete, and health failures
💼Backup & restoreExport and import all deployed stack configs as a zip archive

UI

FeatureDescription
🌙Dark and light themePersists across sessions
📱Responsive layoutSlide-in sidebar and mobile-friendly layout on small screens
🔌Plugin systemExtend the UI and add new features with community-built plugins

Quick Install

curl -fsSL https://raw.githubusercontent.com/ya0903/HomeStack/main/install.sh | bash

The script will ask for:

  • Install directory (default: /opt/homestack)
  • Frontend port (default: 7080)
  • Backend port (default: 7079)

Note: The first account you register becomes admin. Subsequent accounts are viewers by default — promote them in Settings → User Management.


Manual Install

Requirements: Docker, Docker Compose plugin, Git

git clone https://github.com/ya0903/HomeStack.git /opt/homestack
cd /opt/homestack
# Create your environment file
cp .env.example .env
nano .env # set your ports# Build and start
docker compose -f homestack.yml up -d --build

Open http://your-server-ip:7080 in your browser.


Updating

cd /opt/homestack
git pull
docker compose -f homestack.yml restart backend

A full rebuild (up -d --build) is only needed if backend/Dockerfile or requirements.txt changed. For all other updates a restart is sufficient.

Or re-run the install script — it detects an existing install and updates in place.


Marketplace

The marketplace ships with 47+ ready-to-deploy apps across categories including Media, Downloads, Networking, Security, Productivity, Smart Home, Gaming, and more.

Included apps include: Jellyfin · Plex · Immich · Navidrome · Audiobookshelf · Calibre-Web · Komga · Kavita · Kaizoku · Sonarr · Radarr · Prowlarr · qBittorrent · Lazy Librarian · Nextcloud · Seafile · Paperless-ngx · Mealie · Trilium Notes · FreshRSS · Monica · Firefly III · Vaultwarden · Authelia · Authentik · WireGuard Easy · Pi-hole · AdGuard Home · Nginx Proxy Manager · Uptime Kuma · Netdata · Grafana · Gitea · Homer · Homepage · Dashy · Home Assistant · Portainer CE · File Browser · Syncthing · Stirling PDF · Jellyseerr · RomM · Pterodactyl Panel · Matrix Synapse · Kiwix · Whoami

Community uploads

Any admin can submit their own app to the marketplace directly from the UI — fill in a name, category, icon, description, and paste a docker-compose.yml. Submitted templates are stored on the server and available to all users.


Plugin System

HomeStack has a first-class plugin system that lets anyone extend the UI and add new features.

Installing a plugin

Go to the Plugins tab in the sidebar. You can install from:

  • Git URL — paste a GitHub/GitLab repo URL and click Install
  • ZIP file — upload a plugin zip directly

Plugins can be enabled/disabled without uninstalling, and uninstalled cleanly at any time.

Building a plugin

A plugin is a folder with a manifest.json and a JavaScript entry file:

my-plugin/
manifest.json
main.js
styles.css (optional)

manifest.json

{
"id": "my-plugin",
"name": "My Plugin",
"version": "1.0.0",
"description": "What this plugin does",
"author": "your name",
"entry": "main.js",
"styles": "styles.css"
}

main.js — export an init function that receives the PluginAPI:

exportfunctioninit(PluginAPI){// Add a new panel accessible from the sidebarPluginAPI.registerPanel('my-panel','My Panel','<h2>Hello from my plugin!</h2>');PluginAPI.registerSidebarItem('🛠️','My Panel','my-panel');// Add a button to every stack cardPluginAPI.registerStackAction('Open in browser',(stackName)=>{window.open(`http://localhost`);});// Subscribe to app eventsPluginAPI.onEvent('stackDeployed',(data)=>{PluginAPI.toast(`${data.stack_name} deployed!`,'success');});}

PluginAPI reference

MethodDescription
registerPanel(id, title, html)Add a new full-page panel accessible from the sidebar
registerSidebarItem(icon, label, panelId)Add a nav button in the sidebar
registerStackAction(label, callback)Add a button to every stack card — callback receives the stack name
onEvent(event, callback)Subscribe to app events: stackDeployed, stackDeleted, containerImported
fetch(path, options)Make an authenticated API call to the HomeStack backend
toast(msg, type)Show a toast notification — types: success, error, info, warning
getState()Read current app state: stacks, containers, templates, health, user

To distribute your plugin, push it to a public GitHub repo and share the URL. Users can install it with one paste.


Configuration

Copy .env.example to .env and edit as needed:

VariableDefaultDescription
FRONTEND_PORT7080Port the web UI is served on
BACKEND_PORT7079Port the backend API listens on
AUTH_MODElocallocal for built-in auth, authelia for SSO
AUTHELIA_LOGIN_URL/Redirect URL for Authelia login
AUTHELIA_USER_HEADERRemote-UserHeader Authelia sets with the username

File Structure

HomeStack/
├── homestack.yml # Docker Compose file for HomeStack itself
├── install.sh # One-liner installer
├── .env.example # Environment variable reference
├── backend/
│ ├── Dockerfile
│ ├── requirements.txt
│ └── app/
│ ├── main.py # All API routes
│ ├── auth.py # JWT auth, user management, SSO
│ ├── docker_ops.py # Docker/Compose operations
│ ├── models.py # Pydantic request/response models
│ ├── plugin_ops.py # Plugin install/enable/disable
│ ├── scheduler.py # APScheduler — cron restarts, resource snapshots
│ ├── resource_history.py# Rolling in-memory resource history (60 samples)
│ ├── marketplace_ops.py # Custom marketplace template storage
│ └── templates.py # Built-in template management
├── frontend/
│ ├── index.html
│ ├── app.js
│ ├── styles.css
│ └── nginx.conf
├── templates/ # Built-in parameterised stack templates
│ ├── jellyfin/
│ │ ├── template.json
│ │ └── docker-compose.yml.tpl
│ └── ...
└── data/ # Runtime data — gitignored, back this up
├── users.json
├── stacks/
├── plugins/
└── marketplace/

Custom Template Builder

The Template Builder (under the Templates panel) lets you create parameterised templates stored on the server and reused across multiple deployments.

Each template uses {{PLACEHOLDER}} syntax:

services:
my-app:
image: myapp:latestcontainer_name: {{STACK_NAME}}restart: unless-stoppedvolumes:
- {{APP_DATA_PATH}}:/data

STACK_NAME and INSTALL_PATH are always injected automatically. Any other placeholders prompt the user for a value at deploy time.


Tech Stack

LayerTechnology
BackendPython 3.12 · FastAPI · Uvicorn · APScheduler
FrontendVanilla JS · HTML · CSS (no frameworks)
AuthJWT (python-jose) · bcrypt
TemplatesJinja2
ProxyNginx (Alpine)
RuntimeDocker · Docker Compose

License

MIT — do whatever you want with it.

About

HomeStack is a self-hosted web UI for deploying and managing Docker Compose stacks on a Linux homeserver. It provides a clean, modern dashboard to deploy services from built-in templates or custom compose files, monitor container health, import existing containers, and extend functionality through a plugin system — all without touching the terminal

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages