Štivoje: My Personal Book Recommender 🤖

“Found some stories you might want to dig into! 🐛” – Every Saturday morning, I get an email like this. It’s from Štivoje, my personal book recommender, powered by machine learning.

I fed Štivoje with 334 books I liked, so that he suggests 5 new books for me, out of 52.5k titles. The project took about 9 hours over 2-3 days. This is how it got done.

The Goal / Idea

I’ve been wanting to learn in public and develop my AI/ML skills, so I’m looking for interesting side projects. For the first one, I landed on building a personal recommendation system for books. It was a nice starting point and a great way to develop some NLP skills.

All in all, I had a three-fold goal:

  • Learn about
    • NLP-based recommendation systems built with Python
    • n8n workflows and automation
    • basics of Git
  • Build a personal book recommender (Štivoje) to get good book suggestions every week or so
  • Showcase the project and interact with like-minded people

Building Štivoje

1. ‘Taste profiles’ Comparison – TF-IDF vectorization with Python

I needed a Python script that will:

  • take data on 334 books I liked
  • take data from the book dataset covering ~52k most popular titles from Goodreads
  • make vectors for my book taste + each book
  • calculate cosine similarity, effectively predicting what titles I will like (the higher the similarity, the higher probability I will like a title)

Once done, I picked the top 2%, or around 1000 book titles.

2. Making Štivoje Alive – Building n8n Workflow

Next, I built a simple n8n flow to make Štivoje select 5 random books from the list and send me a cute email containing the recommended titles every Saturday morning.

What surprised me in this phase was the amount of ‘admin work’ (like GCP permissions, DNS settings), and debugging annoying little issues 15x times (like getting n8n to process code as expressions versus ‘pasting’ it in email as literal text).

In the end, it was very rewarding to receive actual emails with real books based on my personal taste from Štivoje.

Shout-out to my friend Vlad who introduced me to n8n (and kindly lets me use his self-hosted instance for my projects!)

* Project Management

I decided to keep it very simple and use a single Trello board with TO DO, IN PROGRESS, DONE columns and labels for weeks (e.g. week 2-3 etc.)

The initial breaking down of the project into weeks and tasks was done with the help of Gemini. As I was actually working on the project, the timeline changed drastically – as well as my approach.

I adapted to this and used my Board as a living document.

If you want to learn why estimating (software) projects is hard, I recommend a book I really liked: How Big Things Get Done: The Surprising Factors That Determine the Fate of Every Project, from Home Renovations to Space Exploration and Everything In Between. Štivoje approved.

Tools & Tech Stack

INFRASTRUCTURE AND TECHBackend and workflows – n8n
DatabaseGoogle Sheets
Programming Language – Python (main), JavaScript (a bit in n8n)
Logic / ML – scikit TF-IDF
Code managementGoogle Colab (main); GitHub (long-term store)
DATASETSBest Books Ever Dataset” – 52478 records corresponding to books on the GoodReads Best Books Ever list

334 books I rated with 4 or 5 out of 5
PROJECT MANAGEMENTTrello
MISCBrainstorming, image, text, and code (co-)creationGemini, ChatGPT

TimetrackingTopTracker

Learnings

Working on Štivoje taught me that NLP isn’t a boogeyman.

I learned how to turn book data into vectors with TF-IDF in Python, compare them with cosine similarity, and make n8n do the heavy ‘backstage’ lifting so I get fresh picks emailed to me every Saturday.

Although I have worked on many software projects as product manager, it was interesting to really experience from the dev perspective how you break down a technical goal/theme into more manageable, smaller tasks and iterate, from development perspective (vs. breaking down the larger themes from ‘product perspective’)

Importantly, I’ve developed a tolerance for making errors and debugging a lot, which is important for this type of work.

Shout-out to Joao Diogo de Oliveira, my mentor, who encouraged me to explore different projects and learn hands-on.

Potential Next Steps


Make smarter

I might play with weighting somehow (e.g., “more points if it’s non-fiction by my favorite author”) to fine-tune the taste match.

Thinking about feedback loops (e.g. if I am un/happy with some suggestion)

Saving previous suggestions (so I have a reference point to make sure the same book is not recommended twice in a given timeframe)…
and excluding already read books from the recommendations

Improve the dataset: clean and tidy up what I have + expand with newer book data

Make prettier

Making a more delightful experience overall would be nice. I could include book covers and/or Goodreads links to suggestions. Maybe make an email address for Štivoje? etc.

Pivot

Re-purpose existing code/processes for movie, song, or TV show recommendations


Even better, try a hybrid across ‘verticals’: I know your taste in books, here are recommended songs…
or take it even further: I know your books, here are travel destinations you will like

Re-Package into a ‘micro-SaaS

Maybe I’ll vibe-code a web app in Loveable or Replit so anyone can upload their own data and get a Štivoje of their own

Who knows, your next favorite recommendation might come from Štivoje v2.0! ✨

Sidenotes

  • Shout-out to my nephew for populating those 334 books with descriptions and genre data (sidenote: he was fairly remunerated for the work:)
  • Featured image and Štivoje illustrations were created with the help of GenAI
  • If you have interesting project ideas or would like to collaborate with me, don’t be shy – add me on LinkedIn or schedule a call


Posted

in

by

Tags: