Skip to content
mybibli
Roadmap

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.

v1 scope 100%

Source of truth: _bmad-output/implementation-artifacts/sprint-status.yaml in the repo.

What's next

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.

  1. Backlog

    Polish & community CRs

    Unscheduled

    The 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-finding label.

    Full list lives in ROADMAP.md's parking lot.

  2. v2.0 candidate

    Classification, reinvented

    Exploring

    Today 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_id fix.
    • Will land on a minor version if a backwards-compatible path is found, on v2.0 otherwise.

    Tracked on GitHub: #206

Shipped

The ten epics

Each one ships behind a draft PR per story, gated by green CI. Each one ends with a retrospective.

  1. Epic 1

    Catalog my first book

    ✓ Done

    Project skeleton, scan field, title CRUD with ISBN scanning, volume management, contributor management, search, async metadata fetch, login. The foundation.

  2. Epic 2

    I know where my books are

    ✓ Done

    Configurable storage-location hierarchy, scan-to-shelve workflow, browse a shelf's contents, contextual guidance.

  3. Epic 3

    All my media types

    ✓ Done

    Provider chain (BnF / Google Books / Open Library / MusicBrainz / OMDb / TMDB / BDGest), media-type-aware scanning, cover image management, metadata editing and re-download.

  4. Epic 4

    I manage my loans

    ✓ Done

    Borrower CRUD & search, loan registration with validation, loan return with automatic location restoration, per-borrower history.

  5. Epic 5

    My series & my collection

    ✓ Done

    E2E 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.

  6. Epic 6

    CI/CD pipeline & reliability

    ✓ Done

    GitHub Actions pipeline, seeded librarian + login-as for parallel-safe E2E, manually-edited-fields race fix, cleanup of waitForTimeout with a CI grep gate.

  7. Epic 7

    Multi-role access & security

    ✓ Done

    Anonymous browsing with role gating, session inactivity timeout with keep-alive toast, language toggle (FR/EN), strict Content Security Policy headers, scanner-guard modal interception.

  8. Epic 8

    Administration & configuration

    ✓ Done

    Admin 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.

  9. Epic 9

    UX polish & accessibility

    ✓ Done

    Dashboard 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.

  10. Epic 10

    Mobile UX & sécurité closeout

    ✓ Done

    Auth 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.

  11. Milestone

    v1.7.0 + v1.7.1 — Reach more users, debug more easily (finished properly)

    ✓ Live

    mybibli 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 with genpdf + 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/value page, 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 missing COPY 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 MariaDB DECIMAL(10,2) into Option<f64>. VolumeModel::find_by_id and find_by_label now wrap the two DECIMAL columns with CAST(... 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 /audit list sorted by location → V-code (#237; volumes.under_audit_since DATETIME NULL migration, 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 EXISTS SQL 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 HTMX hx-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 returned 400 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> submits parent_id= (empty) for root locations, and #[serde(default)] Option<u64> only short-circuits ABSENT fields — empty strings still hit the u64 parser. New deserialize_optional_u64 helper (sibling of the existing _i32 and _f64 ones in routes::series) treats empty as None. Wired to CreateLocationForm.parent_id, UpdateLocationForm.parent_id, AND VolumeEditForm.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 audit confirms no new advisories — the 2 pre-existing upstream-blocked ones (rsa via sqlx-mysql, time 0.2 via 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 from en.yml to a new de.yml, Sie-form throughout (formal "you" — appropriate for library / small-association deployments). Italian UI translation (#276) — ~900 keys translated to a new it.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 new mybibli_logs named 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 > System without 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 > System gains a Logging section; the next log line uses the new EnvFilter directive (plain level or full directive list) with no docker compose up -d, persisted to the settings table. API-key permanent-delete 422 (#309) — the DELETE handler was extracting Form<> from the body but HTMX hx-delete puts 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 > Health permanently red. New MYBIBLI_PROVIDER_HEALTH_TIMEOUT_SECS env 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; new force_refresh path invalidates the cache. DB pool size 10 → 20 (#312) — observed transient pool timed out during 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 complete

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.

9-1 Dashboard global stats card done
9-2 Dashboard recent additions done
9-3 Dashboard stats by genre done
9-4 FilterTag & unshelved indicator done
9-5 Overdue loans indicator done
9-6 Series-with-gaps indicator done
9-7 Recent activity indicators done
9-8 Loan status, role-aware done
9-9 Home page scanner state machine done
9-10 Modal foundation + delete-borrower migration done
9-11 Migrate return-loan to modal done
9-12 Migrate delete-contributor to modal done
9-13 Migrate delete-series to modal done
9-14 Migrate deactivate-user to modal done
9-15 Status messages & empty states done
9-16 Connection-lost overlay done
9-17 Navbar hamburger & scanner auto-close done
9-18 Navbar role-visibility polish done
9-19 Contextual help tooltips done
9-20 Keyboard shortcuts & cheat-sheet done
9-21 Responsive per-page layouts done
9-22 WCAG AA final audit done

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.