Qué Pinta Salta
Five sources, one place: Salta's cultural calendar fed automatically
The problem
Salta's event listings live fragmented across four ticketing sites that don't talk to each other and, above all, across Instagram flyers — where the information exists as an image, not as data.
For the user: there's no single place to see what's on tonight. For the organizer: their event shows up scattered, or doesn't show up at all.
Loading everything by hand doesn't scale. That was the real problem.
The decision that defines the system
Gemini 2.5 Flash reads the flyer and the caption and returns structured JSON. But it publishes nothing. The gate is a deterministic TypeScript filter that validates four fields by shape —title, date, time, venue— and decides whether the event goes live or falls to human review.
This is deliberate. An LLM that is confidently wrong is more dangerous than one that fails outright. Putting the decision in code makes the criterion auditable, versionable and explainable — and when extraction fails, the flyer isn't lost: it enters the review queue with the original caption as context.
How it works
Five active sources. Four return structured data and are normalized with code. Only Instagram goes through the LLM, because it's the only one where the data lives as an image.
Events that appear in several sources aren't duplicated: a Jaccard similarity algorithm scoped to same venue and same day merges them, keeping every purchase link and the lowest price.



