Shipped, and shipping next.
mybibli reached v1.0 after ten epics of foundational work, and is in production on the household NAS that drove the project. Beyond v1, every release is a focused theme — see what's coming next, or scroll down for what already shipped. Pre-built Docker images on Docker Hub; everything tracked openly as GitHub issues.
Source of truth: _bmad-output/implementation-artifacts/sprint-status.yaml in the repo.
Coming up.
Planned releases, in roughly the order they will ship. Themes are stable, dates are not — mybibli is a side-project and ships when ready. Each version is bundled around one coherent user benefit. The full plan, including the tech-debt parking lot, lives in ROADMAP.md.
-
Backlog
Polish & community CRs
UnscheduledThe originally-planned v1.1–v1.6 build is complete and v1.7.0 has shipped. mybibli is now in GH-issue-driven polish mode — new CRs are queued here until a coherent theme emerges (or until enough land to bundle into the next themed minor). Patches ship independently for production bugs.
- Volume-count mismatch — title shows multiple volumes when user owns only 1 (#300) — silent data corruption, pending triage; potential v1.7.1 candidate.
- Broader per-provider visibility for metadata fetch (#202) — docs slice shipped in v1.5; UX slice is deeper work.
- Long-standing flake in
home-search.spec.ts:224(#196) — downgraded to fix-when-convenient. - A drift of code-review findings tracked under the
type:code-review-findinglabel.
Full list lives in ROADMAP.md's parking lot.
-
v2.0 candidate
Classification, reinvented
ExploringToday the "genre" field tries to be two things at once: the catalog source's idea of a section, and the owner's manual classification. v2 candidate splits them — keep Dewey for the standards-based axis, treat genre as a free-form owner-side label, and stop the auto-fetch from ever touching either.
- Splits a longstanding entanglement that surfaced in v1.1.8's
genre_idfix. - Will land on a minor version if a backwards-compatible path is found, on v2.0 otherwise.
Tracked on GitHub: #206
- Splits a longstanding entanglement that surfaced in v1.1.8's
The ten epics
Each one ships behind a draft PR per story, gated by green CI. Each one ends with a retrospective.
-
Epic 1
Catalog my first book
✓ DoneProject skeleton, scan field, title CRUD with ISBN scanning, volume management, contributor management, search, async metadata fetch, login. The foundation.
-
Epic 2
I know where my books are
✓ DoneConfigurable storage-location hierarchy, scan-to-shelve workflow, browse a shelf's contents, contextual guidance.
-
Epic 3
All my media types
✓ DoneProvider chain (BnF / Google Books / Open Library / MusicBrainz / OMDb / TMDB / BDGest), media-type-aware scanning, cover image management, metadata editing and re-download.
-
Epic 4
I manage my loans
✓ DoneBorrower CRUD & search, loan registration with validation, loan return with automatic location restoration, per-borrower history.
-
Epic 5
My series & my collection
✓ DoneE2E test stabilization, contributor deletion guard, series CRUD, title/series assignment with gap detection, BD multi-position omnibus support, browse list/grid toggle, similar titles, Dewey codes.
-
Epic 6
CI/CD pipeline & reliability
✓ DoneGitHub Actions pipeline, seeded librarian + login-as for parallel-safe E2E, manually-edited-fields race fix, cleanup of
waitForTimeoutwith a CI grep gate. -
Epic 7
Multi-role access & security
✓ DoneAnonymous browsing with role gating, session inactivity timeout with keep-alive toast, language toggle (FR/EN), strict Content Security Policy headers, scanner-guard modal interception.
-
Epic 8
Administration & configuration
✓ DoneAdmin shell with health tab, CSRF synchronizer-token middleware, user administration, reference-data management, system settings, trash view + restore, permanent delete + auto-purge, first-launch setup wizard.
-
Epic 9
UX polish & accessibility
✓ DoneDashboard indicators, modal-based confirmations replacing
hx-confirm, status messages and empty states, connection-lost overlay, navbar polish, contextual help tooltips, keyboard shortcuts, responsive layouts, and a final WCAG 2.2 AA audit. -
Epic 10
Mobile UX & sécurité closeout
✓ DoneAuth threat model documented end-to-end, CSRF rejection UX (server-rendered "session expired" feedback), mobile DataTable card mode + admin tabs
<select>dropdown (dual-surface pattern), axe-core extended to every entity-detail route. Closeout epic — every story grounded in a GitHub issue from the post-Epic-9 review pass, no new feature surface. -
Milestone
v1.7.0 + v1.7.1 — Reach more users, debug more easily (finished properly)
✓ Livemybibli has been live on the household NAS that drove the project since v1.1.1 (2026-05-14). After v1.4.0 ("Bring your own agent" — JSON HTTP API at /api/v1/* with API-key auth), v1.5.0 — "Know what you have, and what it's worth" is the fourth themed minor, bundling five CRs. Library of Congress metadata provider (#263) sits between Google Books and Open Library in the chain — fills the older / academic / US-government EN-book gap. Donut chart for stats-by-genre on home (#265) — Chart.js v4 vendored, 5% threshold rolls small genres into an "Other" bucket with a
<details>block listing the rolled-up names. Title lifecycle affordances — delete a title with zero volumes via a UX-DR8 modal (#271) + edit ISBN/ISSN/UPC in the metadata-edit form with checksum + duplicate-collision guards (#272). Real server-rendered PDF wish list export (#266) — replaces the browser print-to-PDF round-trip withgenpdf+ DejaVu Sans vendored. Headline: per-volume collection valuation (#243) — purchase price + estimated current value with per-column ISO 4217 currency, aggregations per currency / per genre / per series on a new/stats/valuepage, opt-in home dashboard indicator (default OFF, admin toggle). CHF seeded as the default currency, admin-overridable. Pre-built Docker images on Docker Hub at gcorbaz/mybibli —:1.5.0. v1.5.1 is a five-fix production-hygiene patch shipped within hours of the v1.5.0 NAS upgrade: Dockerfile missingCOPY static/fonts/made the wish list PDF crash (#281); Trash permanent-delete on titles failed because the 4 child FKs weren't cascaded (#282); the Library valuation toggle was missing from the System admin tab (#283); revoked API keys couldn't be deleted (#284); and the provider Health-tab probe marked everyone Unreachable because of a missing User-Agent + an overly strict reachability rule (#285). Docker Hub:1.5.1. v1.5.2 is a one-fix hotfix on v1.5.1: the v1.5.0 #243 valuation workflow was partially broken — the UPDATE landed and totals appeared correctly, but every subsequent volume read crashed because SQLx 0.8 can't decode raw MariaDBDECIMAL(10,2)intoOption<f64>.VolumeModel::find_by_idandfind_by_labelnow wrap the two DECIMAL columns withCAST(... AS DOUBLE)— same pattern the aggregation queries already used (#288). Docker Hub:1.5.2. v1.6.0 — "Tighten the catalog" is the fifth themed minor — four CRs aimed at catalog hygiene. Storage locations can now be marked organizational to refuse volume assignments — useful for nested containers that act as folders, not shelves (#280; checkbox on the create/edit form, flip-with-volumes guard, volume-edit picker rejects organizational targets). The new shelf-audit workflow lets a librarian mark a volume "À contrôler" — single or in bulk for an entire shelf — surfaced via an amber home-dashboard indicator and a dedicated/auditlist sorted by location → V-code (#237;volumes.under_audit_since DATETIME NULLmigration, audit-trail entries for every mark/clear). A "Titles without volumes" filter chip on the home dashboard surfaces titles with no active volume row — either soft-deleted away or never shelved (#279; Librarian+ only,NOT EXISTSSQL guard, mirrors the #205 Uncategorized chip shape). And the home page's list view becomes a sortable table — Title · Author · Genre · Dewey · Volumes — replacing the cards-stacked-vertically layout, with column headers issuing HTMXhx-get+hx-push-url=true, mirroring/location/:id(#250; grid view unchanged, sort dropdown hidden in list mode). Docker Hub:1.6.0. v1.6.1 is a one-fix hotfix on v1.6.0 surfaced within hours of the v1.6.0 prod NAS upgrade: ticking the new#280"Emplacement organisationnel" checkbox on a root location returned400 Failed to deserialize form body: parent_id: cannot parse integer from empty string. The location-edit form's<select name="parent_id"><option value="">None</option>...</select>submitsparent_id=(empty) for root locations, and#[serde(default)] Option<u64>only short-circuits ABSENT fields — empty strings still hit the u64 parser. Newdeserialize_optional_u64helper (sibling of the existing_i32and_f64ones inroutes::series) treats empty asNone. Wired toCreateLocationForm.parent_id,UpdateLocationForm.parent_id, ANDVolumeEditForm.condition_state_id(latent there too — picking "no condition" would 400 the same way) (#296). Latent since the location-edit feature shipped; only surfaced now because CR #280 gave users a new reason to edit root containers. Docker Hub:1.6.1. v1.6.2 is a two-part dependency-hygiene patch. (1) cargo update applied 74 caret-compatible bumps including axum 0.8.8 → 0.8.9, tokio 1.50 → 1.52, openssl 0.10.76 → 0.10.80 (security-relevant), rustls 0.23.37 → 0.23.40, hyper 1.8 → 1.9, tower-http 0.6.8 → 0.6.11, wasm-bindgen 0.2.115 → 0.2.121, and the icu_* + rustls-* + zerocopy stacks. No code changes; 909 unit tests + integration suite + sqlx-prepare check all green.cargo auditconfirms no new advisories — the 2 pre-existing upstream-blocked ones (rsavia sqlx-mysql,time 0.2via genpdf) remain. (2) Cargo.lock removed from .gitignore and committed — mybibli ships as a binary application, so a pinned lockfile gives reproducible builds across the Dockerfile, the release workflow, and `git checkout vX.Y.Z` checkouts. Previously the lockfile was untracked and the Docker build re-resolved dependency versions at build time, which would have made two different `:1.6.x` images potentially diverge silently if upstream had pushed a patch release between builds. This is a one-time structural fix; future bumps will be tracked in the lockfile diff. Docker Hub:1.6.2. v1.7.0 — "Reach more users, debug more easily" is the sixth themed minor, bundling three CRs. German UI translation (#275) — ~900 keys translated fromen.ymlto a newde.yml, Sie-form throughout (formal "you" — appropriate for library / small-association deployments). Italian UI translation (#276) — ~900 keys translated to a newit.yml, Tu-form informal throughout, Italian guillemets «…» for inline quotes. Together they bring the UI to four languages on top of EN + FR; reference data (genre names, location-type names, condition states) stays in whatever language operators entered — only UI chrome is localized. Persistent log directory + rotation + admin-controlled level (#301) — logs now write to/var/log/mybibli/in the container (mapped to the newmybibli_logsnamed volume, bind-mountable for DSM Log Center / journald) with daily rotation and a 30-day in-process purge. Admins can flip the log level (trace/debug/info/warn/error) from/admin > Systemwithout a redeploy. New chapter 12 of the manual ("Operations & debugging") in EN + FR walks through tailing, log levels, structured-JSON parsing, and post-mortem grepping. Foundation slice (PR #302) extended the i18n machinery to handle ≥3 languages, with a new locale-parity test that ensures all four locale files stay key-aligned on every CI run. Docker Hub:1.7.0. v1.7.1 — "Finish 1.7.0 properly" is the patch that closes the v1.7.0 #301 gap (the release notes had advertised admin runtime log-level control but only the env-var bootstrap actually shipped) and bundles four production-surfaced bugfixes from the v1.7.0 NAS upgrade. Runtime log-level admin UI (#308) —/admin > Systemgains a Logging section; the next log line uses the newEnvFilterdirective (plain level or full directive list) with nodocker compose up -d, persisted to thesettingstable. API-key permanent-delete 422 (#309) — theDELETEhandler was extractingForm<>from the body but HTMXhx-deleteputs form fields in the query string; drop the body extractor. provider_health probe timeout configurable, default 3 s → 10 s (#310) — every probe was timing out on home-NAS DNS+TLS, making/admin > Healthpermanently red. NewMYBIBLI_PROVIDER_HEALTH_TIMEOUT_SECSenv var. Bulk cover-refetch now actually re-queries providers (#311) — was silently no-op'ing on cached titles because the chain short-circuited on the cache hit; newforce_refreshpath invalidates the cache. DB pool size 10 → 20 (#312) — observed transientpool timed outduring a 64-title bulk-refetch; the sqlx default was too tight for HTTP handlers + 3 always-on background tasks + admin polling. Plus home filter chips: drop duplicate "Non classé" (#314) — was rendering both a "Non classé" chip (auto from the placeholder genre) and a "Sans genre" chip (the #205 dedicated affordance) — duplicates. Docker Hub:1.7.1+:latest. The 1.6.x, 1.5.x, 1.4.x, 1.3.x, and 1.2.x lines stay in maintenance. Honor the 1.1.0 minimum install floor (seed-gate + audit trio); earlier tags are removed.
Epic 9 — story by story
Twenty-two stories. All shipped, retrospective complete (2026-05-10). Each story links to its merged PR via the issues view on GitHub.
Steer the next release.
The roadmap above describes the direction. The order — and which features get pulled forward, deferred, or reshaped — depends on what real users hit. If something in what's next matters to you, say so on the issue. If a feature is missing entirely, open one — every release of mybibli so far has been driven by production feedback.