Touchline
Match preparation for grassroots football captains.
Pick the squad, draw the shape, plan Saturday, and send every player a briefing that tells them their job.
Try it in two minutes: open the live demo, click Try the demo, no sign-up, and you're in a private sandbox with a ready-made 7-a-side team. It deletes itself after 24 hours.
In one minute
| |
|---|
| The problem | A Sunday-league plan lives in a WhatsApp thread, a whiteboard photo and the captain's head. By kickoff, half the team has a different version, and last month's good idea is gone. |
| The bet | The gap isn't drawing tactics (that's well served). It's continuity: squad → lineup → shape → one briefing players actually open, reused every week. |
| What I built | A live product, now on its third release: tactics editor, lineup on a pitch with Football Manager-style roles, set pieces, a fair-minutes sub plan, and a frozen briefing where each player taps Find me to see their own job. |
| How I worked | PM and owner, with an AI coding agent as the engineer. I wrote the specs first, shipped in evidence-gated phases, and made every product call myself. |
| What's unproven | The problem itself. No interviews or pilot yet, and the docs say so plainly. The discovery plan, with kill criteria, is the next step. |
For hiring managers: where to look
All docs: docs/README.md
The product
| |
|---|
| Team home. The next match, where its plan stands, and a six-step path to your first briefing. | Squad on the pitch. Players land in the slot that suits them, with a fit badge, an FM-style role, a duty and a one-line instruction. |
| |
| Paste a squad. The whole list from a group chat or spreadsheet, in any order, previewed before saving. | Find me. A player picks their name and sees only their part: position, role, set pieces, sub times, minutes. |
| |
| Publish and share. Preview every slide, then send one link to the team chat. You can revoke it any time. | One briefing, every screen. The presenter, the phone view and the PDF all render the same frozen snapshot. |
| |
Three releases, three questions
| Release | Question | Triggered by | Shipped |
|---|
| 1.0 · 20 Oct 2026 | Can the whole loop work without other software? | The spec pack | Squad, tactics editor, fixtures, lineup, plan with private notes, frozen briefing, presenter, PDF, demo sandboxes |
| 1.1 · 20 Oct 2026 | Does every player know their job? | Using it myself, as captain and as player | Pitch builder with fit, roles and duties, set pieces, fair-minutes sub plan, Find me |
| 1.2 · 27 Oct 2026 | Can a new captain reach a first briefing fast? | A UX audit of 38 screens | Team home and setup checklist, paste a squad, one plan status, sticky publish, team-chat sharing, Find your job |
Full notes: release notes.
Product decisions I'd talk through
- Publishing freezes a snapshot. A Wednesday tweak never quietly changes what players read on Monday. The cost is a bit of "you have unpublished changes" friction.
- Private notes sit next to public ones, and the publisher works from an allowlist that can't include them. Coach-only context stays with the plan and can't leak by accident.
- Nothing new blocks publishing. Out-of-position players, a broken sub or uneven minutes are warnings. A captain in a hurry still gets a briefing out.
- Fair minutes is a nudge, not a rule. Some teams play to win, some so everyone gets a game. That's the captain's call.
- No "Send on WhatsApp" button. It's the obvious growth move, but a deep link would put the secret briefing link in a third-party URL and its logs. The phone's share sheet does the job without that.
- Find me tracks nothing. The player page has no login, so measuring who looked themselves up would be tracking players. I'll learn its value by asking instead.
Every decision, with its reasoning: decision register (the top ten are at the start).
How it was built
I worked as the product owner and an AI coding agent (Claude Code) did the engineering, working from a spec pack and a build brief. Each phase ended with written evidence (the tests actually run, the bugs found, screenshots) before the next one began. The agent proposed options with trade-offs; I made the calls: hosting, email confirmation, how public links are rate-limited, the PDF engine, how the demo works, and what went into 1.1 and 1.2.
Stack: Next.js 16 (App Router) · React 19 · TypeScript · Tailwind + shadcn/ui · React Konva (editor) · Supabase (Postgres, Auth, row-level security) · Zod · react-pdf. Hosted on Vercel and Supabase. Architecture with diagrams →
Quality: 124 unit tests, 133 database assertions and 54 end-to-end browser tests, run against a production build, plus automated WCAG 2.2 AA checks on 19 screens. Every requirement maps to its tests in the traceability matrix. What isn't covered yet →
Privacy: every table is locked to its owner inside the database, and that's tested ("can user B see user A's data?") on every table. Share links are 256-bit secrets stored only as one-way hashes; they travel in the URL fragment so they never reach server logs, and they can be revoked in one click.
Node 22 and Docker. See docs/DEVELOPMENT.md; deployment is in docs/DEPLOY.md.
npm install
npx supabase start
cp .env.example .env.local # values from `npx supabase status`
npm run dev
Honest status
Live as a portfolio product on Vercel and Supabase free tiers. Not yet tested with real captains, players or physical phones, and no independent security review. The release assessment holds the product to its own launch gate, and it doesn't pass yet. That's what the pilot is for.
Built by Aditya Hasija, product manager · Live demo · Docs