Skip to content

Self-host Soft Serve

updated Aug 2026prices checked · Aug 2026Install verified on Ubuntu 26.04 · Aug 2026 · how we test

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

CategoryCode hosting
LicenseMIT
StackGo
Min RAM256 MB
Dockeryes
Difficulty
Our recommendation

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:

non-negotiableNo pull requests, no issues, no web UI. Anything resembling code review has to happen somewhere else — email patches, a second forge, or a hosted one — so be sure that is a workflow your team will actually accept before you make it the only remote.
non-negotiableAdmin access is SSH keys and nothing else. Every key in SOFT_SERVE_INITIAL_ADMIN_KEYS becomes an administrator, and that variable has to be set in the config file before the first start. There is no password login and no recovery flow, so getting this wrong means editing configuration on the box to dig yourself out.
non-negotiableThree listeners and one directory to protect: 23231 for SSH and the TUI, 23232 for HTTP clones, 9418 for the Git protocol — publish only the ones you use. The single data directory holds the repositories, the host keys and a SQLite database, so it is the entire backup. Its RAM figure here is our own estimate rather than an upstream requirement.

More in Code hosting

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.

We use analytics cookies (Google Analytics, PostHog) to see which guides are useful. No ad networks, no cross-site tracking. See our privacy policy.