Multi Mate is a football matchup analytics app built with React, Vite, Express, and TypeScript. It combines league standings, fixture analysis, and confidence scoring across several European leagues in a single full-stack app.
The current runtime uses the in-memory MemStorage implementation in server/storage.ts, so you can run the app locally without provisioning a database. Drizzle and PostgreSQL config are included in the repo for future persistence work, but they are not the active runtime path today.
- React 18 + Vite frontend
- Express + TypeScript backend
- TanStack Query for client-side data fetching
- Tailwind CSS + Radix UI components
- Optional API-Football integration for live refreshes
npm run devstarts the app in development modenpm run checkruns TypeScript checksnpm run buildcreates the production build indist/npm startruns the production server fromdist/index.jsnpm run db:pushpushes the Drizzle schema if you later wire up Postgres
- Node.js 20+ recommended
- npm 10+ recommended
Copy .env.example to a local .env file if needed.
PORT: optional, defaults to5000FOOTBALL_API_KEY: optional for basic local startup, required for live API-Football standings and fixture updatesTHE_ODDS_API_KEY: preferred odds provider for SportsBet AU h2h prices and combined multi oddsSPORTSGAMEODDS_API_KEY: optional fallback odds provider for Bet365 prices from SportsGameOddsENABLE_MOCK_SPORTS_DATA: optional local demo switch; set totrueonly when you explicitly want generated fallback fixturesDATABASE_URL: not required for the current in-memory runtime, only needed if you activate the Drizzle/Postgres workflow
npm install
npm run devThe app serves both the API and the frontend from the same Node process.
npm install
npm run check
npm run build
npm startAfter a successful build, the production outputs are:
dist/index.jsdist/public/
- If
FOOTBALL_API_KEYis missing, the app still starts, but live league fixtures and standings are disabled unlessENABLE_MOCK_SPORTS_DATA=true. - If
THE_ODDS_API_KEYandSPORTSGAMEODDS_API_KEYare both missing, the app still starts and matchup cards show odds as pending. - The
/api/leagues/:id/refreshroute expectsFOOTBALL_API_KEYto be configured. drizzle.config.tsrequiresDATABASE_URLonly for Drizzle commands such asnpm run db:push.
This repo is intentionally host-agnostic for the first upload. Any Node-compatible host that supports a long-running Express server can run it with:
npm installnpm run buildnpm start
This repo is now set up for Vercel with:
- a static Vite build output in
dist/public - a serverless Express API entrypoint at
api/[...route].ts - SPA rewrites in
vercel.json
To connect it in Vercel:
- Import the GitHub repo in Vercel.
- Keep the detected build settings from
vercel.json. - Add
FOOTBALL_API_KEYonly if you want live API-backed football data. - Add
THE_ODDS_API_KEYif you want SportsBet odds in matchup and multi views. - Optionally add
SPORTSGAMEODDS_API_KEYas the older Bet365 fallback. - Deploy.
For local Vercel CLI linking later, run vercel link and vercel env add as needed, but no committed .vercel/ directory is required.
The repo includes a sample screenshot at all-bets-this-week.png.
- Audit and update vulnerable dependencies
- Decide whether to keep the in-memory runtime or complete the Postgres integration
- Add hosting-specific config for your chosen platform when you are ready to deploy