Value Proposition¶
Audience: Sales, leadership, prospect's CTO/CEO. Read this with
key-features.mdand../architecture.mdopen. Tone: Engineering-grounded, no marketing copy. If you can'tgrepfor it, it's not in here.
Elevator pitch¶
Evospin is a turnkey real-money iGaming platform: a NestJS 11 backend monorepo (ebit-api) plus two frontends — a Next.js 14 player site (ebit-fe — branded dropbet) and a Vite + React 19 admin SPA (ebit-admin-fe for operators) that together deliver the full operator stack — sign-up + KYC, wallet with crypto on/off-ramp, house games (dice, plinko, mines, limbo, blackjack, speed-roulette), provider-game catalogues (Softswiss, PM8, BGaming, ST8, EvoGames slots), sportsbook proxy, real-time websockets, promo / leaderboard / VIP / rakeback / challenges, and a permissioned admin backoffice. It targets operators that want to launch a crypto-native casino without rebuilding wallet, fairness, observability, and admin tooling from scratch — and it ships with a complete OpenTelemetry pipeline (Jaeger / Prometheus / Loki / Grafana) wired in by default, so day-one you have production-grade traces, metrics, and logs without bolt-ons.
Differentiators (concrete, not marketing)¶
These are things Evospin ships in code today, with file paths you can verify in <30 s.
1. Five-application NestJS monorepo, deployed independently¶
nest-cli.json declares 5 apps (api, rt, bj, bo, speed-roulette) sharing 11 libs (@app/shared, @app/auth, @app/games, @app/accounting, @app/integrations, @app/gateway, @app/ws-throttler, @app/modules, @app/is-localhost, @app/_prisma, @app/guards). Each app has its own main.ts, builds independently, and ships its own Docker image. This means:
- The websocket fan-out service (
apps/rt, port 4001, namespace/events, websocket-only — polling explicitly disabled) scales independently of the REST API. - The live-game game-servers (
apps/bjblackjack,apps/speed-roulette) can be scaled, restarted, and even disabled per-customer without affecting the rest of the stack. - The backoffice (
apps/bo) is a separate process even though it shares the same NestJS codebase — admin traffic cannot starve player traffic.
Most monolithic competitors force you to scale the whole thing or carve services out by hand later. Evospin was carved up day one.
2. End-to-end OpenTelemetry, real, captured today¶
Run the recipe in ../e2e-trace-demo.md and you'll get back a Jaeger trace ID for a real bet — a single POST /casino/games/house/dice/bet produces 69 spans spanning HTTP → controller → service → Prisma → Postgres → Redis (BullMQ enqueue) and back. No demo-mode shim, no synthetic instrumentation: the trace is captured against the local docker-compose stack with no source modifications. Sign-in produces 37 spans, sign-up 49.
This is the baseline observability you get with a fresh customer install — not a roadmap item. See ../observability.md for the OTel collector / Jaeger / Prometheus / Loki / Grafana wiring.
3. Prisma + Postgres backbone with split, multi-schema layout¶
libs/_prisma/src/schema/ declares schemas in three files (api.prisma, blackjack.prisma, speed_roulette.prisma) backed by three Postgres schemas in one database. Operationally this means:
- One Postgres cluster to back up, monitor, and patch.
- Game data is logically isolated — a blackjack migration can't break the bet history table.
- Migrations are split per app, run via
npm run db:migrate:dev, and seeded vialibs/_prisma/src/seed/index.ts.
Most competitors either run a shared monolithic DB or a microservice-per-DB sprawl. The split-schema pattern is the pragmatic middle.
4. BullMQ on Redis for all production async work¶
Every async job — auth-session updates, bet settlement, bot-fleet driving, leaderboard ticks, promo tasks, user-stats migration, skindeck deposits, both speed-roulette state-machine queues — runs through @nestjs/bullmq against the cache Redis. RabbitMQ exists in compose but only as a stub for the FastTrack bonus tracker (see apps/api/src/fast-track/rabbitmq/fast-track.rmq.module.ts:8, disabled = true). One queue runtime to monitor; jobs are inspectable via redis-cli -a cache → KEYS bull:*.
5. Provably-fair fairness and external blockchain-anchored fairness¶
Two distinct fairness models, each implemented:
- Server-side seed rotation (
apps/api/src/provably-fair/) —ProvablyFairService.popUserSeed()produces per-bet HMAC seeds that the player can verify after the round. - Blockchain-anchored RNG (
apps/speed-roulette/) — speed-roulette anchors round outcomes to an EOS (Wax / Jungle) block viawaitForBlock, so the wheel result is deterministic from a public chain entry. See../architecture.md§1 and../flows/dropbet-speed-roulette.md.
Most platforms ship one or the other. Evospin ships both, in production.
Why not build it ourselves?¶
Concrete time-to-market argument from the code that exists:
| Subsystem | Replication estimate | Source of estimate |
|---|---|---|
| Auth (sign-up + 2FA + JWT cookies + Redis sessions + password reset + email verify + reCAPTCHA + GeeTest) | 2–3 months for a senior team | apps/api/src/auth/ covers controllers, service, strategies, guards (JwtGuard, RolesGuard, OtpGuard), session queue producer, cookie helpers; captcha/geetest/ + captcha/google/ |
| House games (dice, limbo, plinko, mines, blackjack, speed-roulette) — gameplay rules, RNG, settlement, ledger writes, fairness seeds | 3–4 months | apps/api/src/casino/games/ + apps/api/src/provably-fair/ + apps/bj/ + apps/speed-roulette/ |
| Provider game integrations (Softswiss CDN, PM8 launch + wallet, BGaming wallet + dev-proxy, ST8, EvoGames) | 2–3 months per provider — adapter, wallet callback, signature verification, error taxonomy | apps/api/src/casino/slots/providers/{softswiss,pm8,bgaming,st8,evogames} |
| Wallet & payments (CCPayment, NowPayments, SkinDeck) — deposit, withdraw, webhook signatures, idempotency, network registry | 2 months | apps/api/src/payment/provider/integration/{ccpayment,nowpayments,skindeck} |
| KYC (Sumsub) — applicant lifecycle, webhook handler, doc upload, status state machine | 1 month | apps/api/src/kyc/sumsub/ + apps/api/src/kyc/{kyc.service.ts,kyc.repository.ts} |
| Sportsbook proxy + S2S auth | 1–2 months | apps/api/src/sportbook/{actions,auth,s2s,system} |
| Promotions, bonuses, challenges, leaderboards, VIP, rakeback, tips | 3 months | apps/api/src/{promo,challenge,leaderboard,vip-program,rakeback,tips,admin-tips} |
| Real-time websocket fan-out (socket.io with Redis adapter, throttling, auth) | 1 month | apps/rt/ + libs/ws-throttler/ |
| Admin backoffice + UI (user mgmt, bet review, promo CRUD, KYC review, dashboards) | 3 months | apps/bo/ + ebit-admin-fe/ |
| Observability (OTel collector + Jaeger + Prometheus + Loki + Grafana, spanmetrics, exemplars) | 1 month to wire it cleanly | docs/observability.md + collector configs |
| Frontend player site (Next.js 14 App Router, i18n en/de, socket.io client, Tailwind + shadcn) | 3 months | ebit-fe/ |
Conservative aggregate: 22–28 person-months for a senior team to reach feature parity, not counting the operational tail — provider re-certification, payment compliance reviews, observability tuning, performance tests. Evospin collapses that into a Phase-1 local stack-up in 1 day (../onboarding/day-one.md) and a Phase-2 customisation window of 2–4 weeks (roadmap.md).
Codebase scale¶
Counted on 2026-04-25 with find … -name '*.ts' -o -name '*.tsx' | xargs wc -l:
| Repo | Files (.ts + .tsx) |
Lines |
|---|---|---|
ebit-api/ |
1,444 | 107,712 |
ebit-fe/ |
864 | 62,650 |
ebit-admin-fe/ |
519 | 41,995 |
| Total | 2,827 | 212,357 |
Excludes node_modules/, .next/, dist/. Includes tests and migrations. (The original 78,331 figure in informal notes is ebit-api source-only, excluding tests and apps other than api.)
For context: 212k lines of TypeScript covers everything in the key-features.md inventory — 2FA auth, KYC, wallet, six house games, five provider integrations, sportsbook, full admin, real-time, OTel observability, promo / challenge / leaderboard / VIP / rakeback, and the player + admin frontends.
What Evospin is not¶
To save you a discovery call:
- Not a sportsbook origin —
apps/api/src/sportbook/is a proxy layer; the odds engine is external, integrated via S2S auth. - Not a multi-tenant SaaS — single-tenant white-label deployment. See
integration-options.md§White-label. - Not a licensing or regulatory product — Evospin ships the integration surfaces (Sumsub, audit logs, provably-fair seeds). The operator owns the licence in their jurisdiction. See
nfr-sla.md§Compliance. - Not currently using RabbitMQ for production traffic — the broker runs in compose for the FastTrack bonus integration, but that integration is stubbed (
disabled = true). All async work is BullMQ. - Not a finished
apps/bjstory — the orphanebit-bjblackjack server has an EVO-Games external-wallet path that no dropbet flow currently touches. The dropbet blackjack flow usesapps/api+ the in-process game logic. Treat theebit-bjorphan as roadmap, not GA.
Cross-links¶
key-features.md— full feature inventory with code paths.integration-options.md— what you can swap, replace, or extend.nfr-sla.md— measured latency, throughput, availability targets.roadmap.md— adoption phases.../architecture.md— system architecture, C4 diagrams, port contract.../e2e-trace-demo.md— proof-of-life Jaeger trace from a real bet.