Inspiration

Playing across multiple tennis clubs creates a surprisingly fragile routine. Lessons, clinics, and court reservations live in separate booking portals, so answering “when am I playing next?” means checking several systems and hoping nothing changed.

I wanted one dependable view without handing another service permission to write to my personal calendar.

What it does

Tennis Calendar Bridge signs in to configured, authorized club portals, normalizes lessons, clinics, and reservations into one local event store, and publishes:

  • a private dashboard
  • a tokenized iCalendar feed for Apple Calendar, Google Calendar, and other calendar clients
  • an opt-in GPT-5.6 weekly brief that turns the next seven days into an at-a-glance plan, logistics, and watch-outs

The deterministic calendar remains useful without AI or an OpenAI API key.

How I built it

Provider-specific Playwright adapters produce one normalized Python event model stored in SQLite. The service renders a private dashboard and standards-based .ics feed.

For the Build Week extension, a privacy filter creates a minimal Responses API request containing only event titles, local times, categories, statuses, and pseudonymous labels such as “Venue 1.” It uses gpt-5.6-sol with low reasoning effort to identify patterns such as tight gaps, late finishes, and venue changes.

Credentials, access codes, instructor names, raw portal data, source URLs, club identifiers, and real venue names stay local. The brief --preview command prints the exact outbound request before any API call.

Architecture:

club portals → provider adapters → normalized events → local SQLite → dashboard / iCalendar / privacy filter → GPT-5.6 weekly brief

How I used GPT-5.6

GPT-5.6 has one focused, visible product responsibility: cross-event synthesis. It explains the week without becoming the source of truth, scraping portals, storing credentials, or changing calendar events. The prompt explicitly asks it not to invent missing travel assumptions or facts.

How I used Codex

Codex was my implementation and verification partner for the Build Week work. In the primary session it:

  • inspected the pre-existing architecture and official challenge rules
  • helped design and implement the privacy boundary and Responses API integration
  • added redaction and response tests
  • strengthened CI with formatting, linting, typing, tests, package builds, and metadata checks
  • exercised a clean Python 3.12 installation and synthetic judge path
  • prepared the reviewable PR, release, judge documentation, and demo material

I kept the final product decisions explicit: opt-in AI, aliases instead of real venues, no personal-calendar write access, synthetic demo data, and no claims beyond verified evidence.

Challenges

Calendar data mixes routine facts with sensitive details. The hardest part was giving GPT-5.6 enough structure to find weekly patterns without forwarding raw pages or personal portal data. Pseudonymous venue aliases preserve useful transition patterns while keeping actual locations local.

Portal variability was the other challenge. Explicit adapters and sanitized parser fixtures make failures understandable and testable instead of hiding them behind a generic scraper.

Accomplishments that I'm proud of

  • One private schedule across three provider families
  • Calendar subscription without calendar write permission
  • A previewable GPT-5.6 request with a tested redaction boundary
  • A two-minute synthetic judge path requiring no club accounts
  • 30 passing tests and a green Python 3.11/3.12 CI matrix
  • A public v0.2.0 wheel and source release
  • Clear disclosure of the pre-existing project and the Build Week extension

What I learned

AI is most trustworthy here when its role is narrow and its data boundary is visible. The deterministic calendar should remain the source of truth; the model is valuable as an explanation layer over a week that spans multiple incompatible systems.

What's next

I would add more adapters from sanitized fixtures, deterministic conflict checks, an authenticated dashboard view for the brief, and explicit retention controls for scraper debug artifacts.

Try it

The repository includes synthetic data and a two-minute judge path. No real club credentials or browser download are needed to inspect the dashboard, calendar feed, or exact GPT-5.6 request preview.

Repository: https://github.com/lzongren/tennis-calendar-bridge

Release: https://github.com/lzongren/tennis-calendar-bridge/releases/tag/v0.2.0

Built With

  • codex
  • github-actions
  • gpt-5.6
  • icalendar
  • openai-responses-api
  • playwright
  • python
  • sqlite
Share this project:

Updates