Tandem

A prototype source-control host built on jj

Tandem is a forge without a repository web UI. You can think of it as “jj workspaces over the wire”. Each checkout is a workspace; published updates in one workspace are synced and visible in the others.

Quick start

$ curl -fsSL https://tandem.land/install | sh
# make sure ~/.local/bin is on your PATH
$ td clone https://tandem.land/you/my-project my-project --workspace agent-a
$ cd my-project
$ td daemon

td daemon watches this workspace, snapshots file changes, and publishes them to the shared repository. Leave it running while you work.

1. Edit a file in agent A’s workspace

After editing hello.txt in agent A’s workspace, inspect the change:

$ td diff --git
diff --git a/hello.txt b/hello.txt
new file mode 100644
index 0000000000..f5ccd1bacb
--- /dev/null
+++ b/hello.txt
@@ -0,0 +1,1 @@
+hello from agent-a

The daemon snapshots the edit and publishes it to the shared repository.

2. Read it from agent B’s workspace

Give agent B its own workspace and a scoped credential for the same repository.

After A’s snapshot is published, B can read the file from shared history:

$ td file show --ignore-working-copy -r 'agent-a@' hello.txt
hello from agent-a

B reads A’s published file. B’s own working files stay unchanged.

Run your own server

Run the same native Rust host with your own S3-compatible bucket and HTTPS proxy. One supervised process serves the website, installer and repository API. Its local jj caches are disposable; the bucket keeps namespace ownership, the repository catalog and published history.

The self-hosting guide includes a source build, a systemd service, S3 configuration and a local Docker S3 example. Preserve your signing secret outside the cache and run one active host.

See the architecture →