Compute & deploy
- Vercel (opens in new tab)
API + marketing site hosting
- EAS (Expo) (opens in new tab)
Mobile build + submit (App Store / Play)
- Hetzner (opens in new tab)
Dedicated compute
How we build it well
Live CI across every repo, every third-party we depend on, every public surface you can hit. Pre-qualify the stack without an NDA.
Live
§ 01Security posture
Six concrete security receipts. Each is enforced in code; specifics under contract. Provenance and integrity are public; attack surface stays private — we name what we do, not how an attacker would attack it.
Every request is signed at the integrator boundary with a per-tenant credential. A stolen API key alone is not enough to scrape. Replay protection is part of the scheme. Specifics provided under contract.
Specifics under NDA
Provenance tables carry UPDATE and DELETE triggers that reject the operation. Append-only is enforced by the database, not by application code. Behaviour is independently verifiable through the public ledger.
Postgres-enforced
The box is behind a zero-trust private mesh; no public SSH, no internet-routable management surface. Port-scanning the host finds nothing useful. Operational detail under contract.
Specifics under NDA
Every runtime secret lives in a per-environment secret manager. No env-in-dashboard, no .env committed, no operator memorising. Rotation procedure is part of the operations runbook.
Operational
Every external dependency has a deliberate failure posture, reviewed in code. Security boundaries fail closed; availability paths fail with logged degradation. Specifics under contract.
Operational
Edge-level bot defence on the public signup surface. Edge-level traffic policy on the product API. Both run before any application code. Specifics under contract.
Edge-enforced
Vulnerability disclosure: SECURITY.md in the audit_trail repo carries the policy + the 7-day disclosure window. Every claim above is verifiable in code under NDA — operational specifics are not public.
§ 02Public surfaces
Every link below is a real artifact you can hit right now. No NDA, no contract, no demo. Receipts, not claims — written out as six hrefs.
OpenAPI spec
/openapi.json
Every route, every schema, every error code in OpenAPI 3.1. Parse it with any client; the api answers exactly what's written here.
(opens in new tab)API reference
/docs
The same OpenAPI contract, rendered browsable. Every route and schema on one page; what it documents is what the api answers.
(opens in new tab)Official ledger
SplitWinner/audit_trail
The official anchor chain, the single-file verifier, and the SPEC registry. Clone it, run it — the ledger opens with its first official anchor.
(opens in new tab)Sealed alpha
SplitWinner/audit_trail_alpha
Five weeks of live anchoring, sealed and archived — both verifier generations included, every disclosure stated in ALPHA.md.
(opens in new tab)Methodology
METHODOLOGY.md
What the ledger proves, what it deliberately does not, and the daily protocol — including what stays private and why.
(opens in new tab)Security policy
SECURITY.md
Scope, reporting, and the disclosure window. Confirmed incidents are published append-only — no silent edits.
(opens in new tab)CI integrity gate
integrity.yml
The append-only guard and the full-corpus verification that runs on every push — a chain-breaking change cannot merge.
(opens in new tab)§ 03Stack
The full third-party stack — every vendor we depend on, named before you sign anything. Institutional choices, not duct tape. If we move off something, this list moves in the same commit.
Compute & deploy
API + marketing site hosting
Mobile build + submit (App Store / Play)
Dedicated compute
Data
Postgres + Auth (single store)
API rate-limit + KV
Payments
Mobile IAP (Daily Prediction pass)
AI
Claude models (admin + user tiers)
Observability
Errors + tracing across all repos
Uptime monitoring, log drain
Mobile app product analytics
Box log shipping → BetterStack
Orchestration
Cron + webhook orchestration (single scheduler)
Newsletter + transactional
SMTP provider behind Listmonk
Anchoring
Daily Bitcoin anchoring of the prediction ledger
Secrets
Secrets manager (synced into Vercel + the box)
Network
Zero-trust private mesh
Reverse proxy + automatic HTTPS
Source & CI
Source + Actions CI
Box-private mirror over Tailscale
Last reviewed in the same change that ships the stack. If we move off something, this list moves with the commit — same discipline as every other number on the site.
§ 04System architecture
Three lanes. Box-side writes data and anchors it; the API reads and serves it under contract; clients consume it. Supabase Postgres is the bus — everything on the left writes to it, everything on the right reads from it through the API.
Box
Dedicated compute
Data ingestion
Per-sport scrapers + odds backfill + schedule. Python services.
ML training + inference
Per-sport models, conformal-evaluated and calibration-checked. Daily live morning run.
Audit anchor writer
Wrote every alpha live prediction to the immutable audit_trail ledger before kickoff.
Orchestrator
Single scheduler. Cron + webhooks. Operational specifics under NDA.
API
Vercel · US East
/v1/* public read tier
Authenticated and signed on every request. Implementation specifics under NDA.
/webhooks/* writers
Metrics, insights, quant, engineering — CI + n8n triggered.
/openapi.json (public)
OpenAPI 3.1 — every route, every schema, every error code.
Clients
EAS · Vercel · GitHub
Mobile app
SplitWinner (React Native + Expo). Ships via EAS to App Store / Play.
Marketing site
splitwinner.com (Next.js 16). The site you're reading right now.
Public audit_trail repo
Daily mirror of the immutable ledger + the verify.py runner. Anyone can clone.
Trust boundary at the API: trusted internal services write their own domain tables within the trusted plane; the API enforces auth, signing, column allow-lists, and entitlement gating before serving any client. The public audit_trail mirror is a separate path — daily push, OpenTimestamps proof, Bitcoin attestation.
§ 05Service topology
Aggregate counts across the system. Numbers signal scale without naming the individual services — the operational footprint at the resolution that matters for due diligence.
Box services
5
Five independent tiers — ingest, ML, scoring, delivery, anchoring — each its own restartable process. Health, restart count, and last-deploy SHA visible in the ops console.
API endpoint groups
8
Public read-tier groups exposed via /v1/*. Every route, request schema, and response shape lives in the public OpenAPI spec — generated from code, never hand-written.
Webhook receivers
5
Scheduled writers — metrics, insights, quant, engineering, training. Each one's payload schema is in the OpenAPI spec; each one's shared-secret check fails closed.
Cron-driven workflows
12+
Scheduled workflows orchestrating ingest, training, scoring, anchoring, and reporting — NY-local, DST-aware.
Each number above is a real count as of the commit that ships this section. When the shape moves — new service, new endpoint group, new workflow — the count moves in the same change. Same discipline as every other number on the site.
§ 06Prediction lifecycle
Seven deliberate steps from game-data ingest to a delivered bet. The fork that matters most is the bet-or-skip decision — every prediction goes through it, both outcomes get anchored to the public ledger. Skips disclosed, not hidden.
01
Per-sport scrapers + odds backfill + schedule pull.
→ Game data
02
Per-sport models, cross-validated out-of-sample, registered to the immutable audit_models ledger.
→ Models
03
Calibrated probabilities over every outcome on the slate.
→ Probabilities
04
Coverage guarantee at the configured alpha. Output is the conformal set per row.
→ Conformal set
05
Each conformal-evaluated prediction either clears the bar and becomes a bet, or is held back as a disclosed skip.
→ Bet OR Skip
06
SHA-256 hash of every prediction (bet AND skip) written to the immutable audit_trail before kickoff while the pipeline runs. Daily OpenTimestamps proof, upgraded to a Bitcoin attestation.
→ Hash
07
Promoted bets land in the delivery table for the consumer app + API. Skips are public on the ledger but not delivered as picks.
→ Delivery
The bet-or-skip fork
After conformal evaluation, every prediction either clears the bar or it doesn't. Two outcomes — both anchored, only one delivered.
Promoted to bet
Lands in the delivery table. Delivered through the consumer app and the API. Recorded on the audit_trail row.
Disclosed skip
Anchored to the public ledger but not delivered as a pick. The system publicly says "we won't commit to this one." Recorded on the audit_trail row.
Skips disclosed, not hidden. The bar is deliberately high; as discovery surfaces new signal, more predictions lift from skip to bet over time. Coverage is an improving frontier, not a fixed target.
§ 07Deploy pipeline
Push, then CI gate, then deploy. The CI gate is the rigor signal — five checks pass or nothing merges. Web + api auto-deploy on push; mobile builds via EAS on demand. Every commit's deploy status is visible from the engineering quality snapshots below.
01
Every commit fires the gated pipeline. Conventional commit messages describe the change; no commit ships without all gates passing.
GitHub-hosted
02
Five checks run on every push. Any red check blocks the deploy.
.github/workflows/ci.yml
03
Vercel auto-deploys api.splitwinner.com + splitwinner.com on every push to main. US East region.
Vercel · 2-3 min · auto
04
EAS builds + submits the SplitWinner app to App Store + Play. Manual trigger (not push-triggered) per release.
EAS · on demand
The CI gate is the merge requirement; no path to production bypasses it. Build-status badges + the engineering snapshot above let any integrator independently verify which commit shipped last and that it passed every gate.
§ 08API quality
Aggregate quality snapshot for the splitwinner-api repo — test count, coverage, lint/typecheck/audit booleans, last passing build. Refreshed on every successful push to main. Under-NDA diligence is a copy of the same signal.
Tests
1,108
across 90 files; CI fails any red build
Line coverage
92.9%
92.7% function coverage
Enforced floor
92%
below this, CI fails — set in bunfig.toml
Build status
Passing
67839a3 · 1h ago
Static gates
Dependencies
16
11 runtime · 5 dev
Vetted before merge. Audit gate fails on any open vulnerability.
Public surface
/openapi.json (opens in new tab)Every route, every schema, every error code — fetchable, parseable, runnable through any OpenAPI client.
Test depth
Unit
1,108
across 90 files; gates every CI run
Integration
37
across 3 files; live-deps nightly
E2E
36
across 6 files; deployed-URL probes post-deploy
Mutation
Periodic
Stryker on the accuracy + security logic modules — periodic quality gate.
Snapshot from https://github.com/SplitWinner/splitwinner-api/actions/workflows/ci.yml
§ 09Web quality
Aggregate quality snapshot for the splitwinner-web repo itself. Same test/coverage/CI gates as the api, plus an end-to-end browser tier and a public sitemap. Updated on every successful push to main — what you're reading was built by the same pipeline this card describes.
Tests
792
across 52 files; CI fails any red build
Line coverage
94.2%
88.9% function coverage
Enforced floor
90%
below this, CI fails — set in bunfig.toml
Build status
Passing
a4c71dc · 54 days ago
Static gates
Dependencies
44
26 runtime · 18 dev
Vetted before merge. Audit gate fails on any open vulnerability.
Public surface
/sitemap.xml (opens in new tab)Every public URL the marketing site publishes. Same source the deploy reads — what you scan here is what Google indexes.
Test depth
Unit
792
across 52 files; component + section + screen coverage
Integration
6
across 1 files; live upstream seams
E2E
140
across 11 specs; Playwright + axe-core, mobile-first
Mutation
Periodic
Stryker isn't wired here yet — Playwright + axe-core act as the browser-tier quality gate.
Snapshot from https://github.com/SplitWinner/splitwinner-web/actions
§ 10Mobile quality
Aggregate quality snapshot for the splitwinner-app repo (Expo / React Native). Same test/coverage/CI gates as the api and web, plus Maestro flows on every PR (lint) and a nightly run on a real iOS simulator. Updated on every successful push to main.
Tests
1,356
across 153 files; jest-expo with the coverage floor enforced
Line coverage
96.9%
96.1% function coverage
Enforced floor
95%
below this, CI fails — set in package.json (jest.coverageThreshold)
Build status
Passing
e657d03 · 1h ago
Static gates
Dependencies
65
54 runtime · 11 dev
Vetted before merge. Audit gate fails on any open vulnerability.
Published bundle id
com.splitwinner.app
Paste into the App Store or Play Store to confirm the published build matches this snapshot.
Test depth
Unit
1,356
across 153 files; component + screen coverage
Integration
25
across 1 files; live upstream seams, nightly
E2E
17
across 17 Maestro flows on a booted iOS simulator
Mutation
Periodic
Stryker isn't configured for the mobile repo — Maestro on a real device runtime is the higher-value mutation surface for an app.
Snapshot from https://github.com/SplitWinner/splitwinner-app/actions/workflows/ci.yml
§ 11Services quality
Aggregate quality snapshot for the splitwinner-services repo. Same gates, same coverage floor as the other repos. Updated on every successful push to main.
Tests
449
across 36 files; bun test with the coverage floor enforced
Line coverage
82.7%
80.6% function coverage
Enforced floor
83%
below this, CI fails — set in bunfig.toml (coverageThreshold)
Build status
Passing
6aeb5f9 · 53 days ago
Static gates
Dependencies
19
9 runtime · 10 dev
Vetted before merge. Audit gate fails on any open vulnerability. Counts the api package + the UI workspace.
Source repository
github.com/OffensiveEdge/edgeseeker-services
Internal repo — access controlled. The CI snapshot itself is the public receipt.
Test depth
Unit
449
across 36 files; route + UI coverage
Integration
13
across 2 files; live Supabase seams, gated by RUN_INTEGRATION
E2E
10
across 1 files against a real deployment target
Mutation
Periodic
Stryker isn't configured for the services repo — the audit-trail-anchored writers carry the higher-value mutation surface.
Snapshot from https://github.com/OffensiveEdge/edgeseeker-services/actions/workflows/ci.yml
§ 12Public documentation
Every long-form document in the public audit_trail repo. Procurement, legal, and security teams can clone and read — no NDA needed for any of these. The marketing site you're reading just summarises what's already published.
METHODOLOGY.md
Methodology
How the box-side pipeline actually works — data, models, conformal, decisions, anchoring.
(opens in new tab)OPERATIONS.md
Operations runbook
How the system is operated — single-operator reality, key custody, backups, recovery.
(opens in new tab)SECURITY.md
Security policy
Vulnerability disclosure policy + 7-day incident commitment. Where to send security email.
(opens in new tab)INTEGRITY.md
Integrity statement
Append-only proof + the integrity workflow's role in enforcing it. The brand stance, fully written out.
(opens in new tab)CHANGELOG.md
Changelog
Every code change to the verifier and anchoring tooling, with commit SHA and date. The integrity workflow blocks any rewrite of prior entries — append-only at the repo layer.
(opens in new tab)README.md
Repo readme
git clone + python verify.py vectors && python3 verify.py chain + read the per-prediction match output. Pure stdlib, no toolchain, three lines.
(opens in new tab)incidents/README.md
Incident archive
One markdown per incident: timeline, scope, fix, follow-ups. Two disclosed today — the recovered=true bootstrap models and the calibration cache miss.
(opens in new tab)AGENTS.md
Repo agent guide
AGENTS.md / CLAUDE.md — the operating conventions the maintainer holds themselves to. Updated in the same commit as the convention it documents.
(opens in new tab)Each document above is a stable URL. When the audit_trail repo moves a file, the link here moves in the same commit — no drift. The whole corpus is one git clone deep.
Now the product. The sandbox ships the surface this engine produces — hold a key and check it; the audit page proves the predictions are honest.
A key in minutes — the full API surface, mocked plausibly-live, no card, no NDA. When it holds up on your desk, the 2026 beta cohort is a direct conversation: a limited set of desks, a fixed seasonal price in writing.
No card · no NDA · fixed price in writing