Use when the user asks to "download an audiobook", "rip Audible", "liberate a book", "sync audiobooks", "back up my Audible library", "add a book to Audiobookshelf", "search my audiobooks", "convert audiobook to MP3", "run libation-sync", "clean up audiobook metadata", "fix book metadata", "transfer audiobooks", or asks anything about Libation, Audiobookshelf, or their Audible library.
npx claudepluginhub oliverames/ames-claude --plugin ames-standalone-skillsThis skill uses the workspace's default tool permissions.
Download, decrypt, and serve Audible audiobooks using Libation on the MacBook Pro and Audiobookshelf on the Mac Mini.
Provides Ktor server patterns for routing DSL, plugins (auth, CORS, serialization), Koin DI, WebSockets, services, and testApplication testing.
Conducts multi-source web research with firecrawl and exa MCPs: searches, scrapes pages, synthesizes cited reports. For deep dives, competitive analysis, tech evaluations, or due diligence.
Provides demand forecasting, safety stock optimization, replenishment planning, and promotional lift estimation for multi-location retailers managing 300-800 SKUs.
Download, decrypt, and serve Audible audiobooks using Libation on the MacBook Pro and Audiobookshelf on the Mac Mini.
Workflow: Audible → Libation (decrypt to M4B) → SCP to Mac Mini → Audiobookshelf
| Component | Path |
|---|---|
| Libation app | /Applications/Libation.app |
| Libation CLI | /Applications/Libation.app/Contents/MacOS/LibationCli |
| Books directory | ~/Music/Libation/Books/ |
| Sync script | ~/Developer/scripts/libation-sync (in PATH) |
| Audiobookshelf | http://100.79.211.138:13378 (Docker on Mac Mini) |
| ABS API key | 1Password: op://Development/Audiobookshelf API Key/credential |
| ABS audiobooks dir | home-server:~/audiobooks/ |
| ABS library ID | 5b9bdb84-5ed1-45bb-ab37-383f2c720da5 |
# Scan Audible library (syncs account)
LibationCli scan
# Search for a book (-n 0 shows all, --bare for ASINs only)
LibationCli search "Book Title" -n 0
LibationCli search "Book Title" -n 0 --bare
# Download + decrypt specific books by ASIN
LibationCli liberate B08G9PRS1K B002V1OF70
# Download all un-liberated books
LibationCli liberate
# Convert M4B to MP3
LibationCli convert
# Export library as CSV/JSON/XLSX
LibationCli export ~/Desktop/library --csv
# Show settings and paths
LibationCli get-setting
Note: The CLI's search command with pagination requires interactive input. Always use -n 0 to show all results at once, or --bare for scripting.
One-command pipeline that scans, downloads, copies to Audiobookshelf, and triggers a library scan.
# Sync all new purchases
libation-sync
# Sync specific books by ASIN
libation-sync B08G9PRS1K B002V1OF70
The script:
LibationCli scan to sync library metadataLibationCli liberate (all new or specific ASINs)~/audiobooks/ on Mac Mini# Load API key from 1Password
ABS_KEY=$(op read "op://Development/Audiobookshelf API Key/credential")
# NOTE: Direct HTTP to 100.79.211.138:13378 times out from this machine (Tailscale routing).
# All ABS API calls must be proxied through SSH:
# ssh home-server "curl -s ... -H 'Authorization: Bearer $ABS_KEY'"
# Trigger library scan
ssh home-server "curl -s -X POST 'http://localhost:13378/api/libraries/5b9bdb84-5ed1-45bb-ab37-383f2c720da5/scan' \
-H 'Authorization: Bearer $ABS_KEY'"
# List recent books (sorted by added date, descending)
ssh home-server "curl -s 'http://localhost:13378/api/libraries/5b9bdb84-5ed1-45bb-ab37-383f2c720da5/items?limit=20&sort=addedAt&desc=1' \
-H 'Authorization: Bearer $ABS_KEY'" | jq '.results[] | {title: .media.metadata.title, author: .media.metadata.authorName}'
# Search library
ssh home-server "curl -s 'http://localhost:13378/api/libraries/5b9bdb84-5ed1-45bb-ab37-383f2c720da5/search?q=QUERY' \
-H 'Authorization: Bearer $ABS_KEY'"
Libation outputs DRM-free M4B by default (DecryptToLossy: False). M4B preserves:
This is the ideal format for Audiobookshelf. To get MP3 instead, use LibationCli convert after download.
Libation creates folders like Project Hail Mary [B08G9PRS1K]/. The ASIN in brackets helps Audiobookshelf's metadata matcher identify the exact Audible edition.
After adding books (especially non-Libation sources), metadata often needs fixing: "(Unabridged)" in titles, swapped author/narrator, bad genres, missing series info.
# Update metadata for a specific book (PATCH — only included fields are modified)
# IMPORTANT: Use "authors" (array of {name} objects) and "narrators" (array of strings)
# NOT "authorName"/"narratorName" — those are read-only computed fields that silently no-op
ABS_KEY=$(op read "op://Development/Audiobookshelf API Key/credential")
ssh home-server "curl -s -X PATCH 'http://localhost:13378/api/items/{ITEM_ID}/media' \
-H 'Authorization: Bearer $ABS_KEY' \
-H 'Content-Type: application/json' \
-d '{\"metadata\":{
\"title\": \"Clean Title\",
\"subtitle\": \"Optional Subtitle\",
\"authors\": [{\"name\": \"Author Name\"}],
\"narrators\": [\"Narrator Name\"],
\"series\": [{\"name\": \"Series Name\", \"sequence\": \"1\"}],
\"genres\": [\"Genre1\", \"Genre2\"],
\"publishedYear\": \"2024\",
\"description\": \"Book description text\"
}}'"
# Delete a book (hard=1 also removes files from disk)
ssh home-server "curl -s -X DELETE 'http://localhost:13378/api/items/{ITEM_ID}?hard=1' \
-H 'Authorization: Bearer $ABS_KEY'"
# Get full metadata for a book
ssh home-server "curl -s 'http://localhost:13378/api/items/{ITEM_ID}' \
-H 'Authorization: Bearer $ABS_KEY'" | jq '.media.metadata'
| Issue | Fix |
|---|---|
| Title has "(Unabridged)" | Set title to clean version, move subtitle portion to subtitle |
| Author/narrator swapped | MP3 ID3 tags often store these incorrectly — set both authors and narrators explicitly |
| Using authorName/narratorName | These are read-only — use authors: [{name}] and narrators: ["name"] arrays instead |
| Genre is "Audiobook" or typos | Replace with actual genres like ["Nonfiction", "History"] |
| Genres as single comma-joined string | Split into separate array entries |
| Missing series info | Add series array with name and sequence number |
| Duplicate entries after scan | Delete extras with DELETE /api/items/{ID}?hard=1 |
For audiobooks not from Audible (no ASIN), organize into Author/Title/ folders before SCP:
ABS_KEY=$(op read "op://Development/Audiobookshelf API Key/credential")
ssh home-server 'mkdir -p ~/audiobooks/"Author Name/Book Title"'
scp /path/to/files/*.mp3 "home-server:~/audiobooks/Author Name/Book Title/"
ssh home-server "curl -s -X POST 'http://localhost:13378/api/libraries/5b9bdb84-5ed1-45bb-ab37-383f2c720da5/scan' \
-H 'Authorization: Bearer $ABS_KEY'"
Audiobookshelf auto-matches based on folder names and embedded metadata, but non-Libation sources almost always need a metadata PATCH afterward.
liberate only downloads books Libation knows about. Always scan before liberate to pick up new purchases.LibationCli search tries to paginate interactively, which fails in non-TTY shells. Always pass -n 0.find ... -exec scp or double-quote with $HOME expansion.~/Developer/credentials/audiobookshelf.env does not exist. Always load via op read "op://Development/Audiobookshelf API Key/credential".http://100.79.211.138:13378 times out from this machine. Proxy all ABS API calls through ssh home-server "curl -s 'http://localhost:13378/...'".cat on credential files. Use awk -F= '/KEY/ {print $2}' to extract values.