Skip to content

Value Proposition

Audience: Sales, leadership, prospect's CTO/CEO. Read this with key-features.md and ../architecture.md open. Tone: Engineering-grounded, no marketing copy. If you can't grep for 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/bj blackjack, 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 via libs/_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 via waitForBlock, 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 originapps/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/bj story — the orphan ebit-bj blackjack server has an EVO-Games external-wallet path that no dropbet flow currently touches. The dropbet blackjack flow uses apps/api + the in-process game logic. Treat the ebit-bj orphan as roadmap, not GA.