Calci8
The app for organising five-a-side football with friends: attendance, balanced teams, lineups, results, rankings, chat and party games, on www.calci8.it and the Play Store.

- Role
- Concept, design and development
- Year
- 2025
- Stack
- Android
- Better Auth
- Claude Code
- Docker
- Fastify
- Node.js
- ONNX Runtime
- Oxlint
- Playwright
- PostgreSQL
- Prisma
- PWA
- Sass
- SolidJS
- Three.js
- TypeScript
- Vite
- WebRTC
- Zod
The idea
Organising the Thursday match among friends means chasing who is in, making fair teams, deciding who brings the ball and remembering who scored. Calci8 puts everything in one phone-first app: each group has its own matches, squad, chat and ranking, and everyone always knows what they have to do. It is live on www.calci8.it and on the Play Store.
A match in phases
Every match goes through nine phases, from sign-ups to the official result: teams, captains, lineups, recap, kick-off and ratings. A phase opens only once the previous one is complete; some are skipped according to the group’s rules, and the scheduler does the rest on its own: reminders, closing sign-ups, the captain vote, the last call for ratings. Teams are balanced by an algorithm on the players’ attributes, attendance handles the waiting list and substitutions, and a result proposed by one captain becomes official only when the other confirms it.
The social side
Group and private chats with stickers, including personal ones cut out from a photo right in the browser by a neural network. Achievements that unlock collectible rewards (animated avatar frames, FIFA-style cards also in 3D with Three.js, kits and titles), predictions, MVPs and rankings without ties, with the tiebreakers explained under each table. And party games: a live quiz, a drawing game and Mister8, a deduction game with phone-to-phone WebRTC voice chat.
Architecture
SolidJS with Vite and SCSS modules on the web; Fastify, Better Auth and Prisma on PostgreSQL on the server, all in TypeScript. The rules both sides must agree on (phases, formats, scoring, achievements) live in a shared module. Updates arrive in real time over Server-Sent Events, so open apps reload only what changed, and attendance changes are serialised per match to avoid double promotions from the waiting list.
Native on the phone
An installable PWA that opens offline thanks to its service worker, with push notifications and an Android app published on the Play Store as a Trusted Web Activity. One design with native details per platform: page transitions, the edge swipe back on iPhone, ripples on Android, haptics, light and dark themes, and every 3D effect with a flat fallback for reduced motion.
Security and privacy
Sign-in with passkeys, Google or an email code, two-factor verification and per-group permissions with different roles. Platform admins cannot see chats, stats or ratings. There is a record of processing with a data breach procedure, and accounts unused for two years are warned and then deleted. Admins can also work through an AI assistant, with an MCP server protected by OAuth 2.1.
Quality and delivery
Oxlint with warnings as errors, a check that allows only theme tokens in the styles, hundreds of domain and API tests run against a database schema created from scratch, and Playwright end-to-end tests on a phone viewport, including several players at once. Every release has its changelog section, read by players in the app; CI also checks the production Docker image and deployment is automatic. Development is done with Claude Code, with project hooks and skills for releases and new achievements.