Futbol Friend.
Pickup players and standing teams have the same problem from opposite sides. Both need one more player. Neither wants to join a formal league.
Two ways in
The product has two paths, and it keeps them separate. You can join a single run and play that day. You can also build a standing team and fill the last few spots.
The player path
This is the most important decision in the product. Most pickup tools treat two different things as one state. The first is “I am interested in your team”. The second is “I am confirmed for this Sunday”. Futbol Friend keeps them separate. Interest in a team never adds you to the roster. A place on the roster never confirms you for a match.
The interface states this directly:
“Waiting for the team leader. If they invite you to a run, it will show up under Matches for a separate yes or no.”
The leader path
This is the other half of the same idea. Team setup asks three questions and nothing more: the name, how often you play, and which positions you need. People do not finish a longer form.
The leader’s dashboard then enforces the order. A run needs a court and a time before the leader can invite anyone. Roster membership stays separate from each RSVP.
Designing with AI
I build Futbol Friend alone. Claude Code does much of the building. The decisions are written down before any code exists.
Claude Code reads three files before it touches a screen: the product rules, the locked visual system, and the design handoff. Palette, type, shape and spacing are already fixed, so exploration happens inside them.
The two-track model was the hardest call. I worked through the options with Claude and listed the trade-offs for each one. Once I picked the separation, I wrote it into the rules file so it would not be re-decided later:
“Two-track roster. Per-match accept/decline confirmation is a separate track from standing roster membership. Never collapse them into one state.”
Output gets reviewed, not accepted. The first team-creation flow was convoluted. It used a vertical progress rail and repeated the team identity row on every step. It never made clear where team creation ended and match scheduling began. I cut it to three numbered steps on one horizontal marker.
I keep a running list of problems found in review so they do not come back. Pale borderless controls that do not look interactive. A filter label reading “Lights” when it means “Lit after dark”.
The exploration folder shows the shape of the work. Six directions, then thirty refined variants before one was chosen. Every one was coded and responsive, because the handoff does not accept image mockups. That is what changed: not the decisions, but how many I can test before committing to one.
Where it stands
The app is in active development. I build it alone. It is not shipped yet. The lists below describe the app today, not the plan.
Working today
- Home and how-it-works
- Team discovery and the interest flow
- Team creation wizard
- Team HQ dashboard for leaders
- Email OTP authentication
Next
- Player-side Matches screen: accept or decline a run invite
- Run planning: court, exact time, invitations
- Promoting an interested player onto the roster
- Notifications when a run is set
Built with Next.js 16, React 19, Supabase, and Tailwind v4. The palette is “Eclipse Field”: deep navy and pale paper. The typefaces are Bodoni Moda, Fraunces, DM Mono, and Inter.