A Subversion client that does not feel like a punishment.
SVN handles big binary-heavy repositories and file locking well. What's painful is that status on a large checkout is slow, every operation is a server round-trip, and the GUI clients mostly give the same model a nicer skin.
Subverted keeps a daemon resident next to your working copy so sv st answers from a warm index,
and puts a CLI (sv) and a desktop app on top of it. The long-term plan (local history, file-level
staging, locking workflows) is in docs/PLAN.md.
The working copy stays the truth. Subverted reads SVN's metadata and shells out to svn for
everything that changes it. Plain svn keeps working in the same folder at all times. If
Subverted dies, nothing is lost and nobody is blocked.
Early, and honest about it.
- M0, reading working copies directly: done. Status matches
svn statuson the fixture working copies, with two known divergences documented in PLAN.md. - M1, daemon and CLI: in progress, mostly working. Warm
sv ston a 100k-file checkout is well under the 50 ms target on the daemon side. - M2, the GUI: in progress. Live status and diff work, and the rest of the day-to-day flow is landing one slice at a time.
It has been built and used on Windows. The Linux and macOS bundles come out of the release workflow, but nobody has run them yet, and the test suite is advisory on those platforms in CI until it has been seen green there.
Grab your platform's download from
Releases. Every download has the desktop app
and sv together.
- Windows: run
subverted-<version>-win-x64-setup.exe. It installs for your user only (no admin prompt), into%LOCALAPPDATA%\Programs\Subverted, and adds that folder to your PATH, sosvworks in any new terminal. The uninstaller takes it back off. There's also a plain.zipif you'd rather not install. - Linux / macOS: unpack the
.tar.gzand run./install.sh. It copies everything to~/.local/share/subverted, putssvandsubvertedin~/.local/bin, and adds that to PATH in your shell profile if it isn't there yet. On Linux it also adds a menu entry../install.sh --uninstallremoves all of it. SetSUBVERTED_PREFIXto install somewhere other than~/.local.
Whichever way you install, the three executables have to stay in the same folder:
| File | What it is |
|---|---|
sv / sv.exe |
the command line |
Subverted / Subverted.exe |
the desktop app |
subverted-daemon |
the background process both of them talk to; starts itself on first use |
The bundles are self-contained, so you don't need .NET installed. You do need the svn
command line on PATH, since everything except sv st goes through it:
- Windows: SlikSVN, or TortoiseSVN with "command line client tools" ticked in the installer
- macOS:
brew install subversion - Linux:
apt install subversion(or your distro's equivalent)
On macOS the bundle isn't signed and isn't a .app yet, so start the GUI with subverted from a
terminal. Gatekeeper will complain until you clear the quarantine flag, once, after unpacking:
xattr -dr com.apple.quarantine subverted-*-osx-arm64Builds of every push to master are attached to the
CI runs as artifacts, if you
want something newer than the last release.
sv st # what changed, from the daemon's warm index
sv d art/hero.png # diff of local changes
sv log -l 5 # last five revisions
sv up # pull in everyone else's work
sv lock art/hero.psd -m "repainting the sky"
sv commit -m "new sky" --mark # also adds new (?) and deletes missing (!) files
sv pick -m "just the fix" # walk the changes one at a time, commit what you pick
sv daemon status # what the daemon holds, and whether it's watchingsv --help lists everything. Anything that throws work away (revert, rm, resolve --theirs)
shows you what it's about to do and asks first.
For the GUI, run Subverted and open any folder inside a working copy.
You need the .NET SDK pinned in global.json and svn on PATH.
dotnet tool restore
dotnet build Subverted.slnx
bash tools/run-tests.sh # runs each test project's own executable
dotnet csharpier format . # before every commitUse tools/run-tests.sh rather than dotnet test. Under this SDK dotnet test sometimes
discovers zero tests and reports that as success. CLAUDE.md has the details.
To produce the same layout a release ships:
dotnet publish src/Subverted.Daemon -c Release -o artifacts/bin
dotnet publish src/Subverted.Cli -c Release -o artifacts/bin
dotnet publish src/Subverted.App -c Release -o artifacts/binReleases are cut by pushing a v* tag. The workflow runs CI, bundles win-x64, linux-x64 and
osx-arm64, builds the Windows installer from installer/, and attaches it all to
a GitHub release. Tags with a - in them (v0.2.0-beta.1) are
marked as prereleases.
src/Subverted.Core status model, depends on nothing
src/Subverted.Svn the only project that knows SVN exists (wc.db reads, the svn CLI)
src/Subverted.Protocol messages between the daemon and the front-ends
src/Subverted.Daemon holds the index, watches the disk, runs svn on the front-ends' behalf
src/Subverted.Frontend finds or starts the daemon and talks to it
src/Subverted.Cli sv
src/Subverted.App the Avalonia desktop app
tools/ probes, benchmarks and fixture builders
docs/ARCHITECTURE.md explains how the pieces fit and records every
design decision, including the ones that were measured and turned out wrong.
CLAUDE.md is the working agreement for contributors: it's strict, because this
tool touches the place people's unpushed work lives.
WTFPL. Do what you want with it.