Kids Sports Schedule Coordinator
What you'll learn
~30 min- Parse multiple activity schedules from CSV or JSON into a unified family calendar
- Detect time conflicts and overlapping events across kids
- Generate carpool coordination suggestions based on location and timing
- Export ICS calendar files and a printable weekly family view
What you’re building
Nick has two daughters. One plays U10 futsal and U10 soccer. The other plays U8 soccer and takes dance classes. That is four activities across two kids, each with its own practice schedule, game day, coach, and location. Practices land on different fields on different nights. Games stack up on Saturday mornings. Dance rehearsals show up on Fridays with two weeks’ notice. Every activity has its own team app — TeamSnap for futsal, SportsEngine for soccer, a Google Sheet from the dance studio — and none of them talk to each other.
Right now, Nick’s schedule management looks like this: check TeamSnap, check SportsEngine, check the dance Google Sheet, mentally overlay all three, figure out which kid needs to be where at what time, text the carpool group chat, and hope he did not miss a conflict. He does this every Sunday night. Sometimes he catches the overlap. Sometimes he does not, and Saturday morning turns into a scramble.
This tool ingests each kid’s schedule from a CSV or JSON file, merges everything into a unified family calendar, flags time conflicts and travel-time problems, suggests carpool groupings based on location and timing, and exports the whole thing as ICS files for phone sync and a printable weekly summary. One command, one calendar, no more mental gymnastics on Sunday night.
If you are a parent with multiple kids in multiple activities, you already know. The group texts start on Monday. “Are we still on for Thursday practice?” “Game time changed to 9 AM.” “Tournament schedule just dropped — we play at 8, 10, and 2.” You are cross-referencing three apps, a text thread, and a screenshot of a bracket someone posted to Instagram. Google Calendar entries are perpetually out of date because the schedule changed again. The system is not broken — there is no system. There is just a parent with a phone trying to keep it all straight.
Ingest events from multiple independent sources, normalize them into a common schema, detect overlapping time windows, and flag resource conflicts (in this case, the resource is a parent who cannot be in two places at once). This is the same pattern behind meeting schedulers (Calendly, Clara), resource booking systems (conference rooms, equipment), ops dashboards (shift scheduling, fleet dispatch), and project management tools (Gantt chart conflict detection). The domain changes; the algorithm does not.
🔍Youth sports logistics primer for non-parents
If you do not have kids in organized sports, here is the landscape and why scheduling gets complicated fast:
- Futsal is indoor soccer played on a smaller, hard court (basketball-court sized) with five players per side instead of eleven. The ball is smaller and heavier, which keeps it on the ground and forces faster passing. Futsal seasons typically run fall through winter when outdoor soccer is off. Practices are usually twice a week (45-60 minutes each), with games on Saturdays at indoor sports complexes.
- Youth soccer (outdoor) runs spring and fall. Practices are two to three times per week, games on Saturdays. At the U8 and U10 age levels (under 8, under 10 years old), games are short — two 20-25 minute halves — but they are scheduled back-to-back at field complexes, so your time slot might be 8 AM, 9:30 AM, or 11 AM with no choice in the matter.
- Dance classes run year-round on a fixed weekly schedule (e.g., Monday and Wednesday, 5:00-6:00 PM). Recital season adds Friday rehearsals starting about six weeks before the show. Rehearsal schedules come out late and change frequently.
- Why conflicts happen: Two kids means two times the commitments. If both have Saturday morning games at different fields at overlapping times, one parent goes to each — or one kid needs a carpool ride. If Tuesday night futsal practice (5:30-6:30 PM) overlaps with Tuesday night U8 soccer practice (4:00-5:00 PM) at a field 20 minutes away, the pickup-to-dropoff math gets tight. Add dance on top, and you are solving a constraint-satisfaction problem every week.
- Carpool culture: In youth sports, carpooling is survival. Parents coordinate rides to practices and games, especially when families have multiple kids at different locations simultaneously. The coordination happens in group texts and is ad hoc. A parent who can see which families are going to the same place at the same time can organize this much more effectively.
Who this is for
Nick as a dad, not a property manager. He played football at JMU — punter, four years — and has a kinesiology degree. He understands sport logistics at a structural level. But understanding the problem and having a tool to solve it are two different things. His two daughters are deep into youth sports, and his wife’s work schedule is just as packed as his. Nick is the family logistics coordinator by default. He does not need another app with a monthly subscription and push notifications he will ignore. He needs one tool that pulls every schedule into one place, tells him where the conflicts are, and gives him something he can print and stick on the fridge.
The showcase
The finished tool produces:
- Unified calendar view (HTML): every event for every kid on one color-coded weekly calendar. Each child gets a distinct color. Events show activity name, time, location, and type (practice, game, rehearsal, tournament).
- Conflict detection with color-coded warnings: overlapping events highlighted in red with a clear description of the conflict — which two events overlap, by how many minutes, and at which locations. Travel-time conflicts flagged when back-to-back events at different locations do not leave enough buffer for the drive.
- Carpool suggestion engine: groups families by proximity (same zip code or within 5 miles) and identifies shared rides for same-time, same-location events. Outputs a “Carpool Opportunities” list with event, families, and suggested driver rotation.
- ICS export: generates
.icscalendar files (one per child, plus a combined family file) for import into Apple Calendar, Google Calendar, Outlook, or any calendar app. Conflict events are tagged with “[CONFLICT]” in the title. - Printable “This Week” family summary: a clean, single-page day-by-day breakdown showing every event, conflict alerts, carpool notes, and a packing checklist (which kid needs cleats vs. dance shoes vs. indoor shoes on which day).
The prompt
Start your AI CLI tool in an empty directory and paste this prompt:
Build a Node.js CLI tool called kids-schedule-coordinator that ingestsmultiple children's activity schedules from CSV or JSON files, merges theminto a unified family calendar, detects time conflicts, suggests carpoolgroupings, and exports ICS calendar files plus a printable weekly summary.
PROJECT STRUCTURE:kids-schedule-coordinator/ package.json src/ cli.js (entry point, argument parsing with Commander) schedule-parser.js (CSV and JSON ingestion, normalization) conflict-detector.js (time overlap and travel-time conflict detection) carpool-engine.js (proximity grouping and ride-share suggestions) calendar-builder.js (HTML weekly calendar view generator) ics-exporter.js (ICS file generation for calendar app import) weekly-view.js (printable "This Week" family summary) sample-data.js (generates realistic sample schedules) templates/ calendar.hbs (Handlebars HTML calendar template) weekly-summary.hbs (Handlebars printable weekly summary template) static/ style.css (calendar and summary styling)
REQUIREMENTS:
1. CLI INTERFACE (src/cli.js) - Usage: node src/cli.js [options] <schedule-files...> - Accepts one or more schedule files (CSV or JSON), auto-detects format by file extension - --output or -o: output directory for generated files (default: ./family-calendar) - --week or -w: target week start date in YYYY-MM-DD format (default: next Monday) - --family-name or -f: family name for calendar titles (default: "Englehart") - --buffer or -b: minimum buffer minutes between back-to-back events at different locations (default: 30) - --carpool-radius or -r: max miles for carpool grouping (default: 5) - --carpool-file or -c: optional JSON file with carpool family data (names, addresses, zip codes) - --generate-sample: generate sample schedule files and carpool data, then exit - --ics: generate ICS calendar files (default: true) - --no-ics: skip ICS generation - --print: also generate the printable weekly summary HTML - After parsing arguments, orchestrate the pipeline: parse schedules, detect conflicts, run carpool engine, build calendar HTML, export ICS files, optionally build weekly summary. Print a text summary of conflicts found and carpool opportunities to the terminal with chalk color coding.
2. SCHEDULE PARSER (src/schedule-parser.js) Parse activity schedules from CSV or JSON files. Each file represents one source (a team app export, a dance studio schedule, a manual entry).
CSV expected columns (case-insensitive, flexible matching): - Child Name (or Child, Kid, Player, Student) - Activity (or Sport, Class, Program) - Team Name (or Team, Group, Level) -- optional - Day of Week (or Day, DayOfWeek) -- e.g., "Monday", "Tue", "Saturday" - Start Time (or StartTime, Start, Time) -- e.g., "5:30 PM", "17:30", "5:30pm" - End Time (or EndTime, End) -- e.g., "6:30 PM", "18:30" - Location (or Venue, Field, Facility) - Address (or Addr, FullAddress) -- street address for distance calculation - Type (or EventType, Category) -- "practice", "game", "rehearsal", "tournament", "scrimmage", "recital" - Coach (or Instructor, Coach/Instructor) -- optional - Season Start (or SeasonStart, StartDate) -- optional, YYYY-MM-DD - Season End (or SeasonEnd, EndDate) -- optional, YYYY-MM-DD - Notes (or Comments) -- optional, free text
JSON expected format: { "source": "TeamSnap" or "SportsEngine" or "manual", "child": "Daughter Name", "activity": "U10 Futsal", "events": [ { "dayOfWeek": "Tuesday", "startTime": "17:30", "endTime": "18:30", "location": "SportsPlex Indoor", "address": "123 Sports Dr, Arlington, VA 22201", "type": "practice", "coach": "Coach Martinez", "team": "Arlington Fire U10", "seasonStart": "2026-01-05", "seasonEnd": "2026-03-28", "notes": "" } ] }
Normalization rules: - Parse time strings flexibly: "5:30 PM", "5:30pm", "17:30", "530pm" - Normalize day-of-week: accept full names, 3-letter abbreviations, 2-letter abbreviations. Store as full lowercase ("monday", "tuesday"). - Normalize event types to canonical set: "practice", "game", "rehearsal", "tournament", "scrimmage", "recital". Map common variants ("match" -> "game", "lesson" -> "practice", "class" -> "practice", "performance" -> "recital", "showcase" -> "recital"). - Assign a color to each child (configurable but defaults): First child: #3b82f6 (blue), Second child: #ec4899 (pink), Third child: #f59e0b (amber), Fourth child: #10b981 (green). - Expand recurring events: for a given target week, generate concrete date-time instances from the day-of-week + time pattern. If season start/end are provided, only generate events within the season window. - Return a unified array of normalized event objects: { id, childName, childColor, activity, team, date (YYYY-MM-DD), dayOfWeek, startTime (HH:MM 24hr), endTime (HH:MM 24hr), durationMinutes, location, address, type, coach, notes, source }
3. CONFLICT DETECTOR (src/conflict-detector.js) Detect scheduling conflicts across all events for the target week:
a. TIME OVERLAP CONFLICTS: Two events for different children that overlap in time. For each overlap, calculate: - overlapMinutes: how many minutes the events overlap - conflictType: "full" (one event entirely within the other), "partial" (partial overlap), "adjacent" (back-to-back with no gap) - parentCoverage: can two parents cover both events? (flag as "needs-two-parents" if overlap exists, "one-parent-ok" if events are sequential with buffer)
b. TRAVEL TIME CONFLICTS: Back-to-back events for the SAME child (or requiring the same parent) at different locations. Estimate travel time between locations using a simple approach: - If both addresses are provided, use zip code distance as a rough proxy: same zip = 5 min, adjacent zip = 15 min, different area = 25 min - If addresses are not available, use location name matching: same location = 0 min, different location = 20 min (default) - Compare travel time + buffer against the gap between events. If gap < travel time + buffer, flag as a travel conflict. - Report: gap available (minutes), estimated travel time, buffer needed, deficit (minutes short)
c. SAME-CHILD CONFLICTS: Two events for the same child at the same time. This is a hard conflict -- the child cannot be in two places. Flag with highest severity.
Return a sorted array of conflicts: { id, severity ("critical", "warning", "info"), conflictType, event1, event2, overlapMinutes, travelMinutes, gapMinutes, bufferDeficit, resolution (suggested fix), parentCoverage }
Suggested resolutions: - Same-child overlap: "Schedule conflict -- [child] cannot attend both. Choose one or contact coaches about alternate times." - Time overlap (different kids): "Both parents needed. [Parent A] to [event1], [Parent B] to [event2]." - Travel conflict: "Only [N] minutes between events at different locations. Leave [event1] [M] minutes early or arrange carpool for [event2]."
4. CARPOOL ENGINE (src/carpool-engine.js) Generate carpool suggestions for events where ride-sharing is possible.
Input: the carpool families file (JSON) with this structure: [ { "familyName": "Englehart", "zipCode": "22202", "children": ["Daughter1", "Daughter2"], "canDrive": true, "vehicleSeats": 6, "notes": "Available weekdays after 4 PM" }, { "familyName": "Thompson", "zipCode": "22202", "children": ["Jayden"], "canDrive": true, "vehicleSeats": 5, "notes": "" } ]
Grouping logic: - For each event (by activity + day + time + location), find all carpool families whose children participate in the same activity. - Filter to families within the carpool radius (compare zip codes using a simple lookup: same zip = 0 miles, adjacent zip codes in the 222xx Arlington range = 2-4 miles, different prefix = 8+ miles). - Group families into carpool clusters. - For each cluster, suggest a driver rotation: cycle through families that canDrive, distributing driving duties evenly across the season. - Calculate seats needed vs seats available per carpool.
Return: [ { event: { activity, dayOfWeek, startTime, location }, families: ["Englehart", "Thompson", "Rivera"], suggestedDriver: "Thompson (this week)", rotation: ["Thompson", "Englehart", "Rivera"], seatsNeeded: 4, seatsAvailable: 5, notes: "All within 22202 -- 2 min between pickups" } ]
If no carpool file is provided, skip carpool suggestions and print a message: "No carpool data provided. Use --carpool-file to enable carpool suggestions."
5. CALENDAR BUILDER (src/calendar-builder.js) Generate an HTML weekly calendar view using Handlebars:
Layout: - Header: "[Family Name] Family Calendar" title, week date range (e.g., "March 9 - March 15, 2026"), generated timestamp - Weekly grid: 7 columns (Monday-Sunday), rows representing 30-minute time slots from 7:00 AM to 9:00 PM - Event blocks: positioned by day and time, height proportional to duration, colored by child (using the assigned child color) - Each event block shows: time, activity name, location (abbreviated), type badge (practice/game/rehearsal in small pill) - Conflict markers: events involved in conflicts get a red border and a warning icon. Hovering (or tapping on mobile) shows the conflict description. - Conflict summary panel: below the calendar grid, a list of all detected conflicts with severity icons, descriptions, and suggested resolutions - Carpool panel: below conflicts, a list of carpool opportunities for the week with family names and suggested drivers - Legend: child name + color swatch, event type badges, conflict severity icons
Styling (static/style.css): - Light, print-friendly theme (this goes on the fridge): Background: #ffffff, grid lines: #e5e7eb, time labels: #6b7280 - Child colors as left borders and light background fills on events - Conflict events: red (#ef4444) dashed border, light red background - Game events: bold text. Tournament events: bold + star icon. - Responsive: on mobile, switch to a vertical day-by-day list instead of the 7-column grid - Print CSS: fits on standard Letter paper in landscape orientation, hides interactive elements, uses solid borders
6. ICS EXPORTER (src/ics-exporter.js) Generate ICS (iCalendar) files for importing into calendar apps:
- One ICS file per child: "daughter1-calendar.ics", "daughter2-calendar.ics" -- contains only that child's events - One combined family ICS file: "englehart-family-calendar.ics" -- all events for all children - Each ICS event includes: SUMMARY: "[Child] - [Activity] ([Type])" e.g., "Daughter1 - U10 Futsal (Practice)" DTSTART / DTEND: correct date and time in local timezone LOCATION: venue name and address DESCRIPTION: team name, coach, any notes. If the event has a conflict, append "CONFLICT: [conflict description]" CATEGORIES: activity name COLOR: child's assigned color (use X-APPLE-CALENDAR-COLOR for Apple Calendar compatibility) - Conflict events get "[CONFLICT] " prepended to the SUMMARY - Use the ical-generator library for proper ICS formatting - Handle timezone correctly (default: America/New_York)
7. WEEKLY VIEW (src/weekly-view.js) Generate a printable "This Week at a Glance" HTML summary:
Layout: - Title: "[Family Name] Family -- This Week" with date range - Day-by-day breakdown (Monday through Sunday): Each day shows: - Date and day name - All events sorted by start time, each showing: time, child name (with color dot), activity, location, type - Conflict alerts inline (red banner with description) - Carpool notes inline (blue banner with driver info) - Daily packing checklist: Based on event types, list what each child needs: "Monday: [Daughter2] -- dance shoes, leotard, water bottle" "Tuesday: [Daughter1] -- indoor shoes, shin guards, water bottle" "Saturday: [Daughter1] -- cleats, shin guards, uniform, water bottle; [Daughter2] -- cleats, shin guards, uniform, water bottle" Packing rules: - Futsal: indoor shoes, shin guards, water bottle - Soccer (practice): cleats, shin guards, water bottle - Soccer (game): cleats, shin guards, uniform, water bottle, snack - Dance (class): dance shoes, leotard, hair pins, water bottle - Dance (rehearsal): dance shoes, costume, hair pins, water bottle - Tournament: cleats, shin guards, uniform, water bottle, snack, camp chair, sunscreen - Weekly conflict summary: total conflicts, critical vs warning, unresolved items - Carpool summary: total carpool opportunities, miles saved estimate (rough: assume 5 miles per one-way trip avoided)
Styling: - Clean, minimal, black-and-white friendly (designed to be printed) - Child color dots for quick visual identification - Conflict alerts in bold with a simple border - Fits on 1-2 pages of Letter paper in portrait orientation
8. SAMPLE DATA GENERATOR (src/sample-data.js) When --generate-sample is passed, create realistic schedule files for Nick's family:
a. futsal-schedule.csv -- Daughter1, U10 Futsal (Arlington Fire): - Practice: Tuesday 5:30-6:30 PM, Thursday 5:30-6:30 PM - Location: SportsPlex Indoor (620 S Frederick St, Arlington VA 22204) - Games: Saturday 10:00-11:00 AM (location varies by week, default: Thomas Jefferson Community Center, 3501 S 2nd St, Arlington VA 22204) - Coach: Martinez - Season: January 5, 2026 -- March 28, 2026
b. soccer-daughter1.json -- Daughter1, U10 Soccer (Arlington Storm): - Practice: Monday 4:30-5:30 PM, Wednesday 4:30-5:30 PM - Location: Barcroft Park Field 2 (4200 S Four Mile Run Dr, Arlington VA 22206) - Games: Saturday 9:00-10:15 AM (location varies, default: Gunston Park, 2700 S Lang St, Arlington VA 22206) - Coach: Williams - Season: March 2, 2026 -- May 30, 2026
c. soccer-daughter2.csv -- Daughter2, U8 Soccer (Arlington Blaze): - Practice: Tuesday 4:00-5:00 PM, Thursday 4:00-5:00 PM - Location: Long Bridge Park Field 1 (475 Long Bridge Dr, Arlington VA 22202) - Games: Saturday 9:00-10:00 AM (default: Long Bridge Park Field 3, 475 Long Bridge Dr, Arlington VA 22202) - Coach: Patel - Season: March 2, 2026 -- May 30, 2026
d. dance-schedule.json -- Daughter2, Jazz/Ballet (Arlington Dance Studio): - Class: Monday 5:00-6:00 PM, Wednesday 5:00-6:00 PM - Location: Arlington Dance Studio (3028 Wilson Blvd, Arlington VA 22201) - Friday Rehearsal: 4:30-6:00 PM (recital season only, starting April 10, 2026) - Location for rehearsal: Kenmore Middle School Auditorium (200 S Carlin Springs Rd, Arlington VA 22204) - Instructor: Ms. Chen - Season: year-round (class), April 10 -- May 22, 2026 (rehearsals)
e. carpool-families.json -- 5 families: - Englehart (22202, 2 kids, can drive, 6 seats) - Thompson (22202, 1 kid on U10 Futsal + U8 Soccer, can drive, 5 seats) - Rivera (22204, 1 kid on U10 Futsal, can drive, 7 seats -- minivan) - Kim (22206, 1 kid on U10 Soccer, can drive, 5 seats) - Okafor (22201, 1 kid in dance + U8 Soccer, can drive, 5 seats)
BUILT-IN CONFLICTS in the sample data for the week of March 9-15, 2026: - Saturday morning: Daughter1 U10 soccer game (9:00-10:15 AM at Gunston Park) overlaps with Daughter2 U8 soccer game (9:00-10:00 AM at Long Bridge Park) -- both parents needed, different locations - Tuesday evening: Daughter2 U8 soccer practice ends at 5:00 PM at Long Bridge Park, Daughter1 futsal starts at 5:30 PM at SportsPlex Indoor -- 30-minute gap but 15-minute drive, tight with buffer - Saturday: Daughter1 futsal game (10:00-11:00 AM at TJ Community Center) starts right after her soccer game ends (10:15 AM at Gunston Park) -- same child, 15-minute gap, different locations, 10-minute drive
DEPENDENCIES: csv-parser, ical-generator, handlebars, chalk, commanderThe --generate-sample flag creates all five files with realistic schedules and built-in conflicts. Run the tool against sample data first to see how conflict detection and carpool suggestions work. Then replace the sample files with your actual schedules exported from TeamSnap, SportsEngine, or wherever your team data lives.
What you get
After your AI CLI tool finishes, set up the project:
cd kids-schedule-coordinatornpm installGenerate sample data and run the tool
# Generate sample schedule files and carpool datanode src/cli.js --generate-sample -o ./family-calendar
# Run the coordinator for the week of March 9node src/cli.js \ ./family-calendar/futsal-schedule.csv \ ./family-calendar/soccer-daughter1.json \ ./family-calendar/soccer-daughter2.csv \ ./family-calendar/dance-schedule.json \ --week 2026-03-09 \ --family-name Englehart \ --buffer 30 \ --carpool-file ./family-calendar/carpool-families.json \ --print \ -o ./family-calendarOpen ./family-calendar/calendar.html in your browser. You should see:
- Weekly calendar grid with events color-coded by child. Blue blocks for Daughter1 (futsal and soccer), pink blocks for Daughter2 (soccer and dance). Events positioned accurately by day and time slot.
- Saturday morning conflict highlighted in red: both daughters have soccer games at 9:00 AM at different fields. The conflict summary says “Both parents needed” and names the two locations.
- Saturday mid-morning conflict also flagged: Daughter1’s soccer game ends at 10:15 AM at Gunston Park and her futsal game starts at 10:00 AM at TJ Community Center. The tool should flag this as a same-child conflict with a travel deficit.
- Tuesday evening travel warning: Daughter2’s soccer ends at 5:00 PM at Long Bridge Park, and Daughter1’s futsal starts at 5:30 PM at SportsPlex. The 30-minute gap minus the estimated travel time leaves little buffer.
- Carpool suggestions below the calendar: Thompson and Rivera families grouped with Englehart for futsal, Kim family for U10 soccer, Okafor family for dance and U8 soccer.
Check ./family-calendar/ for the ICS files and open one in your calendar app to verify events import correctly.
Open ./family-calendar/weekly-summary.html for the printable version. It should fit on one to two pages and include the daily packing checklist.
Common issues and fixes
| Problem | Follow-up prompt |
|---|---|
| Events do not appear on the calendar grid | The calendar HTML is rendering but no event blocks are visible. Check that calendar-builder.js correctly maps each event's startTime and dayOfWeek to the grid position. The time slot calculation should convert "17:30" to a row offset: (17 - 7) * 2 + 1 = row 21 (for 30-minute slots starting at 7 AM). The day column should map "tuesday" to column 2 (Monday = 1). Make sure the CSS uses position: absolute within a position: relative day column, with top calculated from the row offset. |
| ICS files show wrong timezone or times are off by hours | The ICS events show times shifted by 4 or 5 hours. The ical-generator library needs the timezone set explicitly. Set the calendar timezone to "America/New_York" and make sure each event's start and end are created as timezone-aware Date objects, not UTC. Use: event.start = moment.tz("2026-03-10 17:30", "America/New_York").toDate() or equivalent. |
| Conflict detector misses the Saturday overlap | The Saturday morning conflict between the two soccer games is not being detected. Make sure the conflict detector compares events across different children, not just within the same child. For each pair of events on the same date, check if event1.startTime < event2.endTime AND event2.startTime < event1.endTime. If both conditions are true, the events overlap. |
| Carpool engine returns empty results | The carpool engine finds no carpool opportunities even though the carpool-families.json file is loaded. The matching logic needs to join carpool families to events by activity name. Check that the activity names in the carpool family children's data match the activity names in the schedule files. Use case-insensitive, partial matching: if a child is listed on the "U10 Futsal" activity and the carpool file lists them as participating, they should match. |
| Printable weekly view does not fit on one page | The weekly summary overflows to 3+ pages when printed. Reduce the font size for the daily schedule to 11px, use compact spacing (line-height: 1.3), and set the packing checklist to a two-column layout. Add CSS @media print { body { font-size: 11px; } .day-section { page-break-inside: avoid; } } to keep each day together and prevent awkward splits. |
When Things Go Wrong
Use the Symptom → Evidence → Request pattern: describe what you see, paste the error, then ask for a fix.
How it works
The tool follows a straightforward pipeline:
-
CLI (
cli.js) parses arguments with Commander, validates that all schedule files exist and are readable, and orchestrates the pipeline: parse schedules, detect conflicts, run carpool engine (if carpool file provided), build calendar HTML, export ICS files, optionally build the printable weekly summary. It prints a color-coded conflict summary to the terminal so Nick can see problems immediately without opening a browser. -
Schedule Parser (
schedule-parser.js) reads each input file, auto-detects CSV vs JSON by extension, normalizes column names and time formats, assigns a color to each child, and expands recurring events into concrete instances for the target week. It returns a flat array of normalized event objects that the rest of the pipeline consumes. Every event has the same structure regardless of which app it came from. -
Conflict Detector (
conflict-detector.js) runs three passes. First, same-child conflicts: events where one child is double-booked. Second, cross-child time overlaps: events where two kids have simultaneous commitments at different locations, requiring both parents. Third, travel-time conflicts: sequential events at different venues where the gap between them is not enough for the drive plus buffer time. Conflicts are scored by severity and returned with suggested resolutions. -
Carpool Engine (
carpool-engine.js) matches carpool families to events by activity, filters by proximity using zip code comparison, groups families into clusters, and generates a driver rotation suggestion. It is a convenience layer — it does not enforce anything, just surfaces opportunities that Nick can act on via the group text. -
Calendar Builder (
calendar-builder.js) compiles the Handlebars template with all events, conflicts, and carpool data. It positions events on a 7-column weekly grid, applies child colors, marks conflicts with red borders, and renders the conflict and carpool summary panels below the grid. -
ICS Exporter (
ics-exporter.js) generates standard iCalendar files using the ical-generator library. It creates one file per child and one combined family file. Conflict events are tagged in the summary field so they stand out in any calendar app. -
Weekly View (
weekly-view.js) builds the printable summary: a day-by-day schedule with inline conflict alerts, carpool notes, and the packing checklist generated from event types and activity names.
Customize it
Add weather integration
Add a --weather flag that checks the weather forecast for each outdoor eventin the target week. Use the Open-Meteo API (free, no key required) with theevent location's coordinates (geocode from address using a simple zip-to-coordinates lookup). For each outdoor event (soccer games, soccer practices),add a weather badge to the calendar view: sun icon if clear, cloud icon ifovercast, rain icon if precipitation > 50%. Flag rainy-day events with ayellow warning: "Rain likely -- check with coach for cancellation." Indoorevents (futsal, dance) are not affected and should not show weather data.Add team roster management
Add a --roster flag that accepts a JSON file with team rosters (player names,parent names, parent phone numbers, parent email). For each carpool group,show the contact info for the suggested driver so Nick can text them directly.Add a "Snack Schedule" feature: for game days, rotate snack duty amongfamilies on the roster and include "Snack duty: [Family Name]" on thecalendar and weekly summary. Track which families have already broughtsnacks this season so the rotation is fair.Add budget tracker
Add a --budget flag that loads a JSON file with activity costs: registrationfees, equipment costs, uniform costs, tournament entry fees, and travelestimates. Add a "Season Budget" section to the weekly summary showing:total spent to date, upcoming costs this month, per-child breakdown, andper-activity breakdown. Flag when total season cost exceeds a configurablebudget threshold. Export a simple CSV budget report for tracking expensesacross seasons.Add morning digest notification
Add a --digest flag that generates a plain-text "Today's Schedule" summaryfor the current day (or a specified date). The digest shows: what ishappening today, who needs to be where and when, what to pack, anyconflicts, and the carpool driver. Format it for easy copy-paste into atext message or email. Add an optional --email flag with an email addressto send the digest automatically using nodemailer. Nick could set this upas a cron job to get a text every morning at 6 AM with today's family schedule.Try it yourself
- Generate the schedule coordinator with the prompt above.
- Run
npm installand generate sample data with--generate-sample. - Run the tool for the week of March 9, 2026 with all four schedule files and the carpool file.
- Open the HTML calendar in your browser. Are all events positioned correctly on the grid?
- Check the conflict summary. You should see at least three conflicts: the Saturday morning double-game, the Saturday same-child overlap, and the Tuesday evening travel warning.
- Open one of the ICS files in your calendar app. Do the events import with correct times and locations?
- Open the printable weekly summary. Read the packing checklist — does each day list the right gear for the right kid?
- Change a game time in one of the sample files (move Daughter2’s Saturday game to 10:30 AM) and re-run. Does the Saturday morning conflict disappear?
Key takeaways
- Calendar aggregation eliminates the mental overhead of multi-source scheduling. Three team apps and a Google Sheet become one calendar. The parser normalizes everything into a common format so the rest of the tool does not care where the data came from.
- Conflict detection catches what your brain misses at 10 PM on Sunday. Time overlaps are obvious when you see them on a grid. They are not obvious when you are mentally overlaying three separate schedules while packing lunches. The detector does the overlap math once and flags every problem.
- Travel-time awareness turns a calendar into a logistics plan. Knowing that two events overlap is useful. Knowing that you have 30 minutes between venues that are 15 minutes apart — and that you need the other 15 for parking and check-in — is actionable. The buffer calculation converts a time gap into a “can we make it” answer.
- The same patterns you use at work apply to your personal life. Calendar aggregation, conflict detection, resource scheduling, and notification digests are the same patterns behind property management dashboards, project scheduling tools, and ops centers. The domain is different. The engineering is identical.
- Tools you build for yourself get used. A tool that solves a problem you personally have every week is a tool you will actually run. Building for your own life is the fastest way to internalize what AI CLI tools can do, because you already understand the domain and you will immediately know if the output is right or wrong.
Daughter1 has a soccer game from 9:00-10:15 AM at Gunston Park. She also has a futsal game from 10:00-11:00 AM at TJ Community Center, which is a 10-minute drive from Gunston Park. The family uses a 30-minute buffer for travel between locations. How should the conflict detector classify this situation?
What’s next
In Lesson 8, you will build the Coaching Playbook Builder. Nick played football at JMU and has a kinesiology degree. Whether he is helping coach his daughters’ teams or sketching formations on a whiteboard for a weekend scrimmage, he thinks in plays and movement patterns. The playbook builder is a visual tool for diagramming youth formations, drawing player movement routes, organizing drill sequences, and exporting printable practice plans. Same AI CLI workflow, same one-command philosophy — applied to the field instead of the fridge calendar.