Inspiration

University events are everywhere, club fairs, workshops, speaker nights, study sessions, but the tooling hasn’t caught up. A lot of clubs still rely on Google Forms and scattered Instagram/Discord posts, which leads to poor discovery, messy registration, and no real “source of truth” for an event. We also noticed that while platforms like Luma are great, they’re designed for the public internet, many campus events are meant to be targeted to a school community, not broadly public or searchable. Lumina was inspired by the idea of “Luma, but campus-first and privacy-first.”

What it does

Lumina is an event platform for universities where events are campus-scoped by default. Clubs can create event pages with clear details and registration, and choose visibility options like campus-only / unlisted / members-only so events stay targeted to students. Students get a clean place to discover events and RSVP without filling out yet another Google Form link. It’s designed to feel like a real campus product, fast, mobile-friendly, and installable as a PWA.

How we built it

We built Lumina as a TypeScript monorepo using a modern web stack:

  • Frontend: React + Vite + TanStack Router for routing, TanStack Query for caching and data fetching, TailwindCSS + shadcn/ui for UI
  • API: Hono + tRPC for end-to-end type-safe APIs between the web app and server
  • Auth: Better Auth for authentication flows and session handling
  • Database: PostgreSQL with Drizzle ORM for schema + queries
  • Infra/Deploy: Cloudflare via Alchemy for deployment
  • Tooling: shared workspace packages (@repo/*) + TypeScript + Biome for consistency and speed

Challenges we ran into

  • Designing “campus-only” as a real product constraint: it’s not just a toggle — it affects sharing, discovery, and how you prevent events from being “public by accident.”
  • Balancing privacy with usability: we wanted links to be shareable in group chats while still keeping events inside the university context.
  • Integrating multiple systems quickly: routing, caching, typed APIs, auth, and DB all touch the same flows — moving fast while keeping types aligned took discipline.
  • Hackathon realities: tightening scope and focusing on the flows that best demonstrate the problem/solution (create → share → RSVP) instead of trying to build everything.

Accomplishments that we're proud of

  • A production-shaped architecture (typed API + auth + DB + deploy) rather than a throwaway demo.
  • End-to-end type safety with tRPC, which made it easier to iterate quickly without breaking contracts.
  • A clean, modern UI foundation using Tailwind + shadcn/ui with a responsive experience.
  • PWA support, making Lumina feel like a real campus app students could keep on their phone.
  • A clear product story: “Events that stay inside your university.”

What we learned

  • Product constraints like privacy and audience targeting are features, not afterthoughts — and they shape everything from UX to backend rules.
  • Type-safe stacks drastically reduce coordination overhead in a team sprint: fewer bugs, faster refactors, easier parallel work.
  • The best hackathon demos come from nailing a few core flows end-to-end (not shipping a dozen half-finished features).
  • Deployability matters: having a real deployment path changes how you build and what you prioritize.

What's next for Lumina

  • University verification: enforce campus-only access using verified university email domains / SSO integrations.
  • Better discovery: campus feed, categories, search, calendar view, and personalized recommendations.
  • Club tooling: member roles, recurring events, templates, attendee exports, check-in/QR scanning at the door.
  • Integrations: ICS calendar sync, reminders, and optional Discord/Slack announcement hooks for clubs.
  • Safer sharing controls: clearer “unlisted vs campus-only vs public” UX and defaults that prevent accidental public exposure.
  • Analytics: basic insights for clubs (views → RSVPs → attendance) to help them run better events.

Built With

Share this project:

Updates