Skill trees now render the way the source does: each class has three named subtrees (e.g. Swordmaster: The Blade / The Will / The Way), each with its own 3-col or 5-col grid, sized in 72px cells. Extractor parses subtrees separately so the per-tree row/col coordinates are correct (previously all 22 nodes were stacked on one combined grid and overlapped). Connector edges are mapped per-subtree too. Loadout: new global 3-ability + 3-technique slot row at the bottom of the Skill Trees panel. The cap is global across all 5 classes (matches the source HTML which has `id=active-Ability-N` / `id=active-Technique-N` without per-tree scope). Click a slot to pick from any allocated Ability or Spice (for Ability slots) or any allocated Perk (for Technique slots); right-click clears. Slot backgrounds use the local ability.png / technique.png artwork copied into /icons. Label overlap fix: constrained the name label under each node to the node width (72px) and bumped the vertical gap from 44 to 60px so 2-3 line names have room without bleeding into the row below. Existing saved builds migrate cleanly — loadout normalizes to length-3 slot arrays if absent or malformed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| backend | ||
| data | ||
| frontend | ||
| scripts | ||
| .dockerignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| README.md | ||
Dune Awakening — Character Builder
Plan your character across House, Class, Character XP, Specializations, Faction Standing, and Skill Trees. Shareable via short link.
Stack
- Frontend: Vue 3 + Vite + TypeScript
- Backend: NestJS (Node 22, TypeScript)
- Storage: Valkey (Redis-compatible) for build sharing
- Data: extracted from
../sample-data/*.htmlinto./data/*.jsonviascripts/extract.py
Two containers: app (NestJS serving the SPA + API) and valkey. Wire-up in
docker-compose.yml.
Run
docker compose up --build
Then open http://localhost:9002.
Update data
If you save new HTML snapshots into ../sample-data/, re-run the extractor:
uv run python3 scripts/extract.py
This regenerates ./data/*.json, which the container picks up on next build.
API
POST /api/builds— body is a build payload (any JSON ≤16 KB). Returns{ code }(8-char URL-safe id).GET /api/builds/:code— returns{ code, build }.GET /api/data/:file— serves the static JSON tables (allow-listed).
Builds are stored in Valkey with a rolling 1-year TTL (refreshed on each fetch), so popular shared builds don't expire.
Dev (without Docker)
In two terminals:
# backend
cd backend && npm install && VALKEY_URL=redis://localhost:6379 npm run start:dev
# frontend
cd frontend && npm install && npm run dev
The Vite dev server proxies /api/* to localhost:3000.