Inspiration

Student-athletes juggle practices, exams, tournaments, and clubs — and every AI scheduling tool that could help means handing a chatbot your school name, teammates, and location. We wanted the convenience of AI-optimized scheduling without that trade-off: real utility from an LLM, while the LLM itself never learns who you actually are.

What it does

Schiddle takes a messy, free-text description of your week and turns it into a structured, optimized schedule. Type something like "Tennis practice Monday and Wednesday 3-5 PM, AP Calc exam prep Tuesday evening, tournament in San Diego Saturday" and Schiddle organizes it into time-blocked events with productivity tips, spread across the correct actual calendar dates. From there, export it as a real .ics file that opens natively on Mac/iPhone/iPad, or push it directly into your Google Calendar with one click — all while your real names, schools, and locations never leave your browser to get there.

How i built it

Next.js (App Router) + TypeScript on the frontend, with a client-side masking engine that tokenizes names, schools, locations, and activities before anything leaves the browser. Only the tokenized text is sent to our API route, which calls Groq's free Llama 3.3 70B model to return structured JSON. The response is unmasked back into real values entirely client-side. From there, the schedule is either downloaded as a real .ics file (via the ics library) or pushed straight into the user's Google Calendar using NextAuth + the Calendar API, scoped narrowly to event creation only.

Challenges i ran into:

The AI inventing its own tokens. When we asked for a "location" the user never gave one for, the model hallucinated a placeholder tag matching our tokenization scheme , which then leaked into the UI since it had no match in our reverse-map. Fixed by explicitly telling the model never to invent tags, and adding a client-side cleanup pass to strip any that slip through anyway. Everything stacking on "today." Early on, every event defaulted to the current date because the schema never asked the model for a day at all. Fixed by adding a dayOfWeek field and resolving it to a real calendar date in code — never trusted to the model's own date math. Vague times defaulting to midnight. "Evening" or "after practice" would silently become 00:00. Fixed with explicit time-of-day defaults and relative-event ordering in the prompt. Recurring activities collapsing into one event. "Practice Monday, Wednesday, and Thursday" was merged into a single event instead of three, with leftover day-name text bleeding into unrelated fields. Fixed by explicitly instructing the model to expand each recurring day into its own separate event. Google OAuth verification. Getting Calendar API access working smoothly meant navigating Testing-mode restrictions, the "unverified app" consent screen, and publishing to Production — which taught us to always keep a zero-dependency fallback (.ics export) so a live demo never depends on a third-party consent flow going smoothly. Accomplishments that we're proud of A masking/unmasking pipeline that actually holds up under adversarial-ish conditions (hallucinated tokens, vague inputs) rather than just working on the happy path. Real, working dual calendar export — not a mockup — covering both Google accounts and Apple/iCloud-only users. Catching and fixing multiple distinct LLM reliability bugs (token hallucination, date collapsing, midnight defaults, recurring-event merging) through actual testing rather than assuming the first prompt would hold up.

What's next for Schiddle

Full Google OAuth verification, so the "Google hasn't verified this app" warning screen goes away entirely. Right now, users have to click through an "Advanced → Go to Schiddle Web (unsafe)" warning to connect Google Calendar — functional, but not the polish a real product needs. Submitting for verification removes that friction permanently. Broader recurring-pattern support (e.g. "every weekday," biweekly patterns) Full Apple/iCloud CalDAV integration so iOS-only users get the same one-click experience as Google users Smarter conflict detection when two events overlap Expanding the masking dictionary's coverage beyond the current heuristic categories

Built With

Share this project:

Updates

Submission history