dsx

Sync a Claude Design project.
Zero bytes through a model.

dsx moves files between a Claude Design project and a local directory directly — the file contents never pass through any model's context. Unofficial, single Go binary, stdlib only.

~665,000
tokens — a large project, read file by file
1 line
the same pull, any size, through dsx
~/design
$ dsx clone $PROJECT design
pulled 103, unchanged 0, binary 6 (660.1 KB)
$ dsx status
clean — nothing changed locally, nothing new on the server
Terminal: dsx clone pulls a Design project in one summary line, then dsx status reports the tree is clean.
A real run. One summary line replaces reading every file into context.

How it works

It's git for a Design project.

Familiar verbs, and everything else addressed as dsx <noun> <verb>. Conflicts are decided on bytes, not clocks. It reads Claude Code's existing OAuth token — no separate login, no MCP server to wire up. One-time: run /design consent in Claude Code.

clonepullpushstatusfetch diffpinunpindsx <noun> <verb>
Terminal: edit a file and add a new one, dsx status shows modified and untracked, dsx diff shows the byte-level divergence, dsx push sends two files, dsx status is clean.
The full round-trip — edit & add, status, byte-level diff, push, clean.

The other obsession

Built not to lose your files.

Not spending tokens is the first goal. Not losing data is the second, and it shows up everywhere.

--prune proves before it deletes

Removes only files it can prove dsx pulled and you haven't touched. Untracked → not ours. Edited → a conflict, never a silent delete.

Conflicts on bytes

Divergence is decided on content, not timestamps or etags. The both-sides-changed case is a conflict, full stop.

Atomic writes

Every file lands temp-then-rename. A killed process never leaves a half-written file — and never a fragment the next run blames on you.

The token is read, never printed

dsx reads Claude Code's OAuth token, never writes, refreshes, or prints it — it won't even wrap it into an error string.

Terminal: a teammate changed a file on the server; dsx push refuses with conflicts 1 and exit 3 instead of overwriting, and dsx status shows the local edit still present.
Both sides changed. push refuses (exit 3) rather than clobber — your edit is still there.

Install

One binary, no runtime.

macOS and Linux, on both amd64 and arm64. Nothing to configure.

Homebrew — macOS

Spell the tap out; Homebrew 6.0 needs the fully-qualified form to grant trust inline.

$ brew install somework/tap/dsx

go install

If you'd rather build from source what you can read.

$ go install github.com/somework/dsx@latest

Archive — macOS & Linux, with provenance

Release archives carry GitHub build attestations — verify before you unpack.

$ gh attestation verify dsx_*.tar.gz --repo somework/dsx

Read this first

Unofficial, and honest about it.

The Claude Design endpoint is undocumented and makes no promises. dsx was built by probing it and pinning every claim with a live test against the real server — but a server deploy can still break it. It is not affiliated with or endorsed by Anthropic. The protocol notes, the threat model, and the design decisions that were considered and declined are all in the repo: PROTOCOL.md · SECURITY.md.