Static React + Vite mod database app for V Rising data, abilities, items, NPCs, workstations, prefabs, systems, components, queries, and linked reference views.
The app is fully structured and static-first:
- React + Vite for the UI shell
- Tailwind CSS for styling
- generated JSON as the canonical content contract
- GitHub Pages deployment from
dist/
Hugo is no longer part of the shipping path.
Reference content is generated to:
public/data/reference/<section>/index.jsonpublic/data/reference/<section>/by-slug/<slug>.jsonpublic/data/reference/aliases.json
Supported reference sections:
prefabscomponentssystemsqueries
DB content is generated to:
public/data/db/<section>/index.jsonpublic/data/db/<section>/by-slug/<slug>.json
Current DB sections:
itemsrecipesnpcsabilitiesworkstationsblueprintsquestsbuffsitemsets
Search content is generated to:
public/data/search.index.json
The structured generators currently read from source material in:
content/prefabs/**/*.mdcontent/components/**/*.mdcontent/systems/**/*.md
These markdown files are treated as extraction input, not as the public rendering model.
Optional enrichment snapshots and curated ability icons live in:
data/enrichment/*.jsonpublic/icons/abilities/*
content/dev, content/user, and content/editing remain out of the current app scope unless we explicitly revive authored guides later.
- Node.js 20+
npm installnpm run devnpm run generate:dataThis starts from a clean generated-output root so stale legacy files under public/ cannot leak into deploy artifacts.
npm run refresh:db-assetsThis is a manual refresh step for repo-owned enrichment inputs. It reads local Bloodcraft resources plus the local asset dump, writes deterministic snapshots under data/enrichment/, normalizes canonical join maps (abilities, items, recipes, NPC/workstation display, and remaining DB display maps), and copies curated ability icons into public/icons/abilities/.
The refresh output now includes per-entry provenance (sourceKind, sourceRef) in enrichment maps and emits data/enrichment/item-icon-unresolved.json for icon curation follow-up.
Optional legacy source discovery:
VRISING_TOOLTIP_LEGACY_SOURCEfor a single JSON file pathVRISING_TOOLTIP_LEGACY_SOURCESfor multiple JSON file paths (comma/semicolon separated)- equivalent
*_LEGACY_SOURCE/*_LEGACY_SOURCESpairs also exist for item icons/descriptions, recipe links, and section display maps - otherwise the script checks known local defaults and safely continues when none are found
npm run validate:datavalidate:data runs path/slug validation plus enrichment threshold-floor checks from data/enrichment/coverage-thresholds.json against the generated data/enrichment/enrichment-coverage.json snapshot. Coverage metrics are high-signal only, with low-signal fallback rows tracked separately.
npm run buildBuild output is written to dist/. The build also generates dist/404.html for SPA deep-link support on GitHub Pages.
npm run verifyThis is the canonical release-safe check. It runs TypeScript verification, shortcode syntax validation, the full build/generation pipeline, and a Pages artifact sanity pass that confirms the expected dist/ and public/ output shape.
npx playwright install chromium
npm run visual:baseline
npm run visual:compareThe visual-review workflow captures an explicit player-first pack plus a developer sanity pack in both dark and light themes using the vrising-theme local-storage key.
npm run visual:baselinewrites accepted screenshots totests/visual/baselines/npm run visual:comparecaptures current screenshots, generates diffs, and writes an HTML report under.codex-tmp/visual-review/latest/- the player-first pack includes home, search/list browse, and these detail captures:
/db/items/item-blood-essence-t01,/db/items/item-vampire-coating-blood,/db/abilities/ab-apply-weapon-coating-blood-ability-group,/db/recipes/recipe-armor-boots-t01-bone,/db/npcs/char-bandit-bomber-v-blood - the player-first pack also keeps the URL-backed ability school slice visible at
/db/abilities?view=catalog&school=blood - the developer sanity pack keeps the reference prefab list/detail plus the clipped shell/header captures so top-bar drift stays obvious during later UI passes
- the runner is now config-driven on top of a generic engine so later local apps can define their own shell/control packs without a second bespoke review stack
- this is a review aid for UI passes and is intentionally separate from
npm run verify - small exploratory human edits are expected; only refresh baselines when a visual change is intentionally accepted as the new standard
Accepted broad-run QA routine:
npm run qa:accepted-broad-runThis helper runs the accepted Dual-Lane Review Loop sequence after a qualifying broad extractor run:
npm run refresh:db-assetsnpm run verifynpm run visual:compare- review the generated
.codex-tmp/visual-review/latest/report, starting with the player-first pack
The repeatable Dual-Lane Review Loop and checkpoint format are documented in docs/track-3-iteration-playbook.md.
The original-site comparison notes and deliberate parity decisions live in docs/database-parity-audit.md.
Ingestion readiness preflight:
npm run qa:ingestion-readinessThis helper is the non-mutating preflight companion to the accepted broad-run QA flow.
- it writes a Markdown report plus machine-readable JSON under
.codex-tmp/ingestion-readiness/ - it checks shared source availability, broad control coverage, stateful harness evidence, and core-domain enrichment verdicts for abilities, items, recipes, NPCs, and workstations
- it exits successfully when only warnings are present, and fails only on shared blockers such as missing required roots or broken broad control coverage
- it is meant to run before the next larger asset-ingestion push, not to replace
npm run qa:accepted-broad-run
npm run generate:referencebuilds the structured reference graphnpm run generate:dbbuilds DB section indexes and detail filesnpm run generate:searchbuilds the lightweight unified search indexnpm run generate:dataruns the full generation pipelinenpm run refresh:db-assetsrefreshes canonical enrichment snapshots and curated ability icon inputs from local external dumpsnpm run validate:dataperforms path/slug sanity checks plus enrichment threshold-floor validationnpm run verifyruns the full pre-push verification path used locally and in CInpm run visual:baselinerefreshes accepted visual baselines for the fixed screenshot review packnpm run visual:comparecompares the current UI against accepted visual baselines and writes a diff report under.codex-tmp/visual-review/latest/npm run test:visual-reviewexercises the idempotent visual-review engine helpers and config validationnpm run qa:accepted-broad-runruns the accepted broad-run QA sequence for the Dual-Lane Review Loopnpm run qa:ingestion-readinesswrites a core-domain ingestion readiness report under.codex-tmp/ingestion-readiness/
public/data/anddist/are build-generated.public/icons/abilities/is a repo-owned curated asset input preserved across generation.- This project is an unofficial, non-commercial fan reference. V Rising names, art, and related assets remain the property of Stunlock Studios.
- Keep game-derived assets scoped to approved pipeline inputs and honor rights-holder takedown requests promptly.
src/config/sections.tsis the app-level section contract for reference and DB routing.src/config/shell.tsis the frozen shell destination contract; adjust top-nav routes there instead of freehand restyling the header.src/config/home.tsis the homepage landing contract; change grouped homepage discovery surfaces and future enrichment seams there instead of mirroring shell changes by hand.node scripts/check_shortcode_syntax.js contentis still useful because the source corpus contains relref-style markdown that the extractors depend on parsing cleanly.scripts/dev.shis no longer part of the current architecture or verification path.
Run the canonical verification pass first:
npm run verifyThen do one quick human smoke pass against the built app and spot-check these routes:
//prefabs/components/systems/queries/db/items/db/recipes/db/npcs/db/abilities/db/workstations/db/blueprints/db/quests/db/buffs/db/itemsets/search
Representative detail and legacy-alias checks:
/prefabs/item-consumable-healingpotion-t01/components/itemdata/systems/server--gamedatasystem/queries/server--gamedatasystem--query-1748745749-1/prefabs/Item_Consumable_HealingPotion_T01/components/ItemData/systems/server/GameDataSystem
Deploy artifact sanity:
dist/404.htmlexists and matches the SPA fallback strategydist/only contains the app shell, assets, and generated datapublic/only contains generated data plus.nojekyll- search results show both reference and DB entries without shipping full markdown bodies
On push to main, GitHub Actions:
- installs dependencies
- runs
npm run verify - deploys
dist/to GitHub Pages
- Decide whether the new content belongs in
referenceordb. - Extend the relevant generator in
scripts/. - Add or update the section contract in
src/config/sections.ts. - Update the UI mapping layer if the new data benefits from schema-aware rendering.
- Re-run
npm run verifyand then spot-check routes and search results.