dune-tools/character-builder
Vantz Stockwell f142725dd8 Skill tree: subtrees, loadout slots, label fix
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>
2026-05-23 08:21:09 -04:00
..
backend Add Dune Awakening character builder + initial project scaffolding 2026-05-23 07:30:37 -04:00
data Skill tree: subtrees, loadout slots, label fix 2026-05-23 08:21:09 -04:00
frontend Skill tree: subtrees, loadout slots, label fix 2026-05-23 08:21:09 -04:00
scripts Skill tree: subtrees, loadout slots, label fix 2026-05-23 08:21:09 -04:00
.dockerignore Add Dune Awakening character builder + initial project scaffolding 2026-05-23 07:30:37 -04:00
docker-compose.yml Use external port 9002 instead of 8080 2026-05-23 07:30:55 -04:00
Dockerfile Add Dune Awakening character builder + initial project scaffolding 2026-05-23 07:30:37 -04:00
README.md Use external port 9002 instead of 8080 2026-05-23 07:30:55 -04:00

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/*.html into ./data/*.json via scripts/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.