"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.

(Landing Page - Hero Section)
Landing page

(Login Page)
Login Page

(Posts Page)
Posts Page

(1-1 Chats)
Chat

(Groups Page)
Groups Page

(Group Chat)
Group Chat

(Group Library)
Group Library

(Reading Room)
Reading Room

(Leaderboard)
Leaderboard

(Personal Profile Diary)
Personal Profile Diary

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