Commit graph

12 commits

Author SHA1 Message Date
Huang Xin
9fd7a4820d
fix(deps): resolve open Dependabot alerts (#6813)
* fix(deps): resolve open Dependabot alerts

Raise the workspace overrides for shell-quote, proxy-addr and
source-map-js to their patched releases, and pull postcss-selector-parser
6.x (pinned by @tailwindcss/typography) up to 7.1.6. The compiled prose
styles are unchanged.

Move katex to 0.18 (with marked-katex-extension 5.1.13 and an override for
the packages still asking for 0.16) and i18next-http-backend to 4.0.2.
v4 only drops the cross-fetch fallback; the backend loads in the browser,
which has fetch.

Update rustls to 0.23.46 in Cargo.lock, Cargo.cef.lock and the koplugin
LocalSend helper.

Blank the Nix pnpmDeps and cargo hashes so the fod-hashes check prints
the new values.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(nix): refresh pnpm and cargo dependency hashes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 07:59:43 +02:00
Huang Xin
dfa54293c0
fix(linux): stop the CEF focus loop that froze two-window sessions (#6691)
* fix(linux): stop the CEF focus loop that froze two-window sessions, closes #6689

Bump readest/tauri feat/cef to d6ef6e4c (readest/tauri#5): the runtime
now moves the X focus into a window's browser only while that window's
toplevel still holds it, so a late winit Focused event no longer bounces
the focus between two browsers forever.

Also records the windows dependency from #6546 in Cargo.cef.lock, which
was missing and made --locked resolution fail.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(nix): refresh cargoHash for the readest/tauri bump

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 14:12:26 +02:00
Huang Xin
6bcd170de4
fix(reader): animate page turns for PDF and comics on Windows and Linux, closes #6380 (#6506)
Some checks are pending
CodeQL Advanced / Analyze (actions) (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
CodeQL Advanced / Analyze (rust) (push) Waiting to run
Publish Docker image / build (linux/amd64, ubuntu-latest) (push) Waiting to run
Publish Docker image / build (linux/arm64, ubuntu-24.04-arm) (push) Waiting to run
Publish Docker image / merge (push) Blocked by required conditions
Build with Nix / tests (push) Waiting to run
PR checks / nix_flake_check (push) Waiting to run
PR checks / rust_lint (push) Waiting to run
PR checks / koplugin_rust_lint (push) Waiting to run
PR checks / build_web_app (push) Waiting to run
PR checks / test_web_app (1) (push) Waiting to run
PR checks / test_web_app (2) (push) Waiting to run
PR checks / test_extensions (push) Waiting to run
PR checks / build_tauri_app (push) Waiting to run
Scorecard supply-chain security / Scorecard analysis (push) Waiting to run
Deploy to vercel on merge / build_and_deploy (push) Waiting to run
* fix(reader): animate page turns for PDF and comics on Windows and Linux, closes #6380

Fixed-layout books (PDF, CBZ/CBR, fixed-layout EPUB) only animate through
the captured page turn, which needs a native snapshot of the webview. That
snapshot existed on macOS, iOS and Android only, so Windows and the Linux
CEF runtime rejected it and every turn on those books was instant.

Both engines are Chromium, so both now take the snapshot with the DevTools
protocol's Page.captureScreenshot, clipped to the reader cell: WebView2's
CallDevToolsProtocolMethod on Windows, the CEF browser's DevTools message
observer on Linux. The clip returns exactly the region at device
resolution, and captureBeyondViewport stays off so the live page never
reflows. JPEG, as on Android: about 35 ms per full cell against 86 ms for
PNG.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* build(nix): bump cargoHash for the native-bridge dependency edges

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(reader): release the CEF screenshot observer when no result arrives

The observer and its registration hold each other, so a capture that
never gets a result (the DevTools agent detached, or the wait timed out)
kept both alive. Take the registration on agent detach, and on timeout
from the caller on the UI thread.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-30 16:08:42 +02:00
Huang Xin
3314d4fdf6
fix(desktop): reopen the library when Readest is relaunched with only reader windows open, closes #6394 (#6495)
* fix(desktop): reopen the library when Readest is relaunched with only reader windows open, closes #6394

Relaunching Readest (e.g. from the desktop shortcut) after closing the
library window left only the reader windows and never brought the library
back:

- The single-instance callback only focuses the `main` window, which does
  nothing once it is gone. The first reader window now recreates it on a
  plain relaunch; launches carrying a file or link still go to the
  open-with handlers.
- On the Linux CEF build the relaunch never reached the single-instance
  plugin at all. Chromium's process singleton claims it first, the running
  browser process drops the command line, and the new process panics in
  CEF initialization, so a relaunch neither raised the library nor opened
  the files it was given. The launch is now handed to the running instance
  over the plugin's D-Bus interface before CEF starts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(nix): update cargoHash for the zbus entry in Cargo.cef.lock

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 11:04:50 +02:00
Huang Xin
2ce0522743
chore(linux): catch up the CEF runtime with upstream feat/cef, closes #6397 (#6487)
Some checks are pending
CodeQL Advanced / Analyze (actions) (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
CodeQL Advanced / Analyze (rust) (push) Waiting to run
Publish Docker image / build (linux/amd64, ubuntu-latest) (push) Waiting to run
Publish Docker image / build (linux/arm64, ubuntu-24.04-arm) (push) Waiting to run
Publish Docker image / merge (push) Blocked by required conditions
Build with Nix / tests (push) Waiting to run
PR checks / nix_flake_check (push) Waiting to run
PR checks / rust_lint (push) Waiting to run
PR checks / koplugin_rust_lint (push) Waiting to run
PR checks / build_web_app (push) Waiting to run
PR checks / test_web_app (1) (push) Waiting to run
PR checks / test_web_app (2) (push) Waiting to run
PR checks / test_extensions (push) Waiting to run
PR checks / build_tauri_app (push) Waiting to run
Scorecard supply-chain security / Scorecard analysis (push) Waiting to run
Deploy to vercel on merge / build_and_deploy (push) Waiting to run
2026-09-30 04:07:58 +08:00
Huang Xin
d80e2fd574
fix(nix): add the desktop Now Playing crates to Cargo.cef.lock (#6459)
* fix(nix): add the desktop Now Playing crates to Cargo.cef.lock

#6457 added souvlaki and its dependencies to Cargo.lock only. The Linux
CEF build (Nix, Flatpak, release) swaps in Cargo.cef.lock, which did not
have them, so the Nix build on main failed with "no matching package
named `souvlaki` found". Regenerated with the minimal cargo metadata
resolve under .cargo/cef.toml; no existing crate versions change.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(nix): bump cargoHash for the new Cargo.cef.lock

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 14:09:39 +02:00
Huang Xin
5d030abf32
fix(build): repair the Docker and Nix builds after #6368 (#6379)
* fix(build): repair the Docker and Nix builds after #6368

Two main-branch builds broke on 8750c310 and both are fallout from that PR.

**Docker** (`pnpm build-web`: "Can't resolve '@pdfjs/pdf.min.mjs'",
"Can't resolve '@simplecc/simplecc_wasm'"). `setup-vendors` runs in the
`dependencies` stage and its output is not in the build context, so every
directory it creates needs an explicit `COPY --from=dependencies`. Splitting
the bundler-imported modules out of `public/vendor` into `vendor/` left the
new directory with no COPY line. The test derives the expected roots from the
`prepare-vendor` script, so adding another one fails until the Dockerfile
copies it.

**Nix** ("no matching package named `sentry-debug-images` found"). The Linux
CEF build vendors from `Cargo.cef.lock`, which `nix/package.nix` copies over
`Cargo.lock`, and that second lock never learned about the two crates the
sentry `debug-images` feature pulls in. Added `findshlibs` and
`sentry-debug-images` there, plus the dependency entry on `sentry`; both need
only packages the lock already had.

This is also why `nix-deps-check` stayed green on #6368: it hashes
`Cargo.cef.lock`, which that PR did not touch, so the stale vendor set only
surfaced when the full Nix build ran on main.

`cargoHash` is updated in a follow-up commit from the hash the deps-check
prints, since the vendor contents change.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* style: format the vendor-root docker test

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(nix): update cargoHash for the new sentry debug-images crates

The vendor set gained findshlibs and sentry-debug-images, so the pinned
hash moved. Value taken from the nix-deps-check run on this PR:

  specified: sha256-EPNbiv0YJ79rqBHFCO5gjQwt9Vn1v9HV0ZfH7f2Eo/E=
  got:       sha256-8MIkn2N65P87tG0RncOQtH01SYfRUM4qB6rOzd+fwwQ=

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor: one vendor dir, with the bundler importing from packages

#6368 split the vendored modules into a second `vendor/` directory to stop
them shipping twice (Tauri embeds every published file, and `public/` is
published whole). Two vendor directories is the wrong shape, and the copies
were never needed: the aliases can resolve straight at the sources, which is
how `jieba-wasm` has always been imported.

  @pdfjs/*    -> packages/foliate-js/node_modules/pdfjs-dist/legacy/build/*
  @simplecc/* -> packages/simplecc-wasm/dist/web/*

`public/vendor/pdfjs` now holds only what the reader fetches by URL at
runtime — the worker, the WASM decoders, cmaps, standard fonts and the layer
CSS — and `vendor/` is gone, along with `copy-pdfjs-lib`, `copy-simplecc`,
`setup-simplecc`, its Dockerfile COPY and its worktree copy.

Two details this turned up:

- The @pdfjs alias needs an explicit `declare module`. TypeScript inferred
  types for the minified JS while it sat inside the app, but skips JavaScript
  under node_modules, and pdfjs-dist ships `pdf.d.mts`, not the
  `pdf.min.d.mts` that would sit beside the minified build. Only the import's
  side effect is used, so the declaration is bare.
- `packages/simplecc-wasm` is a submodule the worktree script skips, so the
  script now copies its committed `dist/web` into a new worktree instead of a
  vendor directory.

A true `import ... from 'simplecc-wasm'`, matching jieba exactly, would need a
change in that submodule: its `exports` map points at `pkg/`, which is build
output and not committed (only `dist/web` is), and the map forbids other
subpaths.

Verified with a real build: modules resolve with no `vendor/` present,
`out/vendor` holds only pdfjs, `pdf.min.mjs` is bundled into a chunk and not
published, and both jieba and simplecc WASM are emitted once each.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs: say why the @pdfjs alias points at the package, not public/

The comments still described a vendored copy. Record the constraint
instead: a module the bundler imports must not also be published, or
Tauri embeds it twice.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* test: drop the vendor/docker config assertions

These assert on config files rather than behaviour: the alias-target test,
the Dockerfile vendor-COPY test, and the pdfjs wasm copy-script test.

The SELF_HOSTED default check in docker-image-defaults.test.ts stays; it
predates this work (#6100) and guards runtime behaviour of the published
image rather than a config shape.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-23 15:13:35 +02:00
Huang Xin
e0f1d23892
fix(nix): add imagesize to the CEF lockfile (#6274)
* fix(nix): add imagesize to the CEF lockfile

#6273 added the imagesize crate to Cargo.lock but not to Cargo.cef.lock,
which the Nix package builds the Linux CEF app from. Its offline vendor
had no imagesize, so the build on main failed with "no matching package
named `imagesize` found". The Readest entry also gains http-body-util,
hyper and hyper-util, which cargo already resolved from the vendor.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(nix): refresh the Cargo vendor hash for imagesize

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 16:14:29 +02:00
Huang Xin
f819d39578
fix(nix): sync CEF dependencies for offline builds (#6126)
* fix(ci): use CEF bundler with deployment array quoting fix

* fix(nix): include psl in the CEF dependency lockfile

* fix(nix): refresh CEF Cargo vendor hash for psl
2026-09-07 18:39:37 +02:00
Huang Xin
ee86510cca
chore: bump tauri to version 2.11.5 (#6081)
Some checks are pending
CodeQL Advanced / Analyze (actions) (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
CodeQL Advanced / Analyze (rust) (push) Waiting to run
Publish Docker image / build (linux/amd64, ubuntu-latest) (push) Waiting to run
Publish Docker image / build (linux/arm64, ubuntu-24.04-arm) (push) Waiting to run
Publish Docker image / merge (push) Blocked by required conditions
Build with Nix / tests (push) Waiting to run
PR checks / rust_lint (push) Waiting to run
PR checks / koplugin_rust_lint (push) Waiting to run
PR checks / nix_flake_check (push) Waiting to run
PR checks / build_web_app (push) Waiting to run
PR checks / test_web_app (1) (push) Waiting to run
PR checks / test_web_app (2) (push) Waiting to run
PR checks / test_extensions (push) Waiting to run
PR checks / build_tauri_app (push) Waiting to run
Scorecard supply-chain security / Scorecard analysis (push) Waiting to run
Deploy to vercel on merge / build_and_deploy (push) Waiting to run
* chore: bump tauri to version 2.11.5

* chore: update agent memories

* chore(nix): bump cargoHash for the tauri 2.11.5 lockfile

The fod-hashes check failed on the stale cargo vendor hash after
Cargo.lock was regenerated for the tauri fork bump. Take the hash from
the check's `got:` line. Also pass `--keep-going` to that nix build so a
single run reports every stale fixed-output hash instead of stopping at
the first one.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(epub): decode UTF-16 BOM bodies with as_chunks

CI's stable clippy rejects `chunks_exact(2)` with a constant chunk size
(`clippy::chunks_exact_to_as_chunks`) now that the crate's MSRV is 1.90
and `slice::as_chunks` is available. Same behaviour: the trailing odd
byte of a malformed UTF-16 stream lands in the ignored remainder, which
the new test pins down.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* chore(nix): bump pnpmDeps hash for the tauri plugin package bumps

pnpm-lock.yaml changed with the @tauri-apps/plugin-* JS package bumps,
so the pnpm dependency fixed-output hash went stale. Value taken from
the fod-hashes check's `got:` line.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 22:32:30 +02:00
Huang Xin
3723c1625d
fix(linux): catch the CEF stack up with upstream feat/cef (#6080)
readest/tauri feat/cef is rebased onto upstream feat/cef (4368b87b9),
keeping only our DevTools-close fix on top. Upstream now passes
--no-first-run itself (tauri-apps/tauri#15980), so the app no longer
adds it through CefRuntimeAttributes; it also brings the media
permission fixes, script injection on the main frame only and the
AppImage bundling fix. Cargo.cef.lock follows the new revision.

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 21:26:43 +02:00
Huang Xin
655c72ad5a
feat(linux): ship Readest on the tauri CEF runtime (#6074)
* feat(linux): build and ship Readest on the tauri CEF runtime

Linux now builds against upstream tauri `feat/cef` (git) and the plugins on
plugins-workspace `feat/cef`, while macOS/Windows/mobile keep the readest
fork untouched:

- `pnpm tauri:cef dev|build` (scripts/tauri-cef.mjs) runs @tauri-apps/cli-cef
  with `--features cef`, cargo `--no-default-features` and the Linux-only
  `[patch.crates-io]` in src-tauri/.cargo/cef.toml, swapping the committed
  Cargo.cef.lock in for the run so Cargo.lock stays in the fork state.
- The fork crates are no longer workspace members (a member clashes on
  `links` with the git copy); the tauri-plugins fork carried no changes and
  is removed, tauri-plugin-fs comes from crates.io at 2.5.1.
- App: `cef = ["tauri/cef"]` (the fork gets a no-op stub), explicit runtime
  type, `cef_entry_point`, `--no-first-run` for CEF, commands generic over
  the runtime, xdg-portal dialogs on Linux (rfd's GTK thread crashes CEF),
  rangefile reads and pointer-driven move/resize on the Linux CEF runtime,
  Chromium reported in the About dialog, deb/rpm depend on libwebkit2gtk
  while plugins still pull the wry runtime.
- Build-generated permission files are untracked; turso registers `batch`.
- CI Linux legs use `pnpm tauri:cef`.

Submodules: packages/tauri -> feat/cef-feature-stub, tauri-plugin-turso ->
fix/register-batch-command (both need pushing).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* feat(linux): let the CEF wrapper run an unpacked tauri CLI for offline builds

Flatpak builds have no network, so `TAURI_CEF_CLI` points scripts/tauri-cef.mjs
at an unpacked copy of @tauri-apps/cli-cef instead of `pnpm dlx`.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* chore(linux): take the CEF stack from the readest forks

- src-tauri/.cargo/cef.toml: tauri and the plugins now come from the readest
  forks' feat/cef branches (upstream feat/cef plus the DevTools-close fix in
  tauri-runtime-cef); Cargo.cef.lock re-resolved against them.
- tauri-plugin-turso: point at main, which merged the batch command fix.
- CI: STRACE_MODE=0 for the Linux legs so the CEF AppImage bundler
  (quick-sharun) does not launch the app under Xvfb and hang (#4906).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* feat(linux): make the CEF runtime the default tauri build on Linux

`pnpm tauri` now goes through scripts/tauri.mjs (the former tauri-cef.mjs):
on Linux its dev, build and bundle commands run the feat/cef tauri CLI
with the CEF feature, cargo config and Cargo.cef.lock swap, and every
other platform or command passes straight through to @tauri-apps/cli.
The separate `tauri:cef` script goes away, so the release and nightly
workflows, the local Linux build script and the docs use plain
`pnpm tauri build` again.

The tauri webdriver harness (scripts/test-tauri.sh) still calls the
`tauri` binary directly and keeps the wry runtime on Linux, since
tauri-driver needs WebKitWebDriver.

Cargo.cef.lock picks up the quick-xml 0.41 bump from main.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* chore(nix): refresh cargoHash for the reshaped Cargo.lock

Dropping the packages/tauri-plugins submodule and the tauri-plugin-fs
path patch changed the vendored cargo dependency set, so the Nix
fixed-output hash moves to the value the nix-deps-check job reported.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(linux): harden the CEF wrapper and pointer window drag

Review follow-ups on the CEF runtime work:

- scripts/tauri.mjs parks the wry Cargo.lock in Cargo.lock.wry, created
  exclusively, so two CEF commands in one checkout cannot swap lockfiles
  over each other, and a killed run leaves an obvious file to move back.
- The CEF runtime alias, entry point and runtime attributes are gated on
  Linux as well as the `cef` feature; elsewhere the feature is a no-op.
- Pointer-driven window move/resize applies the last pointer delta when
  the button is released before the pending animation frame, and does
  not start tracking when the button was already released while the
  window state was being read.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 20:09:06 +02:00