The problem
Football fans want a game they can play with friends all season long. It should not be betting, and it should not be a spreadsheet passed around by email. I first built TotoCampionato for the 2006/2007 Serie A season in classic ASP, and later made a version that ran inside Facebook. In 2026 I rebuilt it from scratch so that one platform can run club competitions for a whole season, not just a single tournament.
What I built
A Node.js prediction game where players fill in a slip for every match and compete in leagues they create themselves.
- 9 coupons per match: final result, half-time result, goal/no goal, under/over 2.5, total penalties, half-time/full-time, odd/even, exact score and total goals. Points follow the odds, so a brave correct call is worth more than an obvious one.
- Leagues on any competition: 8 competitions are ready out of the box, from Serie A and the Premier League to the Champions League and the 2026 World Cup. League admins manage members, prizes, a banner, a news ticker and a chat.
- Fantasy layer: fantasy teams built from real players and coaches, with scoring rules and match events managed from the admin panel. Players appear as collectible-style cards.
- Sponsor tasks: a league sponsor can set tasks, members upload a screenshot as proof, and the league admin reviews it. This gives small leagues a way to find prizes.
- Automatic match flow: every minute the app locks matches that have started; every 30 seconds it pulls live data from API-Football; points are calculated without anyone typing results.
- Five languages: Italian, English, French, German and Spanish.
- Admin panel: users, leagues, odds, results, bulk email templates, a mail inbox and scheduled backups of the database and the app.
Built with
Node.js 20, Express 4, EJS templates, MySQL, Passport with Google login, bcrypt, Nodemailer and ImapFlow for mail, Multer for uploads. It runs on Phusion Passenger on shared cPanel hosting, with match data from API-Football.
Why it was done this way
I did not write a new app. I forked TotoMondiale, my World Cup game, because its scoring engine, league system and admin panel already ran a full tournament. That let me spend the time on what a season needs: several competitions at once, a fantasy game and sponsor tools.


