What are we dealing with this week, and when does it reset?
Hoxxes Briefing answers that one question fast. No wiki dive, no dashboard, no login — just an industrial mission board for Hoxxes IV that you can scan under pressure and keep reading when you're offline.
The live board — Deep Dive and Elite Deep Dive, biome, timing, and every stage's objectives, warnings, and anomalies at a glance.
- 🗺️ Both dives, side by side — the current Deep Dive and Elite Deep Dive, with the normal dive never treated as an afterthought.
- ⏳ Timing up front — start, end, and time remaining until the weekly reset.
- 🎯 Every stage, decoded — biome plus primary and secondary objective, warning, and anomaly (mutator) for all three stages of each dive.
- 📡 Freshness you can trust — live, cached, or stale is always labeled, and a background refresh swaps in newer data without blanking the board you're reading.
- 📴 Offline-readable — a PWA that keeps showing the last briefing when the network drops, and a clear state when there's nothing cached yet.
- 📱 Phone-first and themed — compact, warm, rough, and operational, without drowning the mission data in decoration.
The briefing is generated server-side from upstream Deep Rock Galactic event metadata and the same mission generator the game uses, compiled from Rust to WebAssembly. Web and API only ever talk through one closed, validated wire contract.
flowchart TD
A[Browser loads static SPA shell] --> B[SPA requests GET /api/v1/briefing]
B --> C[Hono API fetches upstream DRG event metadata]
C --> D[API derives the seed]
D --> E[Rust → WASM mission generator runs server-side]
E --> F[API maps the result to the contract and validates it]
F --> G[SPA parses the same contract]
G --> H[Board renders — live, cached, or offline]
Wire data crosses a closed valibot contract in both directions: closed enums, no freeform strings for bounded domains, and both ends reject the unknown. New domain values are a deliberate contract revision, caught at build time rather than papered over at runtime. See docs/architecture.md for the full shape.
| Layer | Built with |
|---|---|
| Web SPA | SolidJS 2 (beta), Panda CSS, Lingui i18n, Embla, PWA / Workbox |
| API | Hono on Vercel Functions |
| Wire contract | valibot shared schemas |
| Generation | Rust mission generator → WebAssembly |
| Build & tooling | Vite, pnpm workspaces, mise, Biome, Vitest, cargo |
Exact versions live in the package.json and Cargo.toml files — this table
names the tech, not the pins.
Install the repo toolchain and dependencies:
mise install
corepack enable
pnpm installRun the local app in two terminals:
pnpm dev:apipnpm dev:webThe web dev server runs on http://127.0.0.1:5173 and proxies /api/* to the
local API.
pnpm build # build every workspace package
pnpm test # TypeScript + Rust test suites
pnpm check # the full gate: Biome + typecheck + rustfmt + clippy + test + buildRegenerate the committed WASM package after Rust generator changes:
./scripts/codegen-wasm.shapps/web/— Solid SPA, PWA shell, and public UIapps/api/— Hono API and server-side orchestrationpackages/contracts/— shared API schemas and parsing helperscrates/— Rust generator facade and WASM bridgeapi/— Vercel Function entrypointsdesigns/— Pencil mockups and the design-system spec
- Architecture — system shape and data flow
- Product — product and UX intent
- Design System — tokens, typography roles, components, motion
- Ubiquitous Language — canonical domain terms and deliberate deviations
- Domain Reference — Deep Rock Galactic catalogue and contract enums
- Contract Runbook — evolving the wire contract (revisions, seasons)
- Deployment — Vercel deployment runbook
- Web App — web app ownership and local notes
- Use Conventional Commits for commit messages.
- Prefer small, focused commits with one logical change per commit.
- Run
pnpm checkbefore opening a PR. - Do not include AI/tool attribution in commit messages unless explicitly requested.
This project would not be here without the mission generation work started in trumank/drg-mission-gen and carried forward through the vioxynteris fork that Hoxxes Briefing currently depends on.
Rock and Stone to every miner who left a flare in the dark.
