soft-serve vs Gitea for a Personal Remote: When You Don’t Need Issues
Chris Vale
August 25, 2026
Gitea is a forge. soft-serve is a git remote that happens to have a TUI. If you do not need issues, pull requests, a web UI for cousins, or Actions, Gitea is a city you commute through to push two private repos. I have done that commute. Then I put soft-serve on a tiny box, SSH keys only, and remembered that git already had a server story before we all wanted a GitHub at home.
This is not “Gitea is bad.” I wrote about Gitea versus Forgejo versus GitHub when you want a forge. This is when you do not want a forge. You want git push to a machine you own and a backup of that machine. soft-serve fits that hole. So does a bare repo over SSH. soft-serve is the nicer bare repo.
What you are not installing
No issue tracker to ignore. No Actions runner to patch. No web stack to TLS. No user table except keys. No “weekend project” that becomes on-call because a cousin wants a PR review on a phone. If that sentence feels like a loss, install Forgejo and stop reading. If it feels like a relief, you were over-served.
TLS is the usual objection. “I want HTTPS clone URLs.” You want a habit from GitHub. SSH URLs work in CI, in the laptop, in Termux if you must. A reverse proxy in front of soft-serve is you inventing Gitea’s surface area again. I do not. Tailscale SSH or plain SSH on the tailnet is enough HTTPS-shaped safety for a personal remote. The packets are already in a mesh. Adding a browser to feel modern is how the city comes back.
Mobile browse-without-push is the other objection. I read diffs on the laptop or I wait. A phone forge is a feature I used twice and patched for a year. I am not proud of those two times. I am proud of the year I stopped.

What soft-serve actually is
A Charm-shaped git server: SSH access, a terminal UI to browse, create repos, manage keys. It is pleasant. It is not GitHub. Clone URLs are SSH. Your editor’s git integration does not care. Your phone’s review app does, because there is no review app. That is the point.
Failure modes are small-server modes: disk, keys, the process down, a backup you never restored. They are not schema migrations across three releases of a forge. I will take that trade for personal dotfiles, homelab gitops, and a novel nobody else should see.
When Gitea is still the right small box
You want a browser on a tablet to look at a diff. You want issues for yourself as a kanban. You want to onboard a friend without teaching SSH config. You want packages or Actions later. Start at Gitea/Forgejo. Migrating “up” from soft-serve is adding a forge and remotes. Migrating “down” from Gitea is easy until you liked the issue numbers. Be honest about later.
CI is the usual later. soft-serve does not grow a runner. You can still webhook or poll from Woodpecker pointed at SSH. That is extra. If you know you want CI, do not pretend you wanted a TUI remote.

Bare git over SSH versus soft-serve
A git init --bare in a user account is fewer moving parts than soft-serve. It has no TUI, no nice create-repo flow. If you are happy with ssh and mkdir, you do not need Charm. I use soft-serve when I want keys and repos managed without remembering paths. I use bare repos when the box is already a jump host and I want zero new binaries.
Both beat a forge for a single human. Both need the same backup: the repo data, not a screenshot of a TUI. Document the clone URL in the same note as the restic path. Future you will not remember whether the remote was soft-serve or a bare repo in /srv/git. The note is the UI you skipped.
Upgrades of soft-serve are a binary bump. Read the changelog. It is still shorter than a Gitea release. Pin the image. Take a data snapshot. The forge people already learned this. The remote people think they are too small to snapshot. Disks do not agree.
Access and the WAN
Do not open 22 to the world for a personal remote if Tailscale exists. soft-serve on a tailnet is the whole remote-access story. Same as Gitea without port 3000. If you must have SSH on the WAN, keys only, no password, fail2ban, and a nonstandard port if you enjoy folklore. I prefer the mesh. The Gitea article said the same about 3000. Git is not a reason to publish a socket.
More keys than humans is how a laptop you sold still pushes. Review authorized keys when a machine leaves. soft-serve makes this a TUI task. Bare git makes it authorized_keys. Calendar either one.
Gitops and the missing PR
Homelab gitops people think they need PRs to be serious. A personal remote plus a laptop branch is a PR you do in the working tree. If you are the only reviewer, the web UI is a mirror. I have watched people block themselves on a self-hosted Actions run to apply a DNS change. A push to main and a pull on the box is allowed when the blast radius is your living room. When the blast radius is a friend’s house, use a forge and a second pair of eyes. The tool follows the blast, not the identity of being a “real” engineer.
Pre-commit hooks on the client catch more than a forge for a solo Ansible repo. Put the hook where you type. Do not stand up Gitea to run a linter you could run locally. That is commute-through-the-city again.
LFS, size, and the cute server
soft-serve is not where I dump 9 GB game assets. Bare git plus LFS is a policy problem anywhere. If you need LFS, you need to operate LFS. Gitea has a button. The button is still disk. A personal remote on a 128 GB Pi will fill. The forge would fill too. The difference is you might notice sooner in a web UI that shows repo size. Check du on a calendar. Cute servers die of binaries.
Mirrors of GitHub into soft-serve are a nice backup of code you care about. They are also how you duplicate the internet onto a Pi. Mirror the two repos you actually patch. Do not mirror your entire star list because a TUI made it feel free.
Backup is the forge you skipped
Every clone is a copy until it is not: unpushed commits, and the server as the only place with main. restic the data dir. Restore onto a second soft-serve. Clone from the restore. If that works, you have a remote. If you only have laptop clones, you have laptops. I still want the server backup. Laptops go to beaches.
The close
If you do not need issues, you do not need Gitea. soft-serve or a bare SSH repo is a personal remote. Gitea is a product that happens to include a remote. Pick the product you will operate at 11 p.m. I operate a TUI and a restic job. I do not operate a forge for a folder of Ansible. When I need a forge, I install a forge. I do not grow one from a remote by wishing for a web UI.
The test is simple. List the last month of things you did in Gitea that were not git push or git pull. If the list is empty, you are paying forge operations for a remote. Move the remotes. Keep GitHub for the public work. Keep a tiny SSH git for the private work. Sleep. If the list includes “opened an issue so I would remember,” a text file in the repo is an issue tracker that backs up with the code. I have loved worse systems.