Quad

Find your people on campus, and find the right room when plans change.

You leave class, walk across UBC for a workshop you found on Instagram, and get to an empty room. The organizer posted a correction somewhere else. A friend who follows the right account made it. You turn around.

We built Quad to close that gap. It gathers UBC Vancouver events from calendars, club websites, and public announcements, gives each occurrence a stable page with its source, and keeps confirmed changes attached to the link students already have. Students can browse by day, ask for recommendations in plain language, save events to a calendar, and get a digest or a reminder that uses the current event details.

Try Quad · Campus Pulse · Ask Genie · GitHub

Inspiration

The hardest part of finding a club event can be knowing where to look. One club uses a calendar. Another puts everything on a flyer. A third posts the time in one place and the new room in another. Students who already know the club and follow the right channels have an advantage. For a first-year student looking for a community, or a commuter deciding whether to stay on campus, that gap can determine whether they go at all.

We started with event discovery. Looking through the sources showed us a second problem. The same event can be announced several times, and the differences between two announcements may be the most important information a student needs. We wanted Quad to preserve the original source, recognize when two announcements refer to the same occurrence, and make a confirmed change easy to see.

What it does

  • Find something you can actually attend. Discover puts upcoming events in a day-by-day timeline and can use saved interests to surface relevant events and something outside a student’s usual topics. Students can browse the campus map, save listings, and add events to their calendar.
  • See what changed. Each event has a stable link, organizer, source, and revision history. A confirmed room change updates the existing page. The student can open the link they saved earlier and see the new location and the previous one.
  • Ask in your own words. Ask Genie understands requests like “I’m trying to learn more about AI” and “Find three free events from different organizers this week.” Quad checks that candidates are published and upcoming before Genie ranks them. The results link to the original listings, and the app returns fewer results when fewer qualify.
  • Get a useful reminder. An n8n workflow reads the current feed for an 8 a.m. Vancouver digest and a reminder around an hour before a timed event. It can route to email through Gmail and to a phone through ntfy.
  • See how the feed is doing. Campus Pulse shows when Databricks last refreshed, how many announcements and events it analyzed, and examples of source-linked listings and AI venue suggestions.

How we built it

An announcement goes from a Maritime source check to Quad’s intake and review workflow. Gemini helps interpret unstructured posts. Quad publishes the event and records any confirmed revisions. That data then feeds both n8n notifications and Databricks analysis, and students see the results through the Lovable-built website. We used Freebuff across the sprint to build, connect, debug, and test those pieces.

Freebuff · Our coding partner throughout HackCamp

We used Freebuff throughout the build, from working out how changes should fit the codebase to implementing and debugging features across the frontend and backend. The short feedback loop mattered because Quad has several interfaces that must agree. A change to what counts as a published event affects the website, notifications, and analytics. We used the coding agent to work through those boundaries and then checked the behavior against the existing flows.

Google sign-in is a concrete example. The merged Freebuff branch adds the FastAPI authorization and callback routes, short-lived OAuth state and login codes in SQLite, the React sign-in flow, and tests for the handoff. It had to work alongside the existing account flow and across the hosted application’s frontend and backend. The OAuth suite passed 16 tests, and we verified that the deployed site starts the Google flow with the expected callback. That is a complete feature a judge can trace from the Freebuff branch to the running app. Merged Freebuff pull request

Maritime · The backbone of Quad

Maritime runs the system that keeps the feed useful after a deployment. Our scheduled source monitor checks AMS listings, UBC Events, club calendars, and linked websites. It remembers what it has seen and reports each source separately. A failed request to one site can show up in the run log while the rest of the sources continue. Rechecking unchanged announcements does not create another copy of the event.

We also used Maritime Computers for a persistent Linux browser to read visible Instagram captions from a rotating watchlist. We started with the AMS directory and recorded where each linked website or profile came from. The directory pass attempted 317 club pages, and the Instagram watchlist contains 294 profile URLs. Those numbers describe discovery and monitoring coverage. What the reader can capture depends on account visibility and the browser session, and it pauses when it encounters sign-in or rate limits.

A separate review enrichment worker rechecks incomplete records against linked or corroborating sources. A missing room can sometimes be filled from a second listing. A conflicting room or an event date that still lacks evidence stays available for review. This gives collection, evidence checking, and publication distinct jobs.

The Quad website and FastAPI backend also run on Maritime, with SQLite on persistent storage. Source cursors and published event history survive a redeploy, and the system can keep checking events with the team’s laptops closed. In one logged six-source run, the monitor checked 78 announcements with zero import failures. That is the agent work we show behind the website. Maritime implementation · Source coverage

Gemini API · Turning messy announcements into evidence

A calendar can supply an explicit date and time. A caption or flyer might express the same details as “Thursday at five, ICCS, beginners welcome.” We use Gemini’s structured output to interpret those inputs and extract an organizer, date, time, venue, audience, cost, and RSVP link when the source supports them.

The extraction includes short evidence excerpts for important fields. Quad validates the result and keeps uncertain values unknown. The date a photo was posted cannot substitute for the date of the event. “Free pizza” alone cannot establish that admission is free. The same rule matters downstream when a student asks Genie for free events or opts into a filtered alert.

Gemini also helps classify listings that are still missing topics into Quad’s fixed set of categories. That makes an event easier to discover without treating a better tag as a new event or sending another announcement. Structured feeds continue to use their explicit fields, so model work goes where it adds information.

Databricks · Campus Pulse and source-grounded recommendations

We send announcements and event revisions through a durable export queue into Databricks. Bronze preserves the source and revision trail. Silver selects the latest event revision and resolves venue aliases against a campus building reference. Gold serves published events and produces activity summaries and Pulse metrics. Databricks SQL ai_query suggests buildings for unresolved venue text and evaluates a bounded set of possible duplicate pairs. A duplicate suggestion is evidence for review. Quad’s event record changes through its own matching and confirmation rules.

Changes to Bronze can trigger a job that regenerates the analysis. Quad reads completed results and shows their freshness on Campus Pulse. It checks that each featured event still matches a published revision and linked source before displaying it. A verified snapshot showed 255 source announcements, 112 upcoming events analyzed, and two venues placed by AI. One concrete example is Labs of Ling, for which Pulse showed Henry Angus as an AI venue suggestion alongside the AMS source. Campus Pulse · Original AMS listing

For Ask Genie, Quad narrows a question to eligible listings and sends candidate event IDs to a Genie space over the Gold event table. The results must match those IDs before we render them. A live request about learning AI surfaced introductory machine-learning and large language model workshops. The page also has a listing-based fallback when Genie is unavailable. Student account and subscriber details stay outside that query path. Ask Genie

n8n · Notifications that use the current plan

We built an importable n8n workflow with an 8 a.m. digest and a separate one-hour reminder. The digest helps a student decide what to attend that day. The reminder pulls the current listing close to the start, so a room correction made after breakfast can still be reflected when the student leaves for the event.

The workflow respects the recipient and topic settings configured in n8n. It branches to Gmail or ntfy by channel preference and records successful sends by channel. A retry can attempt the failed channel while skipping the successful one. A changed start time can receive a fresh reminder at the new time. We tested the planner for Vancouver dates, reminders around midnight, current venues, and preview versus test delivery. Preview mode lets us demonstrate both message types without contacting the recipient list. n8n workflow and test instructions

Lovable · A campus experience students can use

We built the React and TanStack interface with Lovable, synced it through GitHub, and connected it to our live FastAPI backend. We iterated toward a day-by-day timeline for deciding what fits between classes. The same project includes the campus map, saved calendar, Google sign-in, event history, Pulse, and Ask Genie. The frontend presents the provenance and revision work where it matters most. On the event page, students can see the current details and open the organizer’s listing.

Challenges we ran into

The hardest engineering decision was how much to trust a second announcement. Two nearly identical workshops on different dates can be separate occurrences. A new flyer for the same workshop may be a correction. We used source identity and event fields to match posts, then routed conflicting details through review. We also had to handle blocked pages and expiring browser sessions without letting one fragile source stop the monitor.

We used a repeatable fixture to test the difference. Intro to Git is published in Demo Hall 101. A second announcement proposes Demo Hall 204. Before confirmation, the existing event page still shows 101. After confirmation, the same URL shows 204 and its history shows both rooms. The fixture is fictional, and the live feed and Pulse examples come from real source listings.

What we’re proud of

We finished with 112 upcoming listings in the live feed when we checked the submission, and we could follow the data from a Maritime source run all the way to a student-facing page. We can demonstrate the update path in one sitting. Open a listing and its source, replay the room-change fixture, show the revised page and its history, then inspect a reminder preview and the Databricks results.

We also shipped workflows that handle incomplete information explicitly. An unreadable source can be reported as blocked. A missing time stays unknown. A Genie search with two qualifying events can return two. Those behaviors matter as much to a student planning their afternoon as a successful import.

What we learned

We came in thinking event discovery was mostly a collection problem. Building Quad taught us to evaluate the whole trip from source to action. We started checking whether a claim came from an organizer, whether a correction reached the event page, and whether a scheduled reminder picked up the corrected event record. Each check caught a different kind of mistake.

Community impact and what’s next

Quad gives students a way into campus life when they do not already know which clubs to follow. A first-year student can find a beginner event outside their usual interests. A commuter can check what’s on before deciding to stay late. A student who saved the original listing can reopen it and see the organizer’s correction.

Our next steps are to make cancellations from organizers propagate reliably, connect notification preferences in the website directly to n8n, and extend monitoring where public sources give us usable evidence. We want to pilot Quad with students and club organizers and measure how often a source link or a timely correction helps someone attend.

Built with Freebuff, Maritime, Google Gemini API, Databricks SQL, Databricks Genie, n8n, Lovable, FastAPI, SQLite, React, TanStack Start, Vercel, Gmail, and ntfy.

Built With

Share this project:

Updates

Submission history