NetGrip runs on the router: a Go backend reading /proc, /sys, ubus and
UCI, and a React frontend. If you have an OpenWrt device and have hit a rough
edge, that is the most valuable contribution there is - the best fixes in this
repo started as "on my board this page is empty".
One issue per bug, with the shape of the problem rather than the diagnosis:
- What the panel showed, what you expected, what the router actually has
(a stripped
uci show <pkg>or ubus dump is worth more than a paragraph). - Board, OpenWrt version and how NetGrip is installed (release binary, package, manual build).
# Backend (needs Go)
go build ./...
go test ./...
# Frontend (builds into internal/server/dist, embedded into the binary)
cd app
npm ci
npm run build- Reads are cheap, forks are not. The panel is polled every few seconds
on hardware with four cores. Prefer one parse of a whole config over a
fork per option, and
/procor/sysover any subprocess. - A missing tool is an empty state, not an error. Routers differ; a feature that does not apply must disappear quietly, not fail red.
- Writes go through the executor as declarative ops with a snapshot, a health check and a rollback. Never shell out a config change directly.
- Honest fallbacks. Resolve names from live state (the bridge the LAN
sits on, the uplink that carries traffic) instead of hardcoding
br-lanorwan; fall back to the conventional name only when nothing resolves. - Parsers are pure functions with fixtures from real router output. Tests run without a router.
- Conventional commits (
feat:,fix:,refactor:...), one logical change per commit, subject in imperative mood, in English. - Code, comments and user-facing strings are in English and Spanish alike:
every new key in
app/src/locales/en.tsneeds its entry ines.ts. - PRs target
mainand merge as squash. - Reproducible before/after beats a long description: if you measured something (CPU, latency, a failing check), include the number.
- No AI co-author trailers. History is attributable to people: CI rejects
any commit carrying a
Co-Authored-By:trailer from an AI assistant, and merge bodies are written clean.
The UI is bilingual English/Spanish through the locale files in
app/src/locales/. Add your language by copying either file and wiring it
into the language switcher; keep keys identical across locales.
AGPL-3.0-only. See LICENSE. Contributions are accepted under the same terms.