Commit Graph

1423 Commits

Author SHA1 Message Date
neon 199ba687c3 feat(achievements): answer in the language the client asks for
Achievement names, descriptions and category labels, the secret placeholder and the monthly
challenge are text the server writes and every client shows as is, so they stayed English in a
translated web page and will in the localized iOS app. The routes that return them now read
Accept-Language and answer in that language, with Vary: Accept-Language.

The translations live in the web's catalogs under serverText, so Crowdin, its checks and its
translators handle them through the existing pipeline; the server reads that subtree, and the image
copies the catalogs beside dist. English is never looked up: a request without the header, and
every client that predates it, gets the bytes it got before. A test keeps serverText in en.json
equal to the seed and the constants it mirrors. The web now sends its chosen language on every API
request, and the Accept-Language matcher moved into @bookorbit/types so the client and the server
negotiate the same way.

The iOS app is a consumer the web client does not show: it will send its own interface language.
App Store builds that predate that still send the device language, so on a non-English device they
will start getting translated achievement names inside English screens. That was accepted; the
response shape does not change.

Ref bookorbit/bookorbit-ios-support#79
2026-10-30 02:21:07 +00:00
neon 1beb17d218 fix(metadata): stop duplicating moved provider IDs
Keep providers with compatibility ID fields out of the generic external-provider rows so the editor exposes one valid input.

Closes #1997
2026-10-30 01:16:04 +00:00
neon 805a857776 docs: fix contributing guide links
Fixes #1994
2026-10-30 00:51:26 +00:00
neon fd1aac3074 fix(reader): preserve valid EPUB side clicks
Evaluate the long-hold threshold when the pointer is released so the double-click delay does not discard valid page turns.

Closes #1992
2026-10-30 00:44:06 +00:00
neon e8e3f4df19 fix(series): keep loading series books after returning to the page
Read the series id once per kept-alive instance instead of following the
shared route, so coming back no longer resets the list and strands the
scroll observer on a removed sentinel. Re-observe the sentinel whenever
the books section remounts.

Closes #1988
2026-10-30 00:13:16 +00:00
neon 0206a98ccc fix(series): count every volume of series longer than the ladder cap
Send logical volume counts on each series summary, tallied from the member
grouping the ladder already builds, and read them on the cards instead of
counting the 60-slot ladder. Long series no longer stop at 60 or show as
complete after their first 60 volumes are read.

Closes #1987
2026-10-30 00:04:46 +00:00
neon 63e16ad757 fix(series): show selected books in KOReader series views
Pass bulk selection state through the dedicated series-page model so grid and list layouts render the same selection cues as the library.

Closes #1956
2026-10-28 15:23:35 +00:00
neon 62e8690b30 fix(stats): make history years accessible when overflowing
Keep the all-time filter visible and expose keyboard-accessible controls for navigating long year ranges.

Closes #1959
2026-10-28 14:27:24 +00:00
neon a9e63a60e1 fix(stats): save reading history share images
Wait for the canvas export callback before starting the download so the browser can complete the PNG export.

Closes #1967
2026-10-28 14:15:56 +00:00
neon 329e266962 docs: improve README support and navigation 2026-10-28 04:27:58 +00:00
neon f2a7a11188 build(deps): update minor and patch dependencies
Refresh workspace manifests, resolution overrides, and the lockfile while keeping all packages on their current major versions.
2026-10-28 02:49:03 +00:00
neon 7b72f06130 ci: close inactive pull requests automatically
Mark pull requests stale after 30 inactive days and close them seven days later. Clear the stale state when new activity arrives so active contributions remain open.
2026-10-28 01:47:44 +00:00
neon a96ff0c85a security(deps): resolve container scan findings
Upgrade fixable Node dependencies and rebuild the pinned kepubify binaries with Go 1.27.3 so multi-architecture image publication passes the security gate.
v3.6.0
2026-10-27 23:55:58 +00:00
neon 267f53fccd feat(koreader): colour the widget board on colour screens
Add a Colour setting to Settings > Home: Accents, the default, colours each
widget's marks and draws Continue reading in its cover's deep shade; Tinted
also washes every tile in its widget's colour; Off keeps the greys. Black-and-
white screens draw as before, colour e-readers get stronger shades, and night
mode keeps each colour's hue.
2026-10-27 15:27:39 +00:00
neon 0b89e5a4a1 fix(series): count duplicate formats as one volume
Preserve raw book counts for compatibility while reporting logical ownership and reading progress for duplicate series positions.

Closes #1871
2026-10-27 03:55:23 +00:00
neon 0752319647 feat(koreader): draw the reading pets in colour and add six more
Redraw every reading pet as a shaded 64 x 64 master with a colour and a
grey per palette entry, one lazily loaded module per pet, and add the
mimic, mummy, witch, skeleton, candle and alien. Paint in colour on
colour screens, keep pet colours in night mode, scale by half steps and
give pet tiles a dithered refresh so Kaleido shows their colour.
2026-10-26 16:01:25 +00:00
neon 1c27e5dd05 fix(koreader): keep manual links to a different copy matched and suggest links
Report a linked copy whose bytes differ from the library file as positionIncompatible instead of
unmatched, so the plugin keeps the match, skips highlights without a failure and still syncs progress.
Treat a position-less place within a page as the same place and jump to the nearest page.
Suggest library books with the same title and authors for books to review, with bulk linking.
See docs/KOREADER_HASH_MATCHING.md.

Closes #1872
Closes #1919
2026-10-26 15:06:04 +00:00
neon 834da8c954 fix(client): keep the sidebar dock inside a narrow sidebar
The dock's six 32px controls need 13.25rem, but the sidebar can be dragged
down to 224px, so the language and settings buttons spilled past its edge.
Below that width the buttons now shrink to 28px with a 2px gap. The spacer
that added a stray gap is replaced by a right-aligned group; the rail and
phone sheet are unchanged.

Closes #1873
2026-10-25 21:24:18 +00:00
neon 587ffeb3ed docs: add a note on API stability to the README 2026-10-25 15:43:09 +00:00
neon cf09a71be6 fix(cover): keep a cover staged in a slot that is locked again before save
A cover staged after unlocking a locked slot, then re-locked before saving,
was silently dropped. The save now leaves that slot open, writes the cover,
then locks it again, and holds the page refetch until the locks are final.

Closes #1915
2026-10-24 23:11:40 +00:00
neon 569cc8c84b security(docker): move both images to node 26.12.1
Rebuild the app and read-aloud worker images on Node 26.12.1, which fixes
CVE-2026-111497 in the bundled Brotli decoder and the other October 2026
Node security issues. The app image stays on Alpine 3.23, pinned by digest.
Closes #1912
2026-10-24 22:48:29 +00:00
neon 70376ad866 fix(koreader): open the dashboard on reMarkable's 16-bit screen
Draw dashboard thumbnails in RGB32 when the screen is RGB565. KOReader's
MuPDF scaler throws on RGB565, which crashed the first-run layout picker
and the widget previews on every reMarkable running under AppLoad.

Closes #1909
2026-10-24 21:06:40 +00:00
neon b9e5fe3a29 fix(koreader): keep the configured file name on downloads
Plugins from 1.7.0 request a delivery variant, and every such download had
" - bo-<id>-<variant>" added to its name. Only copies that would share a path are
renamed now: a narrated EPUB's text-only copy and later same-format files. A new
<a|b|c> chained default also stops the default pattern naming authorless
standalone books "Standalone/ - <title>". See docs/READ_ALOUD_DELIVERY.md.

Closes #1893
2026-10-24 21:06:09 +00:00
neon 946855cd30 feat(library): read series from folders for comics and manga
Offer the one-folder-per-series layout Komga and Kavita use as a File as Book path-rule preset
rather than a new organization mode, so released iOS builds and both existing modes are unaffected.
Add a job that applies saved rules to books already in a library, and keep a run year such as
"Batman (2016)" when ComicInfo or a provider names the series without it.

Ref #1167
Ref #1918
Ref #839
2026-10-24 04:43:17 +00:00
neon faee78370d feat(library): rebuild the folder picker as a tree with a live plan
Pick folders from a lazily loaded tree with find-by-name and typed paths, beside a plan showing
the books each organization mode would import, overlaps with other libraries, and folders no
library reads yet. New ManageLibraries /path routes walk folders within entry and time bounds.
Fix the scanner filing a disc-named library folder such as /mnt/disk1 under the folder above it,
and move books already filed there onto their primary file on the next scan.
2026-10-24 04:04:00 +00:00
neon d29b06c6e8 fix(auth): restore metadata editing lost to the 3.5.0 library roles
Promote Viewer grants to Editor on book libraries for non-superusers who hold Edit metadata but
can edit nowhere, which is how every such account was left after the upgrade. Accounts with any
Editor or Owner role are left alone. The Users drawer now says where Edit metadata takes effect,
read from a new GET /users/:id/library-access route.

Closes #1902
2026-10-24 03:56:25 +00:00
neon e28f45452d fix(koreader): keep each device's layout at every interface size
Layout breakpoints use the screen width at 1x, so Interface size scales text,
icons and spacing without dropping Home columns or detail panes. Every page,
sheet and widget picks a layout that fits instead of cutting text or leaving
gaps; search becomes balanced list-row sections, Edit Home keeps hidden widgets,
stock KOReader messages become BookOrbit toasts, and the plugin is 2.1.0.
2026-10-24 03:46:05 +00:00
neon b50b8da56c feat(metadata): add external HTTP metadata providers
Register book-metadata-provider services by address, with no code change per
provider; Settings lists ready-made ones to install. Ranking prefers a record of
the book's own medium. LubimyCzytac moves out to its own provider and Aladin,
whose API closes, is retired; their ids stay. Adds migrations 0129 and 0130.
See docs/METADATA_PROVIDERS.md.

Ref #1405
2026-10-23 06:11:04 +00:00
neon 9e49f496f1 feat(reader): add grouped reading progress routes
Add GET and PUT /reading-progress and DELETE /reading-progress/:fileId: positions grouped by
kind, up to 25 files saved in one request, and an optional editedAt so the server keeps the newer
of two saves. Move the web reader and book page to them, and list reading-progress in
SERVER_FEATURES for the iOS and Android apps, which adopt the routes in the same release.
2026-10-22 17:28:07 +00:00
neon d44444823f feat(types): advertise reading history to clients
List reading-history in SERVER_FEATURES so the iOS app shows History, and its links from
Activity and a book's Timeline, only on servers that serve the routes.

Ref #1630
2026-10-22 16:23:47 +00:00
neon 6b6b662e79 fix(books): deliver plain EPUBs that fail text-only inspection
A text-only download of an EPUB with no narration returned 400 when the
strict inspection tripped on a structural fault such as duplicate manifest
ids, a missing resource or a chapter over 16 MiB. Serve such books as stored,
and log why inspection failed or why a text-only delivery was refused.

Closes #1888
2026-10-22 15:31:35 +00:00
neon 1c593d7403 feat(stats): add a reading history of every finished read
Add a History page listing every read newest first, rereads included, as a
virtualized ledger or month cover walls, with period totals, per-read ratings,
export and a share image. Deleting a book keeps its finished reads under a
title and author snapshot (migration 0128).

Closes #1630
2026-10-22 14:45:09 +00:00
neon d21c68d13c feat(books): add an audiobook chapter editor
Add a Chapters tab to edit chapter timing and titles, look chapters up on Audible or in the ebook,
snap starts to pauses, keep a version history and write chapters into M4B, M4A and MP3 files. Add a
chapter health tool with a bulk Audible lookup queue. Editing needs Editor access to the book's
library. Chapter edits keep released iOS playback working by accepting a stale manifest revision
while the track layout is unchanged.

Ref #1120
2026-10-22 04:36:49 +00:00
neon 5ba5352e3e fix(books): stop the Files tab header overlapping its stats
Stack the hero bar when one row would leave the title under 12rem,
measured from the stats and actions rather than a fixed container
breakpoint, and let the folder crumb truncate once its ancestors are
spent instead of painting over the stats.
2026-10-22 00:42:23 +00:00
neon 8810d47658 feat(books): remember a default read-aloud narration language
Resolve book languages stated as names ("English") to a code, so the
dialog and the server's fallback stop calling English unsupported. The
dialog groups the ebook and audiobook in a Sources card, shows
Highlighting without the Advanced disclosure, and saves a per-user
default under /user-preferences/read-aloud for books it cannot match.
2026-10-22 00:42:06 +00:00
neon 0320210767 fix: say which download client is not responding
Show one notice above the release picker naming the client, with a
Try again that resends the same release, instead of a chip on every
row. Grab failures carry the client name in errorMeta, and transport
errors read "connection refused" rather than "fetch failed".
2026-10-22 00:05:10 +00:00
neon 992224f2e8 feat(books): add read-aloud generation
Generate a synced read-aloud EPUB from a book's EPUB and audiobook through an
optional STAlign worker (Docker on CPU, or native with MLX on Apple Silicon),
with review, re-sync, replace in place, restart recovery and live progress on
the Files tab. Book details also stack the ebook and audiobook covers when
both exist. See docs/READ_ALOUD.md.
2026-10-21 23:44:37 +00:00
neon 99aa7dce70 fix(reader): preserve third-party KOReader menu entries
Extend KOReader's cached menu order instead of persisting complete
override lists. Remove marker-owned legacy overrides during upgrade
while preserving hand-maintained entries.

Closes #1878
2026-10-21 19:51:36 +00:00
neon 8f289c295a fix(series): load complete KOReader series lists
Fetch every bounded API page before applying local pagination so large series remain complete in KOReader and available offline.

Closes #1883
2026-10-21 19:33:26 +00:00
neon d31bf392f4 fix(reader): discard unmatched lifecycle entries
Treat an unmatched lifecycle response as terminal so built-in help documents do not retry until parked. Record the skipped title in sync activity and clear the stale parked warning.

Closes #1886
2026-10-21 19:17:38 +00:00
neon 9ba01498cf fix(reader): enable D-pad dashboard setup
Expose each starter preset and the Start button as separate focus targets so non-touch KOReader devices can complete first-run setup.

Closes #1880
2026-10-21 19:05:02 +00:00
neon 9d1319ef8b fix(reader): preserve KOReader covers in night mode
Counter-invert custom cover pixels before KOReader applies its screen-wide night mode so artwork retains its original colors.

Closes #1885
2026-10-21 18:51:54 +00:00
neon fbd7a2e125 feat(metadata): clean pasted identifiers instead of truncating them
ISBNs copied from Amazon carry hyphens, and copied ASINs often start with a zero-width space.
The edit tab cut a hyphenated ISBN at its maxlength, Book Dock sent it on for the server to
reject, and an invisible character left an ID that looked right but never matched.

Clean ISBN, ASIN and provider id input as it is typed or pasted, and apply the same shared
rule in the book metadata and Book Dock DTOs so every client, including released iOS builds,
gets it. Provider ids keep their punctuation because Google ids and slugs use it, and an
over-long value is kept whole so validation still names the field.

Closes #1624
2026-10-21 05:47:03 +00:00
neon edc5e41105 feat(books): filter read-along titles
Expose read-along EPUBs as an additive format filter while preserving ordinary EPUB matching and existing client compatibility.

Closes #1583
2026-10-21 05:18:37 +00:00
neon d1cc18dc51 feat(smart-scope): add rolling older-than date filters
Allow users to build bounded historical windows without hard-coded calendar dates. Keep the API additive and advertise support for independently released clients.

Closes #1751
2026-10-21 03:59:41 +00:00
neon 95fa2c77fb docs: refresh KOReader plugin preview 2026-10-20 18:39:25 -06:00
neon c59dd0118f i18n(client): sync translations from Crowdin (#1844)
Keep sparse translated catalogs synchronized with reviewed Crowdin content.

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
v3.5.0
2026-10-20 17:07:14 -06:00
neon cecbdc44ce security(docker): require patched libexpat version
Prevent cached image layers from retaining the vulnerable Alpine package.
2026-10-20 22:33:08 +00:00
neon a41d3da63e fix(email): use shared default provider as fallback
Preserve explicit and per-user provider precedence while allowing multi-user installations to use a configured shared default deterministically.

Closes #1387
2026-10-20 16:05:33 -06:00
neon 2b8917afb6 feat(authors): allow correcting metadata matches
Let users edit author facts, choose and pin a provider record, and keep later refreshes tied to that record. Preserve compatibility for older clients through additive API fields and a discoverable server feature.

Keep server typechecking deterministic by breaking circular Drizzle inference and correcting the nullability mismatches it previously hid.

Closes #1464
2026-10-20 16:05:32 -06:00