Overview
At UC Riverside, a lot of campus life lives on Instagram.
Student organizations promote events through posts and flyers, but that makes discovery incredibly fragmented. Unless you already follow the right accounts, it's easy to miss what's happening on campus. Event details are often buried inside flyer images, spread across captions, or formatted inconsistently — making the information hard to search, browse, or trust at scale. I built UCR Events to solve that problem: a platform that aggregates posts from 400+ student organization accounts, extracts structured event information from messy social content using OCR + LLMs, and serves it through a frontend designed for fast discovery and low cognitive load.
Problem
Campus events weren't hard to find because they didn't exist. They were hard to find because the information was scattered.
At UCR, organizations mainly share events through Instagram. That creates several issues: students need to already know which accounts to follow, event information is spread across hundreds of pages, key details are often embedded in flyer images rather than text, formatting is inconsistent from org to org, and discoverability depends too much on chance and the algorithm. Students regularly missed events, and organizations had limited visibility outside of their existing followers.
Approach
How do you turn messy, image-heavy, inconsistent social posts into reliable event records people can browse like a product?
Instagram is not a structured data source. It's a stream of promotional content made for people to look at, not for machines to understand. I designed an ingestion pipeline with core stages: collect post content from student organization accounts, extract raw text from flyer images using OCR, pass caption + OCR text into an LLM to identify event fields, normalize the output into structured records, deduplicate repeated or similar events, and serve the results through a clean frontend feed. This bridged the gap between unstructured campus promotion and structured event discovery.
Pipeline
A lot of the work went into making the system resilient when the source data was imperfect.
Many organizations put the most important details inside flyers, not captions, so OCR was essential. After extracting raw text, I used an LLM step to identify fields like title, date, time, location, and organization. In practice, the inputs were messy: incomplete dates, inconsistent time formats, unclear locations, repeated posts, non-event content mixed in, and event details split across caption and flyer. This project also forced me to think carefully about efficiency — I was building under tight usage and cost constraints, so I had to be deliberate about how often things ran, what needed deeper processing, and where the AI pipeline added the most value.
Frontend
Even if the backend works, the product still fails if browsing feels noisy or tiring.
I wanted the frontend to feel simple and fast, not overloaded. A lot of event products make the mistake of showing too much too early, which makes scanning harder. I intentionally designed the UI around low cognitive load. The main feed uses event cards that surface only the most important information up front. For deeper details, I used a dialog-based view rather than cramming everything into the card itself. I also implemented infinite scroll so users could move through a large event set without the friction of pagination.
Outcome
400+ organizations aggregated. 3,000+ users. Strong recurring engagement.
The finished product became a centralized event discovery site for UCR students. It aggregated content from 400+ student organizations and reached 3,000+ users, with strong recurring engagement that validated real demand. More importantly, it proved that students genuinely wanted a simpler way to discover events and organizations across campus. What started as a campus pain point turned into a working system that people actually used.
Reflection
The real value was building a system that could take messy, human-made content and turn it into something legible and useful.
UCR Events changed how I think about software. Before this, I mostly thought of applications as interfaces built on top of already-structured data. This project showed me how much useful information in the real world is actually fragmented, inconsistent, and trapped inside formats that are hard to work with. It made me much more interested in products that sit between unstructured information and everyday users — especially systems where AI is not the gimmick, but the layer that removes friction and makes the product possible.