TogethrTeam
A social and team management app for youth and amateur sports teams
React · Vite · TypeScript · Framer Motion · PWA
What it is
A mobile-first social and team management app for youth and amateur sports teams, built for a client. The pilots run with 13-to-17-year-old squads. The core loop is positive peer recognition: teammates award each other Swag Coins for character and contribution, which build a public player identity: an avatar, earned gear, a playable player card. Coaches and parents get role-shaped versions of the app, and neither can send or receive peer recognition. There is no negative option anywhere in the product; that is a construction decision, not a setting.
What it does
Five tabs whose contents change by role: players get chat, the team, the locker room, video and a penalty-shootout game; coaches trade the game for weekly drills and an anonymous team-pulse view; parents get logistics and their child's page.
The running of the team is the half that has to work before any of the rest earns its place. Schedule and roster are shared, but each role is handed the slice it actually needs: a coach's home is the administrative view — what is next, who has not RSVP'd yet, the shape of the season — while a parent's is logistics only, meaning the next event, whether their child is down as going, what they owe, and everyone's number. The schedule leads with the league table and sits beside the squad list; contact details render through a single gate, so who may see whose phone number is one function rather than a rule re-implemented on five screens. Coaches set weekly drills from a seeded library of skills and fitness work or write their own, assign them to the whole squad or to named players, and can see who has proven the work with a clip. The manager takes fees and the game-day rota.
Money is deliberately the one thing the app will not do. Fees are read-only and there is no payment rail anywhere in it, on the reasoning that a "Paid" button that lies is worse than a report that tells you the truth. Scheduling is kept small for the same reason: no calendar sync, no recurring events, no reminders, no attendance history, no venue maps. Each of those is a promise that breaks quietly, and a team app that is wrong about kick-off is worse than one that never claimed to know.
The coin economy is built to resist gaming: peer picks cap at eight per trait, anything self-reported pays only with a photo or clip attached, and signed shoutouts between players are worth zero, because reciprocal rewards are the farming loop to keep out. Safeguarding lives in the reducer, not the interface: chat rooms derive from role, and the one room the app refuses to create is a parent alone with someone else's child. There are no rankings of kids, no GPS, and video pixels never leave the phone.
There is a second surface for the adults running the club. /manage is a
laptop-first console sharing the same store as the phone app: the roster, the
fixture list and league table, outstanding invoices, and the invites that get
families onto the team. It exists because the desk work of running a squad —
chasing unpaid subs, filling a game-day job, finding out who still hasn't
replied about Thursday — is miserable on a phone,
and it is a different job from the recognition loop the players use.
How it's built
React, TypeScript and Vite as an installable PWA. It is demo-grade and honest about it: no backend, no accounts, all state on-device with fictional seed data, and one load/save boundary in the store that is the single swap point when a real backend lands. Every write goes through one reducer, and the scoring and rating engines are pure modules with no randomness in them.
Working with Claude
This one is demo-grade on purpose: no backend, no accounts, everything held on the device, so a client could put a working product in front of people before anyone committed to infrastructure. That constraint did most of the design work. It is roughly 23,700 lines across about 85 files, and the hard part was never any single screen — it was keeping the role rules identical everywhere they apply, so that what a coach can see and what a parent cannot are the same answer on every surface of the app.