modules/programs/agents/shared/skills/booklore/SKILL.md
Inspect my self-hosted BookLore library (books, audiobooks, libraries, shelves). Use when the user asks about BookLore, mentions their book/audiobook library, asks what books they have, looks up a title, lists libraries or shelves, or checks the BookLore instance status.
npx skillsauth add MichaelVessia/nixos-config bookloreInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Read-only wrapper for my self-hosted BookLore instance: inspect version, user, libraries, shelves, and books.
Credentials are exported into the shell by sops-nix (see
modules/programs/shell.nix):
BOOKLORE_URL — base URL (no trailing slash), e.g. http://192.168.1.7:8080BOOKLORE_USERNAME — login userBOOKLORE_PASSWORD — login passwordThe wrapper script asserts all three are set and aborts cleanly otherwise.
BookLore has no API-key auth. The flow is:
POST /api/v1/auth/login with {"username": "...", "password": "..."}{"accessToken": "...", "refreshToken": "...", "isDefaultPassword": false}Authorization: Bearer <accessToken>scripts/booklore.sh caches the access token in a per-user/per-URL
tempfile ($TMPDIR/booklore-<uid>/<hash>.token) and decodes the JWT's
exp claim to decide whether to reuse or re-login. The login helper
inside the script returns a valid token on stdout; every other
sub-command calls it once at the top.
This is also a workaround for a server-side bug in the deployed
development build: two logins in the same wall-clock second produce
identical refresh tokens and trip a UNIQUE constraint on
refresh_token, returning HTTP 400. The cache means we log in roughly
once per JWT lifetime instead of once per call.
scripts/booklore.sh exposes simple sub-commands. All output is JSON or
pre-formatted text.
bash scripts/booklore.sh status # /api/v1/version
bash scripts/booklore.sh version # alias for status
bash scripts/booklore.sh me # /api/v1/users/me
bash scripts/booklore.sh libraries # /api/v1/libraries
bash scripts/booklore.sh books [n] # /api/v1/books (default 50)
bash scripts/booklore.sh book-info <id> # /api/v1/books/<id>
bash scripts/booklore.sh search <query> # client-side title filter on /api/v1/books
bash scripts/booklore.sh shelves # /api/v1/shelves
bash scripts/booklore.sh help
For anything not covered, call the API directly with $BOOKLORE_URL after
logging in — see references/api-endpoints.md and
references/quick-reference.md.
bash scripts/booklore.sh search "<title>" — client-side filter.bash scripts/booklore.sh book-info <id> — full record for the match.Use status, me, libraries, shelves for sanity checks. Drop to raw
curl (after login) for anything else.
This wrapper is intentionally read-only. The deployed BookLore version is
development and its mutation surface (uploads, edits, deletes) has not
been verified here. Before issuing any POST/PUT/DELETE, confirm with the
user and verify the endpoint exists on the running instance (see the
controller-inspection recipe in references/troubleshooting.md).
references/api-endpoints.md — verified endpoints on this deployment,
plus notes on upstream-main divergencereferences/quick-reference.md — copy-paste curl recipes (login, list
books, refresh token, etc.)references/troubleshooting.md — auth, connection, 404 (older
deployment), and how to inspect installed controllersv1. Singular paths (/library, /shelf) and /healthcheck
return 404 — do NOT use those./api/v1/books returns a flat array, not a paginated envelope./api/v1/auth/refresh,
/api/v1/books/{id}/cover, downloads) may not exist on this deployed
instance, which reports version: "development". Verify before relying.exp and re-logins automatically.refresh_token table; the token cache avoids it.192.168.1.7:8080). If BOOKLORE_URL is
unreachable, surface that rather than guessing.tools
User guide for the local squash-safe `stack` CLI for stacked PR/MR repair on GitHub and GitLab. Use when someone asks how to inspect, track, sync, merge, document, or undo stacked pull requests / merge requests in squash-merge repositories. Prefer this tool over GitHub's `gh stack` command for this workflow.
tools
Control herdr from inside it. Manage workspaces and tabs, split panes, spawn agents, read output, and wait for state changes — all via CLI commands that talk to the running herdr instance over a local unix socket. Use when running inside herdr (HERDR_ENV=1).
development
Inspect my self-hosted AutoCaliWeb library. Use when the user asks about AutoCaliWeb, books in Calibre, OPDS status, recent imports, shelves, catalog stats, or wants to search the ebook library.
data-ai
Subscribe a YouTube channel in TubeArchivist, queue its top videos by views from recent uploads, wait for the first file, scan Jellyfin, and rename + lock the channel folder to a friendly display name. Use when the user says "add a youtube channel", "subscribe to <channel>", or wants a curated TubeArchivist + Jellyfin import for a creator.