Devpost Submission Guide: KnightLife

Project Name: KnightLife (or "KnightLife — UCF Event Discovery")


Inspiration

UCF has hundreds of clubs. Each one posts events on Instagram in its own format — some write the date, some bury it in the caption, some just say "this Friday." There's no single place to see what's happening on campus this week without scrolling every account individually.

We wanted to solve that. Not by asking clubs to change how they post, but by meeting them where they already are — Instagram — and doing the work of parsing it for students.

What It Does

KnightLife automatically discovers UCF club events by scraping Instagram, using Gemini AI to extract structured event data (title, date, time, location) from raw posts and captions, and presenting everything in a clean, searchable feed. Students can follow clubs, get a personalized event feed, RSVP with one click, receive a calendar invite via email, and coordinate attendance with friends through Squads — invite-code groups that show who's coming.

Key Features:

  • AI-powered event extraction from Instagram posts (Apify + Gemini Flash).
  • Searchable club directory with category filters.
  • Personalized "My Feed" showing only events from clubs you follow.
  • RSVP with an automatic .ics calendar invite emailed to you.
  • Squads: Create a group, share a 6-character code, and see who's in. Supports public or private modes with owner approval.
  • Account system with email verification (6-digit code).
  • PWA — fully installable on mobile.

How We Built It

Layer Technology
Frontend React + Vite, React Router, CSS custom properties
Backend FastAPI (Python), PostgreSQL (Supabase), async SQLAlchemy
AI Pipeline Apify (Instagram scraper) → Gemini Flash (structured extraction)
Email SMTP / Gmail App Password
Infrastructure Docker Compose

The pipeline runs fully automated: Apify fetches the latest posts from configured club accounts, downloads images in memory, and sends image bytes and captions to Gemini with a structured JSON schema. Gemini classifies whether it's a real event and extracts the date, time, location, and title. Valid events are saved to Postgres and appear in the feed immediately.

Challenges

  • Unstructured Instagram captions: Clubs write dates every possible way ("this Thurs", "April 18th", "4/18 @ 7pm"). Getting Gemini to normalize these reliably required careful prompt engineering and a Pydantic schema to enforce the output shape.
  • Async SMTP in a sync context: Python's smtplib is synchronous. Keeping it reliable inside FastAPI's async routes required careful exception handling and rollback logic so a failed email never creates a zombie user account.
  • Squad approval flow: Building pending/approved member states with real-time refresh without WebSockets required utilizing polling and manual refresh instead.

Accomplishments

  • Built an end-to-end AI pipeline that turns an Instagram post into a structured calendar event with no human intervention.
  • Implemented a working email verification and resend flow (fixed during the hackathon).
  • Built the "Squads" feature entirely from scratch, including invite codes, public/private toggles, and owner approval.
  • Successfully deployed with Supabase Postgres and runs locally via Docker Compose.

What We Learned

  • Gemini's structured output (with response_schema) is extremely reliable for extraction tasks when given a tight Pydantic model.
  • Mastered FastAPI and async SQLAlchemy patterns for transactional safety (flush → send email → commit or rollback).
  • Realized that building social coordination features (like Squads) requires significantly more state management than it initially appears.

What's Next

  • Push notifications when a followed club posts a new event.
  • Squad event planning to allow members to vote on which events the squad attends.
  • Expand sources beyond Instagram to include Discord announcements and club websites.
  • UCF SSO / MyUCF integration for automatic club membership import.

Built With

Share this project:

Updates