Goodreads Wrapped
A playful reading year summary, delivered to 5000+ users.

MY ROLE
Product Designer & Full-Stack Engineer
TIMELINE
August – December 2025
TEAM
Me!
TOOLS
Next.js (TypeScript, Tailwind, Motion.dev), Figma, Paper, Vercel
Why build this?
Every December, year-end recaps from Spotify, YouTube, and other platforms flood our social feeds. But not for Goodreads, the largest reading community on the internet: its attempt at a year-end summary, the "Year in Books," is a simple static webpage, lacking both the shareability and design polish of its competitors.
I'm an avid reader myself, and every year I'd find myself manually scrolling through my Goodreads trying to remember what I read. I wanted something that celebrated a year of reading, surfaced those stats, and felt designed for sharing. So... I built it!



Goodreads' current "Year in Books".
Design-code collaboration
Goodreads Wrapped was built with an AI-integrated approach. Rather than a linear design-to-code pipeline, I iterated fluidly between design and engineering: sketching layouts in Figma and Paper while agents built components in code, then refining the live product as I saw how the designs actually felt on a phone screen.
Working this way let me explore more ideas faster. The ability to immediately test components with real Goodreads data allowed me to iterate quickly and see where the design needed adjustment.


Working in parallel with design (in Figma) and code (in Cursor).
How it works
Enter a Goodreads ID
Users provide the numeric ID from their public Goodreads profile URL.
Pull the public shelf
A server-side job reads the user's public "read" shelf via RSS, extracting personal reading stats for the current year. Then it does light, targeted scraping for genre data RSS doesn't include.
Generate the recap
The data is aggregated into a sequence of Spotify-Wrapped-style cards.
Design Decisions
Every design choice traced back to one goal: make a year of reading feel worth celebrating and worth sharing. That meant a visual identity that felt personal rather than corporate, and a format built to travel well outside the app itself.
Pictures worth a thousand words
Most Wrapped-style recaps default to bold, modern design patterns. But I wanted Goodreads Wrapped to feel like something you'd find inside a book, not on a streaming app. I pulled public-domain scans of vintage book illustrations from Old Book Illustrations to build a small library of motifs that could carry the whole product.

Real vintage illustrations used in the final product.
Designed for the screenshot
To encourage shareability, every card was designed as a self-contained poster first, and a screen second. That meant bold typography for smaller devices, generous margins so nothing gets cropped by Instagram Stories, and a final downloadable summary card that stitches the highlights together in a single image.



Each card is a self-contained poster.

The last card is a single downloadable image that captures the whole year at a glance, which users can screenshot, post, and text to their friends.
This card was designed for social sharing, ensuring it looked great whether shared on social media or sent via text message.
A story, not a dashboard
The card order was as important as the cards themselves. Instead of dumping every stat on one screen, the recap builds like a short story, opening with more general stats and closing with more personal ones. Each card earns the next.

The full card sequence, in order: volume → taste → personal closer.
Engineering Highlights
Goodreads Wrapped is a Next.js app deployed on Vercel. Since Goodreads doesn't offer a public API anymore, the heart of the project is a server-side pipeline that reads each user's public shelves via RSS.
Zero-API data pipeline
Pulls public Goodreads RSS feeds for book metadata, then augments with targeted page scraping for genre classification. Staggered request delays are used to stay respectful of server load.
Native-quality sharing
Exports the final recap card as a high-res image, using navigator.share on mobile for native save-to-Photos behavior.
Personality-driven analytics
Derives metrics like a "dependability" score (how often you read what you save) and "biggest fan/hater" moments by comparing user ratings against global averages.
The Result
Goodreads Wrapped turns any public Goodreads profile into a story-format, screenshot-ready recap in seconds, with a fun sequence of personal stats and a downloadable share card at the end. Try it yourself at goodreadswrapped.com!
My own 2025 Goodreads Wrapped (don't judge!)
Launch & Impact
Goodreads Wrapped launched in December 2025 and reached 5,000+ users within its first 30 days. It spread organically through book communities on social platforms such as Instagram, Twitter, and Reddit, as well as through word-of-mouth.

Reflections
Shipping solo is its own design constraint.
- Owning design, engineering, and launch end-to-end forced me to scope ruthlessly. Every feature had to earn its place, which made the final product tighter and more intentional.
Design for the screenshot.
- The recap exists to be shared. I had to adjust my typical design strategy to ensure that every page looked good not just on a screen, but also on social media.
Building on someone else's platform requires care.
- Relying on a third party's public data means thinking about fragility, rate limits, and user privacy from day one. Leaning on RSS wherever possible, keeping the remaining scraping minimal and rate-limited, and messaging clearly when a profile is private kept the project honest.