"Books don't talk. We do." — How I Finally Shipped the College Project I Almost Abandoned
This is a submission for the GitHub Finish-Up-A-Thon Challenge
What I Built
Semester 5. Advanced Technologies subject. The brief: build a full MERN application from scratch.
I built ShelfTalk — a social platform for book lovers. Book clubs, real-time chat, live synchronized reading sessions, discovery, profiles. Think Goodreads meets Discord, built solo in a college semester.
I submitted it. Passed the course. Closed the laptop.
Then it sat on GitHub for months, untouched, with a tagline nobody ever read and features that half-worked on localhost and nowhere else.
The GitHub Finish-Up-A-Thon gave me the deadline I'd been avoiding.
🔗 Live: shelftalk-community.vercel.app
🐙 GitHub: github.com/JaniDhruv/ShelfTalk
Demo
Create an account and open two tabs — real-time chat and the Live Reading Room are best experienced with a second window.
The Comeback Story - What Was Broken vs What Ships Now
When I submitted ShelfTalk for my final grade, the codebase was held together by duct tape. It was good enough to pass, but not good enough to ship. Here is how I tore it down and rebuilt it for production:
Real-Time Chat — rebuilt from scratch
Ripped out the REST polling and replaced it with a full Socket.io implementation. Messages now deliver instantly. Presence indicators show who's online. Group chats stay synced across all members without a single refresh.
Live Reading Rooms — brand new feature
This is the one I always wanted to build but ran out of time for. A book club can start a synchronized reading session — members join, update their page in real time, drop spoiler-safe emoji reactions at specific pages, and compete on a leaderboard. A community heatmap shows where everyone is clustered across the book. Built entirely during this revival.
Reading Diary — brand new feature
A personal daily reading log. Track your reading journey, your streaks, your progress. Something quiet and personal in an otherwise social app.
Push Notifications — brand new feature
Native desktop notifications for new messages, group invites, group activity, and reading room events.
Everything else that was broken — fixed
Local file uploads migrated to MongoDB GridFS. Local MongoDB migrated to MongoDB Atlas. JWT properly implemented across all protected routes. CRA migrated to Vite for dramatically faster builds. The entire app deployed to Vercel and Render — not just running on my laptop.
Key Engineering Lessons:
- State Consistency: Learned how to manage race conditions in real-time WebSockets using acknowledgment callbacks.
- Build Optimization: Successfully migrated a monolithic CRA build to Vite, reducing HMR times by 80%.
- Cloud Migration: Transitioned from a local instance to MongoDB Atlas + GridFS for production-grade file storage.
My Experience with GitHub Copilot
Copilot was the pair programmer that made this revival possible in a tight timeline.
Live Reading Rooms
The hardest part was synchronizing state across multiple clients without race conditions. I asked Copilot Chat to explain the best Socket.io pattern for this — it walked me through using acknowledgment callbacks on socket emissions to guarantee state consistency when a user joins mid-session. It then scaffolded the initial join_reading_room and page_updated event handlers that became the backbone of the entire feature.
Reading Diary
I knew I wanted a diary but wasn't sure what data actually makes it useful. Copilot Chat helped me brainstorm — daily page counts, reading streaks, mood tags, session duration — then generated the Mongoose schema structure. What would have taken an hour of documentation reading took 10 minutes.
Vite Migration
Moving from CRA to Vite surfaced a lot of subtle import errors and environment variable differences — process.env everywhere had to become import.meta.env. Copilot's inline suggestions caught most of these automatically as I typed. It knew the Vite conventions and autocompleted the correct patterns before I even looked them up.
UI Polish
The new chat bubbles, leaderboard ranking cards, reading room ambient gradients — Copilot autocompleted flexbox layouts and suggested responsive breakpoints throughout. Small wins that added up to hours saved.
Built with ☕ and too many late nights.
shelftalk-community.vercel.app
@dj29










Top comments (7)
waa your frontend is so soft, i like it! and the idea itself is too-- but! when i saw your post i thought "oh hey so we can talk with ai about books certain pages and ai itself knows the books content!" good work!
Bro, I actually wanted to do so but very first I had to shift from old versioning and CRA to Vite and then have socket.io which was too much needed for better UX. But bro, Thanks for your comment. I'll add that feature maybe using gemma 4 dense, after I get time again. But I have a question, Did you see my submission post in the entries, cause I can't find it.
Oh same goes for me either. I cant find my submission post but i think its still there for people to see. And yes i have seen your submission post in the entries.
Thank you Very much bro. I was really terrified. And bro really thankful for your suggestion. Actually, that AI chat for books you were talking about, I actually thought of it before. I wanted to have it but 1st idea was for a group to have a library and I started with Google Books API, but at that time didn't knew it only gives Book metadata and not real books so I had to go for PDF uploads and also bro, to have AI chat for books is only good when either you've yourself trained a model or you went for prompt engineering to the next level. Cause I use AI for that too but its not quite helpful for it, gives you spoilers and sometimes hallucinates to the next level.
But in future I think of adding 2-3 Book clubs that are admin handled and you can have an AI chat group there too.
You're right about hallucination being a real problem- but it's actually solvable with RAG, by filtering chunks up to the user's current page, you prevent spoilers and keep responses grounded. Pair that with BYOK so users bring their own large-context models (like Gemini 2.5 Pro or Claude with 200k context), and you get a solid, scalable architecture without bearing the inference cost yourself- Anyway, curious where you take this next!
Bro, that is actually a brilliant architecture. Filtering the vector search chunks strictly up to the user's current page is the perfect workaround for the spoiler issue—I hadn't thought of doing page-aware RAG like that to keep the LLM grounded!
And BYOK is the absolute right move. It’s the only way a feature like this scales without burning a hole in my own wallet for inference costs, especially with large-context models like Gemini or Claude.
As for where I take this next: right now, I'm fully locked in on preparing for my university's on-campus placement season starting in a few weeks. But as soon as I secure a role, V2 of ShelfTalk is absolutely getting this exact Page-Aware RAG pipeline. Thanks for the mini-masterclass in system design!
Also, I just checked out your submission—'I Built a 1920s Butler AI That Runs Entirely on My Linux Machine'. That is such a sick concept, running an agentic system entirely locally on Linux is a massive flex. Dropped a like, incredible work! 🙌
Good luck with the placement season, hope it goes well!
And thanks for checking out Bantz! butler appreciated the like 🎩 he's a bit broken still but he's trying his best