Skip to content

Decision log

Newest last. Each entry: what was decided, why, and what it rules out.

Date Decision Why Instead of
2026-10-25 Connect RPC (protobuf) end to end One schema generates the Go agent, the Worker and the admin. Measured cost on the router: about 0.45 MB of flash. Hono RPC (TypeScript only), hand-written JSON
2026-10-25 Control plane on Cloudflare Workers + D1 + Durable Objects Cheap, no servers, realtime with hibernating WebSockets (same model as digilan). A VM, digilan's Go nexus
2026-10-25 Go agent, cobra CLI, plain-text output with --json Static binary for every router CPU; CLI readable over SSH, in the web console and with screen readers. Binary named edge-agent, ea symlink, like digilan. A full digilan-style CLI/TUI
2026-10-25 Fleet enroll codes in generic firmware, MAC identifies the router after One image per batch, factory reset re-enrolls by itself, codes revocable. Per-device images only
2026-10-25 Data plane: WireGuard + VXLAN ZeroTier's free plan is non-commercial, its API needs a paid plan ($18/month) and its controller licence forbids commercial use without an agreement. Tailscale's free plan is non-commercial too and its package (10 MB) does not fit 16 MB flash. WireGuard is in the kernel, free, fastest on weak CPUs. ZeroTier (tested in the lab as an evaluation), Tailscale, Headscale
2026-10-25 Connection ladder, every rung tried automatically; only one side needs to be reachable ISP boxes and connections vary widely (see the ISP guide): IPv6 pinhole, UPnP mapping, then more rungs. Asking customers to forward ports
2026-10-25 Two WireGuard paths always up + path watcher Failover in about 3 s instead of 146 s; leases renewed at different times. One tunnel re-dialed on failure
2026-10-25 Confirm-or-rollback guard on every config change A router must never need a site visit (digilan's rollback guard). Applying and hoping
2026-10-25 No LuCI on any image The agent owns the router's configuration; a second editor only produces changes the agent overwrites. LuCI for debugging
2026-10-25 Debug console = one non-interactive command per request, recorded Accessible, auditable; covers ea, logread, ifstatus, flash.sh. A full terminal emulator (can come later)
2026-10-25 Technician kit = the agent in a container Reuses enrollment, realtime and the console; no third party. Cloudflare Tunnel (possible stopgap)
2026-10-25 Admin: SvelteKit, native CSS, server-rendered forms, WCAG 2.2 AA Light, accessible, works without JS. A component library
2026-10-26 Admin becomes a client-side app (replaces server-rendered forms) Server rendering made every click wait for the API (0.7-1 s). Pages now show at once; JavaScript becomes required. a11y patterns kept. Streamed SSR (keeps no-JS, waits one round trip)
2026-10-26 Fast staff session check in the control plane, Smart Placement Better Auth's getSession cost 0.4-0.8 s per call; each D1 query ~90 ms from the caller's colo. Caching sessions in the admin
2026-10-26 Either router can be the reachable one Home behind carrier NAT is common (5G, Starlink, Free, SFR); a reachable travel side still connects. Home-only reachability
2026-10-25 Admin cards on phones, tables on wide screens A restyled table loses its semantics in Safari (VoiceOver). One responsive table
2026-10-25 GitLab group jumo-router (jumo was taken), Go module gitlab.com/jumo-router/edge/agent
2026-10-25 Environments: dev and prd only Small team; staging adds cost without a second team to protect. dev/stg/prd as in lengua
2026-10-25 Secrets as suffixed group variables (ADMIN_API_KEY_DEV, _PRD) Environment-scoped group variables need a paid GitLab tier. Scoped variables
2026-10-25 No Terraform yet Wrangler creates D1 and custom domains (DNS + certificates). Terraform later for Access, WAF, R2. Terraform from day one
2026-10-25 Hardware: not the GL-SFT1200 Opal No official OpenWrt support (vendor 18.06 SDK, kernel 4.14). See Hardware.