No description
Find a file
goober 96f273ce2b fix: reachable undo, nameable groups, and no favicon request
Found by running the app in a browser for the first time.

- Undo was only reachable from the team tab, and only after a team solve had
  finished, so an equip made from the character view had no way back. Both
  views now show it whenever there is something to undo.
- The owner-group naming dropdown listed all 23 espers from the game database
  rather than the characters the capture says you own. Two espers are both
  published as "Zero", so the list held two identical entries and picking the
  wrong one misattributed a whole loadout; conversely a character the game
  database has never heard of had no entry at all and its group could not be
  named. Options now come from the captured roster, labelled with the esper
  name and disambiguated by codename when two owned characters share one.
- An inline SVG favicon, so the page stops requesting one that does not exist.
  Inline rather than a file because the single-file build must make no
  requests at all.

Verified headless against the real 819-item export: import writes 819 items,
20 characters and 99 equipment rows to IndexedDB; a solve runs in a real
Worker and scores 0.6690 for Zankou, matching the Node bench; equip writes 8
app rows and displaces 7; undo restores all 99 imported rows; state survives
a reload. The file:// build renders, imports, solves inline and issues no
network request.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 12:30:56 +03:00
data-src feat: NTE gear optimizer web app 2026-08-21 11:38:17 +03:00
public/img feat: NTE gear optimizer web app 2026-08-21 11:38:17 +03:00
src fix: reachable undo, nameable groups, and no favicon request 2026-08-21 12:30:56 +03:00
tests feat: NTE gear optimizer web app 2026-08-21 11:38:17 +03:00
tools feat: NTE gear optimizer web app 2026-08-21 11:38:17 +03:00
.gitignore feat: NTE gear optimizer web app 2026-08-21 11:38:17 +03:00
.nvmrc feat: NTE gear optimizer web app 2026-08-21 11:38:17 +03:00
index.html fix: reachable undo, nameable groups, and no favicon request 2026-08-21 12:30:56 +03:00
package-lock.json feat: NTE gear optimizer web app 2026-08-21 11:38:17 +03:00
package.json feat: NTE gear optimizer web app 2026-08-21 11:38:17 +03:00
README.md feat: NTE gear optimizer web app 2026-08-21 11:38:17 +03:00
tsconfig.app.json feat: NTE gear optimizer web app 2026-08-21 11:38:17 +03:00
tsconfig.json feat: NTE gear optimizer web app 2026-08-21 11:38:17 +03:00
tsconfig.node.json feat: NTE gear optimizer web app 2026-08-21 11:38:17 +03:00
vite.config.ts feat: NTE gear optimizer web app 2026-08-21 11:38:17 +03:00
vite.single.config.ts feat: NTE gear optimizer web app 2026-08-21 11:38:17 +03:00
vitest.config.ts feat: NTE gear optimizer web app 2026-08-21 11:38:17 +03:00

nte-optimizer

Gear optimizer for Neverness to Everness. Static site, no server, no account.

It imports the JSON that nte-exporter writes during a normal capture run, and recommends what to equip on whom — drawn onto each character's console grid.

Running it

npm ci
npm run dev            # development
npm run build          # dist/index.html  — the normal build
npm run build:single   # dist/nte.html    — one file, works over file://
npm test

dist/ is committed on purpose. In three years, when npm ci fails on some transitive native module, python3 -m http.server -d dist will still work. The source build is the convenience; the committed output is the artifact.

Layout

path what lives there
data-src/ raw everness mirrors, Arc classifications, guide data. Committed, not shipped.
tools/ build-time scripts. Output goes to src/generated/, also committed.
src/domain/ pure. No DOM, no IndexedDB, no imports from ui/, db/ or state/.
src/solver/ same rule. Chunked generators, so they run in a worker or inline unchanged.
src/db/ schema, migrations, import, persistence adapters.
src/ui/ React. Four tabs and a hash router.

The domain/ and solver/ rule is what makes them worker-safe, Node-testable and diffable against the Python they were ported from. Keep it.

Two things that are easy to get wrong

Ported rules were expensive to derive and break in ways that still look plausible. Before touching anything in domain/, read ~/Apps/nte-research/WIREFORMAT.md and the "facts worth not re-deriving" section of RESUME.md. Builds are 6, 7 or 8 modules and never always 7; the console trait is not always CRIT DMG or Type III; a transposed board renders correctly on a symmetric grid.

The model has measured gaps, and the app is built to show them rather than hide them. Set bonus values are unknown and contribute nothing. The base-stat multiplier has never been read at level 80. A proven build is optimal for its packing and cartridge, not globally. Every one of those is surfaced in the UI on purpose — if you find yourself replacing one with a plausible number, don't.

Degraded modes

Opening dist/nte.html from the filesystem gives the page an opaque origin, so IndexedDB, workers, fetch and module scripts are all unavailable. The app handles this behind two interfaces it never sees through — PersistenceAdapter (IndexedDB → localStorage → memory) and SolverHost (worker → inline) — and shows a banner when storage is not durable. Artwork is not carried in that build.