-
Notifications
You must be signed in to change notification settings - Fork 0
Contributing
git clone https://github.com/xeri/proxyforward
cd proxyforward
cd frontend && npm ci && npm run build && cd .. # do this FIRST
go test ./...
wails dev
You need Go 1.25+, Node.js, and the Wails v2 CLI.
The frontend must be built before any Go command.
main.goembedsfrontend/dist, which is gitignored, and ago:embedmatching zero files is a compile error. On a fresh clone,go build,go vetandgo testall fail untilnpm run buildhas run once. Everyone hits this exactly once.
| Command | What it does |
|---|---|
go test ./... |
The full gate (~35 s): unit, end-to-end, the throughput floor, and the doc-citation check. |
go test -short ./... |
Same, minus the big burst test. |
cd frontend && npm run build |
tsc + vite. This is the only frontend checker — there's no separate lint step. |
wails dev |
The real app, with frontend hot reload. |
wails build |
Produces the exe — and regenerates the Wails bindings, which are committed. |
cd frontend && npm run dev |
The UI alone, in a normal browser, with a mocked Go backend. |
That last one is worth knowing about. http://localhost:5173/?mock=agent runs the whole React app
against a fake engine, with composable axes for the states that are otherwise a pain to reproduce —
?mock=gateway, ?mock=wizard, &link=down, &fatal=1, &analytics=off, &geo=empty, and
more. It's how you check that every surface has a real empty state and a real unavailable state,
not just a happy path. WebView2 is not your browser, though — spot-check in wails dev before
calling UI work done.
The full command list, with the gotchas, is in
docs/agent/commands.md.
Everything here is a gate, not advice — see
.github/workflows/ci.yml:
-
gofmt,go vet,golangci-lint - the full test suite, plus a race-detector run (CI is the only place that runs — it needs cgo)
- the throughput/latency floor: a large burst through the full tunnel, best-of-three. Never lower the floor to go green.
- a ban on
TODO/FIXMEmarkers - a check that the committed
frontend/wailsjsbindings aren't stale actionlint
Separately: CodeQL, govulncheck, gitleaks, dependency review and npm audit; the internet-facing
parsers are fuzzed nightly; a tag builds a draft release for a human to smoke-test and
publish.
Two non-obvious CI facts, both load-bearing:
-
.gitattributespinseol=lf. Windows runners check out CRLF by default, which makesgofmtreject every file. - Every Go job must materialize
frontend/distfirst, for thego:embedreason above.
The repository documents itself unusually thoroughly, and those documents are enforced — a test fails the build if the docs cite a file, symbol or test that no longer exists. Before you start, read:
-
CLAUDE.md— the invariants that survive any rewrite (wire protocol, security, liveness, hot path, GUI contract, privacy), and the Reality check table of what's advertised but not built. -
docs/agent/architecture.md— the map, and "The numbers": the single source for every timeout, cap and buffer size. Change a number there, not in prose somewhere else. -
docs/agent/reasoning.md— the debugging procedure and the standard of evidence expected before a fix is called a fix. -
frontend/DESIGN.md— the visual charter. Read it before any UI work. -
docs/agent/polish-backlog.md— known UX debt. Pull from here before inventing new polish work.
A few rules that will save you a review round:
- Don't advertise a capability that isn't implemented end-to-end. (This has already gone wrong once — see Not Yet Implemented.)
- When you implement something from the Reality check, delete its row in the same commit — and please update this wiki's Not Yet Implemented page too. The wiki lives outside the repo's citation test, so nothing will catch it for you.
-
Unknown is a sentinel, never a fake zero. The UI shows "—" when there's no sample. Don't
render a
0 msyou don't have. - Never add telemetry that leaves the machine. See Analytics and Privacy.
- Touching the relay, the transport or the counters? Run the burst test before and after.
- Anything in
docs/agent/polish-backlog.md. - The rows in Not Yet Implemented — several are self-contained features with the config and UI already wired, waiting only for an engine.
- The advertised-but-unimplemented UDP capability is a live protocol bug, not just a doc bug: it's negotiated by both sides and honoured by neither.
GPL-3.0. By contributing you agree your work ships under it.
proxyforward · Issues · GPL-3.0 — Windows only, TCP only. Check Not Yet Implemented before filing a bug.