Skip to content

Releases: bndct-devops/tome

v1.8.0 — "Spine"

Choose a tag to compare

@bndct-devops bndct-devops released this 05 Jul 10:26
1ae0792

Your library gets a spine — a way to leave its mark on the wider record of what you've read — and a careful pass over the parts that have to hold.

Highlights

  • Your reading, on Hardcover. Link your Hardcover account in Settings and Tome pushes your ratings and reading progress to it — one-way, opt-in, and nothing is ever deleted on Hardcover's side. A dedicated Hardcover page shows every synced book with its exact matched record, filterable by state, with per-book manual match / re-match / exclude. Matching is ISBN-first with a language-aware, audio-averse edition pin, so your profile shows the right edition — not a translation or the audiobook. Tokens are stored encrypted; server kill switch via TOME_HARDCOVER_SYNC_ENABLED.
  • Half-star ratings, everywhere. Book and series ratings now take 4.5-style values — click the left or right side of a star. Existing whole-star ratings are untouched, and KOReader's native (whole-star) rating still syncs both ways without ever rounding your halves away. Once a book is matched on Hardcover, the book page also shows real page numbers ("p. 142 of 384") alongside the percentage.
  • Highlights that travel both ways. Highlights you make in the web reader are now adopted natively by KOReader, and highlights from your KOReader appear inside the web reader — your commonplace book fills itself from whichever device you read on.
  • Follow a series, hear when a volume lands. Follow an ongoing series and Tome tells you when a new volume is out, with an Upcoming Releases card on Home.
  • A smarter Home and richer stats. Focus mode and your Reading DNA now live on Home, every book gets a fuller reading log, and a broad visual pass sharpened the dark themes, the dashboard hierarchy, the reading log, and the top bar.

Also

  • A deep metadata overhaul — cross-source merge with unified ranking, an AniList manga source, a short-lived source cache with in-flight de-duplication, and honest rate limits. Plus /scribe audit editions to find and fix wrong-edition ISBNs.
  • File into libraries straight from the Bindery — the review form and batch bar now have a Libraries picker, and "Match all" applies the best metadata match to every queued file at once.
  • A KOReader series-browser quality pass — live download progress, Retry on a failed load, "on device" markers, an "Open now?" prompt, and tight network timeouts so a dead server stalls for seconds, not a minute.

Fixed

  • A sideloaded book can no longer hijack another book's reading progress. The last-resort filename matcher was too eager — a short title like "It" matched The Italian Job, a Foo v2 file landed on a standalone "Foo", a year (… - 1984 - …) was misread as "volume 1984" — each silently writing one book's position, sessions and highlights onto another. Matching is now strict and declines rather than guessing. (Tome-served downloads match by content hash and are unaffected.)
  • Reading position no longer flaps between two values, and marking a book "unread" on the web now sticks on your device instead of the device re-pulling the old position and undoing the reset.
  • Reading history is more accurate — device sessions are clustered the way they're actually read (a one-third undercount corrected on real multi-year histories), files are recognised by content hash rather than just by name, and the big history import is memory-bounded so it won't OOM on large device databases.
  • Crash-safe file operations — library reorganisation commits per file and works across mounts, book deletion can't leave a permanent ghost row, and "purge empty folders" no longer deletes Syncthing markers.
  • Hardcover edition pinning no longer picks a translation's or the audiobook's edition for a matched book.

Security

  • Quick Connect codes can no longer be brute-forced into a login — polling now requires a long secret issued to the requesting device, so a guessed six-character code gets nowhere.
  • A KOReader sync registration can no longer claim your account — the unauthenticated registration endpoint no longer binds the new sync credential to a same-named Tome account.

Upgrading

  • KOReader plugin: update to build 31 (TomeSync → Check for updates, or auto-check on launch). Graceful update — your existing plugin keeps working; you just won't get half-star round-trip (build 31), the series-browser polish (build 29), content-hash book matching (build 27), or the memory-bounded history import (build 26) until it self-updates. No manual reinstall, no reconfiguration; your synced positions, highlights, and reading history carry over.
  • New optional settings: TOME_HARDCOVER_SYNC_ENABLED (Hardcover push, on by default when a user links an account), TOME_HARDCOVER_SYNC_INTERVAL.

v1.7.0 — "Signature"

Choose a tag to compare

@bndct-devops bndct-devops released this 28 Jun 15:56
9bcf862

Your whole KOReader reading history, imported — and turned into something useful. Years of page-by-page data become real numbers (true reading speed, words read, per-page intensity), every highlight you've made lands in one searchable place, and the same navigation finally follows you across every page.

Highlights

  • Your KOReader reading history, imported. TomeSync can now pull your device's per-page reading log (statistics.sqlite3) — often years of reading from before Tome existed — and fold it into every time-based stat: streaks, heat-map, top books, pace. The first sync backfills everything (chunked and resumable so it survives sleep/Wi-Fi drops); after that it's a trickle. Time and pages only — your read/unread status stays yours to set.
  • A reading signature, in numbers. Now that Tome counts your books' words and has your full page history, new tiles surface what session-timing alone can't: Words Read (lifetime), Reading Speed (your true words-per-minute), Book Length, and Re-reads. Each book page also gains a Reading intensity strip — where your time actually went, page by page — with an honest "X of Y pages" and re-read markers.
  • Highlights — your commonplace book. Every passage you highlight in KOReader gathers into one searchable page, grouped by book, with an "on this day" that resurfaces what you marked on this date in past years. Export to Markdown, per book or in full.
  • The sidebar follows you everywhere. One shared navigation on every page — Stats, Highlights, Wishlist, libraries — plus a global library search, so you're never more than a click from anywhere.
  • A "Taste" tab and a fuller stats gallery. A whole board built from your ratings (distribution, taste-by-genre, best-rated series, rating trend), plus gallery tiles for lifetime totals, personal records, library completion, a 24-hour reading clock, and reading-by-language.

Also

  • Send to KOReader is on by default now — queue a book from the web straight to your e-reader, no email, no Amazon.
  • Offline ratings sync — a rating or review set on the device while offline is remembered and pushed up the next time you're online.
  • A Home link in the book-page breadcrumb (you could reach the library, but not Home, from a book before).

Fixed

  • No more cross-book progress bleed — a filename-match edge case could map later volumes back onto volume 1 and overwrite its position. The matcher now reads the volume number and refuses to guess when a name is genuinely ambiguous.
  • TomeSync self-heals after your Kindle wakes — three failed syncs in a row used to latch it permanently "offline" until a full restart; back-off is now time-based and clears the moment Wi-Fi reconnects.
  • The Home-tab day-streak matches the Stats page after importing your reading history.

Upgrading

  • KOReader plugin: update to build 23 (TomeSync → Check for updates / auto-check on launch). Graceful update — existing plugin builds keep working; you just won't get reading-history sync (build 22) or the offline back-off fix (build 23) until the plugin self-updates. No manual reinstall.

v1.6.0 — Marginalia

Choose a tag to compare

@bndct-devops bndct-devops released this 21 Jun 14:29
a716333

The notes-in-the-margins release. Your reading is now something you can mark up — rate it, review it, and have those marks follow you onto your e-reader.

Highlights

  • Rate and review your books — and whole series. A 1–5 star rating and optional review on every book's detail page, private to you. Stars show on cards, you can sort by My Rating and filter the grid, and a series can be rated as a whole (inherited by unrated volumes).
  • Ratings sync both ways with KOReader. Rate on the web and it's written into the book on-device; rate on KOReader and it flows back to Tome. Web wins on a tie; Tome stays the source of truth.
  • PDFs are readable in the web reader at last. A proper in-browser pdf.js reader — continuous scroll, page tint, fit/zoom, keyboard nav, and progress tracking that syncs like EPUB/comics.
  • Filter your library by language. New Language dropdown in the filter bar (appears once you hold more than one language); messy values like en / eng / English fold into one tidy entry. Save it as a per-language Shelf.
  • Shelved reading status. A fourth state for books you've set aside without finishing — pulled off Continue Reading and completion stats but keeps your exact position. Plus undo on any reading-status change.

Also

  • Reading Stats dashboard: Auto-fit height toggle for list tiles, tidier headline tiles that no longer clip their numbers.
  • npm dependency bumps clearing Dependabot/CVE alerts.

Upgrading

  • KOReader plugin: the two-way rating sync needs TomeSync plugin build 20. This is a graceful update — existing plugin builds keep working; you just won't get rating sync until the plugin self-updates (Check for updates / auto-check). No manual reinstall needed.

v1.5.1

Choose a tag to compare

@bndct-devops bndct-devops released this 16 Jun 16:21
452a629

Patch release — two bug fixes, no new features.

  • Private libraries now actually hide their books (#53). Visibility is enforced by library membership everywhere it matters — the web library, OPDS, and the KOReader (TomeSync) series browser. A book placed in a private library is now hidden from members and guests who aren't its owner or an assigned user, regardless of who uploaded it. (The TomeSync series browser previously applied no visibility filter at all.) Books that aren't in any library stay visible to everyone; a member's own unfiled uploads stay private to them.
  • Custom themes now apply to the stats charts (#55). Chart colours and card hover-glows follow your custom palette's primary colour instead of staying on the built-in accent.

Upgrade: pull ghcr.io/.../tome:latest (or :v1.5.1). No migration or config changes required.

v1.5.0 — Rubric

Choose a tag to compare

@bndct-devops bndct-devops released this 13 Jun 14:28
a5e2e0c

Tome's biggest visual release yet. The violet is gone; in its place, a warmer, quieter identity built around oxblood — bookbinding-leather red — on paper neutrals, with a proper display typeface. And under the new coat of paint, your reading data gets two real upgrades: a stats page you can rebuild however you like, and reading goals to chase.

Highlights

A new look. Tome trades its violet accent for a deep bookbinding red — oxblood in the light themes, a dusty rosewood in the dark — on warm paper tones, with headings set in Bricolage Grotesque. Calmer, more "library," less "dashboard." The theme lineup grows to five, structured into a neutral pair (Light/Dark), a warm pair (Amber and the new cappuccino-dark Ember), and a true-black Black for OLED screens.

Reading goals. Set a target — books per year or month, minutes or pages per day or week — and watch a ring fill as you read. Goals live on the stats dashboard and the Home tab, count automatically from reading you already track (KOReader + the web reader), and can be scoped to a single book type — so a manga binge doesn't quietly inflate your "books this year." Year and month goals show whether you're ahead of or behind pace.

A stats page you own. Reading Stats is now a fully customisable dashboard. It looks identical on day one, but every figure is a tile on a drag-and-resize grid — rearrange, resize, duplicate, configure (chart style, timeframe, pick-your-own metric), and organise into board-tabs you can export, import, and screenshot. Boards save to the server, so your layout follows you across devices.

Group by series. A toggle in the library collapses each series into one stacked card, so a 100-volume run stops drowning out everything else. Filters still reach inside the stacks.

A calmer Home, sharper covers. The Home tab's boxed chips become one quiet panel, Continue Reading sorts by when you last read, and the library's fixed views become a grid/list pair with a cover-size slider — dense to poster-sized.

KOReader plugin. Opt-in WiFi auto-connect for devices that sleep their radios, a flexible download-location system (default layout, flat, or a Sonarr-style custom template), and a tidied in-book menu.


Changelog

Added

  • Reading goals — targets for books/minutes/pages per day/week/month/year, on the stats dashboard and Home tab, optionally scoped per book type, with pace and a bell notification on completion. Per-user.
  • Group by series in the library view — toggle to collapse each series into a stacked card; filters apply inside the stacks. (#43)
  • KOReader plugin: opt-in WiFi auto-connect — re-establishes the connection before user-initiated actions on devices that sleep their radios. Off by default. (plugin build 18, #38)
  • KOReader plugin: choose where downloads go — default layout, flat-in-home, or a Sonarr-style custom template with {series}/{volume}/{title}/… tokens, case modifiers, and sanitised paths. (plugin build 19)

Changed

  • Pick your own cover size — the three fixed views become grid + list with a cover-size slider; layout changes animate.
  • A new look: oxblood, paper, and a proper display face — new identity (oxblood/rosewood on paper, Bricolage Grotesque headings) plus a sweep of refinements.
  • One green, one blue, one amber — three theme-aware semantic tokens replace ~80 hardcoded colours.
  • Wishlist page header/empty-state cleanup; Fulfilled section starts expanded.
  • A calmer Home tab — one hairline-divided stat panel, Continue Reading by last-read, sidebar/Shelves tidy-ups.
  • Five themes, structured — Light/Dark, Amber/Ember, and a true-black Black.
  • KOReader plugin: clearer menu — "Tracking: on (tap to pause)", a Settings submenu, working gesture popup. (plugin build 18)
  • Reading Stats is now a fully customisable dashboard — drag/resize/duplicate/configure tiles, board-tabs with export/import/PNG, server-saved, 35-widget gallery.

Fixed

  • Book-detail Activity strip rendered as empty space — bars are back.
  • Stats dashboard no longer slides in from the side on open (measures container before mount).
  • Phone layout for the stats dashboard — slim fixed gutter + wrapping range pills, no sideways scroll.
  • 365-day heatmap bucketed days in UTC — now local dates, matching other charts.
  • KOReader sync status (/me/kosync) could 500 for accounts with both TomeSync and legacy KOSync history — TomeSync is now prioritised and the status loads reliably.

Security

  • esbuild advisory (GHSA-g7r4-m6w7-qqqr, low) cleared in the website toolchain — Dependabot reports 0 open alerts.

v1.4.0

Choose a tag to compare

@bndct-devops bndct-devops released this 10 Jun 15:46

Maintenance release — no new setup required.

This one is mostly about a bug reported on r/koreader (thanks for the excellent debugging!): if you use KOReader profiles that auto-execute on book open to set your layout, the TomeSync plugin's sync message could silently swallow the profile's actions — so font size, margins or columns kept "resetting" on exactly the opens where another device had read ahead. The sync message is now a passive toast that lets profile actions through. The same fix also stops web-reader positions from throwing KOReader to page 1, and stops the book-open sync running twice.

The plugin updates itself: after updating your server, open the TomeSync menu in KOReader → Check for updates → you should land on build 17 (1.2.4).

Also fixed: relative timestamps ("2h ago") no longer drift by your UTC offset in the Reading Log, notifications, and API-token list.

Two features ride along quietly, both opt-in:

  • Send to KOReader (beta) — queue a book from the web straight to your e-reader; off by default, enable with TOME_SEND_TO_KOREADER=true. Docs
  • Single-book downloads in the plugin — the series browser now drills into per-volume lists, including a "No Series" entry for standalones.

Full details in the changelog.

v1.3.2 — Reader settings hotfix

Choose a tag to compare

@bndct-devops bndct-devops released this 06 Jun 13:19

Fixed

  • Reader font, size and theme no longer reset at every chapter. In the EPUB reader, changing the font, font size or background theme applied to the page you were on but was silently reverted the moment you turned into a new chapter — snapping back to whatever settings were saved when you first opened the book. The reader now reapplies your current choices on every chapter, so adjustments persist for the rest of the session. (#33)

Upgrading

No database migration needed — pull the new image and recreate the container:

docker pull ghcr.io/bndct-devops/tome:latest   # or :v1.3.2

Full Changelog: v1.3.1...v1.3.2

v1.3.1 — Shared libraries hotfix

Choose a tag to compare

@bndct-devops bndct-devops released this 06 Jun 10:54

Fixed

  • Shared libraries are now actually shared. Marking a library public previously had no effect — the library list only ever returned libraries you owned (plus the built-in global ones), so a library created by one account was invisible to every other account, regardless of its public/private setting. Public libraries are now visible to everyone, and their books show up for member accounts too (previously only guests saw public-library books). (#31)
  • Private libraries can be shared with specific people. The library editor has a new Share with users picker, and library owners — not just admins — can grant and revoke access to their own libraries. (#31)
  • Cleaner controls. Rename / delete / add-to-library actions now appear only on libraries you can actually manage, so you no longer see edit buttons that error out on someone else's library.

Upgrading

No database migration needed — pull the new image and recreate the container:

docker pull ghcr.io/bndct-devops/tome:latest   # or :v1.3.1

Full Changelog: v1.3.0...v1.3.1

v1.3.0 — "Diary"

Choose a tag to compare

@bndct-devops bndct-devops released this 05 Jun 21:10
8cf646d

A diary is two things: the lock, and the notes behind it. v1.3.0 ships both — SSO for the lock, cross-device highlight and note sync for the notes.

Highlights

Sign in with SSO

Tome now speaks OpenID Connect — log in with the provider you already run (Pocket ID, Authelia, Authentik, Keycloak, Zitadel, Google, …). Groups map to Tome roles, existing accounts can link SSO from Settings, and a local admin always stays as a break-glass login. Off by default; flip TOME_OIDC_ENABLED.

Your margins travel with you

Highlights and notes made on one KOReader now sync — bidirectionally — to your other devices through Tome, and show up on the book's detail page. Mark a passage on one reader, see it on the next. Edits and deletes propagate cleanly, so nothing you removed comes back.

See how you read

New per-book and per-series reading stats — time read, pace, pages turned, sessions, completion, estimated time remaining, and a daily activity chart: the diary of your reading. Admins also get a library-wide aggregate across readers.

Steadier sync, end to end

Finishing a book on KOReader is now permanent, web↔device progress lines up at the right scale, and OPDS catalogs parse in strict clients again.


Changelog

Added

  • Single sign-on (OIDC). Tome can now authenticate against an external
    OpenID Connect identity provider (Pocket ID, Authelia, Authentik, Keycloak,
    Zitadel, Google, …). When enabled, a configurable "Sign in with SSO" button
    appears on the login page; signing in provisions a Tome account and maps the
    provider's groups to Tome roles (admin / member / guest). Existing accounts can
    attach SSO via Settings → Single Sign-On → Link SSO, so you keep your
    library and reading history while gaining passkey login. Local username/password
    login always stays available, and at least one local admin remains a break-glass
    login regardless of identity-provider state. Off by
    default — set TOME_OIDC_ENABLED=true plus issuer/client credentials to turn
    it on. New env vars: TOME_OIDC_ENABLED, TOME_OIDC_ISSUER,
    TOME_OIDC_CLIENT_ID, TOME_OIDC_CLIENT_SECRET, TOME_OIDC_REDIRECT_URL,
    TOME_OIDC_ADMIN_GROUP, TOME_OIDC_MEMBER_GROUP, TOME_OIDC_GUEST_GROUP,
    TOME_OIDC_DEFAULT_ROLE, TOME_OIDC_AUTO_CREATE, TOME_OIDC_ALLOWED_GROUP,
    TOME_OIDC_ROLE_SYNC, TOME_OIDC_BUTTON_LABEL (see the SSO docs).
  • Per-series reading stats on the series detail page. A collapsible "Reading
    Stats" card now appears between the series header and the volume grid for any
    series you have at least one session on: total time read across all volumes, a
    per-volume bar chart (unread volumes show as faint empty bars so gaps are
    visible), completion count and percentage, session count, pages turned, average
    time per volume, an estimated time remaining (based on finished-volume average),
    longest volume, and first/last read dates. Admins additionally see a
    library-wide aggregate line — total time, sessions, and distinct reader count
    across all users. Served by the new GET /api/series/{name}/reading-stats
    endpoint backed by the extended backend/services/reading_stats.py. The
    StatTile component is now shared from frontend/src/components/stats/StatTile.tsx.
  • Per-book reading stats on the book detail page. A collapsible "Reading
    Stats" card now appears below the reading-status buttons for any book you
    have at least one session on: total time read, session count, pages turned,
    average session length, reading pace (pages/min), first and last read dates,
    an estimated time remaining (shown while the book is in "reading" status),
    and a compact daily activity bar chart. Admins additionally see a
    library-wide aggregate — total time, sessions, and distinct reader count
    across all users — in a small sub-section at the bottom of the card.
    Served by the new GET /api/books/{book_id}/reading-stats endpoint backed by
    the reusable backend/services/reading_stats.py aggregation helper.
  • Highlight & note sync for KOReader, bidirectional across devices. Highlights
    and notes you make on one e-reader sync through Tome to your other KOReader
    devices (pulled when you open a book; pushed on suspend, on close, via Sync
    now
    , or the TomeSync: Sync highlights gesture), and show up in a
    Highlights & Notes section on the book's detail page — highlighted text,
    note, and chapter. The highlight's position is its identity (same passage on two
    devices = one highlight); edits resolve last-write-wins and deletes propagate via
    tombstones (a removed highlight won't reappear). Device-to-device needs the
    Tome-served copy of the book on both. Rendering highlights inside the web reader
    is a separate, later step. Plugin build 12. (TomeSync)
  • TOME_GOOGLE_BOOKS_KEY: optionally supply your own Google Books API key.
    Without it, Google Books is queried anonymously against a shared global quota
    that is exhausted almost immediately, making the fallback silently return zero
    results — felt most acutely for non-English (e.g. traditional Chinese)
    catalogues that depend on Google for coverage. With a key set, requests are
    charged against your own Cloud project quota instead. Public-volume search
    only — no OAuth, no access to user data. A configured key that hits its quota
    now logs a clear warning instead of failing silently. (#10)

Changed

  • Book detail page layout: genres moved into the left sidebar (below the
    cover), book metadata consolidated into a collapsible "Details" grid below
    the description, and the description itself is now truncated with a "Show
    more" toggle. The reading-stats card and Highlights & Notes section sit in
    the same right column, giving the page a cleaner two-column structure.
  • The home "Pick up where you left off" panel is now a compact cover strip
    instead of a full-width grid.

Fixed

  • Books sent with Send to Device now sync their reading position back from
    KOReader. They were emailed as a bare Title.ext, which the TomeSync resolver
    couldn't reliably match to a library book (it failed with "Book not resolved").
    Sent files are now named the same way KOReader names its OPDS downloads —
    Author - Vol. X — Title.ext — so they resolve through the path that already
    works for OPDS. No change for books already on a device; re-send to pick up the
    new name (#25).
  • You can no longer lock yourself out by removing the last admin. Demoting,
    deactivating, or deleting a user is now refused with "Cannot remove the last
    admin" when they are the only remaining active admin — previously a single-user
    instance that changed its own role to member (or guest) had no way back through
    the UI and needed a manual database edit to recover.
  • The PWA service worker no longer swallows full-page navigations to server
    routes. Its SPA navigation fallback was serving the cached app shell for any
    navigation, including /api/* and /opds/* — so on an installed/cached client
    the SSO handshake silently failed (the redirect to /api/auth/oidc/login and
    the provider's return to the callback both got the app shell, dropping you back
    to the dashboard instead of completing sign-in). The navigation fallback now
    excludes /api and /opds.
  • Finishing a book on KOReader is now permanent. Previously, opening a finished
    book again (even briefly) could push a lower position percentage and silently
    un-finish it — dropping the status back to "reading" and erasing the 100%
    mark. Completion is now sticky: once a book reaches "read", any later position
    update from the device leaves the status and progress untouched. The device's
    resume position (used to reopen the book at the right place) still updates as
    normal, so returning to a finished book still opens at the last page. The same
    fix applies to reading sessions flushed from the plugin's offline queue.
    Finishing always normalizes progress to exactly 100%.
  • Web reading progress now syncs to KOReader at the correct scale. Progress
    fractions are 0–1 throughout the stack, but the web reader was mistakenly
    dividing an already-fractional value by 100 before writing to the sync
    position table — so marking a book finished on the web synced as ~1% to
    KOReader, and mid-read positions appeared near the start of the book.
    Web and device positions now match.
  • Login page could crash to a blank screen if you opened it while already signed
    in (e.g. returning to a tab with a live session) — a stale-session edge that
    tripped a React hooks error. The redirect now runs after the page's hooks.
  • TomeSync (KOReader) sync silently failing on HTTPS deployments behind a
    reverse proxy (also released as the 1.2.1 hotfix). The plugin baked its server
    URL from the scheme the app server saw, which is http when TLS is terminated
    upstream — and if the proxy then redirected HTTP→HTTPS, KOReader could not
    follow the 307 on POST/PUT, so every reading session and position update failed
    (sessions piled up as "pending" and nothing reached the library). The server
    now honours X-Forwarded-Proto when baking the plugin's SERVER_URL, and a
    new optional TOME_PUBLIC_URL setting pins the canonical public origin
    explicitly. The plugin build was bumped so existing installs re-bake the
    corrected URL on TomeSync → Check for updates. Plain HTTP, LAN, and
    localhost deployments are unaffected.
  • OPDS feeds are now served with the standard default Atom namespace
    (<feed xmlns="http://www.w3.org/2005/Atom">) instead of prefixed
    ns0: elements, so strict OPDS clients such as KOReader parse them and the
    catalog is no longer empty. The feed builder shared a process-global XML
    namespace map with the download metadata embedder; whichever module was
    imported last claimed the default prefix and silently broke the other.
    Namespace prefixes are now re-asserted, under a lock, at serialization time so
    they no longer depend on imp...
Read more

v1.2.2 — Last-admin lockout hotfix

Choose a tag to compare

@bndct-devops bndct-devops released this 05 Jun 18:09

Fixed

  • You can no longer lock yourself out by removing the last admin. Demoting, deactivating, or deleting a user is now refused with Cannot remove the last admin when they are the only remaining active admin. Previously, a single-user instance that changed its own role to member (or guest) had no way back through the UI and required a manual database edit to recover. (#26)

Already locked out?

If you hit this on an older build, promote an account back to admin directly in the database, then refresh (no restart needed — the role is read from the DB on every request):

docker exec -it tome sqlite3 /data/tome.db "UPDATE users SET role='admin', is_admin=1 WHERE username='<username>';"

Not on Docker? Point sqlite3 at tome.db under your TOME_DATA_DIR.


Full Changelog: v1.2.1...v1.2.2