TiloBox
Back to directory
Soft Serve project preview

Soft Serve

A self-hosted Git server with SSH access, terminal browsing, repository permissions, and Git-based administration.

LicenseMIT
GitHub stars7.2k
Last commit2 weeks ago
Tags6 topics
GoGit ServerProductivitySelf HostedOpen SourceSsh
Overview

Why consider Soft Serve?

Soft Serve is a self-hostable, command-line-first Git server built by Charmbracelet. It ships as a single Go binary and exposes a beautiful SSH-accessible TUI for browsing repos, supports cloning over SSH/HTTP/Git protocol, Git LFS, public-key-based access control, and on-demand repo creation via `git push`. Configuration is handled via a plain YAML file and environment variables, with optional Docker or systemd deployment.

Guided learning

Learn Soft Serve by building

Practical setup notes, real use cases, and copy-ready examples in one focused guide.

6 min read 8 sections
In this guide8 sections

Soft Serve — Self-Hosted Git Server for the Command Line

Soft Serve is a tasty, self-hostable Git server for the command line. 🍦 Unlike heavyweight Git platforms, Soft Serve is built to live entirely in your terminal: its primary interface is an interactive TUI you reach over SSH, and it ships as a single, dependency-free Go binary.

Key Features

  • SSH-first TUI — browse repos, files, and commits from any SSH client with no web browser needed.
  • Multiple clone protocols — clone repos over SSH, HTTP, or the native Git protocol (port 9418).
  • Git LFS — built-in Git Large File Storage support with both HTTP and SSH backends.
  • On-demand repos — create a repository simply by pushing to it for the first time; no admin panel required.
  • Public-key access control — granular permissions backed by SSH public keys; repos can be public or private.
  • User access tokens — mint tokens for CI/CD pipelines without exposing raw SSH keys.
  • Allow/disallow anonymous access — control whether unauthenticated users can clone public repos.
  • Syntax-highlighted file printing — print any file over SSH with optional colour highlighting and line numbers.

Installation

Soft Serve is a single binary called soft. Install it from your package manager, download a release binary, or use go install:

bash
1# macOS or Linux
2brew install charmbracelet/tap/soft-serve
3
4# Windows (with Winget)
5winget install charmbracelet.soft-serve
6
7# Arch Linux
8pacman -S soft-serve
9
10# Nix
11nix-env -iA nixpkgs.soft-serve
12
13# Debian/Ubuntu
14sudo mkdir -p /etc/apt/keyrings
15curl -fsSL https://repo.charm.sh/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/charm.gpg
16echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list
17sudo apt update && sudo apt install soft-serve
18
19# Fedora/RHEL
20echo '[charm]
21name=Charm
22baseurl=https://repo.charm.sh/yum/
23enabled=1
24gpgcheck=1
25gpgkey=https://repo.charm.sh/yum/gpg.key' | sudo tee /etc/yum.repos.d/charm.repo
26sudo yum install soft-serve
27
28# Go
29go install github.com/charmbracelet/soft-serve/cmd/soft@latest

Binaries are available for Linux, macOS, and Windows, as well as Alpine, Debian, and RPM packages, on the releases page.

Setting Up a Server

Make sure git is installed, then run soft serve. That's it.

This will create a data directory that will store all the repos, ssh keys, and database.

On first run, set SOFT_SERVE_INITIAL_ADMIN_KEYS to your SSH public key so you get admin access:

bash
1SOFT_SERVE_INITIAL_ADMIN_KEYS="$(cat ~/.ssh/id_ed25519.pub)" \
2SOFT_SERVE_DEFAULT_REPO=gitops \
3 soft serve

Any key added to this variable is treated as admin with full privileges. Soft Serve will create a new admin user that you can rename later. The optional SOFT_SERVE_DEFAULT_REPO variable causes a named repository to be created empty and public on boot — useful for GitOps tools like ArgoCD.

To use a custom data path:

bash
1SOFT_SERVE_DATA_PATH=/var/lib/soft-serve soft serve

Running with Docker

The official Docker image is available at charmcli/soft-serve. Mount the /soft-serve volume to persist your repositories:

bash
1docker run \
2 --name=soft-serve \
3 --volume /path/to/data:/soft-serve \
4 --publish 23231:23231 \
5 --publish 23232:23232 \
6 --publish 23233:23233 \
7 --publish 9418:9418 \
8 -e SOFT_SERVE_INITIAL_ADMIN_KEYS="YOUR_ADMIN_KEY_HERE" \
9 --restart unless-stopped \
10 charmcli/soft-serve:latest

Ports exposed: 23231 (SSH), 23232 (HTTP), 23233 (stats), 9418 (Git protocol).

Server Configuration

Once the server starts, a config.yaml is generated under the data directory. The default configuration covers SSH, HTTP, the Git daemon, database backend (SQLite or Postgres), Git LFS, cron mirror jobs, and a stats server:

yaml
1# Soft Serve Server configurations
2
3# The name of the server.
4# This is the name that will be displayed in the UI.
5name: "Soft Serve"
6
7# Log format to use. Valid values are "json", "logfmt", and "text".
8log_format: "text"
9
10# The SSH server configuration.
11ssh:
12 # The address on which the SSH server will listen.
13 listen_addr: ":23231"
14
15 # The public URL of the SSH server.
16 # This is the address that will be used to clone repositories.
17 public_url: "ssh://localhost:23231"
18
19 # The path to the SSH server's private key.
20 key_path: "ssh/soft_serve_host"
21
22 # The path to the SSH server's client private key.
23 client_key_path: "ssh/soft_serve_client"
24
25 # The maximum number of seconds a connection can take.
26 max_timeout: 0
27
28 # The number of seconds a connection can be idle before it is closed.
29 idle_timeout: 120
30
31# The Git daemon configuration.
32git:
33 listen_addr: ":9418"
34 max_timeout: 0
35 idle_timeout: 3
36 max_connections: 32
37
38# The HTTP server configuration.
39http:
40 listen_addr: ":23232"
41 tls_key_path: ""
42 tls_cert_path: ""
43 public_url: "http://localhost:23232"
44
45# The database configuration.
46db:
47 # Valid values are "sqlite" and "postgres".
48 driver: "sqlite"
49 data_source: "soft-serve.db?_pragma=busy_timeout(5000)&_pragma=foreign_keys(1)"
50
51# Git LFS configuration.
52lfs:
53 enabled: true
54 ssh_enabled: false
55
56# Cron job configuration
57jobs:
58 mirror_pull: "@every 10m"
59
60# The stats server configuration.
61stats:
62 listen_addr: ":23233"

Every setting can also be overridden with an environment variable prefixed SOFT_SERVE_.

Browsing Repositories via SSH

With the server running you can connect to the live Charm demo to explore the TUI:

bash
1# Jump directly to a repo in the TUI
2ssh git.charm.sh -t soft-serve
3
4# Print out a directory tree for a repo
5ssh git.charm.sh repo tree soft-serve
6
7# Print a specific file
8ssh git.charm.sh repo blob soft-serve cmd/soft/main.go
9
10# Print a file with syntax highlighting and line numbers
11ssh git.charm.sh repo blob soft-serve cmd/soft/main.go -c -l

You can also browse local repositories with soft browse [directory] or by running soft inside any Git repository.

Access Control

Soft Serve uses SSH public keys for authentication. Users are not tied to the underlying Linux system — all user and permission management is done through the server itself. Key capabilities:

  • Allow or disallow anonymous access per-server.
  • Mark individual repos public or private.
  • Add collaborators by their SSH public key.
  • Issue access tokens for scripted or CI use cases.

Summary

Soft Serve turns Git hosting into a pure terminal experience. A single soft serve command is all it takes to spin up a fully featured Git server with an SSH TUI, multi-protocol clone support, Git LFS, fine-grained access control, and optional Docker or systemd deployment — no Nginx, no databases to configure by hand, no web UI to maintain.

Related tools

More options with a similar category or technology profile.

Soft Serve FAQs

Soft Serve is listed as a Developer Tools tool on TiloBox. Review the overview, features, and official documentation on this page to decide whether it solves your specific workflow.

Start with the project's GitHub repository for supported installation and deployment instructions. Test the setup with representative data or a small project before rolling it out more widely.

Soft Serve is listed under the MIT license. Read the complete license text and the project's notices before using, modifying, or distributing the software.

Production readiness depends on your requirements. Review maintenance activity, security practices, documentation, backup and upgrade procedures, and compatibility with your stack; then validate it in a non-production environment.

Soft Serve is listed as an alternative to GitHub. Compare the core workflow, deployment model, integrations, and licensing against your must-have requirements before switching.