Tomelist helps FFXIV players plan tomestone farming during Moogle Treasure Trove events. Log the duties you clear and wishlist the items you want, and it tells you what to run next and whether you'll afford everything before the event ends.
There are no accounts and no backend. Progress stays in your browser (localStorage), each event
keeps its own progress, and the app installs as an offline-capable PWA.
- Overview: your tomestone wallet, a Run Next list ranked by tomes per effort, and a budget verdict for each wishlist tier (Must, Nice, Maybe).
- Objectives: log clears with undo. Weekly Minimogs are tied to their event week, and multi-clear objectives such as "Clear Aloalo Island 6 times" count up to their reward.
- Planner: this week's Minimog and weeklies, plus a pace line against your Must-haves.
- Exchanges: search and filter the event's items, wishlist them by tier and quantity, and log exchanges with undo.
- Settings: five palettes (three Grand Companies, Ishgard, the Crystarium) in dark and light, ornament and density options, and progress export, import and reset.
Events with a second currency, such as the Uolon Horn Tokens in The First Hunt for Astronomy, get a token balance and token costs alongside tomes.
jtferns built v1 by hand in 2021 (Create React App). v2, the current codebase, was rebuilt in 2026 with Claude, an AI coding assistant. Claude wrote most of the code, tests and docs, and drafted the event data from the wiki. jtferns directed the work: product and design decisions, scope, and review. Every change is typechecked, tested and built before it is committed.
Yarn workspaces monorepo:
app/(@tomelist/app): the Vite + React 19 PWA. TanStack Router for routes, Zustand for state, Tailwind CSS 4 and Radix UI for the interface, Vitest and Testing Library for tests. This is what gets deployed.packages/schema/(@tomelist/schema): Zod schemas for event content and saved progress, shared by the app and the data tests.data/: event content.manifest.jsonlists the events, and each event lives indata/events/<id>.json. It is bundled into the app at build time (app/src/lib/events.ts).scripts/: authoring aids for new events. Not part of the build or CI. Seescripts/README.md.docs/: design specs and implementation plans.surge-redirect/: the page that sends visitors from the oldtomelist.surge.shto the new site.wrangler.jsonc: Cloudflare Worker config for hosting.
Requirements: Node 24.21.0 (pinned in .nvmrc) and any yarn on your PATH. The repo checks in
Yarn 4.17.1 under .yarn/releases/ and points to it with yarnPath in .yarnrc.yml, so every
yarn command runs that version.
yarn install
yarn devCommands, run from the repo root:
| Command | What it does |
|---|---|
yarn dev |
Vite dev server for the app |
yarn tsc |
Typecheck every workspace |
yarn test |
Run every workspace's Vitest suite, including the data tests |
yarn build |
Production build into app/dist |
yarn validate:data |
Only the tests that validate data/ |
To try the production build locally, run yarn build, then yarn vite preview inside app/.
app/src/lib/events.tsloads everydata/events/*.jsonfile, validates it against the event schema, and finds the active event.app/src/router.tsxsends/to the active event and serves each event at/<eventId>/overview,/objectives,/planner,/exchangesand/settings.app/src/store/useAppStore.tsholds all user progress, per event, and saves it tolocalStorageundertomelist:v2. Event content is never edited at runtime.app/src/lib/optimizer.tsis the pure planning logic behind Run Next, the budget verdicts and the Planner.
scripts/README.md has the full flow: draft the exchange list with
scripts/fetch-rewards.ts, transcribe the objectives, add data/events/<id>.json, register it
in data/manifest.json, download item icons with scripts/fetch-icons.ts, record tradeability with
scripts/fetch-tradeable.ts, then run
yarn validate:data.
The site is a Cloudflare Worker that serves app/dist as static assets, with a single-page-app
fallback (wrangler.jsonc).
CI (.github/workflows/node.js.yml) runs yarn tsc, yarn test and yarn build on every push
and pull request to main. On a push to main, a second job builds again and deploys with
cloudflare/wrangler-action, using the wrangler version pinned in package.json. That job needs
the CLOUDFLARE_API_TOKEN (Workers Scripts: Edit) and CLOUDFLARE_ACCOUNT_ID repository secrets,
and fails without them. The first deploy creates the tomelist Worker.
Workflows from forked pull requests get no secrets and a read-only token, and the deploy job only
runs on pushes to main.
Tomelist used to live at tomelist.surge.sh. Once the Worker URL is live, replace both
REPLACE_WITH_DEPLOYED_URL placeholders in surge-redirect/index.html with it, then publish the
redirect page by hand:
cp surge-redirect/index.html surge-redirect/200.html && npx surge ./surge-redirect https://tomelist.surge.shProgress saved on the old site stays there: browsers keep localStorage per domain.
MIT, see LICENSE.
FINAL FANTASY XIV © SQUARE ENIX CO., LTD. Item icons come from the game via XIVAPI. Tomelist is a fan project and is not affiliated with Square Enix.