Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
123 changes: 123 additions & 0 deletions Sports/FootballVMProphet/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
# Football VM Prophet

Free local web dashboard for FIFA World Cup 2026 men.

VM Prophet is a local command center for fixtures, live-status health, upcoming/past match filtering, and manual odds tracking. It is built for **free data first**: no paid API key is required and stale/broken data is shown loudly.

## What it does

- Lists FIFA World Cup 2026 matches from a local fixture JSON file.
- Filters by today, live, upcoming, past, due soon, stage, team, venue, and data status.
- Shows detailed upcoming cards with countdown, venue, source freshness, and watchlist flags.
- Supports manual odds CSV import for 1X2 / over-under / BTTS tracking.
- Calculates implied probability and movement from imported odds snapshots.
- Shows data-health status: fixture file, live source, odds file, cache age, stale/broken warnings.
- Runs entirely locally with Node.js and browser HTML/JS.

## What it does not do

- It does not place bets.
- It does not guarantee predictions.
- It does not hide stale data behind a "live" label.
- It does not require paid APIs.
- It does not include official final World Cup 2026 fixture data before the draw/schedule is complete. The included fixture file is a starter/seed structure that you must update when official matches are available.

## Run locally

```powershell
cd Sports\FootballVMProphet
npm install
npm start
```

Open:

```text
http://localhost:8787
```

No dependencies are required beyond Node.js 18+. `npm install` is effectively a metadata check because the app uses only built-in Node modules.

## Free data model

VM Prophet uses three source layers:

1. `data/fixtures.worldcup2026.json` - local source of truth for fixtures.
2. Optional free live endpoint - configured with environment variable `FREE_LIVE_ENDPOINT` if you later find a free source.
3. `data/odds.manual.csv` - manual odds snapshots that you control.

If the live endpoint is not configured or fails, the dashboard stays usable and marks live data as disabled/broken/stale.

## Manual odds CSV

Copy the sample file:

```powershell
Copy-Item .\data\odds.manual.example.csv .\data\odds.manual.csv
```

Format:

```csv
matchId,snapshotTime,bookmaker,market,selection,odds
wc2026-g01-m01,2026-06-11T10:00:00+02:00,Manual,1X2,Home,1.95
wc2026-g01-m01,2026-06-11T10:00:00+02:00,Manual,1X2,Draw,3.40
wc2026-g01-m01,2026-06-11T10:00:00+02:00,Manual,1X2,Away,4.20
```

The app computes implied probability as `1 / decimal odds` and highlights movement between snapshots.

## Optional environment variables

```powershell
$env:VM_PROPHET_PORT = "8787"
$env:VM_PROPHET_TIMEZONE = "Europe/Oslo"
$env:FREE_LIVE_ENDPOINT = "https://example.invalid/free-live-football.json"
```

`FREE_LIVE_ENDPOINT` must return JSON shaped like:

```json
{
"matches": [
{
"matchId": "wc2026-g01-m01",
"status": "LIVE",
"homeScore": 1,
"awayScore": 0,
"minute": 62,
"updatedAt": "2026-06-11T19:22:00Z"
}
]
}
```

## File layout

```text
Sports/FootballVMProphet/
├── package.json
├── README.md
├── data/
│ ├── fixtures.worldcup2026.json
│ ├── odds.manual.example.csv
│ └── watchlist.json
├── server/
│ ├── server.js
│ ├── cache/
│ └── sources/
│ ├── free-live-source.js
│ ├── local-fixtures.js
│ └── manual-odds.js
├── web/
│ ├── index.html
│ ├── app.js
│ └── styles.css
└── docs/
├── Data-Model.md
└── Free-Source-Notes.md
```

## Betting warning

Use this as an evidence dashboard, not a prediction machine. Free sources may be delayed or wrong. The dashboard labels freshness so you can decide whether a signal is usable.
75 changes: 75 additions & 0 deletions Sports/FootballVMProphet/data/fixtures.worldcup2026.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
{
"dataQuality": "seed",
"tournament": {
"name": "FIFA World Cup 2026 Men",
"timezone": "Europe/Oslo",
"note": "Seed schedule structure only. Replace TBD fixtures after the official draw and match schedule are confirmed."
},
"matches": [
{
"matchId": "wc2026-g01-m01",
"stage": "Group Stage",
"group": "Group A",
"homeTeam": "TBD A1",
"awayTeam": "TBD A2",
"kickoffUtc": "2026-06-11T19:00:00Z",
"venue": "Estadio Azteca",
"city": "Mexico City",
"status": "scheduled",
"homeScore": null,
"awayScore": null
},
{
"matchId": "wc2026-g01-m02",
"stage": "Group Stage",
"group": "Group B",
"homeTeam": "TBD B1",
"awayTeam": "TBD B2",
"kickoffUtc": "2026-06-12T19:00:00Z",
"venue": "BMO Field",
"city": "Toronto",
"status": "scheduled",
"homeScore": null,
"awayScore": null
},
{
"matchId": "wc2026-g01-m03",
"stage": "Group Stage",
"group": "Group C",
"homeTeam": "TBD C1",
"awayTeam": "TBD C2",
"kickoffUtc": "2026-06-12T22:00:00Z",
"venue": "SoFi Stadium",
"city": "Los Angeles",
"status": "scheduled",
"homeScore": null,
"awayScore": null
},
{
"matchId": "wc2026-r16-m01",
"stage": "Round of 32",
"group": "Knockout",
"homeTeam": "TBD R32-1",
"awayTeam": "TBD R32-2",
"kickoffUtc": "2026-06-28T19:00:00Z",
"venue": "TBD",
"city": "TBD",
"status": "scheduled",
"homeScore": null,
"awayScore": null
},
{
"matchId": "wc2026-final",
"stage": "Final",
"group": "Knockout",
"homeTeam": "TBD Finalist 1",
"awayTeam": "TBD Finalist 2",
"kickoffUtc": "2026-07-19T19:00:00Z",
"venue": "MetLife Stadium",
"city": "New York/New Jersey",
"status": "scheduled",
"homeScore": null,
"awayScore": null
}
]
}
7 changes: 7 additions & 0 deletions Sports/FootballVMProphet/data/odds.manual.example.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
matchId,snapshotTime,bookmaker,market,selection,odds
wc2026-g01-m01,2026-06-11T10:00:00+02:00,Manual,1X2,Home,1.95
wc2026-g01-m01,2026-06-11T10:00:00+02:00,Manual,1X2,Draw,3.40
wc2026-g01-m01,2026-06-11T10:00:00+02:00,Manual,1X2,Away,4.20
wc2026-g01-m01,2026-06-11T13:00:00+02:00,Manual,1X2,Home,1.82
wc2026-g01-m01,2026-06-11T13:00:00+02:00,Manual,1X2,Draw,3.55
wc2026-g01-m01,2026-06-11T13:00:00+02:00,Manual,1X2,Away,4.60
6 changes: 6 additions & 0 deletions Sports/FootballVMProphet/data/watchlist.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"teams": [],
"markets": ["1X2", "OverUnder", "BTTS"],
"alertHoursBeforeKickoff": 6,
"notes": "Add teams after the official draw, for example: Norway, Brazil, England."
}
42 changes: 42 additions & 0 deletions Sports/FootballVMProphet/docs/Data-Model.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# VM Prophet data model

## Fixture fields

- `matchId` - stable local ID used to join fixtures, live scores, and odds.
- `stage` - Group Stage, Round of 32, Round of 16, Quarter-final, Semi-final, Final.
- `group` - group name or Knockout.
- `homeTeam` / `awayTeam` - team labels. Use TBD until official schedule is known.
- `kickoffUtc` - ISO timestamp in UTC.
- `venue` / `city` - stadium and city.
- `status` - scheduled, live, final, postponed, cancelled.
- `homeScore` / `awayScore` - null until known.

## Live endpoint shape

Optional `FREE_LIVE_ENDPOINT` should return:

```json
{
"matches": [
{
"matchId": "wc2026-g01-m01",
"status": "LIVE",
"homeScore": 1,
"awayScore": 0,
"minute": 62,
"updatedAt": "2026-06-11T19:22:00Z"
}
]
}
```

## Manual odds CSV

- `matchId`
- `snapshotTime`
- `bookmaker`
- `market`
- `selection`
- `odds`

Decimal odds only in v1.
20 changes: 20 additions & 0 deletions Sports/FootballVMProphet/docs/Free-Source-Notes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Free source notes

VM Prophet is intentionally free-first. That means:

- The local fixture file is the source of truth.
- Live scores are optional and best-effort.
- Paid API keys are not required.
- Betting odds are manual CSV/import based in v1.
- Stale/broken data is shown in the dashboard instead of hidden.

## Why not scrape betting sites?

Scraping bookmakers is brittle and can violate terms of service. It is also dangerous for betting decisions because the site layout or anti-bot response may silently break the data. VM Prophet avoids that in v1.

## Recommended workflow

1. Keep fixtures updated manually from official sources.
2. Use optional free live endpoint only as a convenience.
3. Import odds snapshots manually when you care about a market.
4. Treat stale warnings as blockers for betting decisions.
15 changes: 15 additions & 0 deletions Sports/FootballVMProphet/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"name": "football-vm-prophet",
"version": "0.1.0",
"description": "Free local FIFA World Cup 2026 dashboard with fixture, live-source health, cache, and manual odds tracking.",
"private": true,
"type": "module",
"scripts": {
"start": "node server/server.js",
"test": "node server/server.js --self-test"
},
"engines": {
"node": ">=18"
},
"license": "MIT"
}
Loading