Chris Collins

Tools · everyday

Bookshelf

A catalogue of the books you own, made for a phone at the shelf or in a bookshop — scan barcodes (a whole shelf at a time), look books up at Open Library and Google Books, sort them onto rooms, bookcases and shelves, track reading, loans and a wishlist, ask "do I own this?" in a shop, and sync phone and computer by file or through your own GitHub gist.

Added

Works with

How to use it

Point your phone at the barcode on the back of a book and it goes into your catalogue, with its title, authors, cover and page count fetched for you. Everything is kept in this browser; nothing is uploaded unless you set up sync.

How to use it

  • Scan — choose what a scan does: Add to my books, Add to wishlist, or Do I own it? Press Start camera (the browser asks for permission the first time) and hold the barcode inside the box. Tick Keep scanning to work along a shelf: each new book is added as soon as its code is read, with a beep, a short buzz and a message; a book you already have gives two low beeps and a warning instead, and is not added twice (Add another copy if it really is a second copy). Fill in Shelve new books in (room, bookcase, shelf) first and every book scanned goes there. 🔦 Light turns on the phone’s torch where the browser allows it. Photo of a barcode… reads the code from a picture instead.

  • Do I own it? — for bookshops and sales. A scan answers at once, in large type: You own this (and on which shelf, and whether it is lent out), On your wishlist, or Not in your books. Once the details arrive it also warns when you own another edition of the same title by the same author. From there, add it to your wishlist, or move it from the wishlist to your books when you buy it.

  • Type an ISBN — ISBN-10 or ISBN-13, with or without hyphens. It is checked as you type: a wrong check digit is caught and the right one suggested (most typos change one digit or swap two). It shows both forms: an ISBN-10 becomes 978 + its first nine digits + a new check digit; only 978 ISBNs have an ISBN-10, and 979 ones never do.

  • No barcode? Search Open Library by title or author, and add a result to your books or your wishlist — or Add a book by hand. Books from before ISBNs (about 1970) need one of these.

  • Books and Wishlist — a list or a wall of covers. Search everything (title, author, series, tags, notes, publisher, subjects, shelf, ISBN), filter by reading status, and sort by date added, title, author (by surname), year, rating, pages, date read, series, or location — which groups the list by room › bookcase › shelf. The search box also takes filters: author:austen, title:emma, year:1890s, year:1950-1959, year:<1900, rating:4 (4 or more), rating:=5, tag:"to sell", room:study, case:tall, shelf:2, loc:study, subject:poetry, series:discworld, lang:fr, publisher:penguin, condition:good, lent:sam, isbn:978030, and is:lent, is:signed, is:first, is:rated, is:pending, is:notfound, is:nocover, is:unshelved. Tap a book to edit it.

  • A book holds its ISBN (Look up fills empty fields from Open Library and Google Books without touching what you typed), title, subtitle, authors, series and number, publisher, year, pages; reading status with the dates started and finished (set for you when you change the status) and a rating; room, bookcase and shelf; tags and notes; this copy’s condition, price, date bought, Signed and First edition; and its loans.

  • Loans — lend a book from its page (Lend to, due back after 28 days unless you pick a date) or with Lend a book. The tab lists what is out, overdue first with the number of days, a red count on the tab when anything is overdue, and who borrows most. Returned keeps each loan in the book’s history.

  • Stats — books owned, read, reading and unread; pages read; books and pages read by year (from the finish dates); top authors and subjects; books by the decade they were published, by room, and by your rating. Tap a bar to see those books.

Sync between phone and computer

The catalogue lives in each browser separately. Sync & data offers three ways to work:

  1. This device only — nothing to set up. Download a backup now and then.

  2. A backup file — Download backup (or Share backup… to send it through the phone’s share sheet to email, AirDrop, Files or a chat) on one device, then Import it on the other and choose Merge.

  3. Your own GitHub gist — paste a GitHub token on each device and press Sync now. The first sync finds your sync gist, or creates one: a secret gist holding one file, bookshelf.json. Each sync fetches the gist, merges it with this device’s books, saves the result here and uploads it if anything changed. Tick Sync automatically to sync when the page opens and a few seconds after each change.

Merging works book by book. Every book has its own id and the time it was last changed; when both sides have changed the same book, the later change wins. A deleted book leaves a small marker (its id, deleted, and when) that travels with the sync, so deleting on the phone deletes on the computer too — unless the book was edited there after it was deleted. Books added on both devices are simply both kept. If the same book was scanned on two devices before they synced, it appears twice: Same ISBN more than once lists these. The order of changes depends on each device’s clock, so keep clocks set automatically.

About the token
  • Make one that can only reach gists. On GitHub: Settings → Developer settings → Personal access tokens → Fine-grained tokens → Generate new token, choose an expiry, set Repository access to Public repositories (the least it offers), and under Account permissions give Gists Read and write. A classic token with only the gist scope also works.

  • Either kind can read, change and delete all of your gists, secret ones included — but nothing else: not your repositories, profile or settings.

  • The token is stored in this browser’s local storage, separately from the catalogue. It is never put in backups, CSV files or share links, and is sent only to api.github.com. Anything that can run scripts on this site in this browser profile could read it; Forget token removes it.

  • A secret gist is unlisted, not private: it does not appear on your profile or in search, but anyone who has its address can read it. Your catalogue (titles, notes, who has borrowed what) is in it. GitHub keeps every revision of the gist.

  • Gists can hold large files, but the API returns only the first megabyte of a file inline; a larger catalogue (several thousand books) is fetched from the gist’s raw address instead.

Importing and exporting

  • Goodreads — on Goodreads, My Books → Import and export → Export library gives a CSV file. Import it here: the Exclusive Shelf sets the status (read, currently-reading, to-read), other shelves become tags, My Rating, Date Read, Private Notes and My Review (as notes), series in the title — The Colour of Magic (Discworld, #1) — and the ISBNs (which Goodreads writes as ="0306406152") come across. Choose whether to-read books go to your wishlist or to your books as unread (a row with Owned Copies above 0 always goes to your books), and whether to skip books you already have. The export has no covers: they are looked up afterwards.

  • CSV export — every book, with Goodreads' column names first (so a spreadsheet or another catalogue lines the main columns up) and this tool’s own after them (shelf, condition, price, loan, subjects and the rest).

  • Backup — one JSON file with every book, including the deletion markers that sync uses. Merge or Replace on import.

Where the details come from

Looking a book up asks, in order:

  1. Open Library — https://openlibrary.org/isbn/<isbn>.json (the edition), then its authors' and work’s records (https://openlibrary.org/authors/…json, /works/…json) for names and subjects. Covers come from https://covers.openlibrary.org.

  2. Google Books — https://www.googleapis.com/books/v1/volumes?q=isbn:<isbn>; — when Open Library has no record or is missing the authors, cover or page count. Open Library’s values win; Google’s fill the gaps and add subjects.

Title and author searches use https://openlibrary.org/search.json, then Google Books if Open Library finds nothing. All of these answer browsers directly (checked 29 October 2026). Books are looked up one at a time with a pause between, to be gentle with Open Library, which is run by the non-profit Internet Archive. Google Books shares a daily allowance between everyone calling it without a key, and sometimes refuses; paste your own API key (Google Cloud console, enable the Books API) under Look-ups if that happens often. The GitHub API (https://api.github.com/gists) is used only when you set up sync. Nothing else is contacted; the barcode reader is loaded from jsDelivr on browsers that need it (below).

Offline (in a basement, or a shop with no signal) a scan is still recorded: the book is added with its ISBN and marked to look up, and its details are fetched when the connection comes back. Do I own it? works offline too, since it only needs your own catalogue — the title appears once you are online. A book neither service knows is marked not found; fill it in by hand.

The camera

The camera needs a secure page (https://, which this site is) and your permission. The first Start camera makes the browser ask; if you refused before, allow the camera again in the site settings (in Chrome, the icon left of the address; in Safari on iPhone, the aA menu in the address bar → Website Settings → Camera). The video stays on your device — frames are read on the phone and never sent anywhere — and the camera stops when you press Stop camera or leave the Scan tab.

The browser’s own barcode reader (BarcodeDetector) is used where it reads EAN-13: Chrome and Edge on Android, ChromeOS and macOS. Elsewhere — Safari on iPhone, iPad and Mac, and Firefox — the page loads ZXing (Apache 2.0, about 100 KB compressed) from jsDelivr once, and reads the band inside the aiming box.

A book barcode is an EAN-13 starting 978 or 979 — the ISBN-13 itself. The small five-digit code beside it on some books is a price add-on and is ignored. Some American mass-market paperbacks carry a UPC product code on the back and the ISBN only inside the cover: scanning the UPC says so. Codes starting 979-0 are ISMNs for printed music and are refused.

Limits

  • The catalogue is in this browser only, unless you sync. Safari can delete a site’s data after seven days without a visit; Ask to keep it, sync, or keep backups.

  • Covers are links to Open Library and Google, not copies: without a connection they don’t show.

  • Open Library is edited by volunteers. Details for one edition are sometimes those of another (page counts and publishers especially), and author names may be in a different form (Tolkien, J. R. R.). Check the book in your hand.

  • ISBN-13s are shown as 978- and the rest, without the group, publisher and title hyphens, which depend on the ISBN agency’s range table.

  • An ISBN identifies an edition, not a copy: a second copy of the same edition is a separate entry (Add another copy). Some publishers reused ISBNs, and some old books have none.

  • Reading the barcode from a glossy or curved cover is easier in good light, held flat, with the barcode filling about half the box. Very small or damaged barcodes may not read: type the ISBN.

  • Vibration works on Android; iPhones do not let web pages vibrate, so there is only the beep (switched on by the tap on Start camera).

  • Sync merges whole books: if you edit the same book on two devices before they sync, the later edit wins entirely (its notes and its shelf), not field by field.

  • The Goodreads import was written against Goodreads' documented export columns and tested with made-up files, not with a real account’s export.

Linking to an example

A link can carry the search, view and sort, or an ISBN to check — never your books, which stay in each visitor’s own browser. An isbn link only checks: it shows both ISBN forms and whether the book is in the visitor’s own catalogue, and never adds anything. Add a tab after #: scan, books, wish, loans, stats or data. A link replaces your saved settings for this tool (a Restore my settings button undoes it).

Parameter Meaning Example

q

The search box, with any filters

q=author:austen+is:lent

status

Reading status: unread, reading, read, or empty for all

status=unread

sort

added, title, author, year, rating, location, pages, finished or series

sort=author

view

list or grid (covers)

view=grid

mode

What a scan does: add, wish or check (Do I own it?)

mode=check

isbn

An ISBN to check and convert (opens Scan)

isbn=0306406152

example

A preset, below

example=convert

Example Tab What it shows

convert

scan

ISBN-10 0-306-40615-2 and its ISBN-13, 978-0-306-40615-7

typo

scan

the same ISBN with a wrong last digit: the check digit should be 2

check

scan

scanning in Do I own it? mode

unread

books

unread books by author

shelves

books

everything grouped by room, bookcase and shelf

covers

books

the wall of covers, newest first

lent

books

books out on loan

The examples that show books need some in the catalogue: Try it with sample books (on an empty Books tab, or under Sync & data) adds a dozen out-of-copyright classics, with shelves, ratings and two loans, and Remove sample books takes them out again.

Runs entirely in your browser — network requests go only to the services named on this page.