diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..f36a50a --- /dev/null +++ b/docs/index.html @@ -0,0 +1,333 @@ + + + + + +dsx — Claude Design sync, without the bytes touching a model + + + + + + + + + + + + + + + + +
+
+ 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 — agents reading each file
+
→
+
1 line
the same pull, 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.

+
+
+
+
+ +
+
+

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. +

+
+
+
+ + + + + diff --git a/docs/roundtrip.gif b/docs/roundtrip.gif new file mode 100644 index 0000000..06a69d4 Binary files /dev/null and b/docs/roundtrip.gif differ