ShelfMate catalogues your books, vinyl records and CDs using your phone camera and Claude AI. Choose your install method below, then follow the cataloguing steps.
1
Install Docker Desktop
Download and install Docker Desktop from docker.com โ it's free.
Mac: download the .dmg, drag to Applications, launch it
Windows: download the installer, run it, restart if asked
Wait until Docker Desktop shows "Docker is running" before continuing.
2
Download and unzip ShelfMate
Purchase and download ShelfMate from the download page and unzip it into a permanent folder โ somewhere like Documents/ShelfMate/ rather than Downloads, as Docker needs to find it each time you start.
3
Start ShelfMate
๐ Mac โ .app installer: just double-click ShelfMate Launcher.app โ it starts ShelfMate and opens your browser automatically. No Terminal needed.
๐ Mac โ zip install: double-click mac/Start ShelfMate.command in the shelfmate folder instead of using Terminal.
โ ๏ธ Important โ Mac .app users: wherever you put ShelfMate Launcher.app when you first double-click it, that's where ShelfMate will be installed. Choose a permanent location โ such as your Applications folder or Documents โ before running it for the first time. Moving it afterwards requires stopping Docker and restarting from the new location.
๐ก First run only: the browser opens automatically but you may see an empty page โ the database is initialising in the background. Wait 20โ30 seconds and refresh. Every start after that is instant.
Windows / Linux โ or if you prefer the command line on Mac โ open a Terminal or Command Prompt, navigate to the shelfmate folder, and run:
docker compose up -d
Docker sets everything up automatically โ database included. When it's done, open your browser and go to:
Go to http://localhost:8586, select the shelfmate database, click the SQL tab, paste and click Go.
Command line
docker exec -i shelfmate_db mysql -u shelfmate -pshelfmate123 shelfmate << 'EOF'
-- paste your SQL here
EOF
โ The SQL uses INSERT IGNORE โ safe to re-run as many times as you like.
1
Requirements
A web server running PHP 7.4+
A MySQL or MariaDB database
Access to phpMyAdmin or similar
2
Upload the app files
Purchase and download ShelfMate from the download page and unzip it. Upload the contents of the app/ folder to your web server.
Make sure the uploads/bookcases/ folder exists and is writable. Set its permissions to 755 (or 775 if uploads still fail).
3
Create the database tables
In phpMyAdmin, select your database, click the SQL tab, and paste the contents of docker/init.sql from the zip. This creates the books and bookcases tables.
๐ก You can use an existing database โ ShelfMate's tables won't interfere with other apps.
4
Edit config.php
Open app/config.php and set your database credentials:
In phpMyAdmin, select your database, click the SQL tab, paste the SQL from Claude and click Go.
โ The SQL uses INSERT IGNORE โ safe to re-run as many times as you like.
Already using BookBinder? Upgrade in minutes
Your entire catalogue moves across โ no re-photographing, no re-typing. Choose the route that matches how you installed BookBinder.
A
Route A โ Docker install (fresh ShelfMate database)
Use this if you installed BookBinder with Docker.
Step 1 โ Export from BookBinder
Go to BookBinder's phpMyAdmin at http://localhost:8586. Select your bookbinder database, click the Export tab and choose Custom export method. Then:
Under Tables โ check books and bookcases. For each, make sure only the Data column is checked โ leave Structure unchecked. This exports your data only, without the table definitions.
Under Data creation options โ check "INSERT IGNORE statements"
Click Export at the bottom to download the .sql file.
Step 2 โ Import into ShelfMate
Stop BookBinder first:
docker compose down
Start ShelfMate:
docker compose up -d
Go to http://localhost:8586 โ this is phpMyAdmin, included with ShelfMate. Select the shelfmate database in the left panel, click the Import tab, click Choose File, select your .sql file and click Go at the bottom of the page.
โ Done โ your full catalogue is in ShelfMate.
B
Route B โ Shared hosting (BookBinder tables in an existing database)
Use this if you added BookBinder's tables to an existing database such as SoleTrader or a shared hosting database.
Step 1 โ Export just the books and bookcases tables
In phpMyAdmin, select your database and click the Export tab. Choose Custom export method. Then:
Under Tables โ check only books and bookcases, uncheck everything else. For each, make sure only the Data column is checked โ leave Structure unchecked. This exports your data only, without the table definitions.
Under Data creation options โ check "INSERT IGNORE statements"
Click Export at the bottom to download the .sql file.
๐ก phpMyAdmin names the file after your database โ e.g. soletrader.sql. You can rename it if you like, but it doesn't matter when importing.
Step 2 โ Import into ShelfMate
ShelfMate on shared hosting: in phpMyAdmin select its database in the left panel, click the Import tab, click Choose File, select your .sql file and click Go at the bottom.
ShelfMate on Docker locally: go to http://localhost:8586 โ phpMyAdmin is included. Select the shelfmate database, click Import, choose your .sql file and click Go.
โ Done โ your full catalogue is in ShelfMate.
After import: your catalogue carries across including any genre assignments. The new ShelfMate fields โ condition, wishlist, purchase value and last read/played โ will be blank to start with. Fill them in gradually using the inline โ๏ธ edit, or use Batch Edit to set condition or genre across a whole selection at once.
v1.0.0 installs only: if you installed v1.0.0 you'll have a sample book and bookcase. Delete the book first โ go to Browse, find "The Wind in the Willows", click โ๏ธ then ๐ Delete. Then go to Bookcases, click โ๏ธ Edit on "My First Bookcase" โ the ๐ Delete button will now appear. Then import your catalogue.
Bookcase photos: photos don't transfer with the SQL export โ they need to be re-uploaded. Log in, go to Bookcases and use the ๐ท Add photo button on each bookcase card.
Errors about duplicate entries during import are harmless โ entries that already existed are just skipped. Your data is fine.
Cataloguing your collection
These steps are the same whether you used Docker or a manual install. ShelfMate handles books, vinyl LPs and CDs equally well.
A
Take photos of your shelves and stacks
For best results:
One shelf per photo โ don't try to capture everything in one shot
Straight on โ stand directly in front, not at an angle
Good light โ natural daylight or overhead; avoid flash glare on spines
Fill the frame โ get close enough that spine text is readable
One wide-angle overview shot per bookcase โ useful for the bookcase card photo
๐ฑ Works for books, LP spines and CD stacks equally well. Claude can even read upside-down spines. iPhone or Android both work fine.
B
Zip the photos for each location
Group each bookcase or CD/LP stack's photos into a folder and zip it. Name it clearly:
๐ก You can do multiple stacks at once โ just zip them separately and upload together.
C
Open a new chat with Claude
Go to claude.ai and start a new chat. Paste this prompt:
I'm cataloguing my home collection using ShelfMate. I'll upload zipped photos of each bookcase, LP stack or CD stack and I need you to:
1. Read all the spines in the photos (books, LPs and CDs)
2. Generate SQL INSERT statements in this format:
INSERT IGNORE INTO books (title, author, category, sub_category, genre, bookcase, shelf, location_name, notes) VALUES
('Title Here', 'Artist/Author', 'Category', 'Sub-category or NULL', 'Genre or NULL', BOOKCASE_NUMBER, SHELF_NUMBER, 'Room Name', 'any notes');
Rules:
- category: Fiction, Non-Fiction, Music, Classical, Medical, Sailing, TEFL, Reference, Gardening, Cookery, Art, Humour, Games, Sport, Health, Poetry, Nature, Travel, DIY, Magazines
- sub_category for Music: CD or LP
- genre: for music use Jazz, Classical, Blues, Folk, Rock, Soul, Country, World etc. For fiction use Literary, Crime, Historical etc.
- shelf numbers count from top (1=top shelf), 0 = stacked flat
- bookcase number is the number I give you with each upload
- Use NULL for unknown authors/artists
- Flag unclear titles with 'Title unclear - check' in notes
After each stack, output the complete SQL block ready to paste into phpMyAdmin.
Ready โ I'll upload bookcase 1 now.
D
Upload your zip files to Claude
Drag your zip files into the Claude chat. Tell Claude which bookcase number each one is and what it contains:
These are bookcases 1, 2 and 3.
Bookcase 1 = Lounge main bookcase (books)
Bookcase 2 = Lounge LP stack by the hifi (vinyl records)
Bookcase 3 = Office CD rack (CDs)
Claude reads the spines and generates the SQL for each location.
๐ก If a title is hard to read, Claude flags it in the notes column so you can check the physical item later.
E
Add location photos (optional but lovely)
Log in and go to the Bookcases page. Upload an overview shot for each bookcase or stack โ it appears on the location card so you can see at a glance where something lives.
F
Browse, search and tidy up
On the Browse page you can:
Search by title or author/artist
Filter by bookcase or category using the sidebar
Expand categories with a โถ arrow to filter by sub-category or genre
Sort by any column โ including Genre
Edit any item inline with the โ๏ธ button (log in first)
Add items manually with the + Add Book button
Mark items as lent out with the borrower's name
Wishlist items you want to find
Export your catalogue or wishlist to CSV
๐ฒ Random pick โ browse by category for something to read or listen to tonight
๐ก Items flagged as 'Title unclear' are worth a quick follow-up photo to Claude โ a clearer close-up usually does it.
Organising your music collection by genre
Genre is one of ShelfMate's most powerful features for music collectors โ here's the best way to use it.
G
Ask Claude to assign genres when cataloguing
The setup prompt above already includes genre. When uploading a stack of jazz LPs, tell Claude:
This is bookcase 7 โ my jazz LP collection.
Please set genre = 'Jazz' for all of these unless you can identify a different genre from the spine.
Claude will set Jazz as the default and override where it recognises something different (Classical, Blues etc.).
๐ก Works equally well for book genre โ "this is my literary fiction shelf, set genre = Literary Fiction unless clearly otherwise."
H
Batch assign genres after import
Already imported without genres? Use the Batch Edit panel in the Browse page โ no need to edit each item individually.
Filter the list โ e.g. click Music in the sidebar, then LP under sub-category
Narrow further if needed โ e.g. filter to a specific LP bookcase
Click โ Batch edit this selection to expand the panel
Set field: Genre, To value: Classical (or Jazz, Blues, Folk etc.)
Click Apply to all N books and confirm
โก This is the fastest way to genre-tag a large collection. Filter to your Classical LP bookcase, batch set genre to Classical in one click โ done. Repeat for each genre/location combination.
I
Browse and sort by genre
Once genres are assigned:
Click the Genre column header to sort your whole catalogue by genre โ all your Classical together, all your Jazz together
Click the โถ arrow next to Music in the sidebar to expand genre sub-filters
Click a genre in the sidebar to filter to just those items
Combine with category filter โ e.g. Music โ LP โ Jazz for just jazz vinyl
๐ก Genre works for books too โ sort by genre to find all your Literary Fiction, or filter to Crime for a rainy afternoon.
J
Condition grading for vinyl
For vinyl collectors, the Condition field supports standard grades: Mint, NM, VG+, VG, Good, Fair, Poor.
You can add condition when editing any record inline (โ๏ธ button), or set it during the Add Item form. Use the Purchase value field alongside condition for insurance records.
๐ก Batch edit can also set condition across a selection โ useful if you've just acquired a collection and want to mark it all as VG to start.
ShelfMate extras
A few features worth knowing about.
โ
Wishlist
Mark any item as Wishlist status โ either when adding manually or via the inline edit โ๏ธ. Wishlist items appear in the sidebar with a count, styled differently in the browse list so they stand out.
Export your wishlist to CSV โ useful to take to record fairs, second-hand bookshops or car boot sales.
โ
Export to CSV
Go to the Export page (top nav). Filter by bookcase, category or wishlist, then download a CSV that opens in Excel, Numbers or Google Sheets.
Useful for insurance schedules, sharing your catalogue, or keeping an offline backup.
โ
๐ฒ Random pick
Click ๐ฒ Random in the top nav. Filter by category if you want (Fiction only, Music only), then click the button โ ShelfMate picks something at random from your shelves. Shows title, artist/author, location and condition. Hit it again if you're not feeling it.
๐ก Great for breaking the "what shall I listen to tonight?" deadlock when you have 300 LPs to choose from.
Tips & things to know
Do one room at a time โ it's less overwhelming
Keep a consistent bookcase numbering scheme from the start
Note the content in the zip filename โ lounge_lps_jazz.zip is more helpful than bookcase7.zip
For large collections, Claude can process 3โ4 bookcases per chat before hitting image limits โ just start a new chat and paste the setup prompt again
Magazines and periodicals are best as bundles: one entry with a date range in notes (e.g. Yachting Monthly, bundle 2011โ2017)
For LPs: photograph each stack from both sides if possible โ some spines read left-to-right, some right-to-left
Genre batch edit works best when you organise your stacks by genre first โ one zip per genre makes the batch assignment trivial
Use the Wishlist before record fairs โ add everything you're looking for, export to CSV, take your phone or a printout
Log in to edit โ click Log in in the top right and enter your editor password to access editing, batch edit and bookcase management
Updating ShelfMate (easiest method โ Mac & Windows) โ open Docker Desktop, click the ๐ dustbin next to each ShelfMate container to remove them. Then double-click ShelfMate Launcher.app (Mac) or run docker compose up -d from the shelfmate folder (Windows) to reinstall. Your data is preserved unless you also delete the volume.
Updating files (Docker install) โ find your ShelfMate folder on your computer (e.g. Documents/ShelfMate/) and replace files directly in the app/ subfolder. Changes take effect immediately โ no Docker restart needed
Updating files (Mac .app install) โ right-click ShelfMate Launcher.app โ Show Package Contents โ navigate to Contents/Resources/shelfmate/app/ to replace files