尚未检测到更新。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.