BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
Real fixtures, real live scores, and a statistical model fitted on actual results. Know the numbers before you decide.
Sports & fitnessTypeScript · PythonGitHub @Scaper20OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
A football prediction and betting-analysis platform built for the Nigerian market.
Real fixtures, real live scores, and a statistical model fitted on actual completed
matches — no placeholder games, no invented picks.
Most football tipster sites hand you a selection and ask you to trust it. This one
computes probabilities from a published method and shows you the sample size behind
every number, including when that sample is too thin to say anything at all.Read the full README ↗A football prediction and betting-analysis platform built for the Nigerian market. Real fixtures, real live scores, and a statistical model fitted on actual completed matches — no placeholder games, no invented picks.
Most football tipster sites hand you a selection and ask you to trust it. This one computes probabilities from a published method and shows you the sample size behind every number, including when that sample is too thin to say anything at all.
npm install
npm run dev
Open http://localhost:3000. No API key is required — the app falls back to TheSportsDB's public key, which returns real live scores and real fixtures. See Data providers for lifting the coverage limits.
npm run build # production build
npm test # unit tests for the model, odds and staking maths
npm run lint
npm run smoke # hit the live feeds and print what comes back
Every fixture, scoreline and result comes from a live provider. Nothing is generated or seeded. Adapters are merged rather than ranked: the same fixture from two sources is de-duplicated on the club pair and kickoff day, the richer record wins, and gaps are filled from the other.
| Provider | Env var | Coverage | Free tier |
|---|---|---|---|
| football-data.org | FOOTBALL_DATA_API_KEY | Top European competitions, untruncated result sets. Recommended. | 10 req/min |
| API-Football | API_FOOTBALL_KEY | Widest coverage — the only one carrying NPFL and CAF properly | 100 req/day |
| TheSportsDB | THESPORTSDB_API_KEY | Used automatically with the public key when nothing else is set | Public key caps list endpoints at a few rows |
Copy .env.example to .env.local and fill in whichever you have. With none set,
the app runs on the shared public key and says so in the interface — live scores
stay complete, but fixture lists are capped upstream.
An optional ANTHROPIC_API_KEY upgrades the written match analysis from the
deterministic generator to Claude. Claude is given the computed numbers and asked
to explain them; it is never asked to predict anything, and the deterministic
version is used whenever the call fails.
For a fixture between home side i and away side j:
λ = exp(intercept + attack_i − defence_j + homeAdvantage) home goals
μ = exp(intercept + attack_j − defence_i) away goals
Ratings are fitted by weighted maximum likelihood using a diagonal Newton step. The log-likelihood of a Poisson model with a log link is concave, and the L2 penalty makes it strictly concave, so the optimum is unique.
2026-2027 and 2026).A prediction is only published as a pick when the history behind it supports one. Below 15 completed matches in the competition, or fewer than 3 appearances for either club, the model output is still shown — with an explicit warning — and no selection is offered. Fixtures in that state are listed separately on the predictions page rather than quietly mixed in.
The model knows results. It does not know about suspensions, injuries, midweek fixture congestion or a waterlogged pitch. And a probability is not a forecast: a 65% home win will be wrong about one time in three, which is the model working correctly rather than failing.
src/
app/
(app)/ live, fixtures, predictions, match/[id], trends, slip, content pages
api/ live, fixtures, match/[id], trends, health
components/
landing/ hero, marquee, feature and pricing sections
match/ cards, market panels, value calculator, slip
ui/ design-system primitives
lib/
providers/ three adapters, resolver, TTL cache with request coalescing
model/ the prediction engine — fitting, inference, pricing
ai/ analyst with deterministic fallback
service.ts the seam the pages and API routes share
Provider responses are cached in-process with TTLs tuned to each feed's rate limit, and concurrent requests for the same key are coalesced so a cold cache under load produces one upstream call, not many.
npm test
Covers the scoreline distribution and its normalisation, the Dixon-Coles correction, market coherence (1X2 partitions the sample space; over and under are complementary at every line), recovery of known team strengths from simulated seasons, the score equations at convergence, margin removal, Kelly capping and accumulator maths.
Sports betting in Nigeria is regulated and restricted to adults 18 and over. This project is an analytics tool: it does not take bets or hold funds. Predictions are statistical estimates, not certainties.
Provided as-is. Match data belongs to the respective providers and is subject to their terms.