✱ ANGELINA WU

Goodreads Wrapped

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

View live site

Goodreads Wrapped — cover image

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!

Screenshot of Goodreads' existing Year in Books page — a static webpage with no shareable graphicsScreenshot of Goodreads' existing Year in Books page — a static webpage with no shareable graphicsScreenshot of Goodreads' existing Year in Books page — a static webpage with no shareable graphics

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.

Design process
Coding process

Working in parallel with design (in Figma) and code (in Cursor).

How it works

1

Enter a Goodreads ID

Users provide the numeric ID from their public Goodreads profile URL.

2

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.

3

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.

Illustrations used in the 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.

Card: Books read
Card: Top books
Card: Genres

Each card is a self-contained poster.

Downloadable share card

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.

Card sequence storyboard

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.

Social share 3

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.
LET'S DRAW TOGETHER IN THIS FOOTER :)
BRUSH
ERASER