Skip to main content

Git repos backed by your own storage. Push to S3, R2, Tigris, MinIO, Postgres, SFTP, NFS, or local disk.

Project description

Trunks

The most powerful open-source POSIX-compatible, Git-native filesystem.

Trunks turns any backend into a Git-compatible remote. Point it at S3, R2, Tigris, GCS, Azure Blob, MinIO, Postgres, SFTP, a fileshare, or local disk. You get branches, commits, refs, push, pull, the whole protocol. No Git server. No service to operate. No control plane. No repo copy per workspace.

Applications write normal files. Developers run normal Git.

git checkout -b feature/auth
git add .
git commit -m "update auth"
git push

That git push writes commit objects and advances the branch ref straight into your bucket. No GitHub. No remote URL. No server in between.

Install

pip install trunks
npm install @layerbrain/trunks

Quick Start

trunks mount --repo my-app --backend s3://company-trunks --path ./my-app

That's it. ./my-app is a normal folder now. Run code in it. Edit files in it. git push through the Trunks shim syncs to your bucket. Another machine runs the same mount and sees the same files.

S3 here is whatever you have: GCS, Azure Blob, R2, Tigris, MinIO, Postgres, SFTP, fileshare, local disk. Trunks makes each one act like a Git remote. No Trunks server in the middle. No Git server in the middle.

How It Works

Trunks stores repos as Git-shaped objects in your backend.

s3://company-trunks/trunks/my-app.trunk/
├── objects/       blobs, trees, commits (sha-keyed, immutable)
├── refs/heads/    branch pointers (compare-and-swap)
└── journals/      crash recovery
  • When a process writes a file, Trunks hashes the bytes into objects.
  • When it checkpoints, Trunks writes a tree and a commit.
  • When it pushes, Trunks advances the branch ref with compare-and-swap.

That's the whole protocol. Two writers can't clobber each other. Crashes don't corrupt state. Two machines sync by pointing at the same prefix.

Why It Exists

Modern software moves a lot of files across laptops, CI, sandboxes, servers, and storage buckets. Without version history, every write is just another blob that can overwrite the last one.

Git solves history. But Git expects a hosted server, a clone per agent, and has no native story for large or many repos.

Trunks keeps Git's commit objects and refs, drops the server, and writes straight to storage you already use. The bucket is the remote. So is the database, or the SFTP host. Work happens on branches, files are saved as commits, and diffs stay reviewable like any normal Git workflow.

What You Get

  • Real files. Tools read and write with cat, vim, grep, npm, python. The SDKs are a convenience, not a requirement.
  • Real Git. Every checkpoint is a Git commit object. git log, git diff, git blame all work. So does git push through the Trunks shim.
  • Real concurrency. Branches are pointers. Different branches never collide. Same branch is one CAS. One writer wins, the others retry.
  • Real backends. S3, R2, Tigris, GCS, Azure Blob, MinIO, Postgres, SFTP, fileshare, local disk. Each one passes the same multi-commit, branch, merge, and CAS-conflict contract test.
  • Real scale. Virtual mode mounts a 100GB repo without materializing it.
  • Real portability. Same commands on a laptop, EC2, Lambda, Cloudflare Worker, Modal sandbox, Daytona, CI runner.

Mount Modes

trunks mount --repo my-app --path ./my-app
trunks mount --repo my-app --path ./my-app --watch
trunks mount --repo big-repo --path ./big-repo --mode virtual

Default is plain files. --watch keeps a journal so a crash doesn't lose work. --mode virtual sparsely materializes huge repos.

Branches Are Pointers

One branch per task. Creating one is a single ref write. No copy.

trunks branch create --name feature/auth --from main
trunks branch switch --name feature/auth
git add .
git commit -m "update auth"
git push

Two writers on different branches don't collide. Two writers on the same branch race a compare-and-swap. One wins. The other retries.

Git Without GitHub

cd ./my-app
trunks
git checkout -b feature/auth
git add .
git commit -m "update auth"
git push

trunks opens a shell where git writes Trunks objects to your backend. Same commits. Same refs. Your storage. No GitHub. No remote URL.

Python

Use the Python SDK when your application wants files and commits without shelling out.

from trunks import Trunk

with Trunk(name="my-app") as trunk:
    trunk.write("task.md", b"Fix auth\n")
    trunk.commit(message="update auth")
    trunk.push()
async with Trunk(name="my-app") as trunk:
    await trunk.write("task.md", b"Fix auth\n")
    await trunk.commit(message="update auth")
    await trunk.push()

Node

import { Trunks } from "@layerbrain/trunks";

const trunks = new Trunks();
const fs = await trunks.mount({ repo: "my-app", path: "./my-app", watch: true });

await fs.write("task.md", "Fix auth\n");
await fs.checkpoint("update auth");
await fs.push();

Resource API

CLI, Python, and Node share the same resource API.

trunks repo create --name my-app --backend s3://company-trunks --json
trunks branch list --json --limit 20 --offset 0
client = Trunks(cwd="./my-app")
client.branches.create(name="feature/auth", from_ref="main")
const trunks = new Trunks();
await trunks.branches.create({ name: "feature/auth", from: "main" });

List calls return the same envelope everywhere:

{
  "object": "list",
  "data": [],
  "limit": 20,
  "offset": 0,
  "total_count": 0,
  "has_more": false
}

Where To Next

Want to do Page
Walk through your first repo Tutorial
See every command CLI reference
Use Python Python SDK
Use Node Node SDK
Resource shapes Resources
Pick a backend Backends
Use Trunks with agent frameworks Agents
Run CI on your own infrastructure Trunks Actions
Understand the bytes Architecture

Backend guides:

Examples:

Actions:

MIT licensed.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

trunks-1.2.5.tar.gz (199.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

trunks-1.2.5-py3-none-any.whl (213.1 kB view details)

Uploaded Python 3

File details

Details for the file trunks-1.2.5.tar.gz.

File metadata

  • Download URL: trunks-1.2.5.tar.gz
  • Upload date:
  • Size: 199.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for trunks-1.2.5.tar.gz
Algorithm Hash digest
SHA256 a63ba6b69a2cd7a054b2786caac3bff0ace95d1602ea219973ef8ac75ae70e73
MD5 211d94df35da40a5c5f8fc7a02e9a6c9
BLAKE2b-256 3620a8cbc1f9ca2a765b9cafa93cf6e5ee1b34c6f6c938962ca5f4924ba79013

See more details on using hashes here.

File details

Details for the file trunks-1.2.5-py3-none-any.whl.

File metadata

  • Download URL: trunks-1.2.5-py3-none-any.whl
  • Upload date:
  • Size: 213.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for trunks-1.2.5-py3-none-any.whl
Algorithm Hash digest
SHA256 bed21da1cebe24e60d85a9d2b44201e0b8a0a8f54a4e353d6f3f181d4ee3d84c
MD5 c6cff65b1fa0fe135e955fa74e3dc4fa
BLAKE2b-256 5095b7b38888fdb75057e3cef45ab58e79a20a41d739f6696f91a7fb9092dfb2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page