Build a Youth Soccer Team Management App
Create a working app for a club soccer team that manages players, guardians, attendance, matches, availability, messaging, and roster operations with real data flows and admin workflows.
Add this plan to a project to track work and checks.Open workspace
The route
11 steps to Done
- 01
Create the soccer domain schema for teams, players, guardians, events, RSVP, attendance, and lineup assignments
The app will fail if the data model does not reflect actual youth soccer operations and enforce the right relationships and uniqueness rules.
Preview prompt + verify gate ▾Hide ▴
Create the full database schema for a single-team youth soccer management app. Requirements: Team table; Season linked to Team; Player linked to Team with fields fullName, jerseyNumber, birthYear, primaryPosition, secondaryPositions, medicalNotes, activeStatus; Guardian with name, phone, email, preferredContactMethod, relationship; PlayerGuardianLink join table so one player can have multiple guardians; Event linked to Team/Season with eventType enum (practice, game, tournament), startAt, endAt, location, fieldName, opponent, notes, status; AvailabilityResponse linked to player and event with one unique row per player-event pair and status enum (available, unavailable, late, no_response); AttendanceRecord linked to player and event with one unique row per player-event pair and status enum (present, absent, late, excused) plus notes; Announcement linked to team with title, body, audienceScope, publishedAt, optional eventId; PositionAssignment linked to game event and player with position, startStatus, notes. Add foreign keys, indexes for event date and player name, and seed one sample team with players, guardians, events, announcements, RSVP rows, and attendance rows.
- ✓There is a distinct PlayerGuardianLink or equivalent relation rather than a single guardian text field
- ✓AvailabilityResponse has a unique constraint for playerId + eventId
- ✓AttendanceRecord has a unique constraint for playerId + eventId
- ✓Event supports practice, game, and tournament plus opponent and field/location fields
- ✓Seed data exists for at least one team, multiple players, guardians, events, and announcements
- 02
Set up coach authentication and protected management routes for roster, schedule, attendance, and announcements
A team management app needs real access control so only authorized coaches can edit team operations.
Preview prompt + verify gate ▾Hide ▴
Implement authentication and authorization for the soccer team app. Requirements: support sign-in for at least coach/admin users; add a role field such as coach or participant; protect roster management, event creation/editing, attendance entry, lineup assignments, and announcements so only coach/admin can mutate them; enforce protection in server actions, API routes, or backend handlers, not only the UI; redirect unauthorized users away from management pages; show the current signed-in user role in the app shell.
- ✓Unauthenticated users are redirected away from management pages
- ✓Coach/admin users can access protected CRUD screens
- ✓Participant users cannot create or edit roster, events, attendance, or announcements
- ✓Server-side or backend write handlers reject unauthorized mutations
- 03
Build the roster directory with player profiles, jersey numbers, positions, and guardian links
The roster is the core artifact of the app and must support real player records with guardian relationships.
Preview prompt + verify gate ▾Hide ▴
Implement roster management for the soccer team app. Requirements: roster list page with search by player name and filters for active/inactive status; columns or cards showing full name, jersey number, birth year, and primary position; player detail page showing all player info plus linked guardians; add/edit player form with fullName, jerseyNumber, birthYear, primaryPosition, secondaryPositions, medicalNotes, activeStatus; guardian create/edit form with name, phone, email, preferredContactMethod, relationship; linking UI to attach multiple guardians to one player; persist all changes in the database and reload fresh data after save.
- ✓A new player can be created and appears in the roster after refresh
- ✓A guardian can be created independently and linked to a player
- ✓One player can display multiple linked guardians
- ✓Search and active/inactive filtering work on roster data from the database
- ✓Editing jersey number or position persists and reloads correctly
- 04
Implement the schedule module for practices, games, and tournaments with opponent and field details
Coaches need a reliable schedule with soccer-specific event fields, not a generic calendar placeholder.
Preview prompt + verify gate ▾Hide ▴
Implement the schedule module. Requirements: event list sorted by startAt ascending for upcoming and separate past events if useful; create/edit forms for Event with eventType, title or label, startAt, endAt, location, fieldName, opponent, notes, and status; show opponent only when relevant to game events but still persist nullable support in schema; event detail page with full metadata; filter by event type; support linking each event to the active season; all event data must be database-backed and editable by coaches only.
- ✓A coach can create a practice with date, time, location, and field name
- ✓A coach can create a game with opponent information
- ✓Event type filtering shows the correct subset of events
- ✓Editing event details persists and reloads correctly
- ✓Schedule views are populated from database records, not hardcoded items
- 05
Add player availability RSVP per event with unique player-event responses
Availability is a separate planning workflow from attendance and must be tracked before the event happens.
Preview prompt + verify gate ▾Hide ▴
Implement per-event availability tracking. Requirements: on each event detail page, display the full roster with current RSVP status for that event; support statuses available, unavailable, late, and no_response; persist one AvailabilityResponse row per player-event pair using the unique constraint; allow coaches to set or update responses; show summary counts per event such as available/unavailable/no response; preload existing responses when reopening the event page; do not reuse the attendance table for RSVP.
- ✓Each player has at most one availability record per event
- ✓Changing a player from available to unavailable updates the existing row rather than creating a duplicate
- ✓Event detail displays roster-wide RSVP statuses from the database
- ✓Summary counts match the underlying response rows
- ✓No attendance table is used for pre-event availability
- 06
Implement event attendance check-in with present, absent, late, and excused statuses
Attendance reflects what actually happened at the event and should be captured independently from RSVP.
Preview prompt + verify gate ▾Hide ▴
Implement attendance entry for events. Requirements: attendance UI on an event detail or dedicated attendance page showing all active players; statuses present, absent, late, excused, plus optional note per player; persist one AttendanceRecord per player-event pair using the unique constraint; allow reopening and editing attendance after initial save; show attendance summary counts on the event page; keep attendance data separate from availability/RSVP data.
- ✓A coach can mark multiple players present, absent, late, or excused for an event
- ✓Attendance edits persist after refresh
- ✓There is at most one attendance row per player-event pair
- ✓Attendance and RSVP are visible as separate data concepts
- ✓Summary counts reflect the saved attendance records
- 07
Build the game lineup and position assignment editor for match events
Soccer-specific value comes from being able to assign positions and starters for games, not just list events.
Preview prompt + verify gate ▾Hide ▴
Implement lineup management for game events. Requirements: on game event detail page, show a position assignment section; allow selecting player and assigning position plus starter/substitute or similar startStatus; store notes per assignment; persist assignments in the PositionAssignment table linked to the event and player; prevent lineup editing on non-game events; reload saved assignments when reopening the game event; allow updates to positions without duplicate junk rows where appropriate.
- ✓Lineup editor appears for game events and not for practices
- ✓A coach can assign a player to a position and save it
- ✓Starter or substitute status persists correctly
- ✓Saved position assignments reload from the database after refresh
- 08
Create the team dashboard with upcoming events, missing RSVPs, attendance counts, and recent announcements
The dashboard should summarize real operational data so the coach can act quickly each day.
Preview prompt + verify gate ▾Hide ▴
Implement a team dashboard. Requirements: upcoming events section using Event records sorted by nearest startAt; recent announcements sorted by publishedAt descending; a missing RSVP summary that counts players with no AvailabilityResponse or explicit no_response for each upcoming event; attendance summary cards or rows based on AttendanceRecord counts for recent events; quick links to roster, schedule, attendance, and announcements; all dashboard metrics must be computed from database queries and update when underlying records change.
- ✓Upcoming events are ordered by actual event date/time
- ✓Recent announcements are sorted newest first by publishedAt
- ✓Missing RSVP counts change when responses are added or edited
- ✓Attendance summary values come from AttendanceRecord data
- ✓No dashboard stat remains hardcoded after seed data is replaced
- 09
Implement the announcement composer and published team feed
Announcements are the simplest first-release communication channel and need a real publish workflow.
Preview prompt + verify gate ▾Hide ▴
Implement announcement management. Requirements: coach-only create/edit form with title, body, audienceScope, publishedAt, and optional linked event; save announcements to the database; display the published feed in descending publishedAt order; support editing an existing announcement; show linked event context when present; participant users can view the feed but cannot create or edit announcements.
- ✓Coach users can create announcements that persist after refresh
- ✓Participant users can view but not edit announcements
- ✓Announcements are ordered by publishedAt descending
- ✓Linked event metadata appears when an announcement references an event
- 10
Add validation rules and integrity guards for jersey numbers, player-event uniqueness, and required event fields
Without validation and constraints, team data becomes unreliable and duplicate records appear quickly.
Preview prompt + verify gate ▾Hide ▴
Implement validation across the app. Requirements: require player fullName and activeStatus; validate jerseyNumber as numeric or consistent app-specific format; require eventType, startAt, location or field metadata as appropriate; require opponent for game events if your UX expects it; prevent duplicate AvailabilityResponse and AttendanceRecord rows for the same player-event pair through upsert logic and DB constraints; validate guardian email/phone formats if collected; surface friendly error messages in forms; reject invalid backend writes even if the UI is bypassed.
- ✓Submitting a player without a name fails with a visible error
- ✓Submitting an invalid event missing required fields is blocked
- ✓Trying to create a duplicate RSVP for the same player-event pair updates or fails predictably
- ✓Trying to create a duplicate attendance record for the same player-event pair updates or fails predictably
- ✓Validation exists in backend write paths, not only in the browser
- 11
Run seeded end-to-end soccer workflows and fix broken persistence, permissions, and aggregate counts
The final test must prove the app actually works across the main coach workflows, not just isolated screens.
Preview prompt + verify gate ▾Hide ▴
Run a full end-to-end QA pass on the soccer team management app. Requirements: sign in as coach; create a new player and guardian and link them; create a new practice and a new game; record RSVP responses for multiple players on one event; mark attendance for one event; create lineup assignments for the game; publish at least one new announcement; refresh and verify all data persists; test unauthorized access as a non-coach or logged-out user; verify dashboard counts and lists update from the saved data; fix any issues you find and summarize the exact bugs resolved.
- ✓New roster records, guardians, and links remain after refresh
- ✓New practice and game events remain after refresh and display correct metadata
- ✓RSVP, attendance, and lineup data all reload correctly from the database
- ✓Announcements publish and appear in the correct dashboard/feed order
- ✓Unauthorized users cannot mutate protected resources
- ✓Dashboard counts reflect the latest saved records rather than stale seed values