Development
Building from source, architecture, tests, and how to contribute.
- Backend: Go 1.25+, Wails 2.11, SQLite.
- Frontend: React 19, TypeScript (strict), Vite 8, Tailwind 4, TanStack Query v5, zustand v5, Radix UI, i18next.
- Platforms: Windows x64, Linux x64 (GTK3 + WebKitGTK 4.1).
Building from source
Section titled “Building from source”Requirements: Go 1.25+, Node.js 22+, Wails 2.11, a C compiler, and the Wails platform dependencies.
git clone https://github.com/AmadoMuerte/Waxlight-launcher.gitcd Waxlight-launchernpm ci --include=dev --prefix frontendgo install github.com/wailsapp/wails/v2/cmd/wails@v2.11.0cd cmd/waxlightwails devProduction build from the repository root:
make wails-buildArchitecture
Section titled “Architecture”The Go code is layered:
| Layer | Purpose |
|---|---|
internal/app | Composition root (wire.go, adapters.go): constructs every dependency and owns startup/shutdown |
internal/<feature> | Features: accounts, instances, versions, launching, sessions, mods, snapshots, recovery, servers, settings, operations, updates, telemetry, statistics, gamelog, downloads, events, mutations, errs |
internal/platform/* | Adapters: sqlite, snapshots, process, logging, dataroot, credentials, filesystem, downloader, mod/server catalogs, etc. |
internal/transport/wails | Wails controllers and DTOs |
cmd/waxlight/main.go starts Wails; feature logic stays independent of Wails and React. The full backend architecture is documented in docs/backend-architecture.md. The frontend follows Feature-Sliced Design (app/, pages/, features/, entities/, shared/, widgets/); backend calls go only through frontend/src/shared/api.
Checks and tests
Section titled “Checks and tests”make test # frontend production build (i18n + tsc), then Go and frontend testsmake format # gofmt + oxfmtmake lint # Go static analysis (Linux target) + oxlintmake vet # go vet for the current platformmake security # prohibited-pattern and vulnerability checksmake release-check VERSION=X.Y.Z # full release validationFocused Go tests: go test ./path/to/package -run TestName. The pre-commit hook runs make format-check lint and blocks commits on failure.
Branching and PRs
Section titled “Branching and PRs”mainis the stable production branch;devis the integration branch.- Working branches start from
devwith prefixes likefeat/,fix/,refactor/,chore/,docs/,test/,ci/. - Normal PRs target
dev; only thedev → mainpromotion PR may targetmain. - Direct commits to
mainanddevare forbidden, as is force-pushing them.
Security rules for contributors
Section titled “Security rules for contributors”- Never put passwords, TOTP codes, pre-login tokens, session keys, or signatures in DTOs, generated bindings, logs, errors, fixtures, URLs, process arguments, environment variables, or exports.
- Production credentials use native OS storage only; no plaintext or in-memory fallback.
- Features that copy/export/diagnose/archive instances must remove the four authentication properties from
clientsettings.json. - Logging goes only through
internal/platform/logging(slog); stdliblogand stdout prints are forbidden.
Localization
Section titled “Localization”The canonical locale is frontend/src/shared/i18n/locales/en.json: translate values only; preserve keys, {{...}} interpolations, and plural suffixes. Validation: npm run check:i18n --prefix frontend. Adding a language also requires registration in languages.ts, i18n/index.ts, and backend validation. The interface is already available in 10 languages: English, Русский, Беларуская, Español, Français, Deutsch, Қазақша, Polski, Svenska, Português.
How to help
Section titled “How to help”Code, translations, testing, documentation, bug reports, and focused feature proposals are welcome. Before opening a PR, read CONTRIBUTING.md. Report vulnerabilities privately via the security policy. Questions and discussions — on Discord.