← Selected work

FULL STACK / STARTED 2025

BettingAIPro

A football prediction system that keeps the statistical baseline visible alongside AI adjustments. The interesting part is tracing how a prediction changes, and knowing what that trace cannot tell you.

Current BettingAIPro sample verdict for Manchester United versus Liverpool: Home Win, with a 58 percent model probability and 7 out of 10 confidence.
The portfolio preview, captured 12 October 2026. Fixed sample data, not a live prediction or an accuracy result.Full capture ↗

One prediction, several layers.

The backend starts with a Poisson score model and a Dixon–Coles correction for low scores. AI analysis adds contextual adjustments. Keeping those stages separate makes it possible to compare the baseline with the final output.

  1. 01 / BASELINE

    Football data → probabilities

    API-Football inputs feed the Poisson engine. A Dixon–Coles correction adjusts the low-score cells before outcomes are aggregated.

  2. 02 / CONTEXT

    AI analysis and review

    Groq and Gemini integrations add contextual analysis. Model selection is configuration-dependent; the statistical baseline remains a separate input.

  3. 03 / RECORD

    Prediction ledger

    PostgreSQL stores predictions and supports baseline probabilities, adjustment fields, and variance reasons for later inspection.

This maps the prediction pipeline. Some audit fields are nullable: the schema supports comparison, but does not guarantee a complete trace for every saved prediction.

The decisions behind the interface.

Keep the math inspectable.

Normalization scales all three outcome probabilities by 100 divided by their total, then corrects a floating-point remainder on the largest value. The response rounds each value to one decimal place, so displayed totals can differ slightly from 100. This is separate from the Dixon–Coles low-score correction.

Separate work from waiting.

The start endpoint returns a job ID and the client polls for a result. FastAPI background tasks and a process-local dictionary implement this. Entries expire after an hour during status checks. This is not a durable queue: restarts lose jobs, and multiple workers need shared storage and coordination.

Enforce access on the server.

The analysis start and job-status routes use the require_admin dependency. A hidden button is not access control. New privileged routes still need an explicit guard and coverage; a shared dependency cannot prevent every future omission.

Let visitors inspect a safe sample.

The portfolio preview uses shared sample data and makes no live analysis or betting requests. The full demo persists its mode in local storage and provides a fallback when storage is blocked. The unfinished live application is a separate operational concern.

What the demo proves.

You can follow a match into its verdict, compare baseline and final probabilities, and inspect the reasoning without signing in. In the shared example, the home probability changes from 54% to 58%. That four-point change illustrates the interface; it is not evidence that AI improves forecasting.

The 7/10 confidence score is also distinct from the 58% outcome probability. Demonstrating forecast quality would require dated, out-of-sample results, a stated baseline, sample size, and calibration measurements. Undated historical win counts do not establish that, so they are not presented here as performance evidence.

Evidence and remaining work.

This description was checked against revision 504c88e on 12 October 2026. The relevant implementation lives in poisson_engine.py, ai_analyst.py, main.py, and db_helpers.py. The repository includes probability and admin-auth tests; that is not a claim that this portfolio review reran the backend suite.

Durable job execution and a reproducible forecasting evaluation remain important next steps. AI assistance is part of the implementation and review workflow. The code, the working sample, and these explicit limits are the evidence to assess.

ESC