Skip to content

Move Noura to an all-Rust desktop app and server - #15

Merged
lobbystack merged 876 commits into
mainfrom
feature/all-rust
Nov 5, 2026
Merged

lobbystack merged 876 commits into
mainfrom
feature/all-rust

Conversation

@lobbystack

Copy link
Copy Markdown
Owner

This pull request moves Noura to an all-Rust desktop app and a Rust sync server. Do not merge it yet: it exists to run CI on macOS, Windows and Linux, and the parity checks still need to pass.

What it adds

  • An egui desktop app with the Markdown editor, file tree, tabs, search, file viewers and settings
  • Tasks, Projects, Calendar and AI as WebAssembly plugins, plus a TypeScript author kit
  • noura mcp, served from the desktop binary
  • Sync v2: an axum server on SQLite or PostgreSQL, end-to-end encrypted sync, live collaboration and share links
  • Installers that ship the four first-party plugins, with a --smoke check that fails if one is missing

The legacy app stays in place as a read-only reference until parity holds.

Test status

At e5a862e8 on macOS, cargo fmt, Clippy with warnings denied, cargo deny and both plugin builds passed. So did 3,847 workspace tests, with 0 failures and 26 ignored. This pull request's merge of that commit changed no files.

This is the first CI run for this work. Windows and Linux have not built or run it, so expect failures there. The scale and soak jobs in scale.yml run separately, and the notarization check needs Apple secrets on a v* tag.

…hority, and keep retries from reopening ended links
…eckpoint, and refuse forged policy changes on both sides
…r the push, and test each role's rights and removal at seam 4
…ur role allows, open invitations with role and status, invite, copy, revoke and leave
…lds at valid roots, sign profiles at the verified head
…he own-head rule in the validity list, with fixture cases
…nt, and test the workspace limits on both stores
…and add set_access, hand-off and delete_domain on the client
… and recovery, and refuse a member taken off from rotating or wrapping
… and let a root's own objects outrank a waiting one
…s readers, keep the moved-in warning, and say what waits outside Settings
…the app, and refresh the Members section while it's open
…nt rule and bounded deferred records; add a note's parts in text mode
doc_state called encode_state_as_update_v1, which merges yrs's pending update into the state. A pending struct that repeats clocks the document holds gets cut there, and the cut part names the element before it in place of the origin it waits for. A device that booted from that state, or took a snapshot of it, showed text that devices holding the same records didn't.

The state now comes from encode_diff_v1 and holds what the document integrated. Records yrs holds pending stay live under snapshot_covers, so a booted device still takes them.

This changes the guest, so the module, its hash and the fixture change with it. The module is built on x86-64 Linux.
Destructuring the setup with .. dropped the unbound server guard at
once, which deleted its folder while the server kept answering. A new
read connection then failed with SQLite's code 14 and a 500.
Name what never finished when the app's background work times out.
Search reads the index, so it can find the edit before the watch
thread announces it.
A background thread can hold the session a moment after the last window
goes, and a launch right after then read the tree's folders from before
its last change.
A background thread that wakes the windows could hold the session as the
last window went, so the workspace's index stayed open on that thread a
moment longer. The last window's drop now waits for it, up to a second.
The limiter's windows end at fixed times, so the hour could end between
the two requests, as it did at 13:00 on a CI run.
Each workspace open expires old chats on a thread of its own, which held
the workspace's index open after the last window went.
A test waiting for a download listed the folder as the download replaced
a file, and the read of the file it listed found nothing.
The test forges a refusal for every push, and a checkpoint whose random
wait ended went out first and took it.
@lobbystack
lobbystack marked this pull request as ready for review November 4, 2026 22:09
@lobbystack
lobbystack merged commit 7afeedb into main Nov 5, 2026
22 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant