neon
d22faeaaf4
i18n(client): sync translations from Crowdin ( #1427 )
...
Keep sparse translated catalogs synchronized with reviewed Crowdin content.
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-09-18 09:47:01 -06:00
dependabot[bot]
3860d38eb6
chore(deps): bump the production-dependencies group with 6 updates ( #1441 )
...
Bumps the production-dependencies group with 6 updates:
| Package | From | To |
| --- | --- | --- |
| [@formatjs/icu-messageformat-parser](https://github.com/formatjs/formatjs/tree/HEAD/packages/icu-messageformat-parser ) | `3.5.17` | `3.5.18` |
| [@lucide/vue](https://github.com/lucide-icons/lucide/tree/HEAD/packages/vue ) | `1.45.0` | `1.46.0` |
| [@tanstack/vue-virtual](https://github.com/TanStack/virtual/tree/HEAD/packages/vue-virtual ) | `3.13.38` | `3.13.39` |
| [intl-messageformat](https://github.com/formatjs/formatjs ) | `11.2.14` | `11.2.15` |
| [tailwind-merge](https://github.com/dcastil/tailwind-merge/tree/HEAD/packages/tailwind-merge ) | `3.6.0` | `3.7.0` |
| [zod](https://github.com/colinhacks/zod ) | `4.6.2` | `4.6.5` |
Updates `@formatjs/icu-messageformat-parser` from 3.5.17 to 3.5.18
- [Release notes](https://github.com/formatjs/formatjs/releases )
- [Changelog](https://github.com/formatjs/formatjs/blob/main/packages/icu-messageformat-parser/CHANGELOG.md )
- [Commits](https://github.com/formatjs/formatjs/commits/@formatjs/icu-messageformat-parser@3.5.18/packages/icu-messageformat-parser )
Updates `@lucide/vue` from 1.45.0 to 1.46.0
- [Release notes](https://github.com/lucide-icons/lucide/releases )
- [Commits](https://github.com/lucide-icons/lucide/commits/1.46.0/packages/vue )
Updates `@tanstack/vue-virtual` from 3.13.38 to 3.13.39
- [Release notes](https://github.com/TanStack/virtual/releases )
- [Changelog](https://github.com/TanStack/virtual/blob/main/packages/vue-virtual/CHANGELOG.md )
- [Commits](https://github.com/TanStack/virtual/commits/@tanstack/vue-virtual@3.13.39/packages/vue-virtual )
Updates `intl-messageformat` from 11.2.14 to 11.2.15
- [Release notes](https://github.com/formatjs/formatjs/releases )
- [Commits](https://github.com/formatjs/formatjs/compare/intl-messageformat@11.2.14...intl-messageformat@11.2.15 )
Updates `tailwind-merge` from 3.6.0 to 3.7.0
- [Release notes](https://github.com/dcastil/tailwind-merge/releases )
- [Commits](https://github.com/dcastil/tailwind-merge/commits/tailwind-merge@3.7.0/packages/tailwind-merge )
Updates `zod` from 4.6.2 to 4.6.5
- [Release notes](https://github.com/colinhacks/zod/releases )
- [Commits](https://github.com/colinhacks/zod/compare/v4.6.2...v4.6.5 )
---
updated-dependencies:
- dependency-name: "@formatjs/icu-messageformat-parser"
dependency-version: 3.5.18
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: "@lucide/vue"
dependency-version: 1.46.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: "@tanstack/vue-virtual"
dependency-version: 3.13.39
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: intl-messageformat
dependency-version: 11.2.15
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: tailwind-merge
dependency-version: 3.7.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: zod
dependency-version: 4.6.5
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-18 09:46:49 -06:00
dependabot[bot]
2d054412ff
chore(deps): bump the github-actions group with 4 updates ( #1440 )
...
Bumps the github-actions group with 4 updates: [codecov/codecov-action](https://github.com/codecov/codecov-action ), [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action ), [docker/build-push-action](https://github.com/docker/build-push-action ) and [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action ).
Updates `codecov/codecov-action` from 7.0.0 to 7.1.0
- [Release notes](https://github.com/codecov/codecov-action/releases )
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md )
- [Commits](https://github.com/codecov/codecov-action/compare/fb8b3582c8e4def4969c97caa2f19720cb33a72f...0b35c9ecc4f0529d0eb674914510c22f85b196b4 )
Updates `docker/setup-buildx-action` from 4.3.0 to 4.4.0
- [Release notes](https://github.com/docker/setup-buildx-action/releases )
- [Commits](https://github.com/docker/setup-buildx-action/compare/37fe631027851001ddb9b187196cc803df7f5f0e...594f3bf4285d9ea8dc53c9a0c9c4092420091003 )
Updates `docker/build-push-action` from 7.3.0 to 7.4.0
- [Release notes](https://github.com/docker/build-push-action/releases )
- [Commits](https://github.com/docker/build-push-action/compare/53b7df96c91f9c12dcc8a07bcb9ccacbed38856a...c3c9e263c25d99ce0380d002d59b67737d91b0dc )
Updates `docker/setup-qemu-action` from 4.3.0 to 4.4.0
- [Release notes](https://github.com/docker/setup-qemu-action/releases )
- [Commits](https://github.com/docker/setup-qemu-action/compare/1f40c72289eff860ee54a304f1438e3cff362e0a...99012661954931238ded8c8b007157a8430204e1 )
---
updated-dependencies:
- dependency-name: codecov/codecov-action
dependency-version: 7.1.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: github-actions
- dependency-name: docker/setup-buildx-action
dependency-version: 4.4.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: github-actions
- dependency-name: docker/build-push-action
dependency-version: 7.4.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: github-actions
- dependency-name: docker/setup-qemu-action
dependency-version: 4.4.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: github-actions
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-18 09:46:30 -06:00
neon
b10bb58a88
i18n(client): sync translations from Crowdin ( #1418 )
...
Keep sparse translated catalogs synchronized with reviewed Crowdin content.
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-09-15 09:18:54 -06:00
dependabot[bot]
b485d06688
chore(deps): bump the production-dependencies group across 1 directory with 6 updates ( #1417 )
...
Bumps the production-dependencies group with 6 updates in the / directory:
| Package | From | To |
| --- | --- | --- |
| [@lucide/vue](https://github.com/lucide-icons/lucide/tree/HEAD/packages/vue ) | `1.42.0` | `1.45.0` |
| [@tanstack/vue-virtual](https://github.com/TanStack/virtual/tree/HEAD/packages/vue-virtual ) | `3.13.37` | `3.13.38` |
| [cronstrue](https://github.com/bradymholt/cRonstrue ) | `3.24.0` | `3.26.0` |
| [fastify](https://github.com/fastify/fastify ) | `5.12.3` | `5.12.4` |
| [mysql2](https://github.com/sidorares/node-mysql2 ) | `3.24.3` | `3.24.4` |
| [zod](https://github.com/colinhacks/zod ) | `4.5.4` | `4.6.2` |
Updates `@lucide/vue` from 1.42.0 to 1.45.0
- [Release notes](https://github.com/lucide-icons/lucide/releases )
- [Commits](https://github.com/lucide-icons/lucide/commits/1.45.0/packages/vue )
Updates `@tanstack/vue-virtual` from 3.13.37 to 3.13.38
- [Release notes](https://github.com/TanStack/virtual/releases )
- [Changelog](https://github.com/TanStack/virtual/blob/main/packages/vue-virtual/CHANGELOG.md )
- [Commits](https://github.com/TanStack/virtual/commits/@tanstack/vue-virtual@3.13.38/packages/vue-virtual )
Updates `cronstrue` from 3.24.0 to 3.26.0
- [Release notes](https://github.com/bradymholt/cRonstrue/releases )
- [Changelog](https://github.com/bradymholt/cRonstrue/blob/main/CHANGELOG.md )
- [Commits](https://github.com/bradymholt/cRonstrue/compare/v3.24.0...v3.26.0 )
Updates `fastify` from 5.12.3 to 5.12.4
- [Release notes](https://github.com/fastify/fastify/releases )
- [Commits](https://github.com/fastify/fastify/commits/v5.12.4 )
Updates `mysql2` from 3.24.3 to 3.24.4
- [Release notes](https://github.com/sidorares/node-mysql2/releases )
- [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md )
- [Commits](https://github.com/sidorares/node-mysql2/compare/v3.24.3...v3.24.4 )
Updates `zod` from 4.5.4 to 4.6.2
- [Release notes](https://github.com/colinhacks/zod/releases )
- [Commits](https://github.com/colinhacks/zod/compare/v4.5.4...v4.6.2 )
---
updated-dependencies:
- dependency-name: "@lucide/vue"
dependency-version: 1.45.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: "@tanstack/vue-virtual"
dependency-version: 3.13.38
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: cronstrue
dependency-version: 3.26.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: fastify
dependency-version: 5.12.4
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: mysql2
dependency-version: 3.24.4
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: zod
dependency-version: 4.6.2
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-15 09:18:41 -06:00
neon
50063b7775
ci: make crowdin source synchronization deterministic
...
Upload and verify the checked-out English catalog before exporting translations so delayed webhooks cannot stall the scheduled workflow.
2026-09-15 13:11:24 +00:00
neon
2ced82794f
feat(docker): support file-backed secrets
...
Load mounted secrets before database migrations while preserving direct environment values for existing deployments.
Closes #373
2026-09-14 17:02:03 +00:00
neon
c316e52e65
fix(auth): honor delegated admin permissions
...
Allow manage_users administrators to manage user content filters and allow manage_email administrators to share providers they own. Preserve provider ownership and keep system mail designation restricted to superusers.
Fixes #1401
v2.10.0
2026-09-14 04:58:40 +00:00
neon
911f61e3dc
fix(reader): preserve touch text selection in PDF reader
...
Route touch selection through EmbedPDF pointer mode while keeping swipe pagination limited to pan mode. Keep NestJS testing aligned with the application major and prevent incompatible standalone major updates.
Fixes #1388
2026-09-13 18:44:02 +00:00
neon
2f22abe03e
fix(library): respect locale for cron time display
...
Derive the clock convention from the active locale so custom scan schedules match the rest of the interface.
Closes #1391
2026-09-13 12:38:15 -06:00
dependabot[bot]
614194202b
chore(deps): bump @nestjs/testing from 11.2.3 to 12.0.1 ( #1369 )
...
Bumps [@nestjs/testing](https://github.com/nestjs/nest/tree/HEAD/packages/testing ) from 11.2.3 to 12.0.1.
- [Release notes](https://github.com/nestjs/nest/releases )
- [Commits](https://github.com/nestjs/nest/commits/v12.0.1/packages/testing )
---
updated-dependencies:
- dependency-name: "@nestjs/testing"
dependency-version: 12.0.1
dependency-type: direct:development
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-13 11:51:24 -06:00
neon
3bb33b615c
feat(book-requests): add per-indexer seed goals
...
Add configurable seed ratio and seed time goals to request indexers, supporting both static goals and tracker-advertised ratio/seed-time limits via torznab attributes. Enforce indexer-specific seed policy during request fulfillment and display active seed targets in the request seed panel.
Closes #1360
2026-09-13 17:42:12 +00:00
neon
8f1215d331
feat(book-requests): add indexer plugin updates and release profiles
...
Add an in-app update service and UI controls for installed indexer plugins, verifying releases and fetching updates securely. Introduce configurable release profiles for fine-tuning score weights, format preferences, and rejection criteria in book request automation.
2026-09-13 15:04:20 +00:00
neon
fcdd72a384
feat(book-requests): add newznab and nzbget support
...
Support Usenet indexers via the built-in Newznab adapter and Usenet downloads via NZBGet. Generalize active download tracking from torrent client hashes to protocol-agnostic client keys, add NZB release scoring and file handling, and expose Newznab indexer and NZBGet client options in settings and grab flows.
Closes #1312
2026-09-13 06:47:06 +00:00
neon
7a203a03d7
fix(client): add missing icon tooltips
...
Make icon-only controls discoverable to mouse and keyboard users with localized tooltips and accessible names.
Fixes #588
2026-09-12 09:24:32 +00:00
neon
3aebf90242
fix(scanner): surface Book Dock finalize error details
...
Log sanitized failure codes and stages while keeping database queries and filesystem paths out of requester-visible messages.
Ref #1367
2026-09-12 08:12:55 +00:00
neon
ceda7428b0
feat(reader): add dedicated audiobook playback API
2026-09-11 05:41:29 +00:00
dependabot[bot]
7ecc52ee30
chore(deps): bump the production-dependencies group with 12 updates ( #1368 )
...
Bumps the production-dependencies group with 12 updates:
| Package | From | To |
| --- | --- | --- |
| [@lucide/vue](https://github.com/lucide-icons/lucide/tree/HEAD/packages/vue ) | `1.39.0` | `1.42.0` |
| [@tanstack/vue-virtual](https://github.com/TanStack/virtual/tree/HEAD/packages/vue-virtual ) | `3.13.36` | `3.13.37` |
| [@tiptap/extension-link](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/extension-link ) | `3.31.0` | `3.31.3` |
| [@tiptap/pm](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/pm ) | `3.31.0` | `3.31.3` |
| [@tiptap/starter-kit](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/starter-kit ) | `3.31.0` | `3.31.3` |
| [@tiptap/vue-3](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/vue-3 ) | `3.31.0` | `3.31.3` |
| [dompurify](https://github.com/cure53/DOMPurify ) | `3.4.14` | `3.4.15` |
| [vue-echarts](https://github.com/ecomfe/vue-echarts ) | `8.2.0` | `8.3.0` |
| [vue-router](https://github.com/vuejs/router ) | `5.3.0` | `5.3.1` |
| [fastify](https://github.com/fastify/fastify ) | `5.12.1` | `5.12.3` |
| [jose](https://github.com/panva/jose ) | `6.2.10` | `6.2.12` |
| [undici](https://github.com/nodejs/undici ) | `8.10.1` | `8.10.2` |
Updates `@lucide/vue` from 1.39.0 to 1.42.0
- [Release notes](https://github.com/lucide-icons/lucide/releases )
- [Commits](https://github.com/lucide-icons/lucide/commits/1.42.0/packages/vue )
Updates `@tanstack/vue-virtual` from 3.13.36 to 3.13.37
- [Release notes](https://github.com/TanStack/virtual/releases )
- [Changelog](https://github.com/TanStack/virtual/blob/main/packages/vue-virtual/CHANGELOG.md )
- [Commits](https://github.com/TanStack/virtual/commits/@tanstack/vue-virtual@3.13.37/packages/vue-virtual )
Updates `@tiptap/extension-link` from 3.31.0 to 3.31.3
- [Release notes](https://github.com/ueberdosis/tiptap/releases )
- [Changelog](https://github.com/ueberdosis/tiptap/blob/v3.31.3/packages/extension-link/CHANGELOG.md )
- [Commits](https://github.com/ueberdosis/tiptap/commits/v3.31.3/packages/extension-link )
Updates `@tiptap/pm` from 3.31.0 to 3.31.3
- [Release notes](https://github.com/ueberdosis/tiptap/releases )
- [Changelog](https://github.com/ueberdosis/tiptap/blob/v3.31.3/packages/pm/CHANGELOG.md )
- [Commits](https://github.com/ueberdosis/tiptap/commits/v3.31.3/packages/pm )
Updates `@tiptap/starter-kit` from 3.31.0 to 3.31.3
- [Release notes](https://github.com/ueberdosis/tiptap/releases )
- [Changelog](https://github.com/ueberdosis/tiptap/blob/v3.31.3/packages/starter-kit/CHANGELOG.md )
- [Commits](https://github.com/ueberdosis/tiptap/commits/v3.31.3/packages/starter-kit )
Updates `@tiptap/vue-3` from 3.31.0 to 3.31.3
- [Release notes](https://github.com/ueberdosis/tiptap/releases )
- [Changelog](https://github.com/ueberdosis/tiptap/blob/v3.31.3/packages/vue-3/CHANGELOG.md )
- [Commits](https://github.com/ueberdosis/tiptap/commits/v3.31.3/packages/vue-3 )
Updates `dompurify` from 3.4.14 to 3.4.15
- [Release notes](https://github.com/cure53/DOMPurify/releases )
- [Commits](https://github.com/cure53/DOMPurify/compare/3.4.14...3.4.15 )
Updates `vue-echarts` from 8.2.0 to 8.3.0
- [Release notes](https://github.com/ecomfe/vue-echarts/releases )
- [Changelog](https://github.com/ecomfe/vue-echarts/blob/main/CHANGELOG.md )
- [Commits](https://github.com/ecomfe/vue-echarts/compare/v8.2.0...v8.3.0 )
Updates `vue-router` from 5.3.0 to 5.3.1
- [Release notes](https://github.com/vuejs/router/releases )
- [Commits](https://github.com/vuejs/router/compare/v5.3.0...v5.3.1 )
Updates `fastify` from 5.12.1 to 5.12.3
- [Release notes](https://github.com/fastify/fastify/releases )
- [Commits](https://github.com/fastify/fastify/commits )
Updates `jose` from 6.2.10 to 6.2.12
- [Release notes](https://github.com/panva/jose/releases )
- [Changelog](https://github.com/panva/jose/blob/main/CHANGELOG.md )
- [Commits](https://github.com/panva/jose/compare/v6.2.10...v6.2.12 )
Updates `undici` from 8.10.1 to 8.10.2
- [Release notes](https://github.com/nodejs/undici/releases )
- [Commits](https://github.com/nodejs/undici/compare/v8.10.1...v8.10.2 )
---
updated-dependencies:
- dependency-name: "@lucide/vue"
dependency-version: 1.42.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: "@tanstack/vue-virtual"
dependency-version: 3.13.37
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: "@tiptap/extension-link"
dependency-version: 3.31.3
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: "@tiptap/pm"
dependency-version: 3.31.3
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: "@tiptap/starter-kit"
dependency-version: 3.31.3
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: "@tiptap/vue-3"
dependency-version: 3.31.3
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: dompurify
dependency-version: 3.4.15
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: vue-echarts
dependency-version: 8.3.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: vue-router
dependency-version: 5.3.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: fastify
dependency-version: 5.12.3
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: jose
dependency-version: 6.2.12
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: undici
dependency-version: 8.10.2
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-10 21:21:47 -06:00
neon
a7847537fb
docs: strengthen PR submission requirements
2026-09-11 03:18:15 +00:00
SergeiAK
73ac0bb722
feat(authors): collapse series on author pages ( #1271 )
...
Reduce large author listings to one card per series while preserving book counts, scoped visibility, and row-based pagination. Compute both totals in the collapsed query so deep pages remain consistent without a second author-wide scan.
Closes #301
Co-authored-by: neon <18559658+neonsolstice@users.noreply.github.com >
2026-09-10 12:39:14 -06:00
neon
b7e1e21d07
i18n(client): sync translations from Crowdin ( #1307 )
...
Keep sparse translated catalogs synchronized with reviewed Crowdin content.
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-09-10 12:07:31 -06:00
neon
d9ea13ba45
feat: add BookOrbit attribution requirements
...
Define AGPLv3 additional terms and expose attribution, source, and license details through unobtrusive About surfaces.
2026-09-10 18:03:11 +00:00
neon
26712eb02a
security(metadata): scope catalog suggestions to visible books ( #1366 )
...
Derive catalog typeahead values only from books in libraries the requester can access, and enforce their content filters. Preserve superuser visibility, exact-match ranking, and user-scoped collection lookup.
2026-09-10 11:59:24 -06:00
neon
5a5337bb31
chore: merge origin/main into main
...
Preserve both divergent commits while reconciling the local and remote histories.
2026-09-10 16:45:53 +00:00
bobberb
17aa7425f8
feat(library): per-library added_at source (imported/file_modified/file_created) ( #1239 )
...
* feat(scanner): set book added_at from earliest on-disk file mtime
A book's "date added" now reflects when its content files first landed on
disk (the earliest mtime across its content-role files) instead of the
moment BookOrbit imported it. Cover/metadata/supplement sidecars are
excluded. When no content file has a usable mtime, addedAt is left unset so
the DB defaultNow() fallback (import time) still applies. Only set at
initial book creation; re-scan/restore paths do not touch it.
* feat(library): add per-library added_at source with recompute
Add an addedAtSource setting to libraries so "date added" can follow the
book's files on disk rather than the moment the scanner happened to see
them. The setting takes imported (unchanged default), file_modified, or
file_created, guarded by a check constraint on the column.
Expose a recompute action so the chosen source can be applied to books
that are already imported. file_modified runs as a single set-based
update over the stored mtimes; file_created has to stat the files, since
birthtime is not persisted, so it batches those reads.
Leave every existing library on imported so behavior is unchanged unless
a user opts in.
* feat(library): add added_at source control to the library editor
Surface the new addedAtSource setting in the library editor as a radio
group, alongside a button that triggers the recompute for the library
being edited.
Keep the recompute out of the save path so changing the setting stays
cheap: the setting alone only affects books imported from then on, and
applying it to existing books is an explicit choice.
* i18n(library): translate added_at source strings (de/nl/pt/sl)
* fix(library): correct create payload, recompute floor and failure logging
The library creator posts its whole form, so omitting addedAtSource from
CreateLibraryDto made the global whitelist reject every create request
with a 400. Declare the field, validate it against the same source list
as the update DTO, and persist it so the initial scan uses the requested
source rather than silently falling back to imported.
Apply the scanner's usable-time floor to the mtime recompute query too.
It previously excluded only NULL, so a filesystem reporting epoch 0 would
rewrite added_at to 1970 instead of leaving the import time in place. The
floor now lives in library.constants rather than being spelled out twice.
Wrap the recompute in try/catch so a database or stat failure emits the
[fail] log the logging conventions require instead of propagating with
only a [start] line recorded.
* fix(library): gate recompute on the saved source and label the radios
The recompute button stayed enabled while the selected source differed
from the stored one. Because the request carries no source, clicking it
recomputed against the old stored value while the UI showed the new
selection. A hint already said to save first; disable the control as well
so the mismatch is not actionable.
Give the source list radiogroup semantics with aria-checked so screen
readers can tell which option is active, since selection was conveyed by
styling alone.
* test(library): assert the create DTO under the real validation options
The previous comment claimed the case exercised whitelist and
forbidNonWhitelisted, but the shared helper calls validate without them,
so it only proved @IsIn rejects an unknown value.
Drop the misleading comment and add a case that validates with the same
options main.ts gives ValidationPipe, so an undeclared addedAtSource
fails the way it would in a real request.
* docs(library): remove redundant date-added documentation
---------
Co-authored-by: Bob Bobber <user@example.com >
Co-authored-by: neon <18559658+neonsolstice@users.noreply.github.com >
2026-09-10 10:43:47 -06:00
neon
72871fad65
fix(client): preserve synced reading calendar dates
...
Treat exact UTC-midnight lifecycle projections as calendar dates while preserving local conversion for real timestamps.
Fixes #1322
2026-09-10 15:35:06 +00:00
neon
c2f9eea839
chore: add AGPL attribution notice
...
Preserve project credit in conveyed source distributions and include the legal files in runtime images.
2026-09-10 13:32:29 +00:00
neon
daf61cb466
fix(scanner): support uploads to ACL-controlled storage
...
Stream cross-device moves into exclusive destination-side temporary files to avoid copying permissions onto ACL-controlled shares. Publish completed files with rename and clean up failed copies while preserving the source.
Cover storage failures, staging collisions, concurrent moves, and source preservation with real-file unit tests.
Fixes #1342
2026-09-10 12:17:02 +00:00
neon
33c7260f18
fix(auth): explain untrusted OIDC certificate failures
...
Classify private trust-chain failures with a stable error code and direct administrators to a mounted CA bundle without weakening TLS verification.
Fixes #1346
2026-09-10 11:47:56 +00:00
neon
e514be151a
fix(library): ignore current library during folder prescan
...
Prevent an edited library from treating its own persisted folders as conflicts while preserving overlap warnings for other libraries.
Fixes #1340
2026-09-10 11:02:32 +00:00
neon
3a4d467255
fix(server): support nested subfolders in book dock discovery
...
Recurse into nested subfolders during book dock watcher scans and discovery so that books organized under category or author subdirectories are processed. Keep shared folders from claiming exclusive directory ownership so siblings and multi-track units can finalize and discard cleanly without collisions.
Closes #1311
2026-09-10 10:48:00 +00:00
neon
2dcf166572
fix(server): resolve hybrid torrent hashes in qbittorrent
...
Preserve the stored v1 identity while resolving primary hashes through bounded,
cached lookups for polling, retries, tracker checks, removal, and reconciliation.
Cover alias handling and lookup failures with unit tests and verify completion,
import scheduling, duplicate adoption, and removal against qBittorrent 5.2.3.
Closes #1318
2026-09-09 10:45:25 +00:00
neon
04a0f21c8b
feat(server): allow configuring the listen address
...
Allow native and host-network deployments to select an IPv4 or IPv6 bind
address through HOST while preserving the existing wildcard default.
Keep Docker health checks aligned with the configured listener and document
how to restrict host port publishing independently of the container address.
Cover validation, real bootstrap sockets, and health-check commands with tests.
Closes #1315
2026-09-09 10:26:12 +00:00
neon
4febe9ee45
docs: remove stale migration guide links
...
Closes #1309
2026-09-09 09:19:52 +00:00
neon
6c65c393b5
fix(reader): honor line spacing over publisher styles
...
Ensure explicit reader spacing overrides higher-specificity EPUB typography and cover the cascade with a regression test.
Fixes #1302
2026-09-09 03:20:08 +00:00
neon
7978ab0230
test(settings): cover fill-crop preference sync payload
...
Guard against the display preference mismatch reported in #1290 by checking author fields in cover-mode saves and verifying server acceptance of the complete payload.
Ref #1290
2026-09-09 03:12:16 +00:00
neon
b9609b198e
fix(annotations): preserve source highlight timestamps
...
Use KOReader highlight times for annotation history while retaining ingestion times for diagnostics. Export all stored location representations and backfill existing rows during sync.
Fixes #1300
2026-09-08 16:52:36 +00:00
neon
cf40058cb6
fix(users): select exact content restriction matches
...
Prioritize exact genre and tag results within bounded catalog searches. Resolve Enter presses against existing IDs and ignore stale lookup responses.
Fixes #1295
2026-09-08 15:43:27 +00:00
dependabot[bot]
3d6afb3149
chore(deps): bump docker/setup-qemu-action in the github-actions group ( #1267 )
...
Bumps the github-actions group with 1 update: [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action ).
Updates `docker/setup-qemu-action` from 4.2.0 to 4.3.0
- [Release notes](https://github.com/docker/setup-qemu-action/releases )
- [Commits](https://github.com/docker/setup-qemu-action/compare/96fe6ef7f33517b61c61be40b68a1882f3264fb8...1f40c72289eff860ee54a304f1438e3cff362e0a )
---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
dependency-version: 4.3.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: github-actions
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: neon <18559658+neonsolstice@users.noreply.github.com >
2026-09-06 23:38:53 -06:00
neon
5d0c2e6e14
i18n(client): sync translations from Crowdin ( #1236 )
...
Keep sparse translated catalogs synchronized with reviewed Crowdin content.
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-09-06 23:38:35 -06:00
dependabot[bot]
3833f85bad
chore(deps): bump the production-dependencies group across 1 directory with 10 updates ( #1289 )
...
Bumps the production-dependencies group with 10 updates in the / directory:
| Package | From | To |
| --- | --- | --- |
| [@lucide/vue](https://github.com/lucide-icons/lucide/tree/HEAD/packages/vue ) | `1.35.0` | `1.39.0` |
| [@tiptap/extension-link](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/extension-link ) | `3.30.5` | `3.31.0` |
| [@tiptap/pm](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/pm ) | `3.30.5` | `3.31.0` |
| [@tiptap/starter-kit](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/starter-kit ) | `3.30.5` | `3.31.0` |
| [@tiptap/vue-3](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/vue-3 ) | `3.30.5` | `3.31.0` |
| [vue-echarts](https://github.com/ecomfe/vue-echarts ) | `8.1.0` | `8.2.0` |
| [mysql2](https://github.com/sidorares/node-mysql2 ) | `3.24.2` | `3.24.3` |
| [nodemailer](https://github.com/nodemailer/nodemailer ) | `9.0.6` | `9.1.1` |
| [undici](https://github.com/nodejs/undici ) | `8.10.0` | `8.10.1` |
| [zod](https://github.com/colinhacks/zod ) | `4.4.3` | `4.5.4` |
Updates `@lucide/vue` from 1.35.0 to 1.39.0
- [Release notes](https://github.com/lucide-icons/lucide/releases )
- [Commits](https://github.com/lucide-icons/lucide/commits/1.39.0/packages/vue )
Updates `@tiptap/extension-link` from 3.30.5 to 3.31.0
- [Release notes](https://github.com/ueberdosis/tiptap/releases )
- [Changelog](https://github.com/ueberdosis/tiptap/blob/v3.31.0/packages/extension-link/CHANGELOG.md )
- [Commits](https://github.com/ueberdosis/tiptap/commits/v3.31.0/packages/extension-link )
Updates `@tiptap/pm` from 3.30.5 to 3.31.0
- [Release notes](https://github.com/ueberdosis/tiptap/releases )
- [Changelog](https://github.com/ueberdosis/tiptap/blob/v3.31.0/packages/pm/CHANGELOG.md )
- [Commits](https://github.com/ueberdosis/tiptap/commits/v3.31.0/packages/pm )
Updates `@tiptap/starter-kit` from 3.30.5 to 3.31.0
- [Release notes](https://github.com/ueberdosis/tiptap/releases )
- [Changelog](https://github.com/ueberdosis/tiptap/blob/v3.31.0/packages/starter-kit/CHANGELOG.md )
- [Commits](https://github.com/ueberdosis/tiptap/commits/v3.31.0/packages/starter-kit )
Updates `@tiptap/vue-3` from 3.30.5 to 3.31.0
- [Release notes](https://github.com/ueberdosis/tiptap/releases )
- [Changelog](https://github.com/ueberdosis/tiptap/blob/v3.31.0/packages/vue-3/CHANGELOG.md )
- [Commits](https://github.com/ueberdosis/tiptap/commits/v3.31.0/packages/vue-3 )
Updates `vue-echarts` from 8.1.0 to 8.2.0
- [Release notes](https://github.com/ecomfe/vue-echarts/releases )
- [Changelog](https://github.com/ecomfe/vue-echarts/blob/main/CHANGELOG.md )
- [Commits](https://github.com/ecomfe/vue-echarts/compare/v8.1.0...v8.2.0 )
Updates `mysql2` from 3.24.2 to 3.24.3
- [Release notes](https://github.com/sidorares/node-mysql2/releases )
- [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md )
- [Commits](https://github.com/sidorares/node-mysql2/compare/v3.24.2...v3.24.3 )
Updates `nodemailer` from 9.0.6 to 9.1.1
- [Release notes](https://github.com/nodemailer/nodemailer/releases )
- [Changelog](https://github.com/nodemailer/nodemailer/blob/master/CHANGELOG.md )
- [Commits](https://github.com/nodemailer/nodemailer/compare/v9.0.6...v9.1.1 )
Updates `undici` from 8.10.0 to 8.10.1
- [Release notes](https://github.com/nodejs/undici/releases )
- [Commits](https://github.com/nodejs/undici/compare/v8.10.0...v8.10.1 )
Updates `zod` from 4.4.3 to 4.5.4
- [Release notes](https://github.com/colinhacks/zod/releases )
- [Commits](https://github.com/colinhacks/zod/compare/v4.4.3...v4.5.4 )
---
updated-dependencies:
- dependency-name: "@lucide/vue"
dependency-version: 1.39.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: "@tiptap/extension-link"
dependency-version: 3.31.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: "@tiptap/pm"
dependency-version: 3.31.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: "@tiptap/starter-kit"
dependency-version: 3.31.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: "@tiptap/vue-3"
dependency-version: 3.31.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: vue-echarts
dependency-version: 8.2.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: mysql2
dependency-version: 3.24.3
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: nodemailer
dependency-version: 9.1.1
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: undici
dependency-version: 8.10.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: zod
dependency-version: 4.5.4
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: neon <18559658+neonsolstice@users.noreply.github.com >
2026-09-06 23:38:21 -06:00
neon
f0bf903849
fix(books): hide completed audiobooks from continue listening
...
Keep the listening scroller consistent with terminal per-user read statuses and cover the completion transition with focused regression tests.
2026-09-07 05:35:16 +00:00
neon
5303a50604
security(books): enforce per-file mutation permissions
...
Require explicit delete or metadata-edit permission before mutating a book file. Keep catalog state intact when physical deletion fails.
Closes #1293
2026-09-07 05:08:33 +00:00
neon
028d4287b4
fix(client): stabilize book detail layout across screen sizes
...
Keep cover actions and discovery content adjacent to their related sections, and scale the synopsis preview for taller viewports.
Fixes #1259
v2.9.0
2026-09-06 15:39:31 +00:00
neon
836186159a
fix(email): keep attachment filenames in sync after rename
...
Keep relative file paths synchronized during manual renames and repair
stale rows during watcher and full-scan reconciliation. Derive email
attachment names from the file being streamed.
Fixes #1286
2026-09-06 14:26:29 +00:00
neon
5052f170a9
fix(metadata): reject mismatched iTunes media lookups
...
Validate iTunes lookup identities against the book medium so stale ebook IDs fall back to audiobook search instead of preserving portrait covers.
Closes #1285
2026-09-06 11:40:18 +00:00
neon
e3241eea3d
security(deps): patch container vulnerabilities
...
Use the supported Alpine 3.23 Node image to avoid vulnerable util-linux packages in Alpine 3.24. Force fast-uri 3.1.6 to resolve the SSRF advisories reported by the image scan.
2026-09-05 10:06:56 +00:00
neon
d8f87d8dd1
fix(client): keep cover controls within their column
...
Size the cover editor from its assigned container so narrow metadata grids stack controls below the artwork without overlap.
Fixes #1280
2026-09-05 10:05:58 +00:00
neon
978ef8ac2f
fix(client): stop compact detail covers shrinking
...
Keep the observer-derived width cap scoped to the fixed-height wide layout so compact covers cannot feed their own height back into width.
Fixes #1279
2026-09-05 10:04:39 +00:00
neon
43bf1b7cfa
fix(metadata): support CBZ archive comments
...
Retry central-directory discovery at the ZIP comment limit when the default scan reaches the end of the file. Preserve the archive comment while rewriting ComicInfo.xml.
Fixes #1272
2026-09-05 09:49:57 +00:00