About the Project
Inspiration
As a student at Rutgers University–Newark, I noticed a common problem: students join dozens of clubs during orientation but never attend any. I missed events, couldn't find study partners in my courses, and had no centralized way to discover what's happening on campus. I wanted to build something that felt intuitive for campus life.
What it does
RU Connected is an AI-powered student hub that uses Google Gemini to personalize the entire campus experience. It matches students with relevant clubs, events, and classmates based on their major, courses, and interests. The app features five core experiences:
- Discover — Swipe through AI-ranked organizations and events
- Connect — Find classmates matched by Gemini based on shared courses and interests
- AI Search — Ask anything about campus life and get instant, contextual answers powered by Gemini with ElevenLabs voice responses
- Inbox — Message connections and receive outreach from campus organizations
- Profile — Build your student profile to power all AI matching
How I built it
I built RU Connected as a mobile-first web application using the TurboStarter monorepo framework. The tech stack includes:
- Next.js 16 with App Router for the frontend
- Google Gemini 2.5 for AI-powered matching, search, and student recommendations
- ElevenLabs for natural text-to-speech voice responses
- Hono as a lightweight API framework
- Drizzle ORM with PostgreSQL (hosted on Neon) for the database
- Better Auth for authentication
- Motion (Framer Motion) for swipe card animations
- Tailwind CSS for the dark-mode UI, deployed on Vercel
The AI matching engine generates embeddings of student profiles using Gemini's text-embedding-004 model, then ranks organizations, events, and peer connections using cosine similarity. The AI Search feature passes full campus context — all orgs, events, and the student's profile — to Gemini so responses are specific and actionable.
Challenges I faced
- Gemini model availability — During development, several Gemini models experienced 503 overload errors. I solved this by implementing a fallback chain (
gemini-2.5-pro→gemini-2.5-flash→gemini-2.0-flash-lite) with automatic retry logic. - Controlling AI response length — Getting Gemini to consistently return short, structured JSON responses required aggressive prompt engineering with strict word limits and format rules.
- ElevenLabs browser autoplay — Browsers block autoplay audio, so I added a visible "Listen" button as a fallback alongside auto-play attempts.
- Real campus data — I seeded the app with verified Rutgers Newark organizations (Girls Who Code, RAD, Career Resources) and realistic student profiles to make the demo feel authentic.
What I learned
- How to integrate multiple AI services (Gemini for text/embeddings, ElevenLabs for voice) into a cohesive product
- The importance of prompt engineering — small changes in system prompts dramatically affect output quality
- Building mobile-first web apps that feel native using CSS and motion animations
- Managing a full-stack monorepo with shared packages across web, API, and database layers
Built With
- ai
- auth
- better
- css
- drizzle
- elevenlabs
- framer
- gemini
- hono
- motion
- neon
- next.js
- orm
- postgresql
- react
- tailwind
- turborepo
- turbostarter
- typescript
- vercel
Log in or sign up for Devpost to join the conversation.