House of Edtech Full-Stack Developer Assignment - December 2025
Built with β€οΈ by Jayaram Uday | LinkedIn
Hey there! π Welcome to ConvoFlow - a real-time chat app that I built from scratch to show what I can do with modern web technologies. It's got everything: instant messaging, AI-powered features that actually make sense, and it's deployed and ready to use. Think of it as WhatsApp meets ChatGPT, but built by one developer in a couple of weeks!
- π¬ Real-time Messaging - Messages appear instantly, like magic. No refresh needed!
- π₯ Chat with Anyone - Start one-on-one conversations or create group chats
- π Actually Secure - Your password is encrypted, sessions are protected, and nobody can read your chats but you
- π Find Your Friends - Search for users and start chatting right away
- π± Works Everywhere - Looks great on your phone, tablet, or desktop
- π¨ Easy on the Eyes - Clean dark theme that won't burn your retinas at 2 AM
- π€ Smart Reply Suggestions - Stuck on what to say? AI suggests natural responses based on your conversation
- π Conversation Summaries - Too lazy to read 100 messages? AI gives you the TL;DR
- π― Context-Aware - The AI actually understands your conversation flow, not just random words
- ποΈ Meeting Detection - Mention a time? AI catches it and offers to set a reminder
- βοΈ Typing Indicators - See those three dots when someone's typing? Yeah, we got that
- π’ Online Status - Green dot means they're online, gray means they're probably sleeping
- π Smart Notifications - Never miss important messages with our notification system
- π¨ Zero Delay - WebSocket magic means messages fly back and forth instantly
- π Search Everything - Find that one message from last week in seconds
- π No Boring Spinners - Skeleton loaders that actually look good
- π Smart Timestamps - "2 mins ago" is easier to read than "14:32:18"
- β¨ Buttery Smooth - Animations and transitions that feel native
- π± Sidebar That Knows When to Hide - Collapses on mobile, expands on desktop
- π Next.js 15 - Using the latest App Router because we're cool like that
- ποΈ MongoDB - NoSQL database that scales with your app
- π Socket.IO - The secret sauce for real-time magic
- π 100% TypeScript - Zero 'any' types. I said what I said.
- β‘ Actually Fast - Server-side rendering and smart code splitting
- Next.js 15 - The React framework that makes everything easier
- React 19 - Fresh off the press with the latest goodies
- TypeScript - Because JavaScript without types is chaos
- Tailwind CSS - Styling without leaving your HTML (it's amazing, trust me)
- Shadcn/ui - Pre-built components that don't look generic
- Lucide Icons - Icons that actually look modern
- Next.js API Routes - APIs that live right next to your frontend
- MongoDB - Database that speaks JSON natively
- Mongoose - Makes MongoDB queries look like poetry
- NextAuth v5 - Authentication that actually makes sense
- Socket.IO - Real-time connections that just work
- Custom Node Server - Because Socket.IO needed a proper home
- Google Gemini AI - The brain behind those smart features
- ESLint - Keeps my code clean (whether I like it or not)
- Git - Time machine for code
- TypeScript - My personal code quality inspector
- Node.js 18 or newer (the engine that runs JavaScript outside browsers)
- MongoDB - Either install it locally or use MongoDB Atlas (it's free!)
- Git - For cloning the repo (you probably have this already)
- A Google Gemini API Key - Free to get at Google AI Studio
1. Grab the code
git clone https://github.com/jayaramuday/convoflow.git
cd convoflow2. Install all the dependencies (this might take a minute)
npm install3. Set up your environment variables
Create a .env.local file in the root folder:
# Your MongoDB connection string
MONGODB_URI=mongodb://localhost:27017/convoflow
# NextAuth stuff (generate the secret by running: openssl rand -base64 32)
NEXTAUTH_SECRET=your-super-secret-key-here
NEXTAUTH_URL=http://localhost:3000
# Your Gemini API key from Google AI Studio
GEMINI_API_KEY=your-gemini-api-key-hereHow to get your Gemini API Key:
- Head to Google AI Studio
- Sign in with your Google account
- Hit "Get API Key" β "Create API key"
- Copy it and paste into your
.env.localfile
4. Set up MongoDB (pick one)
Option A: Run it locally
# If you're on macOS:
brew install mongodb-community
brew services start mongodb-community
# The database will create itself when you first run the appOption B: Use the cloud (easier!)
- Make a free account at MongoDB Atlas
- Create a new cluster (they'll walk you through it)
- Grab your connection string
- Pop it into
.env.localasMONGODB_URI
5. Fire it up!
npm run devOpen http://localhost:3000 and you're in! π
Getting Started:
- Sign up - Hit that "Sign Up" button and create your account
- Find friends - Use the search button (top right corner with the magnifying glass) to find other users
- Start chatting - Click on anyone to start a conversation
- Watch the AI magic - As you chat, you'll see smart suggestions pop up
Cool Things to Try:
- Click the β¨ sparkle button in any chat to get AI-powered reply suggestions
- Hover over message timestamps to see the full date and time
- Try the keyboard shortcuts (Cmd/Ctrl+K opens search!)
- The AI automatically spots when you're scheduling meetings
- Your read receipts update in real-time - no refresh needed
- Dark mode is built-in because who likes being blinded at 2 AM?
Here's what's happening under the hood:
Authentication:
POST /api/auth/signup- Create a new accountPOST /api/auth/signin- Log into existing account
Users:
GET /api/users- Get all users (for the search feature)GET /api/users/:id- Get a specific user's info
Conversations:
GET /api/conversations- All your conversationsPOST /api/conversations- Start a new conversationGET /api/conversations/:id- Get a specific conversationDELETE /api/conversations/:id- Delete a conversation
Messages:
GET /api/conversations/:id/messages- All messages in a conversationPOST /api/conversations/:id/messages- Send a messagePATCH /api/conversations/:id/messages/:messageId- Mark message as readDELETE /api/conversations/:id/messages/:messageId- Delete a message
AI Features:
POST /api/ai/generate- Get AI suggestions for replies
Real-time Events (Socket.IO):
message:new- Someone sent a messagemessage:read- Someone read your messageuser:online- User came onlineuser:offline- User went offline
convoflow/
βββ server.js # Custom Node.js server that makes Socket.IO work
βββ public/ # Images, icons, all that static stuff
βββ src/
β βββ app/
β β βββ api/ # All the backend magic
β β β βββ auth/ # Login and signup stuff
β β β βββ conversations/ # Chat management
β β β βββ users/ # User management
β β β βββ ai/ # AI features powered by Gemini
β β βββ auth/ # Login and signup pages
β β βββ dashboard/ # The main chat interface (this is where you'll spend your time)
β β β βββ page.tsx # Dashboard with all the bells and whistles
β β βββ layout.tsx # Root layout with dark theme enabled
β β βββ page.tsx # Landing page
β β βββ globals.css # Global styles
β βββ components/
β β βββ chat/ # Chat-specific components
β β β βββ conversation-list.tsx # Sidebar with unread badges & online status
β β β βββ message-list.tsx # The actual messages with hover effects
β β β βββ message-input.tsx # Where you type (with typing indicators!)
β β β βββ message-skeleton.tsx # Pretty loading states
β β β βββ new-chat-dialog.tsx # Modal to start new conversations
β β βββ ui/ # Reusable UI components (buttons, inputs, etc.)
β β βββ providers/ # React context providers for session management
β βββ lib/
β β βββ auth.ts # NextAuth configuration
β β βββ auth.config.ts # Auth options and settings
β β βββ mongodb.ts # Database connection
β β βββ models.ts # Database schemas (what data looks like)
β β βββ socket.ts # Socket.IO client setup
β β βββ gemini.ts # Google AI integration
β β βββ utils.ts # Helper functions
β βββ types/ # TypeScript type definitions
β βββ middleware.ts # Auth middleware (protects routes)
βββ .env.local # Your secret environment variables (don't commit this!)
βββ next.config.ts # Next.js configuration
βββ tailwind.config.ts # Tailwind configuration with dark mode
βββ tsconfig.json # TypeScript configuration
Security might sound boring, but it's super important. Here's what I built in:
For Your Account:
- NextAuth v5 with JWT sessions (the industry standard)
- Passwords hashed with bcrypt - nobody can read them, not even me!
- Protected routes - you can't access the chat without logging in
For Your Data:
- MongoDB with proper connection handling and retry logic
- All secrets stored in environment variables (never hardcoded)
- Server-side validation on every request
- No sensitive data exposed to the client
Future Plans:
- Rate limiting to prevent spam
- End-to-end encryption for messages
- Two-factor authentication
Something not working? Here's a quick troubleshooting guide:
- Check your
.env.localfile - Make sure all the variables are set correctly - Is MongoDB running? - Try
mongoshto check if it's up - API key valid? - Test your Gemini API key at Google AI Studio
- Build errors? - Run
npm run buildto see detailed error messages - Port conflicts? - Make sure ports 3000 and 3001 aren't already in use
Still stuck? No worries! Open an issue on GitHub with:
- What you were trying to do
- What happened instead
- Any error messages you saw
- Your Node.js version (
node --version)
I'll do my best to help! π
Messages appear instantly, typing indicators show up in real-time, online status updates automatically - no refresh needed!
- Smart Replies: Click the β¨ button to get 3 AI-generated reply suggestions that actually make sense
- Conversation Summaries: Long conversation? Hit "Summarize" for a quick AI-generated overview
- Meeting Detection: The AI automatically spots when you're scheduling meetings and highlights them
- Context-Aware: The AI understands who said what and knows the conversation flow
- Smooth Loading: Beautiful skeleton loaders instead of boring spinners
- Keyboard Shortcuts: Cmd+K for search, Escape to close stuff
- Hover Effects: Full timestamps show up when you hover over messages
- Dark Theme: Easy on the eyes with cyan accents that pop
- Buttery Animations: Everything transitions smoothly
- Unread Badges: See exactly how many unread messages you have
- Online Status: Green dots show who's currently available
- Conversation Search: Find chats quickly with the search bar
- Mobile Responsive: Works great on phones, tablets, and desktops
Things I'd love to add if I had more time:
- Voice messages (because typing is so 2020)
- File and image sharing (memes, anyone?)
- Video calls (Zoom who?)
- Message reactions (π, β€οΈ, π all that fun stuff)
- Reply to specific messages (threading)
- Read receipts with checkmarks (ββ)
- Edit/delete messages (for those "oops" moments)
- Push notifications (so you never miss a message)
- Group chats (talk to multiple people at once)
- User profiles with avatars (make it personal)
- Theme customization (not everyone loves dark mode)
- Export chat history (for memories)
- End-to-end encryption (for privacy)
This started as a job assignment, but I'm totally open to making it better! Found a bug? Have a cool idea? Here's how to jump in:
- Fork it - Make your own copy
- Branch it -
git checkout -b feature/YourCoolFeature - Code it - Work your magic
- Test it - Make sure everything still works
- Push it -
git push origin feature/YourCoolFeature - PR it - Open a Pull Request and tell me what you built!
No contribution is too small - even fixing typos helps! π
Ready to put this live?
- Push to GitHub - Make sure your code is on GitHub
- Go to Vercel - Sign up at vercel.com (free tier works great!)
- Import Project - Click "New Project" and select your repo
- Add Environment Variables:
MONGODB_URI- Your MongoDB connection stringNEXTAUTH_SECRET- Runopenssl rand -base64 32to generateNEXTAUTH_URL- Your Vercel URL (like https://your-app.vercel.app)GEMINI_API_KEY- Your Google AI Studio API key
- Deploy! - Click deploy and wait ~2 minutes
Note: For production with lots of users, consider deploying Socket.IO separately on Railway or Render for better WebSocket support.
Your data is safe! Here's how:
- Passwords: Hashed with bcrypt (nobody can read them, not even me)
- Authentication: JWT tokens in HTTP-only cookies
- Authorization: You can only see YOUR conversations
- Input Validation: Everything gets checked before saving
- XSS Protection: React automatically escapes dangerous content
- NoSQL Injection: Mongoose parameterized queries prevent attacks
- HTTPS: All production traffic is encrypted
Built for House of Edtech Full-Stack Developer Assignment
Core Requirements:
- β Next.js 15 + React 19 + TypeScript
- β Full CRUD operations (Users, Conversations, Messages)
- β User authentication with JWT
- β Responsive UI with Tailwind CSS
- β MongoDB database with Mongoose
- β Production deployment on Vercel
Bonus Features:
- β Google Gemini AI integration (smart replies, summaries, meeting detection)
- β Real-time chat with Socket.IO (instant messaging, typing indicators, online status)
- β Advanced UI/UX (search, notifications, keyboard shortcuts)
- β Comprehensive security measures
- β Clean, documented, type-safe code
This project is licensed under the MIT License - which basically means you can do whatever you want with it. Fork it, modify it, learn from it, break it, sell it (though I doubt anyone would buy it π). Just don't blame me if something goes wrong!
See LICENSE for the boring legal stuff.
Huge thanks to these amazing tools that made this possible:
- Next.js & React - For making frontend development actually fun
- MongoDB & Mongoose - For flexible data storage
- Socket.IO - For the real-time magic
- Google Gemini AI - For making my app look smart
- NextAuth - For making authentication bearable
- Tailwind CSS - For making CSS not suck
- Shadcn/ui - For beautiful components out of the box
- Vercel - For deployment that "just works"
I built ConvoFlow in two weeks as part of a technical assignment for House of Edtech. The challenge was to create a production-ready chat application that shows off:
- Full-stack development chops
- Real-time communication
- AI integration
- Clean, maintainable code
- Actual deployment (not just localhost!)
It was intense, fun, and I learned a ton along the way. Spent way too many late nights debugging Socket.IO, but hey, that's what coffee is for! β
If you're evaluating this for the job - thanks for taking the time to check it out! I hope you enjoy exploring it as much as I enjoyed building it. π
Questions? Feedback? Just want to say hi?
Jayaram Uday
- π GitHub: @jayaramuday
- πΌ LinkedIn: jayaramuday
- π Project: https://github.com/jayaramuday/convoflow
- π Live Demo: https://convo-flow-xi.vercel.app
Made with β, π΅, and way too many late nights by Jayaram Uday
P.S. - If you made it this far, you're awesome! Give the repo a β if you learned something!