self-host is a free, open source internet of things (iot) project written in Go and released under Apache-2.0. It has 1,484 GitHub stars, 62 forks and 2 open issues, and was last pushed 23 hours ago. On this registry it ranks #64 of 99 tracked projects in Internet of Things (IoT), with 5 head-to-head comparisons available. It gained 13 stars over the last 3 tracked days.

What is self-host?

self-host is an Apache-2.0, Go-based terminal UI that installs and runs self-hosted applications through Docker Compose, built for people getting started with a home server and for anyone who wants to try an app before committing it to their own setup.

What it is

self-host is a command-line and terminal-dashboard tool that sits on top of Docker Compose. It picks an app from a catalog, generates the account and credentials, wires up the connections between apps that support each other, and runs everything inside a Compose project it manages itself. The project is written in Go, distributed as a single binary, and published under the Apache-2.0 licence, with a catalog of 93 apps listed on its website.

The concrete problem it solves is the gap between "I have heard of Immich or Jellyfin" and "I have a working, connected stack." In the homelab ecosystem, that gap is normally crossed by hand-writing Compose files, looking up image names, and manually pasting service URLs and passwords between containers. self-host replaces that manual assembly with app-specific setup steps, and it positions itself as a small terminal-based alternative to Portainer, with app setup included. It deliberately does not take over containers you already run: it manages its own Compose project, and the README states plainly that if you already have a setup you are happy with, you do not need it.

Key capabilities

  • Installs an app from the catalog with a single command such as self-host install immich, showing a plan for review before anything is installed.
  • Creates the app account automatically and exposes the login through self-host credentials, with self-host status reporting where to open the app.
  • Removes an app with self-host remove immich, which deletes its containers but keeps its data; purging that data is a separate, explicit choice made with --purge.
  • Composes multi-app setups: self-host install media homarr installs a media stack plus a dashboard and connects the supported apps, giving Sonarr and Radarr qBittorrent as their download client, connecting Seerr to Jellyfin, Sonarr and Radarr, and adding Homarr tiles for the apps it supports.
  • Generates passwords by default rather than requiring them to be chosen up front.
  • Updates itself with self-host self-update for script and archive installs, while Homebrew, Docker and system packages update through their own tooling.
  • Ships through many channels from one release binary — an install script, brew install ajnart/tap/self-host, docker run --rm -it ghcr.io/ajnart/self-host:latest, .deb, .rpm, .apk and Arch packages, a release archive checked against checksums.txt, go install, and a source build.

Who uses it and how

  • People new to self-hosting who want a working app on a home server without learning Compose file syntax first.
  • Users evaluating an app before adopting it, such as trying Immich with a few photos and then either keeping it running or removing it while retaining the data.
  • Homelab operators building a media stack who want Sonarr, Radarr, qBittorrent, Seerr, Jellyfin and Homarr connected without manual configuration.
  • Agent-driven workflows, reflected in the project's ai-agents, claude-code and agent-skills topics and its framing of a terminal dashboard for the user and plain commands for an agent.
  • Linux, macOS and WSL2 users, which are the platforms the project documents as tested.

Getting started

The documented install is curl -fsSL https://self-host.fyi/install | bash, which installs only the binary and no apps; alternatives include Homebrew, the ghcr.io/ajnart/self-host:latest Docker image, and native packages for Debian, Fedora, Alpine and Arch.

How it compares

Among the tools named in the facts, the closest point of reference is Portainer, which self-host describes as the thing it offers a small terminal-based alternative to, adding app setup that Portainer does not provide. It also differs from plain Docker Compose by contributing app-specific configuration and credential generation rather than leaving the wiring to the user, and it stays out of the way of existing containers by confining itself to its own Compose project.

When to use it — and when not to

A self-hoster must already have Docker installed with a Compose v2 plugin that supports include, and should accept that the tool manages its own project rather than adopting existing containers. Anyone with a working setup they are satisfied with is explicitly told they do not need it, and Go or source builds require Go 1.26.0 or newer and cannot use self-host self-update. The catalog is finite at 93 apps, so an app outside it still means configuring Compose by hand.

project readme (upstream, from github) — read inline

self-host

Try self-hosted apps from your terminal.

Latest release License: Apache-2.0 Platforms: Linux, macOS, WSL2 93 Apps in the Catalog

Website · Docs · Showreel · Discord

self-host is a terminal UI for getting self-hosted Apps running with Docker Compose. Pick an App, let it set up an account and connect the Apps it supports, then try it.

It's meant for people getting started, or anyone who wants to try an App before adding it to their own setup. Think of it as a small terminal-based alternative to Portainer, with App setup included.

If you already have a setup you're happy with, you don't need this. It manages its own Compose Project, not your existing containers.

Get started

You need Docker with a Compose v2 plugin that supports include. See Platforms and support for tested Linux, macOS and WSL2 setups.

curl -fsSL https://self-host.fyi/install | bash

That installs only the binary, not any Apps. Run self-host, pick what you want to try and review the plan before anything gets installed.

Other ways to install (wget, Homebrew, Docker, packages, Arch, archive, source)

Every channel installs the same release binary, byte for byte.

Channel Command
wget wget -qO- https://self-host.fyi/install | bash
Homebrew (macOS) brew install ajnart/tap/self-host
Docker docker run --rm -it ghcr.io/ajnart/self-host:latest plus socket and Home folder mounts: full command
Debian, Ubuntu (.deb) sudo apt install ./self-host_X.Y.Z_linux_amd64.deb
Fedora, RHEL (.rpm) sudo dnf install ./self-host_X.Y.Z_linux_amd64.rpm
Alpine (.apk) sudo apk add --allow-untrusted ./self-host_X.Y.Z_linux_amd64.apk
Arch Linux, Omarchy sudo pacman -U ./self-host_X.Y.Z_linux_amd64.pkg.tar.zst
Release archive self-host___.tar.gz from Releases, then check it against checksums.txt
Go go install github.com/ajnart/self-host/cmd/self-host@latest
From source git clone https://github.com/ajnart/self-host && cd self-host && go build -buildvcs=false -o ~/.local/bin/self-host ./cmd/self-host

Packages come from GitHub Releases for amd64 or arm64. Go and source builds need Go 1.26.0+ and cannot self-update.

Update with self-host self-update for the script and the archive. Homebrew, Docker and packages update through their own tool.

To read the install script first: curl -fsSL https://self-host.fyi/install -o install.sh, compare shasum -a 256 install.sh with https://self-host.fyi/install.sh.sha256, then bash install.sh. It verifies the archive against checksums.txt and installs to ~/.local/bin. Version, folder and fork options are in the docs.

Try an App

Say a friend recommends Immich. You want to try it with a few photos before deciding whether to add it to your home server. Pick it in the Dashboard, or run:

self-host install immich

Your account is created for you. self-host credentials shows your login, and self-host status shows where to open the App.

If it isn't for you, run self-host remove immich. That removes its containers but keeps its data. Deleting the data is a separate choice with --purge.

If you like it, keep running it here or set it up yourself with Docker Compose. You can try the App before deciding how much time you want to spend on your setup.

Browse the 93 Apps in the Catalog. See Platforms and support for what has been verified.

What gets set up

The main thing this adds to Docker Compose is App-specific setup. For example, self-host install media homarr installs a media setup and a dashboard, then connects the supported Apps:

  • Sonarr and Radarr get qBittorrent as their download client.
  • Seerr connects to Jellyfin, Sonarr and Radarr.
  • Homarr gets tiles for the Apps it supports.

Passwords are generated by default. Some Apps still need a manual step, which the Dashboard shows. You still need to provide your own media and configure any indexers or content sources.

You can do all of this with Docker Compose yourself. self-host automates the setup so you can try using the Apps first.

The Compose files and App configuration live in ~/.self-host. You can read the files it writes. It uses Docker Compose to run the containers, not a separate container engine.

[!IMPORTANT] Nothing installs without your approval. Onboarding writes nothing until you approve its plan, and no single Dashboard key changes an App.

[!NOTE] Apps are third-party software under their own licences. self-host installs and connects them; it does not own or maintain them.

Details and limits
✅ Does ❌ Doesn't
Ships the Catalog inside the binary: 93 Apps and 7 Recipes. Install Docker for you. self-host doctor checks it.
Sets up accounts, API keys and settings where supported. Change another Project's Compose files or App configuration.
Wires Apps together with Links, and gives Homarr native tiles. Back up media libraries or data outside App folders.
Shows a five-tab Dashboard (Overview, Apps, Activity, Catalog, Settings). Run on native Windows. Use WSL2.
Offers Access from the Home network to Tailscale, Cloudflare or your own proxy. Ship indexers, trackers or content sources.
Backs up and restores with optional encryption. Prove safe version-to-version migration. Update checks are not migration tests.
Gives agents plain commands with --json output. Make every App work: one is hidden (details).

A Recipe is a pre-wired bundle: media is qBittorrent, Sonarr, Radarr, Prowlarr, Jellyfin and Seerr.

With an agent

Paste this into Claude Code, Codex, OpenCode, OpenClaw or any coding agent:

Use https://self-host.fyi/llms.txt to help me set up my own home server. Ask what I want to run, explain the plan, and wait for my approval before installing.

Or write the shared skill and dedicated folders for supported agents installed on the machine:

self-host skill install

Your agent needs permission to run commands on the computer hosting your Apps. See With an agent, including the OpenClaw section.

Agent reference

The one public skill, skills/self-host/SKILL.md, only routes to the guide built into the binary. Print it with self-host skill. Agents also read .

Agents follow inspect → plan → approval → apply → verify. Loading the skill is intent, never approval: every change needs the person's explicit yes.

self-host doctor --json
self-host apps list --json
# only after the person approves:
self-host install ntfy --exposure local --yes --json
self-host status --json
  • Pass secrets with --set-file app.key=/path, never as arguments. They land only in the Project's secrets.env.
  • Exit codes: 0 success, 1 error, 2 incomplete Setup, 3 only Manual steps remain.
  • A running container or HTTP 200 is not acceptance. Check that the App does its job.

All flags, events and the isolated Project setup are in the agent docs.

Reaching your Apps

Home network by default. Each change needs your approval.

Anything reachable from the internet needs its own explicit yes that names the risk. Do not forward port 80 on your router for Easy names.

Access options
Access What you get Status
Home network (default) http://192.168.1.20:8096. Ports publish on all host interfaces. Verified 2026-10-14 on Linux (#499) and 2026-10-17 on macOS with OrbStack (#502). Another device was not tried on macOS.
This computer only 127.0.0.1 (--exposure local). Verified 2026-10-26 on WSL2, opened from Windows through localhost forwarding (#502).
Easy names at home http://jellyfin.192-168-1-20.sslip.io, through one managed Caddy. Verified 2026-10-14 on Linux with rootless Docker, from a second machine (#500). Not yet verified on macOS (#502).
From anywhere, privately Tailscale, one HTTPS node per App. Verified 2026-10-26 from another tailnet device, with the fix in v0.6.3 (#502).
Your own web address Cloudflare Tunnel plus a login page. Verified 2026-10-26 with a real domain: from outside, the App answered with the Cloudflare login page, and self-host cloudflare remove took it down again (v0.6.2, #502).
Bring your own self-host access export for SWAG, Pangolin, Nginx Proxy Manager, Traefik or Caddy. Not yet verified on a real host.

The IP:port Address is always kept as a fallback.

Cannot reach an App from another device? Run self-host debug , then see Access and Troubleshooting.

Backup and Restore

[!NOTE] Backups include App folders, Host settings, state and secrets, so keep the archive and its passphrase apart. Media libraries and data outside App folders are not included.

Backup details

A written archive is not a verified recovery plan: restore into an isolated Project and check the data.

self-host backup --encrypt
self-host restore <archive> [app]

Commands

Everything the Dashboard does is also a plain command.

All commands

Prefix with self-host. --verbose (-v) adds detail. --yes authorizes an approved noninteractive install, remove or restore; it is not a preview flag.

Command What it does
doctor Check Docker, Compose and the Host, and a Project's Apps and ports.
host report [--extra] Report OS, Docker access and port binds. Changes nothing.
install ... Install Apps or Recipes into the Project.
status [--updates] URLs, container state, health and Setup; optionally check image updates.
setup [app...] Retry unfinished Setup.
up, down Start / remove the Project's containers and networks. down keeps volumes and App files.
start, stop, restart [app...] Operate named Apps, or every installed App when omitted.
update [app...] Pull images, recreate Apps and rerun checks.
logs [--follow] [--tail N] Container logs; default tail is 200 lines.
remove ... [--yes] Remove Apps, keep data; --purge also deletes their data folders.
config set KEY=value... Change Host settings and recreate affected Apps.
config review [--yes] Review Host drift; --yes applies detected LAN address and time zone fixes.
access export --format caddy|nginx|traefik|json Print each App's upstream for your own reverse proxy. Changes nothing.
backup, restore See Backup and Restore.
debug Status, failed steps with hints and the last 100 log lines, secrets masked.
apps list, apps info Browse the Catalog.
apps request [--url URL] For agents: report an App the Catalog lacks.
feedback [-m text] [--app app] Send a report to the maintainers after you see the masked text and agree.
credentials Print the Admin login and per-App API keys.
share Print a postable install line and site link for the Apps you run.
profile, profile set experience Show or change what self-host remembers about you, such as your Experience level.
skill, skill install|remove Print the agent guide; make the skill discoverable by your agents, or remove it.
cloudflare plan|publish|remove Publish Apps on your domain behind a login; plan previews.
self-update Replace the binary with the latest checksummed release.

A Compose folder you add by hand under ~/.self-host/extra// is an Unmanaged app: it gets lifecycle, Address listing and Backup, but no Setup.

App connections

These connections are called Links. They run when both Apps have finished their own Setup.

Which Apps link to which

A Link connects one App to another. It belongs to the App using the connection, such as Sonarr using qBittorrent as a download client.

Consumer Linked to
Sonarr, Radarr qBittorrent (download client)
Prowlarr Sonarr, Radarr
Seerr Jellyfin, Sonarr, Radarr
Cleanuparr Sonarr, Radarr, qBittorrent
Homarr native tiles and widgets for the Apps it supports

A failing Link marks the consuming App as needing attention, not its target. Browser-only steps are reported as Manual steps with a hint and stay retryable: self-host setup . Homarr Links need Homarr 2.4.1 or newer; NZBGet and SABnzbd Links need 2.5.1 or newer. Other versions stop with a recovery hint (back up first). See the Homarr contracts and proof.

Platforms and support

Requirements, validated platforms and the runtime matrix

You need Docker with the docker compose v2 plugin (with include support), write access to the Project and data folders, free published ports, and enough storage and RAM for the Apps. Start with one App; photos, AI and multi-App Recipes need more. Run self-host doctor first.

Each status below is a dated launch run on a real host or VM, linked to its issue. Nothing else counts.

Platform Status Run
Linux amd64 Verified 2026-10-14 Ubuntu 24.04, Debian 12 and 13 VMs. Install and self-update (#497); Onboarding, the Media Recipe with Homarr, Links, Backup and Restore (#499).
Linux amd64, Docker denied Verified 2026-10-14 sudo "$(command -v self-host)" installs the Media Recipe and the Project stays yours (#498).
Linux amd64, rootless Docker Verified 2026-10-14 Debian 13: a Recipe installs, and Easy names open from a second machine (#500).
Linux arm64 Verified 2026-10-14 Debian 12 VM: install and one Recipe (#501).
macOS arm64 with OrbStack Verified 2026-10-17 v0.5.11, Photos and cloud files Recipe, Home network Access (#502).
macOS with Docker Desktop Not yet verified on a real host Not run (#502).
Intel macOS Not yet verified on a real host Not run (#502).
WSL2 Verified 2026-10-26 v0.6.2 on Windows Server 2025 with WSL2 (Ubuntu 24.04, Docker Engine): Photos and cloud files Recipe, This computer only Access, opened from Windows (#502).
Native Windows Unsupported Not supported.

Known issues from these runs, both fixed in v0.6.0: a newcomer saw Nextcloud's Homarr credential-recovery inputs and Review listed port 7575 (#589); removing the last App left its network and down refused (#590).

One App, Passbolt (#456), is hidden from new installs until it passes on a VM. BookStack, LLDAP and Speedtest Tracker passed a VM run on 2026-10-25 and are offered again. Existing installs keep working (#493). Apps beyond those in the runs above have no launch run, so the older runtime matrix, a 2026-10-07 snapshot, is a pre-launch record, not a promise.

Docker socket denied? Run sudo "$(command -v self-host)". The Project, config and cache stay yours. Rootless Docker also works.

Troubleshooting

Common fixes
Symptom Fix
self-host: command not found Add ~/.local/bin to PATH.
Docker missing or stopped Install or start it, then self-host doctor.
403 rate limit on install SELF_HOST_GITHUB_TOKEN="$(gh auth token)" before bash, or wait an hour.
curl error but the command seems to succeed A pipe hides curl's exit status; use set -o pipefail in scripts.
Native Windows Unsupported. Use WSL2.

More in the troubleshooting docs.

Responsible use

[!WARNING] self-host installs and connects software; what you do with it is your responsibility. Download clients, indexers and media automation have legitimate uses: Linux ISOs, public-domain and Creative Commons works, and media you own or are licensed to copy. We do not condone piracy and do not help anyone find or download content they have no right to. self-host ships no indexers, trackers or content sources. Follow copyright law where you live and the terms of every service you connect.

The software is provided as is, without warranty (Apache-2.0). The maintainers are not liable for how it is used.

Telemetry

Anonymous, on by default, and easy to turn off.

What is sent, what is not, and how to turn it off
Sent Never sent
A summary when you approve Onboarding's plan (your choices, not your data). Your machine's host names or file paths.
Errors: which command failed, which step, and where in the code. Secrets, App data or raw error text.
The name and homepage host of an App an agent asks for that the Catalog lacks. IP addresses or locations.
Feedback you wrote, only after you see the text and agree. An ID that identifies you or your machine.

Nothing is stored to link one run to another. The maintainers use it to see which Apps people install and where Setup breaks. It is never sold or shared.

To turn it off, set SELF_HOST_NO_TELEMETRY=1 or DO_NOT_TRACK=1 (or true). The full list is on the telemetry page.

Docker Compose Maker

Want Compose files without using the CLI? Docker Compose Maker (DCM) turns the Apps you pick into a docker-compose.yaml and .env, with a Template gallery. self-host.fyi/apps lists every App in the Catalog with the same compose self-host installs, and self-host.fyi/compose adds containers only DCM defines. It lives in dcm/ and also runs standalone: docker run -p 7576:7576 ghcr.io/ajnart/dcm.

Repository layout

Path What it is
cmd/, internal/ The Go binary: CLI, Dashboard, the Catalog and every App.
site/ The Astro site at self-host.fyi.
dcm/ Docker Compose Maker, served at self-host.fyi/compose.
tools/sitegen Writes the site's and DCM's data from the Catalog.
docs/ Decisions, agent briefs, release notes and proofs.

site/ and dcm/ are one bun workspace: run bun install at the root. See CONTRIBUTING.md.

Community and support

Frequently asked questions

Is self-host free to use?

self-host is open source under the Apache-2.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does self-host do?

Replace the SaaS you pay for. One binary installs and runs self-hosted apps at home, no Docker knowledge needed. Terminal dashboard for you, plain commands for

What is self-host written in?

self-host is primarily written in Go. Its source is publicly available at https://github.com/ajnart/self-host, and it has 1,484 GitHub stars.