Inspiration
We've all been there — you desperately need to learn React before your internship starts, but you can't afford a $200/month bootcamp. Meanwhile, your roommate is an incredible developer who's been wanting to learn guitar for years, and you happen to play.
The solution was right in front of us the whole time: trade knowledge, not money.
We were inspired by the bartering economies of the pre-internet era, where communities thrived on mutual skill exchange. We wanted to rebuild that for the modern college campus — but smarter. With AI that actually understands why two people are a great match, not just that they share a keyword.
What it does
ExchangeSkill is a real-time, peer-to-peer skill barter platform built specifically for college students. Instead of paying for tutoring, students post what they can teach and what they want to learn, and our system finds the perfect matches.
Here's what makes it powerful:
🤖 Gemini-powered Compatibility Matching — Our AI reads both students' full profiles (bio, skills, college, goals) and calculates a bidirectional compatibility score with a human-readable explanation. It doesn't just match keywords — it understands context. 📚 AI Study Guides — Before each session, students can generate a personalized 60-minute lesson plan powered by Gemini 2.5 Flash, including a minute-by-minute timeline, hands-on mini-projects, and customized tips for both the teacher and learner. ⚡ Real-time Request System — Send swap requests, accept or decline, and get instant browser push notifications powered by Socket.io. No page refresh needed. ⏰ Session Reminders — A background cron job pings both students 15 minutes before their session through real-time sockets. ⭐ Reputation & Ratings — After each session, students rate each other (1–5 stars), building visible trust scores that influence ranking in search results. 🏆 Leaderboard — A platform-wide leaderboard ranks students by sessions completed and average rating, creating healthy competition and recognition.\
How we built it
We built ExchangeSkill as a Turborepo monorepo with two apps running concurrently:
Frontend (apps/web):
Next.js 16 (App Router + Turbopack) with TypeScript Tailwind CSS with a custom matte-black/silver 3D glassmorphism design system Space Grotesk and Space Mono fonts for a premium tech aesthetic Socket.io Client for real-time notifications Clerk Auth (with a developer sandbox bypass for local testing) Backend (apps/api):
Express.js REST API with an /api/v1 prefix and modular route structure MongoDB Atlas + Mongoose ODM for all data models (User, Skill, Session, Rating, SwapRequest) Google Gemini 2.5 Flash via @google/genai SDK for two use cases: Structured JSON matchmaking using responseMimeType: "application/json" to enforce schema-safe output Markdown generation for personalized AI study guides Socket.io Server with a clerkId → socketId user registry for targeted notifications node-cron for background session reminder schedulin
Challenges we ran into
Gemini API Free-Tier Rate Limits The free tier of Gemini API has a limit of 20 requests per day per model. During development, every page reload triggered a matchmaking call and we burned through our quota rapidly. We solved this by building a seamless fallback algorithm — when the API returns a 429 Quota Exceeded error, the system silently switches to a local keyword-overlap scoring model, ensuring the app never crashes or returns blank results for users.
Environment Variables Not Loading in Turbo Monorepo When running npm run dev from the root workspace, Node.js was picking up the wrong working directory, causing dotenv.config() to load a non-existent .env file. This made the backend silently fall back to a local empty MongoDB instance instead of our Atlas cluster. We fixed this by resolving the .env path explicitly relative to the module file using import.meta.url in ESM.
Sidebar Layout Overlap on Zoom Our original CSS used position: sticky; top: 0; z-index: 30 on the sidebar and both sticky and crosshairs-inner (a class with position: absolute; inset: 0) on the main content. When users zoomed in, the sidebar overlapped the page content. We resolved this by switching to a strict h-screen overflow-hidden flex layout where only the main
scrolls — eliminating all overlap conflicts at any zoom level.Real-time Notification Targeting Socket.io sends events by socket ID, but socket IDs change on every reconnect. We built a clerkId → socketId mapping registry on the backend so we could always address the current active socket of any user by their stable clerkId.
Accomplishments that we're proud of
Built a full-stack, production-ready app in a compressed timeline with a monorepo, real-time communications, and generative AI integrations — all working together. Designed a fail-safe AI integration that gracefully degrades on quota limits without any user-facing errors. Implemented true bidirectional matchmaking — most similar apps only match "teacher of X with learner of X." We went further by calculating a mutual compatibility score where you teach what they need AND they teach what you need, weighting that heavily. Created a sandbox developer mode that lets judges demo the entire platform with 8 pre-seeded users without needing to create accounts — all switchable via a dropdown in the header. A premium UI that feels polished and production-grade — dark matte-black theme, 3D glass card animations, crosshair corner details, and real-time animated indicators throughout.
What we learned
AI APIs are not magic — they need guardrails. Structured JSON output mode in Gemini was a game-changer for schema enforcement, but we still needed try/catch fallbacks for every call. Monorepo tooling (Turborepo) dramatically speeds up development once set up — shared configs, concurrent dev servers, and cross-app type safety are worth the initial setup complexity. Socket.io requires careful state management in multi-user scenarios. You can't assume socket IDs are stable, so user-level registries are essential for targeted delivery. dotenv path resolution is tricky in ESM monorepos — always resolve environment file paths explicitly rather than relying on implicit working directory behavior. Design systems pay dividends. Creating a complete CSS design token system upfront (colors, spacing, animation utilities) allowed us to build every page consistently and quickly.
What's next for Skill Exchange
📅 Google Calendar / Google Meet Integration — Auto-generate Calendar invites and Meet links when a session is confirmed, so students never need to manually schedule. 🗺️ Campus-Aware Matching — Filter matches by campus, dorm, or proximity for easier in-person session coordination. 🎯 Skill Verification Badges — Students can take short quizzes or get peer-endorsed to verify the skills they claim to teach, building trust. 💬 In-App Messaging — Replace the simple request system with a full chat channel between matched peers for session planning. 📊 Analytics Dashboard — Track hours taught, skills gained, and session streaks to gamify the learning journey. 🌍 Multi-University Network — Expand beyond single campuses to allow students across universities to trade specialized skills that may not exist locally.
Built With
- cors
- dotenv
- express.js
- mongoose
- react
- socket.io
- tailwind
- typesript
- zod
Log in or sign up for Devpost to join the conversation.