2025: My reads in review

15 min read

It's been a while!

My last post was back in May 2022. A lot has changed since then, especially in the world of AI. ChatGPT didn't exist yet. Now we have AI agents everywhere. But one thing hasn't changed: I still read and track my books in Notion.

When I first started tracking my reading habits ten years ago, asking AI to generate a summary—complete with text and visuals—from just a prompt seemed far-fetched. But here we are!

My approach

I used Claude Desktop with the Notion Connector and Opus 4.5. Nothing fancy.

First attempt

It took a couple of tries to get what I wanted.

First, I started by giving Claude a link to my entire bookshelf (including books in the backlog). But it struggled to sift through hundreds of books to find the ones I finished this year. It failed to fetch the right set, so I had to nudge it in the right direction.

My first attempt at getting Claude to summarize my reading year

As it tried to find the right books, it kept going in a searching loop, and I eventually had to stop the session.

Second attempt

In the second attempt, I gave Claude a more specific link—a view of my bookshelf where finished books are already grouped by year. This time it was successful, fetching the correct list and generating a summary much more quickly.

Screenshot of Notion with the link to the bookshelf view by year

Here's the prompt I used (minus the full Notion link):

prompt
Provide an overview of the books I read in 2025:
- What kind of books did I read
- How long did it take me on average
- Are there any interesting themes or takeaways

https://www.notion.so/...

Claude's response

Claude came back with a text summary and a React component visualizing the results.

Text summary

Summary

14 books finished with an average of ~23 days per book.

What You Read

All non-fiction, with three clear categories:

CategoryBooksExamples
AI/Technology6The Worlds I See, Superintelligence, Empire of AI, The Optimist
Christian/Devotional5Keller's Romans, Galatians, Judges series
Biography/Memoir9Born a Crime, Spare, My Next Breath

Reading Pace

  • Fastest: Empire of AI & The Hundred-Page LLM Book (14 days each)
  • Slowest: Superintelligence (37 days—dense material!)
  • June was your peak month with 3 books finished

Interesting Themes

  1. You went deep on AI — Not just surface-level, but foundational texts (Bostrom), insider accounts (Hao, Hagey), and pioneer memoirs (Fei-Fei Li). This aligns with your recent interest in diffusion models.
  2. Consistent spiritual practice — The Keller devotional series shows a disciplined morning reading habit through the first half of the year.
  3. Audiobooks for memoirs — You gravitated toward audio format for personal stories (Trevor Noah, Prince Harry, Jeremy Renner), which makes sense given the conversational nature of memoirs.

Visual summary

This was the most interesting part of the experience. I didn't expect Claude to give me a rich visual summary using React.

The React visualization Claude generated

Here's the code Claude provided:

jsx
import React from 'react';

export default function ReadingSummary() {
  const books = [
    { title: "The Worlds I See", author: "Fei-Fei Li", days: 25, month: "Jan", genres: ["Biography", "Technology"] },
    { title: "Romans 1-7 For You", author: "Timothy Keller", days: 25, month: "Jan", genres: ["Christian", "Devotional"] },
    { title: "For Love of Country", author: "Tulsi Gabbard", days: 20, month: "Feb", genres: ["Biography", "Politics", "Audiobook"] },
    { title: "Romans 8-16 For You", author: "Timothy Keller", days: 24, month: "Feb", genres: ["Christian", "Devotional"] },
    { title: "Galatians For You", author: "Timothy Keller", days: 26, month: "Mar", genres: ["Christian", "Devotional"] },
    { title: "Judges For You", author: "Timothy Keller", days: 30, month: "Apr", genres: ["Christian", "Devotional"] },
    { title: "The Life of Peter", author: "Derek Thomas", days: 17, month: "May", genres: ["Biography", "Christian"] },
    { title: "Spare", author: "Prince Harry", days: 31, month: "Jun", genres: ["Biography", "Audiobook"] },
    { title: "Empire of AI", author: "Karen Hao", days: 14, month: "Jun", genres: ["Technology"] },
    { title: "The Hundred-Page LLM Book", author: "Andriy Burkov", days: 14, month: "Jun", genres: ["Technology"] },
    { title: "The Optimist", author: "Keach Hagey", days: 25, month: "Jul", genres: ["Biography", "Technology"] },
    { title: "Superintelligence", author: "Nick Bostrom", days: 37, month: "Aug", genres: ["Philosophy", "Technology"] },
    { title: "My Next Breath", author: "Jeremy Renner", days: 18, month: "Oct", genres: ["Biography", "Audiobook"] },
    { title: "Born a Crime", author: "Trevor Noah", days: 23, month: "Dec", genres: ["Biography", "Audiobook"] },
  ];

  const avgDays = Math.round(books.reduce((sum, b) => sum + b.days, 0) / books.length);
  
  const genreCounts = {};
  books.forEach(b => b.genres.forEach(g => genreCounts[g] = (genreCounts[g] || 0) + 1));
  const sortedGenres = Object.entries(genreCounts).sort((a, b) => b[1] - a[1]);

  const genreColors = {
    "Biography": "#8B5CF6",
    "Technology": "#3B82F6", 
    "Christian": "#10B981",
    "Devotional": "#34D399",
    "Audiobook": "#F59E0B",
    "Politics": "#EF4444",
    "Philosophy": "#EC4899"
  };

  return (
    <div className="bg-gradient-to-br from-slate-900 to-slate-800 min-h-screen p-8 text-white">
      <div className="max-w-4xl mx-auto">
        <h1 className="text-4xl font-bold mb-2">📚 Your 2025 Reading Year</h1>
        <p className="text-slate-400 mb-8">A look back at the books that shaped your year</p>
        
        {/* Key Stats */}
        <div className="grid grid-cols-3 gap-4 mb-10">
          <div className="bg-slate-800/50 rounded-2xl p-6 text-center border border-slate-700">
            <div className="text-5xl font-bold text-emerald-400">{books.length}</div>
            <div className="text-slate-400 mt-1">Books Finished</div>
          </div>
          <div className="bg-slate-800/50 rounded-2xl p-6 text-center border border-slate-700">
            <div className="text-5xl font-bold text-blue-400">{avgDays}</div>
            <div className="text-slate-400 mt-1">Avg Days/Book</div>
          </div>
          <div className="bg-slate-800/50 rounded-2xl p-6 text-center border border-slate-700">
            <div className="text-5xl font-bold text-amber-400">100%</div>
            <div className="text-slate-400 mt-1">Non-Fiction</div>
          </div>
        </div>

        {/* Genre Breakdown */}
        <div className="bg-slate-800/50 rounded-2xl p-6 mb-10 border border-slate-700">
          <h2 className="text-xl font-semibold mb-4">Genre Breakdown</h2>
          <div className="space-y-3">
            {sortedGenres.map(([genre, count]) => (
              <div key={genre} className="flex items-center gap-3">
                <div className="w-24 text-sm text-slate-300">{genre}</div>
                <div className="flex-1 bg-slate-700 rounded-full h-6 overflow-hidden">
                  <div 
                    className="h-full rounded-full flex items-center pl-3 text-xs font-medium"
                    style={{ 
                      width: `${(count / books.length) * 100}%`,
                      backgroundColor: genreColors[genre] || '#6B7280'
                    }}
                  >
                    {count}
                  </div>
                </div>
              </div>
            ))}
          </div>
        </div>

        {/* Reading Timeline */}
        <div className="bg-slate-800/50 rounded-2xl p-6 mb-10 border border-slate-700">
          <h2 className="text-xl font-semibold mb-4">Reading Timeline</h2>
          <div className="flex items-end gap-1 h-32">
            {["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"].map(month => {
              const count = books.filter(b => b.month === month).length;
              return (
                <div key={month} className="flex-1 flex flex-col items-center">
                  <div 
                    className="w-full bg-gradient-to-t from-violet-600 to-violet-400 rounded-t"
                    style={{ height: `${count * 30}px` }}
                  />
                  <div className="text-xs text-slate-500 mt-2">{month}</div>
                </div>
              );
            })}
          </div>
        </div>

        {/* Key Themes */}
        <div className="bg-slate-800/50 rounded-2xl p-6 border border-slate-700">
          <h2 className="text-xl font-semibold mb-4">🎯 Key Themes & Takeaways</h2>
          <div className="space-y-4">
            <div className="flex gap-3">
              <div className="text-2xl">🤖</div>
              <div>
                <div className="font-medium text-blue-400">AI Deep Dive</div>
                <div className="text-sm text-slate-400">6 books on AI/tech—from Fei-Fei Li's journey building ImageNet to Nick Bostrom's superintelligence risks, plus inside looks at OpenAI</div>
              </div>
            </div>
            <div className="flex gap-3">
              <div className="text-2xl">✝️</div>
              <div>
                <div className="font-medium text-emerald-400">Faith Formation</div>
                <div className="text-sm text-slate-400">4 Timothy Keller devotionals working through Romans, Galatians & Judges—a systematic morning reading habit</div>
              </div>
            </div>
            <div className="flex gap-3">
              <div className="text-2xl">🎧</div>
              <div>
                <div className="font-medium text-amber-400">Audiobook Memoirs</div>
                <div className="text-sm text-slate-400">4 memoirs on audio—Trevor Noah, Prince Harry, Jeremy Renner, and Tulsi Gabbard sharing raw personal stories</div>
              </div>
            </div>
          </div>
        </div>
        
        {/* Book List */}
        <div className="mt-10">
          <h2 className="text-xl font-semibold mb-4">All 14 Books</h2>
          <div className="grid gap-2">
            {books.map((book, i) => (
              <div key={i} className="flex items-center gap-3 bg-slate-800/30 rounded-lg p-3">
                <div className="text-slate-500 w-8 text-center text-sm">{book.month}</div>
                <div className="flex-1">
                  <div className="font-medium">{book.title}</div>
                  <div className="text-sm text-slate-400">{book.author}</div>
                </div>
                <div className="text-sm text-slate-500">{book.days} days</div>
              </div>
            ))}
          </div>
        </div>
      </div>
    </div>
  );
}

And here's the visualization rendered live in this post:

📚 Your 2025 Reading Year

A look back at the books that shaped your year

14
Books Finished
24
Avg Days/Book
100%
Non-Fiction

Genre Breakdown

Biography
7
Technology
5
Christian
5
Devotional
4
Audiobook
4
Politics
1
Philosophy
1

Reading Timeline

Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct
Nov
Dec

🎯 Key Themes & Takeaways

🤖
AI Deep Dive
6 books on AI/tech—from Fei-Fei Li's journey building ImageNet to Nick Bostrom's superintelligence risks, plus inside looks at OpenAI
✝️
Faith Formation
4 Timothy Keller devotionals working through Romans, Galatians & Judges—a systematic morning reading habit
🎧
Audiobook Memoirs
4 memoirs on audio—Trevor Noah, Prince Harry, Jeremy Renner, and Tulsi Gabbard sharing raw personal stories

All 14 Books

Jan
The Worlds I See
Fei-Fei Li
25 days
Jan
Romans 1-7 For You
Timothy Keller
25 days
Feb
For Love of Country
Tulsi Gabbard
20 days
Feb
Romans 8-16 For You
Timothy Keller
24 days
Mar
Galatians For You
Timothy Keller
26 days
Apr
Judges For You
Timothy Keller
30 days
May
The Life of Peter
Derek Thomas
17 days
Jun
Spare
Prince Harry
31 days
Jun
Empire of AI
Karen Hao
14 days
Jun
The Hundred-Page LLM Book
Andriy Burkov
14 days
Jul
The Optimist
Keach Hagey
25 days
Aug
Superintelligence
Nick Bostrom
37 days
Oct
My Next Breath
Jeremy Renner
18 days
Dec
Born a Crime
Trevor Noah
23 days

Note

I tweaked the component slightly so that it displays nicely within my site.

Observations

Inferring habits?

Claude claimed I had a "disciplined (or systematic) morning reading habit" for the devotionals. Looking at what it extracted from Notion, I only see date started and date finished timestamps—no version history or other details that would reveal when during the day I was actually reading and taking notes. Morning devotionals are a common habit, so it's a reasonable guess. LLMs can fill in gaps with plausible-sounding details, and without careful attention, these inferences can slip by as facts.

Incorrect numbers

If you look closely at the numbers, you'll notice discrepancies between the text summary and the charts. The charts are accurate because they're computed from the actual data in the code. With the text summary, however, it seems that Claude estimated the numbers rather than calculating them—a reminder that LLMs can get basic math wrong.

Final thoughts

A few years ago, the idea of describing what I want in plain language and having AI analyze my reading data, identify patterns, and generate a working visualization would have sounded like a stretch. Now, it's a straightforward task for AI.

The experience wasn't perfect. Claude made some assumptions, got some numbers wrong, and I had to refine my prompt to get the right data in the first place. But once I did, the results were impressive and would have taken me much longer to build on my own.