NovaReads: Building My First ML-Powered Book Recommendation System (As a Final Year Project)


Just wrapped up a major milestone: defending my final year project. And honestly, it’s been a wild ride. Now that the adrenaline's calming down (a bit), I figured it’s time to share what my team and I personally brought to life. This post isn’t some polished case study. Instead, it’s me, a curious software developer who dove headfirst into mixing machine learning with a passion for books. So, here’s my story about building NovaReads, a book recommendation platform with a few quirks and a lot of learning.
What Is NovaReads?
Picture this: a book lover’s nook that speaks two languages English and Amharic and helps you find your next read without endless scrolling or guesswork.
NovaReads is exactly that but also more. The platform features:
Book previews to browse before committing
Community discussions (think book clubs, but digital)
User ratings and reviews
Personal recommendations based on your tastes
Profile preferences to tailor your experience
An admin dashboard for managing content
Notifications to keep you looped in
Behind the scenes? It’s a mixed bag of technologies stacked to work seamlessly:
Frontend: React + TailwindCSS + Framer motion
Backend services: Node.js with Express, and Flask running the machine learning magic
Databases: MySQL for our Amharic books, MongoDB managing users and discussions
Kafka: To power real-time notifications and inter-service messaging
Hosted across Netlify (frontend), Render (backend & ML), and AlwaysData (databases)
All English books are pulled in via the Google Books API, while Amharic titles come from our own MySQL database. We went with a microservices architecture, a pretty ambitious move but it made the whole system modular and scalable.
What Makes NovaReads Different?
Dual language support. Making Amharic books accessible alongside English ones is close to my heart and pretty rare in mainstream apps.
Real-time features driven by Kafka. Notifications pop up live, community chats update instantly, and the admin can get reports without breaking a sweat.
Microservices everywhere. Even as students, we wanted to model a production-level architecture to understand what it takes to tie multiple services together asynchronously.
Personalized recommendations powered by a simple but effective k-NN algorithm. It’s not perfect, but it does give you suggestions that make sense based on what you like.
The whole stack is deployed and running across different services, with the frontend live on novareads.netlify.app and code available on GitHub.
Breaking Down the ML Recommendation System (No Jargon, Promise!)
Okay, imagine every book as a dot on a big map. This map isn’t geography-based but built from features like:
Title words
Genre tags
Descriptions
Ratings
Page count
Before mapping, we “vectorize” these features. Think of turning each book’s qualities into numbers so they can be plotted as coordinates. It’s like plotting your favorite coffee shops on a city map—not by address, but by how salty their snacks are, how strong their espresso is, and how comfy the seating feels.
Once we have this map, we measure distances between points. If you love a certain book, the k-Nearest Neighbors (k-NN) algorithm finds other books lying close to it, assuming they’ll tick your boxes too.
But here’s the trick: we make sure features like ratings or page count are on the same scale, so one doesn't overpower the others. Like making sure no single coffee shop trait (like espresso strength) drowns out the vibe factor.
In short: we turn book features into numbers, find what’s nearby your favorites on the map, and recommend those.
Challenges, Because Nothing’s Ever Easy
Google Books API had other plans. Rate limits hit us hard. The team had to strategically throttle our requests or just sit tight while the API chilled. Not exactly fun when you’re racing against deadlines.
Context management turned into a spaghetti monster. As features piled up, sharing data across React components was a puzzle. We wrestled with hooks and contexts before finding balance.
The ticking clock. Building a whole multi-service system with ML components, databases, real-time messaging, and UI polish — all in a semester.
What’s Next for NovaReads?
There’s always more to do! What we have now:
- Content-based filtering recommendations (the “looking for similar books” kind)
What’s coming:
Collaborative filtering (recommendations based on what people like you enjoy)
More advanced Kafka event handling to deepen real-time interactions
Better UI polish (there’s always more polish)
Finally
This was my first real dive into machine learning actually building something that used it in production, alongside a stack of other tech. The project was chaotic and amazing, teaching me much beyond just coding: teamwork under stress, how services chat asynchronously, and what it takes to put a platform live and keep it humming.
If you’re tinkering with ML, microservices, or just love books and tech mashups, I’d love to connect. Maybe check out the project here on GitHub or try the frontend at novareads.netlify.app. Feedback or stories? Hit me up.
Thanks for reading hope it gave you a peek into the messy, exciting world of building something from scratch with a little algorithm magic.
Subscribe to my newsletter
Read articles from Abenezer Teshome directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Abenezer Teshome
Abenezer Teshome
MERN Stack & Next.js Enthusiast A computer science student sharing my development journey and connecting with fellow devs to grow together.