Skip to main content

max / quasi

Move the Tauri delivery adapter to quasi-notifs, behind a tauri feature Settled in quasicoherent c231ff13 (Max): option (a), a feature on quasi-notifs rather than a crate of its own. quasi-tauri depends on quasi-router and quasi-http unconditionally -- the protocol handler is most of what it is -- so its `notifs` feature could not be taken without the whole description stack coming with it. Eight lines over tauri-plugin-notification cost an app the router, which is why goingson wrote its own copy instead of adopting the framework's. quasi-notifs is where it belongs on its own terms rather than by elimination. deliver.rs already holds Occurrence, the Deliver trait and Outbox, so the crate defines the delivery abstraction and an impl of it is not foreign; "apart from how it reaches a person" is about the kinds, not the crate. And the dep-free argument needed no rewriting: synckit and describe already make synckit-config and quasi-router itself optional on the ground that an app which only declares kinds should not link one to do it. `tauri` is the third instance of a pattern the crate already runs. quasi-tauri's `notifs` feature goes away rather than re-exporting, so there is one place to find the adapter. Nothing else in the tree named it. (b), making quasi-router optional in quasi-tauri, was declined for the reason the task gave: it is a feature that turns off the crate's purpose. (c), leaving it, was declined because the adapter then gets rewritten by whoever adopts first in each app, and goingson was already that.
Author: Max Johnson <me@maxj.phd> · 2026-08-30 21:28 UTC
Signed with PGP, not checked
Commit: c3ddfcf02481f356ce6b2372859e4f02a51a5452
Parent: dbc197d
18 files changed, +94 insertions, -80 deletions
M Cargo.lock +21 -21
@@ -3425,11 +3425,11 @@
3425 3425
3426 3426 [[package]]
3427 3427 name = "quasi"
3428 - version = "0.88.0"
3428 + version = "0.89.0"
3429 3429
3430 3430 [[package]]
3431 3431 name = "quasi-axum"
3432 - version = "0.88.0"
3432 + version = "0.89.0"
3433 3433 dependencies = [
3434 3434 "axum",
3435 3435 "http",
@@ -3443,7 +3443,7 @@
3443 3443
3444 3444 [[package]]
3445 3445 name = "quasi-basics"
3446 - version = "0.88.0"
3446 + version = "0.89.0"
3447 3447 dependencies = [
3448 3448 "makeover-layout",
3449 3449 "quasi-http",
@@ -3453,7 +3453,7 @@
3453 3453
3454 3454 [[package]]
3455 3455 name = "quasi-bench"
3456 - version = "0.88.0"
3456 + version = "0.89.0"
3457 3457 dependencies = [
3458 3458 "dhat",
3459 3459 "makeover",
@@ -3468,7 +3468,7 @@
3468 3468
3469 3469 [[package]]
3470 3470 name = "quasi-http"
3471 - version = "0.88.0"
3471 + version = "0.89.0"
3472 3472 dependencies = [
3473 3473 "form_urlencoded",
3474 3474 "http",
@@ -3477,7 +3477,7 @@
3477 3477
3478 3478 [[package]]
3479 3479 name = "quasi-immediate"
3480 - version = "0.88.0"
3480 + version = "0.89.0"
3481 3481 dependencies = [
3482 3482 "docengine",
3483 3483 "egui",
@@ -3488,15 +3488,17 @@
3488 3488
3489 3489 [[package]]
3490 3490 name = "quasi-notifs"
3491 - version = "0.88.0"
3491 + version = "0.89.0"
3492 3492 dependencies = [
3493 3493 "quasi-router",
3494 3494 "synckit-config",
3495 + "tauri",
3496 + "tauri-plugin-notification",
3495 3497 ]
3496 3498
3497 3499 [[package]]
3498 3500 name = "quasi-router"
3499 - version = "0.88.0"
3501 + version = "0.89.0"
3500 3502 dependencies = [
3501 3503 "makeover-layout",
3502 3504 ]
@@ -3513,20 +3515,18 @@
3513 3515
3514 3516 [[package]]
3515 3517 name = "quasi-tauri"
3516 - version = "0.88.0"
3518 + version = "0.89.0"
3517 3519 dependencies = [
3518 3520 "http",
3519 3521 "quasi-http",
3520 - "quasi-notifs",
3521 3522 "quasi-router",
3522 3523 "quasi-webview",
3523 3524 "tauri",
3524 - "tauri-plugin-notification",
3525 3525 ]
3526 3526
3527 3527 [[package]]
3528 3528 name = "quasi-tui"
3529 - version = "0.88.0"
3529 + version = "0.89.0"
3530 3530 dependencies = [
3531 3531 "docengine",
3532 3532 "makeover",
@@ -3539,7 +3539,7 @@
3539 3539
3540 3540 [[package]]
3541 3541 name = "quasi-webview"
3542 - version = "0.88.0"
3542 + version = "0.89.0"
3543 3543 dependencies = [
3544 3544 "docengine",
3545 3545 "makeover-layout",
@@ -6211,6 +6211,14 @@
6211 6211 "winnow 1.0.4",
6212 6212 ]
6213 6213
6214 + [[patch.unused]]
6215 + name = "quasi-type"
6216 + version = "0.1.3"
6217 +
6218 + [[patch.unused]]
6219 + name = "synckit-client"
6220 + version = "0.10.0"
6221 +
6214 6222 [[patch.unused]]
6215 6223 name = "kberg"
6216 6224 version = "0.1.0"
@@ -6226,11 +6234,3 @@
6226 6234 [[patch.unused]]
6227 6235 name = "tagtree"
6228 6236 version = "0.4.1"
6229 -
6230 - [[patch.unused]]
6231 - name = "quasi-type"
6232 - version = "0.1.3"
6233 -
6234 - [[patch.unused]]
6235 - name = "synckit-client"
6236 - version = "0.10.0"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-axum"
3 - version = "0.88.0"
3 + version = "0.89.0"
4 4 description = "The axum host adapter for quasi-router: an HTTP request in, a rendered description out"
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -13,14 +13,14 @@
13 13 workspace = true
14 14
15 15 [dependencies]
16 - quasi-router = { path = "../quasi-router", version = "0.88.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.88.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.89.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.89.0" }
18 18 axum = "0.8.8"
19 19 http = "1.3.1"
20 20 tokio = { version = "1.50.0", features = ["rt"] }
21 21
22 22 [dev-dependencies]
23 - quasi-webview = { path = "../quasi-webview", version = "0.88.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.89.0" }
24 24 tokio = { version = "1.50.0", features = ["macros", "rt-multi-thread"] }
25 25 tower = { version = "0.5.3", features = ["util"] }
26 26 http-body-util = "0.1.3"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-basics"
3 - version = "0.88.0"
3 + version = "0.89.0"
4 4 description = "The first-party widget set: named assemblies of primitives, shared across our apps"
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -13,12 +13,12 @@
13 13 workspace = true
14 14
15 15 [dependencies]
16 - quasi-router = { path = "../quasi-router", version = "0.88.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.89.0" }
17 17 makeover-layout = "0.41.0"
18 18
19 19 [dev-dependencies]
20 20 # A widget's guarantees are claims about what a renderer draws, so they are
21 21 # tested against a real one rather than by walking the tree the assembly just
22 22 # built. The webview is the renderer that recognises names today.
23 - quasi-webview = { path = "../quasi-webview", version = "0.88.0" }
24 - quasi-http = { path = "../quasi-http", version = "0.88.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.89.0" }
24 + quasi-http = { path = "../quasi-http", version = "0.89.0" }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-bench"
3 - version = "0.88.0"
3 + version = "0.89.0"
4 4 description = "What a described screen costs to render, in time and in allocations"
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -22,13 +22,13 @@
22 22 count = ["dep:dhat"]
23 23
24 24 [dependencies]
25 - quasi-router = { path = "../quasi-router", version = "0.88.0" }
26 - quasi-webview = { path = "../quasi-webview", version = "0.88.0" }
27 - quasi-tui = { path = "../quasi-tui", version = "0.88.0" }
25 + quasi-router = { path = "../quasi-router", version = "0.89.0" }
26 + quasi-webview = { path = "../quasi-webview", version = "0.89.0" }
27 + quasi-tui = { path = "../quasi-tui", version = "0.89.0" }
28 28 # `Serves` is the trait carrying `screen` and `fragment`, which is what the
29 29 # webview is measured through. Taken directly rather than through quasi-webview
30 30 # because a bench calling a trait method should name the trait it calls.
31 - quasi-http = { path = "../quasi-http", version = "0.88.0" }
31 + quasi-http = { path = "../quasi-http", version = "0.89.0" }
32 32 makeover-layout = "0.41.0"
33 33 makeover-tui = { version = "0.41.0", features = ["theme"] }
34 34 # Only to load a bundled theme file. `makeover_tui::Theme` is `#[non_exhaustive]`,
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-http"
3 - version = "0.88.0"
3 + version = "0.89.0"
4 4 description = "The http-shaped seam quasi's webview host adapters share: decoding in, a rendered description out"
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -13,6 +13,6 @@
13 13 workspace = true
14 14
15 15 [dependencies]
16 - quasi-router = { path = "../quasi-router", version = "0.88.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.89.0" }
17 17 http = "1.3.1"
18 18 form_urlencoded = "1.2.2"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-immediate"
3 - version = "0.88.0"
3 + version = "0.89.0"
4 4 edition = "2024"
5 5 description = "The immediate-mode renderer for quasi-router: a described screen in, an egui frame out. Immediate mode is the constraint that matters, not the library."
6 6 license = "MIT"
@@ -12,7 +12,7 @@
12 12 categories = ["gui"]
13 13
14 14 [dependencies]
15 - quasi-router = { path = "../quasi-router", version = "0.88.0" }
15 + quasi-router = { path = "../quasi-router", version = "0.89.0" }
16 16 # The node drawing, which is the makeover layer's and not this crate's. Every
17 17 # widget here that is not a container comes from it: a screen walk that painted
18 18 # its own meter would be the divergence the suite exists to end, one copy per
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-notifs"
3 - version = "0.88.0"
3 + version = "0.89.0"
4 4 description = "Declared notification kinds and the registry that holds them: what a notification says and what it is for, apart from how it reaches a person"
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -22,7 +22,25 @@
22 22 # the declaration is dep-free by design, and an app delivering notifications
23 23 # without describing a pane for them should not take the description suite.
24 24 describe = ["dep:quasi-router"]
25 + # Deliver through `tauri-plugin-notification`. The third instance of the same
26 + # shape: an app that only declares kinds should not link a notification plugin
27 + # to do it, and one that delivers on a terminal should not link tauri.
28 + tauri = ["dep:tauri", "dep:tauri-plugin-notification"]
25 29
26 30 [dependencies]
27 - quasi-router = { path = "../quasi-router", version = "0.88.0", optional = true }
31 + quasi-router = { path = "../quasi-router", version = "0.89.0", optional = true }
28 32 synckit-config = { git = "https://makenot.work/git/max/synckit.git", version = "0.2", optional = true }
33 + tauri-plugin-notification = { version = "2.3.3", optional = true }
34 + # Default features off, for `quasi-tauri`'s reason: this takes an `AppHandle`
35 + # and the plugin extension that hangs off it, and nothing else. An app brings
36 + # the features it wants, and a delivery adapter should not be what turns on a
37 + # tray icon or a devtools build.
38 + tauri = { version = "2.11.5", default-features = false, optional = true }
39 +
40 + [dev-dependencies]
41 + # The `tauri` feature's doctest names a concrete `Runtime`, and `Wry` is behind
42 + # a default feature this crate does not otherwise ask for. Only the example
43 + # needs it: nothing in the test module builds a window, which is what keeps the
44 + # tests runnable with no display. Carried over from `quasi-tauri`, where the
45 + # adapter used to live.
46 + tauri = { version = "2.11.5" }