Backpack Planner is a Svelte 5 + TypeScript PWA for planning and sharing Backpack Tech builds for Run! Goddess.
Live app: https://shilo.github.io/rg-backpack-planner
Game: Run! Goddess
The app lets you plan all three Backpack Tech trees:
It is built for quick iteration while playing: you can level nodes, track Tech Crystal cost, save multiple builds locally, and share builds through compact URLs.
localStoragepackage.jsonvite-plugin-pwaBuild data is stored in the URL hash using a custom compact, URL-safe format implemented in src/lib/buildData/.
The encoder:
This keeps shared URLs short enough to be practical while still round-tripping cleanly through the decoder.
Install dependencies:
npm install
Start the dev server:
npm run dev
The app uses the GitHub Pages base path, so during local development the intended URL is:
http://localhost:5173/rg-backpack-planner/
npm run dev # start the Vite dev server
npm run build # production build + copy index.html to 404.html
npm run preview # preview the built dist/ output
npm run check # svelte-check + TypeScript checks
npm test # npm run check + tsx test/index.ts
npm run pwa:assets # regenerate PWA assets from public/icon.svg
The automated test suite covers both:
Run it with:
npm test
That command runs:
npm run checktsx test/index.tsNote on Test Execution:
test/index.output.log.🎉 All tests completed successfully! message and the final log file link if every single test passes.For more detail on the hand-written CLI suites, see test/README.md.
Tier leveling uses a stable-tier model with hysteresis:
0, the target still lands at 0, but
non-target propagation uses a virtual tier floor of 1 for that rebasetarget propagation tier - 1Reactive thresholds depend on the node's maxLevel:
100 cap nodes react upward when the target reaches 1, 21, 41, 61,
and 8150 cap nodes react upward when the target reaches 1, 11, 21, 31,
and 411 cap nodes react upward when the target reaches 1On the way down, the system uses hysteresis, so the reactive tier does not drop at the same number it rose:
100 cap node that already reached tier 2 at 21 keeps tier 2 support at
20 and only drops to tier 1 when it reaches 19100 cap nodes drop reactive support when they fall below
20, 40, 60, or 8050 cap nodes drop reactive support when they fall below 10, 20, 30,
or 401 cap node drops its own stable tier when it returns to 00, ancestors still rebase against tier 1, while
wrapped nodes (including descendants) rebase against tier 0Once the next stable tier is known, reactive nodes use directional clamping:
max(current, assigned tier upper bound)min(current, assigned tier upper bound)This means a same-tier decrement can still lower other nodes. If the target stays in the same stable tier but the assigned bound is lower than the current reactive level, the branch is rebased downward immediately.
src/
config/ Tree definitions and shared tree metadata
lib/ Components, stores, build-data logic, helpers
public/ Static assets, icons, manifest inputs
scripts/ Build helpers
test/ CLI test suites and docs
dist/ Production output (generated)
This project uses the following third-party assets:
The app deploys to GitHub Pages automatically on every push to main via the .github/workflows/static.yml workflow. If deploys aren't working, check the following:
main to trigger a deploy.The workflow bumps the app version, builds, deploys to Pages, and commits the version bump back to main.
/rg-backpack-planner/.npm run build copies index.html to 404.html so GitHub Pages can route SPA URLs correctly.public/icon.svg changes, run npm run pwa:assets to refresh generated PWA icons.