Add desktop platform support #11

Open
claude-bot wants to merge 7 commits from worktree-desktop-support into main
Collaborator

Summary

  • Adds a desktop feature to feedsignal-web combining dioxus/desktop with the existing server feature, so #[server] functions execute in-process instead of over HTTP (dispatch on #[server] is gated purely on the server cargo feature) — one self-contained native webview binary with DB, feed polling, LLM calls, and the scheduler, no separate server process.
  • main.rs explicitly picks the desktop launcher (LaunchBuilder::desktop()) since dioxus::launch's automatic platform detection prioritizes the (also-enabled) server platform over desktop, which would otherwise stand up an axum server instead of opening a window.
  • Splits the CI check job's four clippy variants (native, server, web, desktop) into their own parallel jobs, since they don't share dependencies and were previously just serial steps in one job.
  • The desktop clippy job runs on a new rust-ci-desktop runner image (GTK/WebKit/AppIndicator headers dioxus-desktop needs, layered on top of rust-ci in schaefera/infrastructure) instead of installing those packages on every run — keeps the other jobs' image small.
  • Documents the desktop build in the README.

Depends on: the rust-ci-desktop label being registered on the live ci-runner box (infrastructure PR: https://code.austinschaefer.com/schaefera/infrastructure/compare/main...add-rust-ci-desktop-image) before the clippy-desktop job here can pick up work — that step touches the live runner and needs manual action, so it's not done yet.

Test plan

  • cargo check/cargo clippy -p feedsignal-web --no-default-features --features desktop --all-targets -- -D warnings pass
  • Existing server and native-workspace clippy jobs still pass (no regression)
  • cargo fmt --check passes
  • cargo test --workspace --exclude feedsignal-web passes
  • Ran the built desktop binary: it opens a window and completes an in-process server-fn call (SQLite connects, migrations run) with no HTTP round trip
  • Restructured .forgejo/workflows/ci.yml validated as well-formed YAML
  • clippy-desktop CI job itself will fail until the rust-ci-desktop runner label is registered (see "Depends on" above)

🤖 Generated with Claude Code

## Summary - Adds a `desktop` feature to `feedsignal-web` combining `dioxus/desktop` with the existing `server` feature, so `#[server]` functions execute in-process instead of over HTTP (dispatch on `#[server]` is gated purely on the `server` cargo feature) — one self-contained native webview binary with DB, feed polling, LLM calls, and the scheduler, no separate server process. - `main.rs` explicitly picks the desktop launcher (`LaunchBuilder::desktop()`) since `dioxus::launch`'s automatic platform detection prioritizes the (also-enabled) `server` platform over `desktop`, which would otherwise stand up an axum server instead of opening a window. - Splits the CI `check` job's four clippy variants (native, server, web, desktop) into their own parallel jobs, since they don't share dependencies and were previously just serial steps in one job. - The desktop clippy job runs on a new `rust-ci-desktop` runner image (GTK/WebKit/AppIndicator headers `dioxus-desktop` needs, layered on top of `rust-ci` in [schaefera/infrastructure](https://code.austinschaefer.com/schaefera/infrastructure)) instead of installing those packages on every run — keeps the other jobs' image small. - Documents the desktop build in the README. **Depends on:** the `rust-ci-desktop` label being registered on the live `ci-runner` box (infrastructure PR: https://code.austinschaefer.com/schaefera/infrastructure/compare/main...add-rust-ci-desktop-image) before the `clippy-desktop` job here can pick up work — that step touches the live runner and needs manual action, so it's not done yet. ## Test plan - [x] `cargo check`/`cargo clippy -p feedsignal-web --no-default-features --features desktop --all-targets -- -D warnings` pass - [x] Existing `server` and native-workspace clippy jobs still pass (no regression) - [x] `cargo fmt --check` passes - [x] `cargo test --workspace --exclude feedsignal-web` passes - [x] Ran the built desktop binary: it opens a window and completes an in-process server-fn call (SQLite connects, migrations run) with no HTTP round trip - [x] Restructured `.forgejo/workflows/ci.yml` validated as well-formed YAML - [ ] `clippy-desktop` CI job itself will fail until the `rust-ci-desktop` runner label is registered (see "Depends on" above) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude-bot added 1 commit 2026-09-15 10:36:49 +00:00
Add desktop platform support via a new feedsignal-web desktop feature
All checks were successful
CI / check (pull_request) Successful in 7m49s
CI / test (pull_request) Successful in 3m37s
CI / audit (pull_request) Successful in 14s
67d399ad05
Combines dioxus's desktop (webview) renderer with the existing `server`
feature so `#[server]` functions execute in-process instead of going over
HTTP — one self-contained native binary with DB, feed polling, LLM calls,
and the scheduler, no separate server to run. main.rs picks the desktop
launcher explicitly since dioxus::launch's automatic platform detection
would otherwise prefer the (also-enabled) server platform over desktop.

Verified: cargo check/clippy pass for the new feature (native crates and
existing server/web features unaffected), and running the built binary
opens a window and completes an in-process server-fn call (DB connects,
migrations run) with no HTTP round trip. CI gets a matching desktop
clippy job with the GTK/WebKit apt packages dioxus-desktop needs to
compile on Linux.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
schaefera added 1 commit 2026-09-15 11:30:40 +00:00
Split CI clippy checks into parallel jobs; move desktop build deps to a dedicated runner image
Some checks failed
CI / fmt (pull_request) Successful in 9s
CI / clippy-native (pull_request) Successful in 2m47s
CI / clippy-server (pull_request) Successful in 2m41s
CI / clippy-web (pull_request) Successful in 1m38s
CI / clippy-desktop (pull_request) Has been cancelled
CI / test (pull_request) Has been cancelled
CI / audit (pull_request) Has been cancelled
6c1020c3ef
The single "check" job ran fmt + four clippy variants (native, server,
web, desktop) as sequential steps, so the desktop feature's clippy check
always waited on the other three even though none of them share
dependencies. Splitting each into its own job lets the runner (capacity
2) run them concurrently instead.

Also drops the per-run `apt-get install` for the GTK/WebKit headers
dioxus-desktop needs — those are now baked into a dedicated
`rust-ci-desktop` runner image (schaefera/infrastructure#TBD) so only the
desktop job's image is bigger, not every job's.

Depends on the `rust-ci-desktop` label being registered on the ci-runner
box before this workflow's clippy-desktop job can pick up work.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
schaefera added 1 commit 2026-09-16 12:59:09 +00:00
Hide the desktop window's title bar and default menu
Some checks failed
CI / fmt (pull_request) Successful in 15s
CI / clippy-web (pull_request) Has been cancelled
CI / clippy-desktop (pull_request) Has been cancelled
CI / test (pull_request) Has been cancelled
CI / audit (pull_request) Has been cancelled
CI / clippy-server (pull_request) Has been cancelled
CI / clippy-native (pull_request) Has been cancelled
ef37690473
Extract desktop window setup into its own crates/web/src/desktop.rs
module (SRP) with a single config() function, wired into main.rs via
LaunchBuilder::desktop().with_cfg(...). Disabling window decorations
also clears dioxus-desktop's default native menu bar as a side effect,
since it exists to give a decorated window something to hang off of.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
schaefera added 1 commit 2026-09-16 13:00:24 +00:00
Merge branch 'main' into worktree-desktop-support
All checks were successful
CI / fmt (pull_request) Successful in 15s
CI / clippy-native (pull_request) Successful in 11m46s
CI / clippy-server (pull_request) Successful in 11m46s
CI / clippy-web (pull_request) Successful in 3m32s
CI / clippy-desktop (pull_request) Successful in 3m37s
CI / test (pull_request) Successful in 10m14s
CI / audit (pull_request) Successful in 21s
d002d44a2b
schaefera added 2 commits 2026-09-16 13:23:00 +00:00
target/ was the majority of the ~1.5GB cache each of the 5 CI jobs
tarred and uploaded on every run — expensive on a single runner where
those uploads contend for the same disk/network, and pointless since
these jobs build different feature-set combinations into one
identically-keyed target dir anyway. sccache already gives compiler-
level reuse without that duplication.

sccache's cache key was keyed to github.run_id, which never gets an
exact hit, so its ~377MB also re-uploaded in full every single run
with no benefit. Key it to Cargo.lock like the registry cache instead,
so it only re-saves when dependencies actually change.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Merge branch 'worktree-desktop-support' of ssh://code.austinschaefer.com:22222/schaefera/feedsignal into worktree-desktop-support
All checks were successful
CI / fmt (pull_request) Successful in 11s
CI / clippy-native (pull_request) Successful in 6m1s
CI / clippy-web (pull_request) Successful in 3m50s
CI / clippy-server (pull_request) Successful in 4m59s
CI / clippy-desktop (pull_request) Successful in 4m28s
CI / test (pull_request) Successful in 6m9s
CI / audit (pull_request) Successful in 28s
9429ca100a
schaefera added 1 commit 2026-09-16 14:06:58 +00:00
Give the test job its own scoped target/ cache
All checks were successful
CI / fmt (pull_request) Successful in 13s
CI / clippy-native (pull_request) Successful in 3m31s
CI / clippy-server (pull_request) Successful in 3m46s
CI / clippy-web (pull_request) Successful in 3m23s
CI / clippy-desktop (pull_request) Successful in 4m27s
CI / test (pull_request) Successful in 7m48s
CI / audit (pull_request) Successful in 25s
04f628b70e
test's own compiled objects are worth reusing across runs — it's the
only job needing full codegen, so it can't share anything with the
clippy jobs' check-only builds regardless of key. Scoping it to a key
the clippy jobs don't touch avoids the contention/collision problem
that came from all 5 jobs previously sharing one target/ cache key,
and since it excludes feedsignal-web, its target/ stays much smaller
than the combined cache removed earlier.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Some checks are pending
CI / fmt (pull_request) Successful in 13s
CI / clippy-native (pull_request) Successful in 3m31s
Required
Details
CI / clippy-server (pull_request) Successful in 3m46s
Required
Details
CI / clippy-web (pull_request) Successful in 3m23s
Required
Details
CI / clippy-desktop (pull_request) Successful in 4m27s
Required
Details
CI / test (pull_request) Successful in 7m48s
Required
Details
CI / audit (pull_request) Successful in 25s
Required
Details
CI / check (pull_request)
Required
This pull request doesn't have enough approvals yet. 0 of 1 approvals granted.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin worktree-desktop-support:worktree-desktop-support
git checkout worktree-desktop-support
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: schaefera/feedsignal#11
No description provided.