Skip to content
Eitan FeldmanBA, ARGResumeenes
Lab

Horario ICS

Photograph your school timetable, get a subscribable calendar. Gemini does the OCR and the structured extraction; the app turns the result into an .ics feed your phone can follow.

No longer maintained, and the source is private. It worked for the terms I needed it for. Leaving it here because the decisions are the interesting part, not the tool.

Every term the school hands out a timetable as a grid — days across the top, time blocks down the side, subject and teacher and room crammed into each cell. Useful on paper, useless on a phone.

This takes a photo of that grid and gives back a calendar you can subscribe to.

The decisions worth reading

Gemini does the extraction, not a hand-written parser. The grid layout changes between terms and between years, and a parser tuned to one shape breaks on the next one. The prompt describes the structure — columns are weekdays, rows are time blocks, each cell has subject, teacher and room — and asks for JSON. That survives a redesign; a coordinate-based parser would not.

There is a model fallback list, not a model. It tries gemini-1.5-flash first and falls back through two others. A single hardcoded model is a tool that stops working the day that model is retired, and this one has to keep working every term without me touching it.

The calendar is served from a route, not downloaded as a file. A downloaded .ics is a snapshot; a subscribed URL updates. It means the timetable can be corrected after the fact and every phone that subscribed gets the fix.

The part that took the longest

Not the AI — the timezone and the accents. miércoles and miercoles are the same day to a person and two different keys to a lookup table, and an .ics file with no timezone declared will happily shift every class by three hours once it reaches a calendar app in Buenos Aires.