尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Log the books you read and see where each one takes place on a world map. The book version of MovieMap, with Goodreads in Letterboxd's place.
Live at https://dominicvhoule.github.io/thebookmap/
goodreads_library_export.csv) on the Goodreads tab. It brings in every book with ratings, dates read and read counts, plus the Want to read and Currently reading shelves, with no limit on size and whether the profile is public or private. Importing a newer export later adds only the new books.| What | Source |
|---|---|
| Titles, authors, covers, editions | Open Library (no key needed). Every cover is Open Library's: each book saves its Open Library cover ID once, and the image link is built from it |
| Your books, ratings, dates read | Your Goodreads library export (CSV) |
| Where a book takes place | Wikidata "narrative location" (P840), linked to Open Library works (P648) |
| When Wikidata has none | The library catalogue's subject places on Open Library ("Saint Petersburg (Russia)"), located through Wikipedia |
| Then | The places linked in the book's Wikipedia article (its Setting or Plot section) |
| Optional AI step | Claude reads the Wikipedia article and catalogue entry (book-setting function, needs an API key) |
| Last resort | The author's country (Wikidata), marked approximate |
| Cover images | Your own Cloudflare Worker and R2 bucket (cloudflare/covers-worker.js): each cover is fetched from Open Library once, then always served from R2 |
| Book summaries | The book's Wikipedia article when it has one (story sentences, credited "From Wikipedia's article … (CC BY-SA 4.0), adapted"); otherwise Claude writes one in its own words (book-summary function, needs ANTHROPIC_API_KEY). Saved once per book in book_summaries |
| Base map | OpenFreeMap tiles (OpenStreetMap data) drawn with MapLibre |
| Accounts, maps, follows | Supabase, the same project as MovieMap |
Resolved settings are cached in a shared book_settings table so each book is only looked up once.
The site works before this: anyone can browse the starter shelf and keep books in their browser, and people can sign in with their MovieMap account. This one step turns on books on accounts, People and the nightly Goodreads check.
supabase/migrations/101_bookmap.sql and press Run. It only adds tables and columns; nothing of MovieMap's is changed. It also schedules the nightly Goodreads check, using the secret MovieMap's daily sync already keeps in Vault.https://dominicvhoule.github.io/thebookmap/ under Redirect URLs, so sign-up and password emails come back to BookMap.The three functions are already deployed to the project: goodreads-feed (Verify JWT on), book-sync (Verify JWT off; uses CRON_SECRET), and book-setting (Verify JWT on; does nothing until ANTHROPIC_API_KEY is set, the same key MovieMap's AI step uses). To redeploy one, paste its supabase/functions/<name>/index.ts into the Supabase editor.
index.html page shell
styles.css all styles (phone layout at the bottom)
config.js Supabase settings (MovieMap's project)
js/featured.js the hand-checked starter shelf (245 books), shown to signed-out visitors
js/data.js Open Library and Wikidata lookups, country helpers
js/wikiplot.js settings from the catalogue's subject places and from Wikipedia
js/app.js map, reading log, logging, Goodreads, accounts, people
data/world.json country shapes (Natural Earth via world-atlas)
supabase/migrations/101_bookmap.sql the book tables and the nightly schedule
supabase/functions/goodreads-feed/index.ts reads public Goodreads Read shelves
supabase/functions/book-sync/index.ts adds new Goodreads books for every member, once a day
supabase/functions/book-setting/index.ts asks Claude where a book is set (optional)
goodreads-feed, nightly book-sync) was removed on 2026-10-26: the site no longer reads Goodreads pages, and the nightly jobs are unscheduled. The two functions are still deployed but unused.