Reading List
Tracks the books Ben has finished and the ones he wants to read.
Reading List Skill
Manages Ben's reading list Google Sheet: https://docs.google.com/spreadsheets/d/1iLziNbQPM_wP162YA8FcqhHhXCkFcCvhpTNa67WGywI/edit
Sheet Structure
Finished tab
Columns: Title, Author, Year Read, Medium, Year Published, Read Order, Date Finished, Book ID
- Title: Book title
- Author: Author name(s)
- Year Read: Year completed (e.g.,
2025,2026) - Medium: One of:
Audiobook,E-Book,Print book - Year Published: Year the book was first published (e.g.,
1952,2003). Fill this in for every new book added. - Read Order: Sequential lifetime reading order. The earliest finished book is
1, and each newly finished book gets the next integer. - Date Finished: Date the finished book is logged, in
YYYY-MM-DDformat usingAmerica/New_York. - Book ID: Stable join key for book metadata, formatted like
book-0104.
Book Metadata tab
Columns: Book ID, Title, Author, ISBN 13, ISBN 10, Open Library ID, Google Books ID, Publisher, Published Date, Page Count, Language, Subjects, Description, Cover URL, Metadata Source, Metadata Checked, Metadata Confidence, Metadata Notes
- Book ID: Join key back to
Finished - Metadata Source: Which lookup source supplied the data, typically
Open Library,Google Books, or both - Metadata Checked: Date metadata was last refreshed
- Metadata Confidence:
High,Medium,Low, orUnmatched - Metadata Notes: Short note about match quality or ambiguity
Wishlist tab
Columns: Title, Author
- Title: Book title
- Author: Author name(s)
- Additional columns may exist but are not required
Medium by year tab
Pivot table summary. Do not edit directly — it auto-updates from Finished.
Commands
Add a finished book
gog --no-input -a "$GOG_ACCOUNT" sheets append 1iLziNbQPM_wP162YA8FcqhHhXCkFcCvhpTNa67WGywI "Finished!A:H" \
--values-json '[["Title","Author","2025","Audiobook","2003","104","2026-05-22","book-0104"]]' \
--insert INSERT_ROWS
Get the next read order
Read the Finished!F2:F range, find the maximum numeric value, and add 1.
NEXT_READ_ORDER=$(
gog --no-input -a "$GOG_ACCOUNT" sheets get 1iLziNbQPM_wP162YA8FcqhHhXCkFcCvhpTNa67WGywI "Finished!F2:F500" --json \
| node -e 'let s=""; process.stdin.on("data", d => s += d); process.stdin.on("end", () => { const rows = JSON.parse(s).values || []; const nums = rows.flat().map(v => Number(v)).filter(Number.isFinite); console.log((nums.length ? Math.max(...nums) : 0) + 1); });'
)
Build the book ID
BOOK_ID=$(printf "book-%04d\n" "$NEXT_READ_ORDER")
Get the finished date
Use the current date in Ben's timezone.
DATE_FINISHED=$(TZ=America/New_York date +%F)
Add to wishlist
gog --no-input -a "$GOG_ACCOUNT" sheets append 1iLziNbQPM_wP162YA8FcqhHhXCkFcCvhpTNa67WGywI "Wishlist!A:B" \
--values-json '[["Title","Author"]]' \
--insert INSERT_ROWS
Move from Wishlist to Finished
- Read the wishlist entry
- Read
Finished!F2:F, compute the nextRead Order, buildBook ID, setDate Finishedto today'sAmerica/New_Yorkdate, and append to Finished with Year Read, Medium, Year Published, Read Order, Date Finished, and Book ID - Look up metadata by ISBN first when available, otherwise by title and author using Open Library and Google Books
- Append or update the
Book Metadatarow for thatBook ID, recordingMetadata Source,Metadata Checked,Metadata Confidence, andMetadata Notes - Optionally delete from Wishlist (requires manual confirmation)
Query Finished books
gog --no-input -a "$GOG_ACCOUNT" sheets get 1iLziNbQPM_wP162YA8FcqhHhXCkFcCvhpTNa67WGywI "Finished!A1:H50" --json
Query Wishlist
gog --no-input -a "$GOG_ACCOUNT" sheets get 1iLziNbQPM_wP162YA8FcqhHhXCkFcCvhpTNa67WGywI "Wishlist!A1:B50" --json
Query Book Metadata
gog --no-input -a "$GOG_ACCOUNT" sheets get 1iLziNbQPM_wP162YA8FcqhHhXCkFcCvhpTNa67WGywI "Book Metadata!A1:R50" --json
Search by author or title
Use gog --no-input -a "$GOG_ACCOUNT" sheets get with a larger range, then filter results in your script.
Workflow Rules
- Always confirm before adding or moving books
- Year Read: Use the current year unless Ben specifies otherwise
- Medium: Ask if not specified; default to
Audiobookif Ben mentions listening - Year Published: Fill this in for every new book. Ask Ben if unknown, or look it up.
- Read Order: Always calculate
MAX(Read Order)+1before appending to Finished. - Date Finished: Always fill with
TZ=America/New_York date +%Fwhen appending to Finished unless Ben specifies a different finished/logged date. - Book ID: Always derive from
Read Orderusingbook-%04d. - Metadata lookup: Prefer ISBN lookup when available. Otherwise search by title and author.
- Metadata confidence: Record
High,Medium,Low, orUnmatchedinstead of silently writing uncertain metadata. - Audiobook details: Preserve narrator, publisher, release date, duration, or other edition-specific audiobook details in
Metadata Noteswhen Ben provides them or they are found during lookup. - Wishlist → Finished: When Ben finishes a wishlist book, move it (don't duplicate)
- Never edit Medium by year — it's a pivot summary
Examples
Add finished book (audiobook, 2026)
gog --no-input -a "$GOG_ACCOUNT" sheets append 1iLziNbQPM_wP162YA8FcqhHhXCkFcCvhpTNa67WGywI "Finished!A:H" \
--values-json '[["The Old Man and the Sea","Ernest Hemingway","2026","Audiobook","1952","104","2026-05-22","book-0104"]]' \
--insert INSERT_ROWS
Add to wishlist
gog --no-input -a "$GOG_ACCOUNT" sheets append 1iLziNbQPM_wP162YA8FcqhHhXCkFcCvhpTNa67WGywI "Wishlist!A:B" \
--values-json '[["Unequal","Eugenia Chang"]]' \
--insert INSERT_ROWS
Read recent finished books
gog --no-input -a "$GOG_ACCOUNT" sheets get 1iLziNbQPM_wP162YA8FcqhHhXCkFcCvhpTNa67WGywI "Finished!A1:H20" --json
Notes
- Sheet ID:
1iLziNbQPM_wP162YA8FcqhHhXCkFcCvhpTNa67WGywI - Title: "Ben's book list"
- Timezone:
America/New_York - Requires
gogwith Sheets API access (service-level account context is preconfigured)
