An original anime action-RPG card battler. 464 fighters, real-time Arts combat, provably-fair summons β and no monetisation of any kind.
βΆ Play the demo in your browser Β Β·Β Run it locally Β Β·Β Read the PRD
100% original IP. Every character, name, move and pixel of artwork in this project is original β there are no third-party assets and no image files at all (portraits are generated procedurally at runtime). See
docs/LEGAL.md.
cd dragon-rush-heroes
node server/index.js # β http://localhost:3000That is the entire setup. There is no npm install β the project has zero
runtime dependencies.
npm test # 86 unit + integration tests (~2 s)
npm run smoke # 25 deployment health checks (~1 s)
node tests/e2e.js # 25 browser tests (needs Chrome)The premium games in this genre are excellent products wrapped around a hostile economy. This build keeps the depth and deletes the extraction.
| Genre standard | Dragon Rush Heroes | |
|---|---|---|
| Starting currency | Buy at ~Β£40 / 2,000 | 25,000 free (~Β£500 equivalent) |
| Premium pass | ~Β£8/month, auto-renews | Free, permanent |
| Stamina | 60 cap, regenerates slowly | Unlimited |
| Play session | Gated by energy | Unbounded |
| Summon fairness | "Trust us" | Cryptographically verifiable |
| Ads | Rewarded video | None |
| Roster | 400+ | 464 |
Your 25,000-crystal grant is 25 ten-pull multis. A simulated grant spend yields roughly 167 unique fighters including an Ultra and 6 Legends before you fight a single battle.
Server-authoritative 3v3 card battler. Draw Arts cards, spend Ki, chain combos, dodge with Vanishing Step, cover-change to save a dying ally, charge the Unique Gauge, and fill seven Rush Orbs to trigger the Rising Rush.
- Seven-element wheel (Crimson β Solar β Void β Verdant β Tidal β Crimson, plus Umbral and Radiant) at 1.5Γ / 0.65Γ
- Five Arts types, three-card combo chains, critical hits, Endurance survival
- Data-driven abilities: 16 effect types across 9 trigger conditions
- Fully deterministic β every battle is replayable from its seed
- Keyboard controls:
1-4cards,Vvanish,Rrush,Ccharge
464 fighters across 80 lineages and 5 rarities, each with unique stats, signature moves, ability kits, Z-Ability team buffs and a Unique Gauge. Duplicates convert to Z-Power toward a 7-star limit break.
Outcomes derive from HMAC-SHA512(serverSeed, clientSeed:nonce:cursor). The
server seed's hash is published before you pull; rotate your own client seed
whenever you like. When the server seed rotates, its plaintext is revealed so
every historical pull can be independently recomputed.
Every portrait is drawn on a <canvas> from a seed. The repository contains
no image files β 464 unique characters in roughly 190 KB of code.
| Summon reveal | Battle arena |
|---|---|
![]() |
![]() |
| Dashboard | Roster |
|---|---|
![]() |
![]() |
server/
βββ core/ HTTP kernel, crypto, validation, logging, errors
βββ domain/ content (464 fighters) Β· combat engine Β· economy β pure, no I/O
βββ data/ WAL store + repository seam
βββ services/ auth Β· game (transaction boundaries)
βββ routes/ 26 endpoints
public/
βββ app/core/ api Β· store Β· ui Β· portrait renderer Β· VFX engine
βββ app/views/ auth Β· home Β· summon Β· roster Β· battle Β· settings
Dependencies point downward only. domain/ imports nothing from the layers
above it, which is why the combat engine is testable without a server.
Storage: an embedded document store with a write-ahead log and atomic
snapshots β ACID-ish durability, no native modules.
db/schema.sql holds the equivalent PostgreSQL DDL (validated
against a live PostgreSQL 17) for the scale-out path; only
data/repositories.js would change.
| Variable | Default | Notes |
|---|---|---|
PORT |
3000 |
|
HOST |
0.0.0.0 |
|
NODE_ENV |
development |
|
DATA_DIR |
./.data |
Snapshot + WAL location |
SESSION_SECRET |
dev-derived | Required in production, β₯ 32 chars |
GACHA_SECRET |
dev-derived | Required in production, β₯ 32 chars |
CORS_ORIGINS |
(empty) | Comma-separated allow-list |
LOG_LEVEL |
debug / info |
The process refuses to boot in production without real secrets β a deliberate fail-fast, since ephemeral secrets would invalidate every session on restart.
FROM node:20-alpine
WORKDIR /app
COPY package.json ./
COPY server ./server
COPY public ./public
ENV NODE_ENV=production
EXPOSE 3000
VOLUME /app/.data
HEALTHCHECK --interval=30s CMD wget -qO- http://localhost:3000/api/health || exit 1
CMD ["node", "server/index.js"]docker run -d -p 3000:3000 \
-e SESSION_SECRET="$(openssl rand -hex 32)" \
-e GACHA_SECRET="$(openssl rand -hex 32)" \
-v drh-data:/app/.data \
dragon-rush-heroes- scrypt password hashing (N=2ΒΉβ΅) with per-user salts
- Session tokens stored only as SHA-256 digests
- Signed double-submit CSRF on every unsafe method
- Strict CSP with no
unsafe-inlinefor scripts - Schema validation on every input; mass assignment structurally impossible
- Per-account and per-IP rate limiting
- Append-only currency ledger; economy invariants enforced in the database
- GDPR export and erasure, cascade-verified
Full detail in docs/SECURITY.md.
137 automated checks, all passing locally.
node tests/run.js β 86/86 unit + integration (~2 s)
node tests/smoke.js β 25/25 deployment health (~1 s)
node tests/e2e.js β 26/26 browser end-to-end (~30 s, real Chrome)
Continuous integration runs the same three suites across Node 18, 20 and 22
on every push β see .github/workflows/ci.yml.
| Suite | Count | Covers |
|---|---|---|
| Unit | 56 | Crypto, validation, store transactions, combat invariants, content generation, economy maths |
| Integration | 30 | Real HTTP: auth, CSRF, rate limits, economy accuracy, traversal, ownership |
| Smoke | 25 | Health, security headers, catalogue integrity, free-forever charter |
| E2E | 26 | Real Chrome: full journey, portrait rendering, complete battle, mobile layout, zero console errors |
Bugs these caught during development: a combat deadlock state, two CSP violations, an empty battle stage, a blown-out screen flash, and a PostgreSQL rule that silently broke GDPR account deletion.
| Document | Contents |
|---|---|
docs/PRD.md |
Personas, journeys, functional requirements |
docs/ARCHITECTURE.md |
ADRs, module boundaries, folder tree, request lifecycle |
docs/API.md |
All 26 endpoints, state management, component hierarchy |
docs/SECURITY.md |
Threat model, controls, testing strategy |
docs/IMPLEMENTATION.md |
Three-phase build plan with verification gates |
docs/LEGAL.md |
IP position and pre-publication checklist |
| Source files | 34 |
| Lines of code | ~11,000 |
| Runtime dependencies | 0 |
| Fighters | 464 |
| Story stages | 48 |
| Image assets | 0 (procedural) |
| API endpoints | 26 |
| Automated checks | 137 |




