neon
0b9027c275
feat(book-dock): expose Book Dock folder as a configurable drop zone ( #64 )
...
* feat(docker): expose Book Dock folder as a configurable drop zone
Add support for an external book drop folder that users can bind-mount
into the container via the BOOK_DROP_HOST_PATH env var. Files copied or
moved into this folder are automatically picked up and ingested by the
existing Book Dock file watcher.
- docker-compose.yml: add BOOK_DROP_HOST_PATH volume override so the
book-dock path is separately bind-mountable
- .env.example: document BOOK_DROP_HOST_PATH with an example NAS path
- AppInfoResponse: add bookDockPath so the UI can show the
container-internal path admins need to bind-mount
- AppInfoService: compute and return bookDockPath from storage config
- BookDockSettings: display drop folder path with BOOK_DROP_HOST_PATH hint
- useAppInfo: expose bookDockPath ref from the app-info API response
- README: document the optional drop folder in the quickstart section
When BOOK_DROP_HOST_PATH is unset, the volume defaults to
./data/app/book-dock, preserving full backward compatibility.
No watcher code changes required - the watcher already watches
the correct container-internal path.
Closes #58
* fix(book-dock): resolve symlink paths so rescan stays idempotent
BookDockWatcherService and BookDockIngestService were building
bookDockPath with path.join(), which preserves symlinks. `@parcel/watcher`
resolves symlinks internally when reporting events (using realpath), so the
absolutePath values stored by watcher events and the paths computed by
walkAndIngest during rescan never matched. This caused findByAbsolutePath
to always return undefined on rescan, creating duplicate DB records for
every file already tracked via a watcher event.
Fix: both services now call `realpath(bookDockPath)` in
onApplicationBootstrap (after mkdir), updating the stored path to the
canonical real path that the watcher also uses. Rescan is now idempotent
regardless of symlinks in the data directory.
Verified by E2E test: 3 consecutive rescans produce zero new records.
2026-05-20 13:00:56 -06:00
neon
e11b22f2b0
fix(books): switch progress reset to per-file controls ( #63 )
...
* fix(books): switch progress reset to per-file controls
Remove the book-level reset action and endpoint, and keep reset scoped to each file row to avoid accidental bulk clears.
Add tests for per-file reset behavior and progress formatting edge cases while keeping migration import filters aligned with the new progress expectations.
closes #57
* ci: increase commitlint body line limit to 250
Allow longer explanatory commit bodies so CI accepts existing project commit patterns without forcing manual hard wraps at 100 characters.
2026-05-20 12:40:24 -06:00
neon
bb11fc2abc
feat(auth): allow 25 active magic links per user
...
Raise the shared-account link ceiling so admins can provision more concurrent demo or shared login URLs without revoking existing active links.
2026-05-19 13:15:21 -06:00
neon
e0686181d6
refactor(settings): consolidate 17 settings tabs into 10 grouped subtab containers ( #56 )
...
Reduce the settings navigation bar from 17 flat tabs to 10 by grouping
related settings into subtab containers, following the existing ?tab=
query-param pattern used by Reader and Metadata.
New groups:
- Integrations (/settings/integrations): Kobo, KOReader, Hardcover
- Admin (/settings/admin): Users, OIDC/SSO (permission-filtered)
- System (/settings/system): File Naming, Book Dock, Maintenance, Audit Log (permission-filtered)
- Account (/settings/account): Profile, Notifications (merged from standalone tabs)
All old routes redirect to their new grouped equivalents for backward
compatibility. Admin and System containers filter available tabs based on
user permissions. Demo-restricted accounts hide the Notifications tab.
New files:
- IntegrationsAllSettings.vue, AdminAllSettings.vue, SystemAllSettings.vue, AccountAllSettings.vue
- lib/integrations-tabs.ts, lib/admin-tabs.ts, lib/system-tabs.ts, lib/account-tabs.ts
- Unit tests for all new containers and tab-lib files (SettingsHeader included)
Closes #55
2026-05-19 13:10:24 -06:00
neon
e4f6ddfb9b
fix(metadata): require google books api key
...
Block Google Books from being enabled without credentials because unauthenticated API calls now fail quota checks. Normalize legacy enabled configs without keys to disabled.
2026-05-19 11:35:31 -06:00
neon
4fbcb48341
style(settings): unpin file naming mobile preview
...
Let the mobile preview panel scroll with the rest of the settings page so it no longer covers form content while editing.
2026-05-19 11:35:18 -06:00
neon
e5c7d4a962
fix(stats): format session archetype tooltip values
...
Format fractional session start times as clock labels so tooltips do not expose raw decimal hours. Round minute durations to keep the chart readable.
2026-05-19 11:19:30 -06:00
Chris Mansell
418314352e
feat: hardcover sync for per user reading status progress and rating ( #53 )
...
* feat(server): sync reading progress with Hardcover
* fix(server): update Hardcover sync pending state
* test(server): cover Hardcover admin and repository
2026-05-19 10:49:15 -06:00
neon
402d1cde5d
fix(smart-scope): preserve draft filters while editing ( #54 )
...
Keep incomplete root filters visible in the SmartScope editor.
This lets users choose a field before setting an operator or value.
Fixes #52
2026-05-19 10:26:29 -06:00
neon
9d9461640b
fix(scanner): clamp oversized inodes in upload and file event flows ( #49 )
...
Use BigInt stat reads for upload and file-event paths to preserve 64-bit inode values. Clamp inodes that exceed PostgreSQL bigint range to 0 before persistence and inode lookups, and add regression coverage for insert, upsert, restore, and move-detection paths.
Fixes #48
2026-05-18 23:00:34 -06:00
neon
8abde907d8
feat(reader): add footer modes, wake lock, keyboard shortcuts, and go-to input
...
- Add tap-to-cycle footer modes (pages, time/session, chapter) along with elapsed reading time and chapter progress on the slider
- Prevent screen dimming during reading using the Wake Lock API
- Add keyboard shortcuts (t/s/b/f/Esc/?/Home/End) with an integrated help modal
- Add go-to-location support (page number or percentage) and a resume-reading toast on book open
2026-05-18 22:02:49 -06:00
neon
25117e3d0b
fix(download): enforce real file extension in pattern resolver
2026-05-18 17:46:20 -06:00
neon
fabd1747d3
fix: add per-org upload pattern defaults for book_per_folder mode ( #33 )
...
* fix(settings): add per-org upload defaults for book_per_folder mode
* ci: add maintainer-gated PR GHCR image publish
---------
Signed-off-by: neon <18559658+neonsolstice@users.noreply.github.com >
2026-05-18 17:12:13 -06:00
neon
8786a18f04
fix(scanner): clamp oversized MergerFS inodes before storage ( #30 )
...
* fix(scanner): clamp oversized MergerFS inodes before storage
MergerFS generates synthetic unsigned 64-bit inodes by hashing file paths.
Values above 2^63-1 overflow PostgreSQL's signed bigint column, crashing
the scanner with 'value out of range for type bigint'.
Switch all file stat() calls to stat(path, { bigint: true }) to read
inodes as precise BigInt values instead of lossy JS numbers. Introduce
clampIno(ino: bigint): number which returns 0 for any inode exceeding
PostgreSQL's bigint max - 0 is the existing sentinel meaning 'rename
detection disabled', so no other code needs to change.
The fix covers all four code paths that write ino to a FileStat:
statFilesIntoAcc and buildSingleBookCandidate in walk.ts, plus the two
targeted-scan paths in scanner.service.ts.
Fixes #19
* ci: add maintainer-gated PR GHCR image publish
---------
Signed-off-by: neon <18559658+neonsolstice@users.noreply.github.com >
2026-05-18 17:11:28 -06:00
neon
ab2af020a4
chore: set open-pull-requests-limit = 1
2026-05-18 16:49:18 -06:00
dependabot[bot]
02c563b8fa
chore(deps): bump @semantic-release/github from 11.0.6 to 12.0.8 ( #47 )
...
Bumps [@semantic-release/github](https://github.com/semantic-release/github ) from 11.0.6 to 12.0.8.
- [Release notes](https://github.com/semantic-release/github/releases )
- [Commits](https://github.com/semantic-release/github/compare/v11.0.6...v12.0.8 )
---
updated-dependencies:
- dependency-name: "@semantic-release/github"
dependency-version: 12.0.8
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-05-18 16:13:00 -06:00
neon
1fc04f8af6
fix(books): downgrade archiver to v7 to restore zip export ( #41 )
...
archiver v8 switched to pure ESM with no default export and a
completely different API, breaking every zip export request with
TypeError: (0 , _archiver.default) is not a function. The NestJS
SWC build produces CJS output, which cannot import the new ESM-only
package at runtime.
Downgrade to ~7.0.1 (the last CJS release) and add a Dependabot
ignore rule for archiver major bumps so this cannot recur silently.
Fixes #31
2026-05-18 15:48:46 -06:00
dependabot[bot]
38e901f3af
chore(deps): bump brace-expansion from 1.1.13 to 5.0.6 ( #40 )
...
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion ) from 1.1.13 to 5.0.6.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases )
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v1.1.13...v5.0.6 )
---
updated-dependencies:
- dependency-name: brace-expansion
dependency-version: 5.0.6
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-18 15:40:21 -06:00
dependabot[bot]
df52eee23e
chore(deps): bump brace-expansion from 1.1.13 to 5.0.5 ( #38 )
...
* chore(deps): bump brace-expansion from 1.1.13 to 5.0.5
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion ) from 1.1.13 to 5.0.5.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases )
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v1.1.13...v5.0.5 )
---
updated-dependencies:
- dependency-name: brace-expansion
dependency-version: 5.0.5
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com >
* chore(deps): skip dependabot branch and issue checks
---------
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-05-18 15:13:19 -06:00
neon
8b70c55604
fix(collections): restore add-to-collection from quick view ( #39 )
...
Close the quick-view sheet before dispatching add or delete actions.
Ensure the collection sheet opens reliably from the side panel.
Add regression tests for quick-view and table-shell action flow.
Expand collection controller and service edge-case coverage for this path.
Fixes #36
2026-05-18 15:00:22 -06:00
neon
4cb0149380
feat(settings): add series number badge to book cover card overlay ( #37 )
...
Series position badge (#N) rendered in the top-right corner of cover
cards, sharing a flex-column container with the existing lock-status
badge. Shown only when seriesIndex is non-null. Whole numbers strip the
decimal (3.0 -> #3 ); fractional values display as-is (1.5 -> #1.5).
Hovering the badge shows a tooltip with the full series name and position.
Enabled by default in Appearance -> Card Overlays.
Closes #32
2026-05-18 13:48:38 -06:00
neon
5524cd9d0d
fix(email): add skip-TLS-verification option and surface provider delete errors ( #35 )
...
Node.js inside Docker validates the full TLS certificate chain against its bundled
CA store. When the chain cannot be verified (e.g. outdated CA bundle, self-signed
cert, or Let's Encrypt chain not trusted), nodemailer reports a misleading error
like "certificate has expired". Add a per-provider tlsRejectUnauthorized flag
(default: true) that passes tls.rejectUnauthorized=false to nodemailer when
disabled, letting self-hosted SMTP servers opt out of cert verification. A visible
warning is shown in the provider form whenever the flag is turned off.
The delete provider API already returned a clear 400 message explaining that the
system designation must be removed first, but the frontend threw a hardcoded
"Failed to delete provider" string and never read the response body. Fix the
composable to parse and rethrow the actual API error message. Also disable the
delete button for system providers with a tooltip stating the constraint, so users
cannot trigger the error in the first place.
Adds tlsRejectUnauthorized boolean column (NOT NULL DEFAULT true) to
email_providers via Drizzle migration 0004.
Closes #26
2026-05-18 12:38:22 -06:00
neon
54fa317441
chore: remove legacy markdown issue templates
...
Keep only YAML issue forms so GitHub does not show duplicate Bug and Feature entries.
2026-05-18 00:17:54 -06:00
neon
2dea6915d4
chore(server): increase currently reading widget limit to 10
...
Adjust the currently reading cap to tune dashboard density without changing feature scope.
2026-05-18 04:26:39 +00:00
neon
69f69febb2
feat(book): add highlights tab with filters, export, and pagination
2026-05-18 03:52:17 +00:00
neon
e89f4ce0e4
ci: enforce PR issue references and branch conventions
...
Validate BO-<issue>-<slug> branch names and lint PR titles and commit headers in CI and release workflows.
Require GitHub closing-keyword issue references and verify referenced issues exist. Align contributing, release, commit, testing, and policy docs with the enforced behavior and tone.
2026-05-17 13:10:32 -06:00
neon
9f15d0955a
feat(reading-log): implement end-to-end reading log feature
2026-05-17 01:42:41 -06:00
neon
8d535c2617
fix(metadata): use Goodreads autocomplete before HTML search
2026-05-16 23:35:31 -06:00
neon
eb9b714ecb
feat: add full-stack achievements system
...
- add achievement schema, migrations, evaluators, APIs, and backfill support on the server
- add achievements UI, composables, toast utilities, and tests on the client
- add shared achievement/auth/notification type updates
2026-05-16 15:50:42 +00:00
neon
9fdb3f46bb
chore(book): unify rating star colors across views
2026-05-15 12:20:09 -06:00
neon
7d1435cbd3
fix(dashboard): include read status in scroller cards
2026-05-14 23:54:14 -06:00
neon
c4f9b289f6
fix(client): disable pwa service worker in dev
2026-05-14 23:48:20 -06:00
neon
9660f4bee4
fix(server): randomize dashboard discover scroller selection
...
Use ORDER BY random() for unread discover results so the scroller returns a true random sample instead of contiguous ID slices. Update repository tests to match the new single-query selection flow.
2026-05-14 22:59:00 -06:00
dependabot[bot]
2eb6ee4cee
chore(deps): bump the development-dependencies group with 19 updates ( #14 )
...
* chore(deps): bump the development-dependencies group with 19 updates
Bumps the development-dependencies group with 19 updates:
| Package | From | To |
| --- | --- | --- |
| [@semantic-release/release-notes-generator](https://github.com/semantic-release/release-notes-generator ) | `14.1.0` | `14.1.1` |
| [@types/jsdom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jsdom ) | `28.0.1` | `28.0.3` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node ) | `25.6.0` | `25.8.0` |
| [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8 ) | `4.1.5` | `4.1.6` |
| [@vitest/eslint-plugin](https://github.com/vitest-dev/eslint-plugin-vitest ) | `1.6.16` | `1.6.17` |
| [eslint](https://github.com/eslint/eslint ) | `10.2.1` | `10.3.0` |
| [eslint-plugin-oxlint](https://github.com/oxc-project/eslint-plugin-oxlint ) | `1.62.0` | `1.64.0` |
| [eslint-plugin-vue](https://github.com/vuejs/eslint-plugin-vue ) | `10.9.0` | `10.9.1` |
| [jiti](https://github.com/unjs/jiti ) | `2.6.1` | `2.7.0` |
| [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint ) | `1.62.0` | `1.64.0` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite ) | `8.0.10` | `8.0.13` |
| [vite-plugin-vue-devtools](https://github.com/vuejs/devtools/tree/HEAD/packages/vite ) | `8.1.1` | `8.1.2` |
| [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest ) | `4.1.5` | `4.1.6` |
| [vue-tsc](https://github.com/vuejs/language-tools/tree/HEAD/packages/tsc ) | `3.2.7` | `3.2.9` |
| [@nestjs/testing](https://github.com/nestjs/nest/tree/HEAD/packages/testing ) | `11.1.19` | `11.1.21` |
| [@swc/core](https://github.com/swc-project/swc/tree/HEAD/packages/core ) | `1.15.32` | `1.15.33` |
| [globals](https://github.com/sindresorhus/globals ) | `17.5.0` | `17.6.0` |
| [tsx](https://github.com/privatenumber/tsx ) | `4.21.0` | `4.22.0` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint ) | `8.59.1` | `8.59.3` |
Updates `@semantic-release/release-notes-generator` from 14.1.0 to 14.1.1
- [Release notes](https://github.com/semantic-release/release-notes-generator/releases )
- [Commits](https://github.com/semantic-release/release-notes-generator/compare/v14.1.0...v14.1.1 )
Updates `@types/jsdom` from 28.0.1 to 28.0.3
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases )
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jsdom )
Updates `@types/node` from 25.6.0 to 25.8.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases )
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node )
Updates `@vitest/coverage-v8` from 4.1.5 to 4.1.6
- [Release notes](https://github.com/vitest-dev/vitest/releases )
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.6/packages/coverage-v8 )
Updates `@vitest/eslint-plugin` from 1.6.16 to 1.6.17
- [Release notes](https://github.com/vitest-dev/eslint-plugin-vitest/releases )
- [Commits](https://github.com/vitest-dev/eslint-plugin-vitest/compare/v1.6.16...v1.6.17 )
Updates `eslint` from 10.2.1 to 10.3.0
- [Release notes](https://github.com/eslint/eslint/releases )
- [Commits](https://github.com/eslint/eslint/compare/v10.2.1...v10.3.0 )
Updates `eslint-plugin-oxlint` from 1.62.0 to 1.64.0
- [Release notes](https://github.com/oxc-project/eslint-plugin-oxlint/releases )
- [Commits](https://github.com/oxc-project/eslint-plugin-oxlint/compare/v1.62.0...v1.64.0 )
Updates `eslint-plugin-vue` from 10.9.0 to 10.9.1
- [Release notes](https://github.com/vuejs/eslint-plugin-vue/releases )
- [Changelog](https://github.com/vuejs/eslint-plugin-vue/blob/master/CHANGELOG.md )
- [Commits](https://github.com/vuejs/eslint-plugin-vue/compare/v10.9.0...v10.9.1 )
Updates `jiti` from 2.6.1 to 2.7.0
- [Release notes](https://github.com/unjs/jiti/releases )
- [Changelog](https://github.com/unjs/jiti/blob/main/CHANGELOG.md )
- [Commits](https://github.com/unjs/jiti/compare/v2.6.1...v2.7.0 )
Updates `oxlint` from 1.62.0 to 1.64.0
- [Release notes](https://github.com/oxc-project/oxc/releases )
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxlint/CHANGELOG.md )
- [Commits](https://github.com/oxc-project/oxc/commits/oxlint_v1.64.0/npm/oxlint )
Updates `vite` from 8.0.10 to 8.0.13
- [Release notes](https://github.com/vitejs/vite/releases )
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md )
- [Commits](https://github.com/vitejs/vite/commits/v8.0.13/packages/vite )
Updates `vite-plugin-vue-devtools` from 8.1.1 to 8.1.2
- [Release notes](https://github.com/vuejs/devtools/releases )
- [Commits](https://github.com/vuejs/devtools/commits/v8.1.2/packages/vite )
Updates `vitest` from 4.1.5 to 4.1.6
- [Release notes](https://github.com/vitest-dev/vitest/releases )
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.6/packages/vitest )
Updates `vue-tsc` from 3.2.7 to 3.2.9
- [Release notes](https://github.com/vuejs/language-tools/releases )
- [Changelog](https://github.com/vuejs/language-tools/blob/master/CHANGELOG.md )
- [Commits](https://github.com/vuejs/language-tools/commits/v3.2.9/packages/tsc )
Updates `@nestjs/testing` from 11.1.19 to 11.1.21
- [Release notes](https://github.com/nestjs/nest/releases )
- [Commits](https://github.com/nestjs/nest/commits/v11.1.21/packages/testing )
Updates `@swc/core` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases )
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md )
- [Commits](https://github.com/swc-project/swc/commits/v1.15.33/packages/core )
Updates `globals` from 17.5.0 to 17.6.0
- [Release notes](https://github.com/sindresorhus/globals/releases )
- [Commits](https://github.com/sindresorhus/globals/compare/v17.5.0...v17.6.0 )
Updates `tsx` from 4.21.0 to 4.22.0
- [Release notes](https://github.com/privatenumber/tsx/releases )
- [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs )
- [Commits](https://github.com/privatenumber/tsx/compare/v4.21.0...v4.22.0 )
Updates `typescript-eslint` from 8.59.1 to 8.59.3
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases )
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md )
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.3/packages/typescript-eslint )
---
updated-dependencies:
- dependency-name: "@semantic-release/release-notes-generator"
dependency-version: 14.1.1
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: development-dependencies
- dependency-name: "@types/jsdom"
dependency-version: 28.0.3
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: development-dependencies
- dependency-name: "@types/node"
dependency-version: 25.8.0
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: development-dependencies
- dependency-name: "@vitest/coverage-v8"
dependency-version: 4.1.6
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: development-dependencies
- dependency-name: "@vitest/eslint-plugin"
dependency-version: 1.6.17
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: development-dependencies
- dependency-name: eslint
dependency-version: 10.3.0
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: development-dependencies
- dependency-name: eslint-plugin-oxlint
dependency-version: 1.64.0
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: development-dependencies
- dependency-name: eslint-plugin-vue
dependency-version: 10.9.1
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: development-dependencies
- dependency-name: jiti
dependency-version: 2.7.0
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: development-dependencies
- dependency-name: oxlint
dependency-version: 1.64.0
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: development-dependencies
- dependency-name: vite
dependency-version: 8.0.13
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: development-dependencies
- dependency-name: vite-plugin-vue-devtools
dependency-version: 8.1.2
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: development-dependencies
- dependency-name: vitest
dependency-version: 4.1.6
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: development-dependencies
- dependency-name: vue-tsc
dependency-version: 3.2.9
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: development-dependencies
- dependency-name: "@nestjs/testing"
dependency-version: 11.1.21
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: development-dependencies
- dependency-name: "@swc/core"
dependency-version: 1.15.33
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: development-dependencies
- dependency-name: globals
dependency-version: 17.6.0
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: development-dependencies
- dependency-name: tsx
dependency-version: 4.22.0
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: development-dependencies
- dependency-name: typescript-eslint
dependency-version: 8.59.3
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: development-dependencies
...
Signed-off-by: dependabot[bot] <support@github.com >
* fix(server): narrow fs stat type for strict typecheck
---------
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-05-14 22:21:12 -06:00
dependabot[bot]
ee39ca9ec8
chore(deps): bump lint-staged from 16.4.0 to 17.0.4 ( #17 )
...
Bumps [lint-staged](https://github.com/lint-staged/lint-staged ) from 16.4.0 to 17.0.4.
- [Release notes](https://github.com/lint-staged/lint-staged/releases )
- [Changelog](https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md )
- [Commits](https://github.com/lint-staged/lint-staged/compare/v16.4.0...v17.0.4 )
---
updated-dependencies:
- dependency-name: lint-staged
dependency-version: 17.0.4
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>
Co-authored-by: neon <18559658+neonsolstice@users.noreply.github.com >
2026-05-14 22:06:04 -06:00
dependabot[bot]
569932a3e0
chore(deps): bump @commitlint/config-conventional from 19.8.1 to 21.0.1 ( #16 )
...
Bumps [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional ) from 19.8.1 to 21.0.1.
- [Release notes](https://github.com/conventional-changelog/commitlint/releases )
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/config-conventional/CHANGELOG.md )
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v21.0.1/@commitlint/config-conventional )
---
updated-dependencies:
- dependency-name: "@commitlint/config-conventional"
dependency-version: 21.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>
Co-authored-by: neon <18559658+neonsolstice@users.noreply.github.com >
2026-05-14 21:58:43 -06:00
dependabot[bot]
7cf1679756
chore(deps): bump opentype.js from 1.3.5 to 2.0.0 ( #15 )
...
Bumps [opentype.js](https://github.com/opentypejs/opentype.js ) from 1.3.5 to 2.0.0.
- [Release notes](https://github.com/opentypejs/opentype.js/releases )
- [Commits](https://github.com/opentypejs/opentype.js/compare/1.3.5...2.0.0 )
---
updated-dependencies:
- dependency-name: opentype.js
dependency-version: 2.0.0
dependency-type: direct:production
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>
Co-authored-by: neon <18559658+neonsolstice@users.noreply.github.com >
2026-05-14 21:54:18 -06:00
dependabot[bot]
4566a22512
chore(deps): bump the production-dependencies group with 15 updates ( #13 )
...
Bumps the production-dependencies group with 15 updates:
| Package | From | To |
| --- | --- | --- |
| [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite ) | `4.2.4` | `4.3.0` |
| [dompurify](https://github.com/cure53/DOMPurify ) | `3.4.2` | `3.4.3` |
| [reka-ui](https://github.com/unovue/reka-ui ) | `2.9.6` | `2.9.7` |
| [tailwind-merge](https://github.com/dcastil/tailwind-merge ) | `3.5.0` | `3.6.0` |
| [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss ) | `4.2.4` | `4.3.0` |
| [vue](https://github.com/vuejs/core ) | `3.5.33` | `3.5.34` |
| [vue-router](https://github.com/vuejs/router ) | `5.0.6` | `5.0.7` |
| [vue-virtual-scroller](https://github.com/Akryum/vue-virtual-scroller ) | `3.0.2` | `3.0.3` |
| [@nestjs/common](https://github.com/nestjs/nest/tree/HEAD/packages/common ) | `11.1.19` | `11.1.21` |
| [@nestjs/core](https://github.com/nestjs/nest/tree/HEAD/packages/core ) | `11.1.19` | `11.1.21` |
| [@nestjs/platform-fastify](https://github.com/nestjs/nest/tree/HEAD/packages/platform-fastify ) | `11.1.19` | `11.1.21` |
| [@nestjs/platform-socket.io](https://github.com/nestjs/nest/tree/HEAD/packages/platform-socket.io ) | `11.1.19` | `11.1.21` |
| [@nestjs/websockets](https://github.com/nestjs/nest/tree/HEAD/packages/websockets ) | `11.1.19` | `11.1.21` |
| [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser ) | `5.7.2` | `5.8.0` |
| [zod](https://github.com/colinhacks/zod ) | `4.4.1` | `4.4.3` |
Updates `@tailwindcss/vite` from 4.2.4 to 4.3.0
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases )
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md )
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.0/packages/@tailwindcss-vite )
Updates `dompurify` from 3.4.2 to 3.4.3
- [Release notes](https://github.com/cure53/DOMPurify/releases )
- [Commits](https://github.com/cure53/DOMPurify/compare/3.4.2...3.4.3 )
Updates `reka-ui` from 2.9.6 to 2.9.7
- [Release notes](https://github.com/unovue/reka-ui/releases )
- [Commits](https://github.com/unovue/reka-ui/compare/v2.9.6...v2.9.7 )
Updates `tailwind-merge` from 3.5.0 to 3.6.0
- [Release notes](https://github.com/dcastil/tailwind-merge/releases )
- [Commits](https://github.com/dcastil/tailwind-merge/compare/v3.5.0...v3.6.0 )
Updates `tailwindcss` from 4.2.4 to 4.3.0
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases )
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md )
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.0/packages/tailwindcss )
Updates `vue` from 3.5.33 to 3.5.34
- [Release notes](https://github.com/vuejs/core/releases )
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md )
- [Commits](https://github.com/vuejs/core/compare/v3.5.33...v3.5.34 )
Updates `vue-router` from 5.0.6 to 5.0.7
- [Release notes](https://github.com/vuejs/router/releases )
- [Commits](https://github.com/vuejs/router/compare/v5.0.6...v5.0.7 )
Updates `vue-virtual-scroller` from 3.0.2 to 3.0.3
- [Release notes](https://github.com/Akryum/vue-virtual-scroller/releases )
- [Changelog](https://github.com/Akryum/vue-virtual-scroller/blob/master/CHANGELOG.md )
- [Commits](https://github.com/Akryum/vue-virtual-scroller/compare/v3.0.2...v3.0.3 )
Updates `@nestjs/common` from 11.1.19 to 11.1.21
- [Release notes](https://github.com/nestjs/nest/releases )
- [Commits](https://github.com/nestjs/nest/commits/v11.1.21/packages/common )
Updates `@nestjs/core` from 11.1.19 to 11.1.21
- [Release notes](https://github.com/nestjs/nest/releases )
- [Commits](https://github.com/nestjs/nest/commits/v11.1.21/packages/core )
Updates `@nestjs/platform-fastify` from 11.1.19 to 11.1.21
- [Release notes](https://github.com/nestjs/nest/releases )
- [Commits](https://github.com/nestjs/nest/commits/v11.1.21/packages/platform-fastify )
Updates `@nestjs/platform-socket.io` from 11.1.19 to 11.1.21
- [Release notes](https://github.com/nestjs/nest/releases )
- [Commits](https://github.com/nestjs/nest/commits/v11.1.21/packages/platform-socket.io )
Updates `@nestjs/websockets` from 11.1.19 to 11.1.21
- [Release notes](https://github.com/nestjs/nest/releases )
- [Commits](https://github.com/nestjs/nest/commits/v11.1.21/packages/websockets )
Updates `fast-xml-parser` from 5.7.2 to 5.8.0
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases )
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md )
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.7.2...v5.8.0 )
Updates `zod` from 4.4.1 to 4.4.3
- [Release notes](https://github.com/colinhacks/zod/releases )
- [Commits](https://github.com/colinhacks/zod/compare/v4.4.1...v4.4.3 )
---
updated-dependencies:
- dependency-name: "@tailwindcss/vite"
dependency-version: 4.3.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: dompurify
dependency-version: 3.4.3
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: reka-ui
dependency-version: 2.9.7
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: tailwind-merge
dependency-version: 3.6.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: tailwindcss
dependency-version: 4.3.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: vue
dependency-version: 3.5.34
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: vue-router
dependency-version: 5.0.7
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: vue-virtual-scroller
dependency-version: 3.0.3
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: "@nestjs/common"
dependency-version: 11.1.21
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: "@nestjs/core"
dependency-version: 11.1.21
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: "@nestjs/platform-fastify"
dependency-version: 11.1.21
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: "@nestjs/platform-socket.io"
dependency-version: 11.1.21
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: "@nestjs/websockets"
dependency-version: 11.1.21
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production-dependencies
- dependency-name: fast-xml-parser
dependency-version: 5.8.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production-dependencies
- dependency-name: zod
dependency-version: 4.4.3
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>
Co-authored-by: neon <18559658+neonsolstice@users.noreply.github.com >
2026-05-14 21:44:19 -06:00
dependabot[bot]
f7fb010fe0
chore(deps): bump the github-actions group with 3 updates ( #12 )
...
Bumps the github-actions group with 3 updates: [actions/labeler](https://github.com/actions/labeler ), [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action ) and [actions/stale](https://github.com/actions/stale ).
Updates `actions/labeler` from 5.0.0 to 6.1.0
- [Release notes](https://github.com/actions/labeler/releases )
- [Commits](https://github.com/actions/labeler/compare/8558fd74291d67161a8a78ce36a881fa63b766a9...f27b608878404679385c85cfa523b85ccb86e213 )
Updates `docker/setup-qemu-action` from 3.6.0 to 4.0.0
- [Release notes](https://github.com/docker/setup-qemu-action/releases )
- [Commits](https://github.com/docker/setup-qemu-action/compare/29109295f81e9208d7d86ff1c6c12d2833863392...ce360397dd3f832beb865e1373c09c0e9f86d70a )
Updates `actions/stale` from 9.1.0 to 10.2.0
- [Release notes](https://github.com/actions/stale/releases )
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md )
- [Commits](https://github.com/actions/stale/compare/5bef64f19d7facfb25b37b414482c7164d639639...b5d41d4e1d5dceea10e7104786b73624c18a190f )
---
updated-dependencies:
- dependency-name: actions/labeler
dependency-version: 6.1.0
dependency-type: direct:production
update-type: version-update:semver-major
dependency-group: github-actions
- dependency-name: docker/setup-qemu-action
dependency-version: 4.0.0
dependency-type: direct:production
update-type: version-update:semver-major
dependency-group: github-actions
- dependency-name: actions/stale
dependency-version: 10.2.0
dependency-type: direct:production
update-type: version-update:semver-major
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-05-14 21:39:28 -06:00
neon
040a43f341
chore(release): fix release changelog text formatting
2026-05-15 02:03:06 +00:00
neon
da5d6cb31f
fix(csp): allow Google Fonts, blob workers, and jsDelivr in CSP directives
2026-05-15 01:15:28 +00:00
neon
3138cf3a4d
fix(security): complete sanitizeLogValue sweep, DOMParser stripHtml, least-privilege CI permissions, pin Dockerfile image
2026-05-15 00:15:23 +00:00
neon
86147ead2c
fix(reader): apply theme bg unconditionally to fix iOS dark mode override
...
On iOS (Chrome/Safari) in system Dark Mode, the epub iframe's
prefers-color-scheme:dark media query always matched regardless of
the in-app light/dark toggle, forcing a dark background even when the
user selected Light mode.
Three changes in generateCSS():
- Set color-scheme to 'light' or 'dark' (not 'light dark') based on
isDark, so the browser and epub-internal light-dark() calls respect
the app setting rather than the OS preference.
- Remove the nested @media (prefers-color-scheme: dark) block that was
overriding mode.fg/link with OS-based dark values.
- Replace both @media screen and (prefers-color-scheme: light/dark)
background blocks with a single unconditional forceBg block driven
by isDark.value, so background colors are always app-controlled.
2026-05-14 22:51:16 +00:00
dependabot[bot]
7be9565567
chore(deps): bump devalue from 5.8.0 to 5.8.1 ( #11 )
...
Bumps [devalue](https://github.com/sveltejs/devalue ) from 5.8.0 to 5.8.1.
- [Release notes](https://github.com/sveltejs/devalue/releases )
- [Changelog](https://github.com/sveltejs/devalue/blob/main/CHANGELOG.md )
- [Commits](https://github.com/sveltejs/devalue/compare/v5.8.0...v5.8.1 )
---
updated-dependencies:
- dependency-name: devalue
dependency-version: 5.8.1
dependency-type: indirect
...
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-05-14 16:39:16 -06:00
neon
a891eb3b16
fix(csp): allow same-origin frame-ancestors for blob URL iframe support on iOS
2026-05-14 22:33:51 +00:00
neon
ee1d98386d
feat(settings): improve migration source validation workflow
...
Improve migration setup feedback so operators can validate credentials and media paths with actionable status instead of ambiguous failures. Keep users on their current setup step while saving to avoid accidental context switches during preflight configuration.
2026-05-14 22:11:57 +00:00
neon
57960efecb
feat(reader): add in-reader text translation with Google/Azure fallback for EPUB
2026-05-14 10:41:33 -06:00
neon
db2b3f9696
ci: run E2E only on nightly schedule, skip E2E on PR/push/manual CI, keep manual e2e workflow for on-demand runs, and align matrix/docs accordingly
2026-05-14 16:37:18 +00:00
neon
102360116b
ci: pin stale action to valid v9 commit hash
...
Use the correct resolvable SHA for actions/stale v9 so the workflow can download the action successfully.
2026-05-14 08:17:34 -06:00
neon
d1d0b7b2c1
feat(reader): add dictionary lookup to epub reader selection popup
2026-05-14 05:46:43 +00:00