Contributing
Full guidelines: CONTRIBUTING.md.
git clone https://github.com/jp1337/easywall.git && cd easywall
go mod download
make test lint
Rebuilding the assets
The compiled files are committed, so rebuild after touching a source:
npm install
npm run build:css # web/static/style.css — the application
npm run build:docs-css # docs/assets/css/style.css — this site
npm run build:diagrams # docs/assets/diagrams/*.svg
npm run check:diagrams fails if a .mmd source changed without a re-render.
npx @google/design.md lint DESIGN.md validates the design system; some warnings
are expected and explained inside the file.
What the review checks
Anything visual follows
DESIGN.md — one source of
truth for colour, typography, spacing, motion and components. There is no third-party
component library; tokens are declared once in the @theme block of web/src/app.css
and Tailwind generates the utilities, so a template never names a colour.
| Colour means state | Green, amber and red are the firewall’s vocabulary — live, unconfirmed, rolled back. A count is not a state |
| The accent is rationed | What is focused, what is active, the one primary action |
| Controls vs containers | A control’s outline is control-edge (3:1, WCAG 1.4.11); a container’s is rule |
| Both themes | Check light as well as dark |
| Sentence case, Inter | The tracked uppercase mono label role survives only in the sidebar dividers |
| Tables reflow | Below 720px rows become cards, which works only if every <td> has a data-label |
| One heading per thing | A page title plus a card titled the same is the duplicate-heading bug |
| Every string translated | {{T "key"}} into both locales/en.json and locales/de.json, attributes included |
Render what you changed. Every defect worth catching in this interface was invisible in the stylesheet and obvious in a screenshot — a clipped port number, a class that no longer existed, a whole page on a white background. Load the pages you touched, in both themes, at a phone width as well as a desktop one.
Adding a language
- Copy
locales/en.jsontolocales/<lang>.json - Translate the values; leave every
idalone - Translate
language_nameinto that language’s own name —Deutsch, notGerman - PR titled
feat(i18n): add <language> translation
Nothing else is needed — the switch is built from whatever locales/*.json contains.
Three inline forms have to survive into your language:
| In the message | Renders as |
|---|---|
`443` |
<code>443</code> |
*before* |
<em>before</em> — emphasis that carries meaning |
{} |
a link, in your word order |
Commits
Conventional Commits: feat, fix,
security, docs, chore, refactor, test. Coverage must not fall below 80%.
Security issues
Not as a public issue — GitHub Security Advisories.