Real-time, actually
Multiplayer cursors, live presence, and conflict-free concurrent edits — CRDT-backed
by pure-Go reearth/ygo, wire-compatible with Yjs. The presence roster shows
who is in the workspace and which file they have open.
Edits land on your real disk: a 600 ms debounce, then an atomic temp-and-rename. There
is no separate document store to reconcile later.
CRDTYjs wire formatpresence rosteratomic writes
// backend/internal/collabdoc/persistence.go
func (p *DiskPersistence) flush(rel string) error {
// debounced 600ms, temp file + rename
}
Terminals you share
Real PTYs, streamed over WebSocket to everyone in the workspace at once — same
session, same output, same keystrokes. Dock them at the bottom or float them as windows,
run as many as you like, rename them (or let the shell's OSC title do it).
It is a login shell on the host, so it runs whatever the host runs: your shell, SSH,
docker, a REPL, a long build someone else can watch.
creack/ptyxterm.jsmulti-subscriberdock or float
$ make build # Ava is watching this pane
✓ built ./wede in 4.1s
Chat that lives in the repo
The public channel is .wede/chat.md — committed alongside your code,
greppable, diffable, readable by whatever tooling you point at the repo. Git activity
posts itself into the thread as people commit and push.
A second, private channel stays under .wede/private/ and is gitignored
automatically. Viewers can read and post to the public channel and nothing else.
markdown on diskgit activity feedprivate channel
## 2026-07-27
**ava** pushed 3 commits to `main`
**sam** conflict in handlers.go — taking it
Workspaces & share links
Open many projects on one host — multi-root, switchable, all sharing the same set of
connected people. Invite with a link scoped to editor or viewer, with an
optional TTL.
Tokens are 32 random bytes; only their SHA-256 hashes touch disk. Redemption is a
constant-time compare, rate-limited to 10 attempts per IP per minute, and revocable
the moment you want it gone.
editor / viewerhashed at restoptional TTLrevocable
POST /api/auth/tokens {"role":"viewer","ttl":"24h"}
→ https://box.local:9090/?invite=7f3c…a91e
Git without leaving the tab
A visual commit graph with branches and merges, blame, side-by-side diffs, per-hunk
staging, conflict resolution, cherry-pick, revert, reset, merge, stash, tags, branches
and remotes.
It drives your real git binary rather than reimplementing it, so hooks,
config, credentials and signing all behave exactly the way they do in your terminal.
commit graphhunk stagingblameconflict UI
// shells out — your git, your hooks, your config
exec.Command("git", "log", "--graph", …)
LSP & DAP, extensible
gopls, typescript-language-server, pylsp and rust-analyzer are wired out of the box for
diagnostics, hover, completion and go-to-definition. dlv and
debugpy are wired for breakpoints and stepping.
Anything else drops in through ~/.wede/lsp.json or
~/.wede/debug.json — no recompile, no marketplace, no extension host.
Format-on-save works the same way.
goplstsserverpylsprust-analyzerdlv · debugpy
// ~/.wede/lsp.json
{ "zig": { "cmd": ["zls"], "ext": [".zig"] } }
Search that keeps up
ripgrep when rg is on PATH, a pure-Go walker when it isn't — same interface
either way, so a fresh box still works before you have installed anything.
Regex, whole-word and case toggles, include/exclude globs, context lines, filename mode,
and project-wide search-and-replace that shows you a preview before it writes.
ripgrepGo fallbackglobsreplace w/ preview
⌘⇧F func (s *Store) · 17 results in 6 files
API client, built in
Postman-shaped requests — methods, params, headers, bearer/basic/api-key auth,
JSON/form/raw bodies, {{variables}} and environments — sent
server-side, so CORS never gets a vote.
Collections are files under .wede/requests/, so they commit and review with
your code. The proxy blocks loopback, private-range and cloud-metadata addresses
after DNS resolution, which defeats rebinding — an SSRF guard most API tools skip.
no CORSSSRF-guardedcommittableenvironments
GET http://169.254.169.254/latest/meta-data
✗ blocked: link-local address (set WEDE_APICLIENT_ALLOW_PRIVATE=1 to allow)
One file to deploy
Go embeds the entire React frontend. Copy one file to a VPS, a NAS or a Raspberry Pi and
run it — no runtime, no sidecar, no image to pull.
Five release targets across linux, macOS and Windows on amd64 and arm64, five direct Go
dependencies, no cgo, and 230 Go tests behind it.
go:embedno cgoamd64 · arm64230 tests
$ ls -lh wede
-rwxr-xr-x 19M wede # that's the whole product