WallpaperMachine
The wallpapers you love. A new home on your Mac.
See the world one book at a time. Log the books you read and see where each one takes place on a world map.
LifestyleJavaScript · TypeScriptGitHub @dominicvhouleOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full 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.