English | Русский
Web app to track raid cooldowns per character and dungeon, with BiS gear hints and raid signup helpers (WotLK-focused).
Data persists locally in localStorage.
Live site: sergimax.ru/raidwise
Toolbar panels are mutually exclusive (only one open at a time). Breadcrumbs at the top of each page show the current section or raid tool and link back to My Raids.
Add characters and raids manually (toolbar buttons or the dotted empty column/row on the table), or load the WotLK template when the list is empty; edit specs, WowSims gear, also-owned items, raid metadata, and column order later. Header info opens a short intro (CDs, gear planning, or BiS-only).
Mark which character has CD on which raid. Reset one character from the table header, or everyone from Raid settings.
Sort and search raids (EN/RU, e.g. ICC25H / ЦЛК25хм); Type shows size (+ skull for Heroic), with per-row edit/delete. When sorted by name, adjacent variants of the same template raid share a background image across up to four rows; extra variants start another image.
Character columns use class-colored names and main/off GS; Complete is a progress bar; compact on small screens, with horizontal scroll inside the table when many characters are present.
Bulk reset CDs, or delete all characters / dungeons / local BiS lists (with confirm); when empty, Add raids from template.
The About section shows the app version and labeled links to the source code and author's website. What's new shows all changes for the latest published version, with a link to the full changelog.
Copyable signup lines of characters still missing CD on filtered raids, with min GS / role / spec filters, optional With upgrades, and optional Specs / GS in the line format. Session-kept filters; Reset parameters clears them; click Selected raid chips to exclude false matches.
Plan soft reserves for one character + spec on BiS upgrades from filtered raids (re-roll or +100, configurable soft reserve maximum with no fixed upper bound), with competition colors, win-odds hints, and a pasteable call list. For re-rolls, ordinary rolls count only when one player calls softs on an item; with multiple callers, only soft rolls count. The call list contains only your selected soft reserves. A toggle controls whether to show the number assigned to each item. The All useful items toggle (off by default) appends the remaining items from the useful-item list after your selected reserves. Optional With upgrades dims characters with no BiS targets; Reset parameters clears the panel filters. Uses the active BiS builds list; other-spec gear counts as owned; session state survives closing the panel.
Built-in presets per spec (Kingdom first, then Titans/community); local copies are editable for gear-choice hints.
Paper-doll slot layout with alternatives; Copy exports Slot: Item lines.
CD cells tint amber for missing BiS and blue for stat-filtered ilvl upgrades (hidden when that CD is marked; main/off split when both specs are set). Boss-grouped tooltips include tier tokens; also-owned items count without being on the WowSims export.
Full UI and item tooltips; first visit defaults to Russian.
Light/dark mode saved locally, with a system preference fallback when browser storage is unavailable; quiet MUJI chrome with a subtle page/panel dot grid; design tokens in docs/design/design-system.md.
Stack: React 19, TypeScript, Vite, MUI, Vitest + Testing Library.
CI:
Locally, npm run ci runs lint + tests with coverage + build; npm run test:browser runs the browser smoke checks separately.
On push/PR to main, GitHub Actions runs Lint, Test and coverage, Build, and Browser smoke in parallel, then Release files (checks CHANGELOG / README badges / lockfile when package.json was bumped; skips this check when the version is unchanged) (.github/workflows/ci.yml); pushes to main also upload a dist artifact (.github/workflows/build-artifacts.yml).
Layout:
src/components/ (UI), src/hooks/ (domain + overlay panels), src/utils/, src/data/ (WoW bundles + BiS presets), src/storage/. Tests are colocated as *.test.ts(x).
Performance:
WoW item JSON is code-split and loaded after the app shell (WowDataProvider / ensure-wow-data); fonts are self-hosted under public/fonts/; class/spec icons are 32×32 WebP; item tooltip scripts load on first item-link interaction for the active locale only.
Contributor and agent conventions: AGENTS.md.
Planned features: docs/roadmap.md.
npm install
npm run devOpen http://localhost:5173.
| Command | Description |
|---|---|
npm run dev |
Dev server |
npm run build |
Production build |
npm run preview |
Preview production build |
npm run lint |
ESLint |
npm run test / npm run test:run |
Vitest (watch / single run) |
npm run test:coverage |
Run Vitest with source coverage; see coverage/index.html for uncovered lines and branches |
npm run test:coverage:changed |
Run all Vitest tests and report coverage for locally changed source files; use npm run test:coverage -- --coverage.changed=<base> to compare with a commit or branch |
npm run test:browser |
Build and check theme first paint, appearance, accessibility, and raid data persistence in Chrome (set CHROME_PATH if Chrome is not in a standard location) |
npm run ci |
Lint + test:coverage + build (pre-push checks) |
npm run build:wow-data |
Regenerate bundled WoW JSON from scripts/wow-data/wowsims-db.json (includes VoA tier loot derived from tier set metadata when WowSims omits zone 4603) |
npm run generate:bis-presets |
Regenerate built-in BiS presets from scripts/bis/bis-list-sources.md + scripts/bis/bis-list-mix.md |
npm run comment:bis-presets |
Add slot comments to BiS preset files |
npm run download:gear-slot-icons |
Regenerate WoW paper-doll slot placeholder PNGs in src/assets/gear-slot-icons/ |
npm run download:raid-icons |
Regenerate template-raid achievement icons in src/assets/raid-icons/ |
npm run download:fonts |
Regenerate self-hosted Onest / Noto Sans / JetBrains Mono woff2 + src/fonts.css |
npm run compress:class-icons |
Resize class/spec icons to 32×32 WebP in src/assets/class-icons/ |
npm run lighthouse |
Desktop Lighthouse vs preview/production URL → docs/lighthouse/ (run preview first for local) |
npm run lighthouse:mobile |
Same with the mobile preset |
The CI test job uploads the coverage-report artifact. Coverage includes all runtime TypeScript files under src/, including files not imported by tests; it excludes tests and test helpers. There is no minimum coverage threshold yet. Browser smoke checks run separately.
Built-in BiS lists are authored in scripts/bis/bis-list-sources.md (Titans + community) and scripts/bis/bis-list-mix.md (Kingdom. With variants: numbered weapons + N-M slot alternatives).
Regenerate TypeScript presets after editing the markdown.
| Key | Contents |
|---|---|
raidwise |
Characters, dungeons, toggles (schemaVersion 6) |
raidwise-bis-lists |
BiS preset selections and local lists (schemaVersion 1; malformed entries skipped on load) |
raidwise-item-tooltip-locale |
en or ru (defaults to ru) |
raidwise-color-mode |
Light/dark preference |
raidwise-gear-hint-legend-dismissed |
Dismissed gear-hint legend above the table |
Legacy my-raid-cds* keys are copied to the new names on first load, then removed.
Character names: new names are letters only (Unicode \p{L}+); display capitalizes the first letter. Legacy names with digits/symbols still load.
Corrupted tracker data resets with an error alert. Legacy saves migrate on load.
Vite emits content-hashed files under assets/ (e.g. /raidwise/assets/index-….js). For good Lighthouse cache scores on sergimax.ru/raidwise:
| Path | Cache-Control | Notes |
|---|---|---|
/raidwise/assets/* |
public, max-age=31536000, immutable |
Filenames change every build |
/raidwise/index.html |
no-cache or short max-age (e.g. 60) |
Must revalidate so clients pick up new hashes |
/raidwise/fonts/* |
public, max-age=31536000, immutable |
Self-hosted woff2 |
Also enable HTTP/2 (or HTTP/3) and brotli or gzip for JS/CSS/JSON/SVG/woff2.
Client-side routes under /raidwise/ must fall back to index.html so direct links and refreshes work.
Example Nginx locations inside a server block. root maps /raidwise/...
to files under /usr/share/nginx/raidwise/...; unknown client-side routes
fall back to index.html, while missing files under assets and fonts stay 404.
location = /raidwise {
return 301 /raidwise/;
}
location = /raidwise/index.html {
root /usr/share/nginx;
add_header Cache-Control "no-cache";
}
location ^~ /raidwise/assets/ {
root /usr/share/nginx;
try_files $uri =404;
add_header Cache-Control "public, max-age=31536000, immutable";
}
location ^~ /raidwise/fonts/ {
root /usr/share/nginx;
try_files $uri =404;
add_header Cache-Control "public, max-age=31536000, immutable";
}
location ^~ /raidwise/ {
root /usr/share/nginx;
try_files $uri $uri/ /raidwise/index.html;
}