Well, it's been over two years since I last generated a post so I had to do some sleuthing to figure out how to do this. So that was fun.
I'm so glad that I wrote docs about how I did this. </sarcasm>
But anyways, here's the paltry list of books that I read this year.
- The Memory Police by Yōko Ogawa (5 stars).
- Blue Nights by Joan Didion (4 stars).
- Elsewhere by Alexis Schaitkin (3 stars).
- My Life in France by Julia Child (4 stars).
- Memory Piece by Lisa Ko (3 stars).
- Our Country Friends by Gary Shteyngart (4 stars).
- Martyr! by Kaveh Akbar (4 stars).
- A Marriage at Sea: A True Story of Love, Obsession, and Shipwreck by Sophie Elmhirst (4 stars).
- The Russian Debutante's Handbook by Gary Shteyngart (3 stars).
- All Systems Red (The Murderbot Diaries, #1) by Martha Wells (4 stars).
- James by Percival Everett (5 stars).
For the record (and by record I mean myself), here's how I generated this list (this year):
Export
First export books out of GoodReads using their export functionaltiy to a csv.
Duckdb to the rescue
Then I used the most excellet duckdb to export the data to markdown format:
duckdb <<'SQL' | pbcopy
.mode list
.headers off
WITH cleaned AS (
SELECT
Title,
Author,
"My Rating",
trim(
replace(
replace(ISBN, '="', ''),
'"',
''
)
) AS clean_isbn,
"Date Read"
FROM '~/Downloads/goodreads_library_export.csv'
)
SELECT
'* [' || Title || '](' ||
CASE
WHEN clean_isbn IS NOT NULL AND clean_isbn <> '' THEN
'https://openlibrary.org/isbn/' || clean_isbn
ELSE
'https://openlibrary.org/search?q=' ||
replace(trim(Title || ' ' || Author), ' ', '+')
END
|| ') by ' || Author || ' (' || "My Rating" || ' stars).'
FROM cleaned
WHERE "Date Read" >= '2025-01-01'
AND "Date Read" < '2026-01-01'
ORDER BY "Date Read" ASC;
SQL
The damn robots helped me with some formatting issues because the data coming out of GoodReads is utter crap.
You can see the other years here in case you missed them.