Self-host Soft Serve
An SSH-first Git server you drive from a terminal UI: clone over SSH, HTTP or the Git protocol, browse repositories, files and commits without leaving the shell, and manage access entirely with SSH public keys. It has no pull requests, no issues and no web forge UI, so it sits alongside a hosted forge rather than replacing one.
Key facts
Soft Serve is not competing with the rest of this hub, and getting that straight is the whole decision: it is an SSH-first Git server with a terminal UI, not a forge. There are no pull requests and no issues, and its HTTP listener exists to serve clones and LFS rather than pages to read. Access control is SSH public keys, repositories appear on demand when you push, and the whole thing is one small Go binary plus a data directory. Run it for private remotes, a mirror target, or a Git endpoint for GitOps tooling that only needs somewhere to pull from. The moment you need code review or issue tracking you want Gitea, Forgejo or GitLab — Soft Serve sits beside a forge, it does not replace one.
What you need
- Any VPS with at least 256 MB of RAM
- A domain you control — most self-hosted setups need HTTPS in front of them
- Under an hour if you've used Docker before
Install
Run these commands on your server:
# Soft Serve — Charm's apt repo, which ships a systemd unit
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://repo.charm.sh/apt/gpg.key | sudo gpg --yes --dearmor -o /etc/apt/keyrings/charm.gpg
echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list
sudo apt update && sudo apt install -y git soft-serve
# set SOFT_SERVE_INITIAL_ADMIN_KEYS in /etc/soft-serve.conf to your public key
# BEFORE the first start — that key is what makes you admin
sudo systemctl enable --now soft-serve
# → ssh -p 23231 SERVER_IP opens the TUI (HTTP clone on 23232, git:// on 9418)What you take on
It is the smallest thing on this hub to operate, and every one of its burdens comes from what it is not:
More in Code hosting
Forgejo
GitBucket
Gitea
GitLab CE
Common questions
Does Soft Serve have pull requests or a web interface?
Neither. The interface is a terminal UI over SSH — you browse repositories, files and commits there, and administer the server with SSH commands. Its HTTP listener exists to serve Git clones and LFS, not pages to read. If you want code review, issues or a browser, use Gitea, Forgejo or GitLab; Soft Serve is a Git server, not a forge.
Who is Soft Serve for, then?
Anyone who wants private Git remotes without running a web application. It creates repositories on demand from a git push, handles access with SSH public keys alone, supports public and private repositories and per-repository collaborators, and issues user access tokens. Common uses are personal remotes, a mirror target, and a Git endpoint for GitOps tooling that just needs somewhere to pull from.
How do I become the admin?
Put your SSH public key in SOFT_SERVE_INITIAL_ADMIN_KEYS before the first start — every key in that variable becomes an admin user with full privileges. On a package install that variable lives in /etc/soft-serve.conf, alongside SOFT_SERVE_DATA_PATH. There is no password login and no recovery flow, so get the key in before you start the service.
What does Soft Serve need to run?
Git on the host and the single soft binary — that is the whole dependency list. State goes in one data directory holding repositories, host keys and a SQLite database, which you can point at PostgreSQL instead. It is a small Go program, so it runs comfortably on the cheapest VPS tier; the packages in Charm's apt and yum repositories include the systemd unit.