Since v1.25.0 you can edit a book's metadata by hand and have your edits survive every automatic refresh (#1237, #1446).
Open a book's detail page and click Edit. You can change:
| Field | Notes |
|---|---|
| Title | Also used for sorting and file naming on the next rename |
| Description | |
| Genres | Comma-separated; the first genre drives the {Genre} naming token |
| Language | Language code, e.g. en, it — drives the {Lang} naming token |
| Release date | YYYY-MM-DD, or clear it entirely |
Every field you edit is locked: the nightly metadata refresh, the author-works sync, and Audiobookshelf/Calibre re-imports keep your value instead of overwriting it. Locked fields show a 🔒 badge in the edit dialog.
Unlock all fields in the edit dialog hands the fields back to the metadata pipeline. The current values stay until the next refresh replaces them.
Two actions clear locks on their own, deliberately: Re-bind and metadata re-map. Both mean "this is the wrong record, take the new one", so Bindery applies the new provider record wholesale.
The value that decides which letter an author files under, in the Authors list
and in the {SortAuthor} naming token, is the author's sort name, and there is
no field for it. Bindery derives it from the display name as "Last, First", and
a metadata refresh replaces it with the provider's own sort name when the
provider has one. Nothing in the UI or the API accepts a hand written sort
name, so unlike a book's title this cannot be locked to your own value.
How author names are filed sets out the rules, including the case rule that files "Vincent van Gogh" under G and "Thomas De Quincey" under D, and the limits of the heuristic.
If you keep an opinionated genre taxonomy (say, {Genre:Unsorted}/… folder
paths), per-book editing does not scale. Two bulk actions set the same genre
list on many books at once and lock it on each:
- Author level — Edit Author → Genre override: applies to every book by that author.
- Series level — Series page → Set genre on an expanded series: applies to every book in the series.
Both are idempotent; re-applying with a different list simply replaces it.
PUT /api/v1/book/{id} accepts title, description, genres,
language, and releaseDate — setting one applies the value and locks the
field. Send lockedFields (an array of those names) to replace the lock set
explicitly; an empty array unlocks everything. Bulk endpoints:
PUT /api/v1/author/{id}/genres and PUT /api/v1/series/{id}/genres with
{"genres": ["Fantasy"]}. DELETE /api/v1/series/{id}/genres removes a series
override.