Skip to main content

max / quasi

Generate a kind's configuration, and deliver one quasi-notifs, second and third halves. The declaration landed with nothing to read it; these are the two pieces that make declaring a kind worth anything. CONFIGURATION. A kind produces its own `enabled` key plus one per knob, each with a posture and a default, and a described settings pane made of those. The keys are dotted -- `event-reminder.lead`, never `event_reminder_lead` -- which is what `is_key` was refusing a dot for, and it settles the collision this was filed in front of: goingson's `event_lead_minutes` is the Events tab dot rather than a delivery setting, and a generated key cannot be mistaken for a hand-written one. The default lives in the declaration and nowhere else, which is the failure goingson's own config header records: `event_lead_minutes` came to have its default written in three places because nothing produced it. `Registry::spec` is a real `synckit_config::ConfigSpec` rather than a parallel table, so a new kind cannot arrive with its keys unclassified and therefore silently Local. It leaks its keys once, on purpose and documented: a spec holds `&'static str` because an app's spec is a const, and the registry is a static whose key set is fixed at compile time. The pane is nodes, so the terminal and egui hosts get it for free, and every control carries the write route rather than a submit button -- the case `Field::changes` exists for, and what goingson reached through 109 lines of its own dispatcher. DELIVERY. `Deliver` is one method and `Outbox` is everything a host would otherwise re-answer: the enabled key consulted before anything is sent, a duplicate suppressed by identity rather than by timing, a restart that does not spam, and bounded memory whose clearing resets the bootstrap it would otherwise defeat. All four are goingson's watcher, and all four are tested against no host at all. `CatchUp` is on the declaration because goingson answers it twice and differently: a snooze that expired overnight still fires, an event reminder for a meeting that started an hour ago does not. That is a fact about what the kind means, not about the renderer, so it is declared once rather than answered per host. `quasi_tauri::Notifier` is what is left for the host, and it is one call. Server-mediated push stays declined (`ce3be80a`); a push adapter would be a `Deliver` like any other. Both features are optional: synckit-config carries a bundled SQLite and the description suite is a suite, and an app that only declares kinds should link neither.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-18 02:20 UTC
Signed with PGP, not checked
Commit: 96607fa754ad10257eaf74dcbe018b26991a84a6
Parent: 11aef1d
19 files changed, +1924 insertions, -40 deletions
M Cargo.lock +329 -9
@@ -101,6 +101,137 @@
101 101 source = "registry+https://github.com/rust-lang/crates.io-index"
102 102 checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56"
103 103
104 + [[package]]
105 + name = "async-broadcast"
106 + version = "0.7.2"
107 + source = "registry+https://github.com/rust-lang/crates.io-index"
108 + checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532"
109 + dependencies = [
110 + "event-listener",
111 + "event-listener-strategy",
112 + "futures-core",
113 + "pin-project-lite",
114 + ]
115 +
116 + [[package]]
117 + name = "async-channel"
118 + version = "2.5.0"
119 + source = "registry+https://github.com/rust-lang/crates.io-index"
120 + checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2"
121 + dependencies = [
122 + "concurrent-queue",
123 + "event-listener-strategy",
124 + "futures-core",
125 + "pin-project-lite",
126 + ]
127 +
128 + [[package]]
129 + name = "async-executor"
130 + version = "1.14.0"
131 + source = "registry+https://github.com/rust-lang/crates.io-index"
132 + checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a"
133 + dependencies = [
134 + "async-task",
135 + "concurrent-queue",
136 + "fastrand",
137 + "futures-lite",
138 + "pin-project-lite",
139 + "slab",
140 + ]
141 +
142 + [[package]]
143 + name = "async-io"
144 + version = "2.6.0"
145 + source = "registry+https://github.com/rust-lang/crates.io-index"
146 + checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc"
147 + dependencies = [
148 + "autocfg",
149 + "cfg-if",
150 + "concurrent-queue",
151 + "futures-io",
152 + "futures-lite",
153 + "parking",
154 + "polling",
155 + "rustix",
156 + "slab",
157 + "windows-sys 0.61.2",
158 + ]
159 +
160 + [[package]]
161 + name = "async-lock"
162 + version = "3.4.2"
163 + source = "registry+https://github.com/rust-lang/crates.io-index"
164 + checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311"
165 + dependencies = [
166 + "event-listener",
167 + "event-listener-strategy",
168 + "pin-project-lite",
169 + ]
170 +
171 + [[package]]
172 + name = "async-process"
173 + version = "2.5.0"
174 + source = "registry+https://github.com/rust-lang/crates.io-index"
175 + checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75"
176 + dependencies = [
177 + "async-channel",
178 + "async-io",
179 + "async-lock",
180 + "async-signal",
181 + "async-task",
182 + "blocking",
183 + "cfg-if",
184 + "event-listener",
185 + "futures-lite",
186 + "rustix",
187 + ]
188 +
189 + [[package]]
190 + name = "async-recursion"
191 + version = "1.1.1"
192 + source = "registry+https://github.com/rust-lang/crates.io-index"
193 + checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
194 + dependencies = [
195 + "proc-macro2",
196 + "quote",
197 + "syn 2.0.119",
198 + ]
199 +
200 + [[package]]
201 + name = "async-signal"
202 + version = "0.2.14"
203 + source = "registry+https://github.com/rust-lang/crates.io-index"
204 + checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485"
205 + dependencies = [
206 + "async-io",
207 + "async-lock",
208 + "atomic-waker",
209 + "cfg-if",
210 + "futures-core",
211 + "futures-io",
212 + "rustix",
213 + "signal-hook-registry",
214 + "slab",
215 + "windows-sys 0.61.2",
216 + ]
217 +
218 + [[package]]
219 + name = "async-task"
220 + version = "4.7.1"
221 + source = "registry+https://github.com/rust-lang/crates.io-index"
222 + checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
223 +
224 + [[package]]
225 + name = "async-trait"
226 + version = "0.1.92"
227 + source = "registry+https://github.com/rust-lang/crates.io-index"
228 + checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667"
229 + dependencies = [
230 + "proc-macro2",
231 + "quote",
232 + "syn 3.0.3",
233 + ]
234 +
104 235 [[package]]
105 236 name = "atk"
106 237 version = "0.18.2"
@@ -263,6 +394,19 @@
263 394 "objc2",
264 395 ]
265 396
397 + [[package]]
398 + name = "blocking"
399 + version = "1.6.2"
400 + source = "registry+https://github.com/rust-lang/crates.io-index"
401 + checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21"
402 + dependencies = [
403 + "async-channel",
404 + "async-task",
405 + "futures-io",
406 + "futures-lite",
407 + "piper",
408 + ]
409 +
266 410 [[package]]
267 411 name = "brotli"
268 412 version = "8.0.4"
@@ -498,6 +642,15 @@
498 642 "static_assertions",
499 643 ]
500 644
645 + [[package]]
646 + name = "concurrent-queue"
647 + version = "2.5.0"
648 + source = "registry+https://github.com/rust-lang/crates.io-index"
649 + checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
650 + dependencies = [
651 + "crossbeam-utils",
652 + ]
653 +
501 654 [[package]]
502 655 name = "cookie"
503 656 version = "0.18.2"
@@ -1023,6 +1176,12 @@
1023 1176 source = "registry+https://github.com/rust-lang/crates.io-index"
1024 1177 checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
1025 1178
1179 + [[package]]
1180 + name = "endi"
1181 + version = "1.1.1"
1182 + source = "registry+https://github.com/rust-lang/crates.io-index"
1183 + checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099"
1184 +
1026 1185 [[package]]
1027 1186 name = "enum-map"
1028 1187 version = "2.7.3"
@@ -1043,6 +1202,27 @@
1043 1202 "syn 2.0.119",
1044 1203 ]
1045 1204
1205 + [[package]]
1206 + name = "enumflags2"
1207 + version = "0.7.12"
1208 + source = "registry+https://github.com/rust-lang/crates.io-index"
1209 + checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef"
1210 + dependencies = [
1211 + "enumflags2_derive",
1212 + "serde",
1213 + ]
1214 +
1215 + [[package]]
1216 + name = "enumflags2_derive"
1217 + version = "0.7.12"
1218 + source = "registry+https://github.com/rust-lang/crates.io-index"
1219 + checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827"
1220 + dependencies = [
1221 + "proc-macro2",
1222 + "quote",
1223 + "syn 2.0.119",
1224 + ]
1225 +
1046 1226 [[package]]
1047 1227 name = "epaint"
1048 1228 version = "0.35.0"
@@ -1090,6 +1270,16 @@
1090 1270 "typeid",
1091 1271 ]
1092 1272
1273 + [[package]]
1274 + name = "errno"
1275 + version = "0.3.14"
1276 + source = "registry+https://github.com/rust-lang/crates.io-index"
1277 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
1278 + dependencies = [
1279 + "libc",
1280 + "windows-sys 0.61.2",
1281 + ]
1282 +
1093 1283 [[package]]
1094 1284 name = "euclid"
1095 1285 version = "0.22.14"
@@ -1099,6 +1289,26 @@
1099 1289 "num-traits",
1100 1290 ]
1101 1291
1292 + [[package]]
1293 + name = "event-listener"
1294 + version = "5.4.2"
1295 + source = "registry+https://github.com/rust-lang/crates.io-index"
1296 + checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2"
1297 + dependencies = [
1298 + "parking",
1299 + "pin-project-lite",
1300 + ]
1301 +
1302 + [[package]]
1303 + name = "event-listener-strategy"
1304 + version = "0.5.4"
1305 + source = "registry+https://github.com/rust-lang/crates.io-index"
1306 + checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93"
1307 + dependencies = [
1308 + "event-listener",
1309 + "pin-project-lite",
1310 + ]
1311 +
1102 1312 [[package]]
1103 1313 name = "fallible-iterator"
1104 1314 version = "0.3.0"
@@ -1247,6 +1457,19 @@
1247 1457 source = "registry+https://github.com/rust-lang/crates.io-index"
1248 1458 checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed"
1249 1459
1460 + [[package]]
1461 + name = "futures-lite"
1462 + version = "2.6.1"
1463 + source = "registry+https://github.com/rust-lang/crates.io-index"
1464 + checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad"
1465 + dependencies = [
1466 + "fastrand",
1467 + "futures-core",
1468 + "futures-io",
1469 + "parking",
1470 + "pin-project-lite",
1471 + ]
1472 +
1250 1473 [[package]]
1251 1474 name = "futures-macro"
1252 1475 version = "0.3.34"
@@ -1678,6 +1901,12 @@
1678 1901 source = "registry+https://github.com/rust-lang/crates.io-index"
1679 1902 checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
1680 1903
1904 + [[package]]
1905 + name = "hermit-abi"
1906 + version = "0.5.2"
1907 + source = "registry+https://github.com/rust-lang/crates.io-index"
1908 + checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
1909 +
1681 1910 [[package]]
1682 1911 name = "hex"
1683 1912 version = "0.4.3"
@@ -2307,6 +2536,12 @@
2307 2536 source = "registry+https://github.com/rust-lang/crates.io-index"
2308 2537 checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4"
2309 2538
2539 + [[package]]
2540 + name = "linux-raw-sys"
2541 + version = "0.12.1"
2542 + source = "registry+https://github.com/rust-lang/crates.io-index"
2543 + checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
2544 +
2310 2545 [[package]]
2311 2546 name = "litemap"
2312 2547 version = "0.8.3"
@@ -2337,6 +2572,20 @@
2337 2572 "hashbrown 0.17.1",
2338 2573 ]
2339 2574
2575 + [[package]]
2576 + name = "mac-notification-sys"
2577 + version = "0.6.15"
2578 + source = "registry+https://github.com/rust-lang/crates.io-index"
2579 + checksum = "fd604973958ddcc11b561193c0fb96ba146506ef2f231ef2e7c35fd2cbc9beca"
2580 + dependencies = [
2581 + "cc",
2582 + "log",
2583 + "objc2",
2584 + "objc2-foundation",
2585 + "time",
2586 + "uuid",
2587 + ]
2588 +
2340 2589 [[package]]
2341 2590 name = "makeover"
2342 2591 version = "2.8.0"
@@ -2542,6 +2791,20 @@
2542 2791 source = "registry+https://github.com/rust-lang/crates.io-index"
2543 2792 checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451"
2544 2793
2794 + [[package]]
2795 + name = "notify-rust"
2796 + version = "4.17.0"
2797 + source = "registry+https://github.com/rust-lang/crates.io-index"
2798 + checksum = "50ff2e74231b72c832d82982193b417f230945be6bdb5575b251d941d31adb00"
2799 + dependencies = [
2800 + "futures-lite",
2801 + "log",
2802 + "mac-notification-sys",
2803 + "serde",
2804 + "tauri-winrt-notification",
2805 + "zbus",
2806 + ]
2807 +
2545 2808 [[package]]
2546 2809 name = "num-conv"
2547 2810 version = "0.2.2"
@@ -2702,6 +2965,7 @@
2702 2965 dependencies = [
2703 2966 "bitflags 2.13.1",
2704 2967 "block2",
2968 + "libc",
2705 2969 "objc2",
2706 2970 "objc2-core-foundation",
2707 2971 ]
@@ -2795,6 +3059,16 @@
2795 3059 source = "registry+https://github.com/rust-lang/crates.io-index"
2796 3060 checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
2797 3061
3062 + [[package]]
3063 + name = "ordered-stream"
3064 + version = "0.2.0"
3065 + source = "registry+https://github.com/rust-lang/crates.io-index"
3066 + checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50"
3067 + dependencies = [
3068 + "futures-core",
3069 + "pin-project-lite",
3070 + ]
3071 +
2798 3072 [[package]]
2799 3073 name = "pango"
2800 3074 version = "0.18.3"
@@ -2820,6 +3094,12 @@
2820 3094 "system-deps",
2821 3095 ]
2822 3096
3097 + [[package]]
3098 + name = "parking"
3099 + version = "2.2.1"
3100 + source = "registry+https://github.com/rust-lang/crates.io-index"
3101 + checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
3102 +
2823 3103 [[package]]
2824 3104 name = "parking_lot"
2825 3105 version = "0.12.5"
@@ -2921,6 +3201,17 @@
2921 3201 source = "registry+https://github.com/rust-lang/crates.io-index"
2922 3202 checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
2923 3203
3204 + [[package]]
3205 + name = "piper"
3206 + version = "0.2.5"
3207 + source = "registry+https://github.com/rust-lang/crates.io-index"
3208 + checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1"
3209 + dependencies = [
3210 + "atomic-waker",
3211 + "fastrand",
3212 + "futures-io",
3213 + ]
3214 +
2924 3215 [[package]]
2925 3216 name = "pkg-config"
2926 3217 version = "0.3.34"
@@ -2966,6 +3257,20 @@
2966 3257 "miniz_oxide",
2967 3258 ]
2968 3259
3260 + [[package]]
3261 + name = "polling"
3262 + version = "3.11.0"
3263 + source = "registry+https://github.com/rust-lang/crates.io-index"
3264 + checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218"
3265 + dependencies = [
3266 + "cfg-if",
3267 + "concurrent-queue",
3268 + "hermit-abi",
3269 + "pin-project-lite",
3270 + "rustix",
3271 + "windows-sys 0.61.2",
3272 + ]
3273 +
2969 3274 [[package]]
2970 3275 name = "polycool"
2971 3276 version = "0.4.0"
@@ -3005,6 +3310,15 @@
3005 3310 source = "registry+https://github.com/rust-lang/crates.io-index"
3006 3311 checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
3007 3312
3313 + [[package]]
3314 + name = "ppv-lite86"
3315 + version = "0.2.21"
3316 + source = "registry+https://github.com/rust-lang/crates.io-index"
3317 + checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
3318 + dependencies = [
3319 + "zerocopy",
3320 + ]
3321 +
3008 3322 [[package]]
3009 3323 name = "precomputed-hash"
3010 3324 version = "0.1.1"
@@ -3100,11 +3414,11 @@
3100 3414
3101 3415 [[package]]
3102 3416 name = "quasi"
3103 - version = "0.26.0"
3417 + version = "0.26.1"
3104 3418
3105 3419 [[package]]
3106 3420 name = "quasi-axum"
3107 - version = "0.26.0"
3421 + version = "0.26.1"
3108 3422 dependencies = [
3109 3423 "axum",
3110 3424 "http",
@@ -3118,7 +3432,7 @@
3118 3432
3119 3433 [[package]]
3120 3434 name = "quasi-basics"
3121 - version = "0.26.0"
3435 + version = "0.26.1"
3122 3436 dependencies = [
3123 3437 "makeover-layout",
3124 3438 "quasi-http",
@@ -3128,7 +3442,7 @@
3128 3442
3129 3443 [[package]]
3130 3444 name = "quasi-bench"
3131 - version = "0.26.0"
3445 + version = "0.26.1"
3132 3446 dependencies = [
3133 3447 "dhat",
3134 3448 "makeover",
@@ -3143,7 +3457,7 @@
3143 3457
3144 3458 [[package]]
3145 3459 name = "quasi-http"
3146 - version = "0.26.0"
3460 + version = "0.26.1"
3147 3461 dependencies = [
3148 3462 "form_urlencoded",
3149 3463 "http",
@@ -3152,7 +3466,7 @@
3152 3466
3153 3467 [[package]]
3154 3468 name = "quasi-immediate"
3155 - version = "0.26.0"
3469 + version = "0.26.1"
3156 3470 dependencies = [
3157 3471 "docengine",
3158 3472 "egui",
@@ -3162,11 +3476,15 @@
3162 3476
3163 3477 [[package]]
3164 3478 name = "quasi-notifs"
3165 - version = "0.26.0"
3479 + version = "0.26.1"
3480 + dependencies = [
3481 + "quasi-router",
3482 + "synckit-config",
3483 + ]
3166 3484
3167 3485 [[package]]
3168 3486 name = "quasi-router"
3169 - version = "0.26.0"
3487 + version = "0.26.1"
3170 3488 dependencies = [
3171 3489 "makeover-layout",
3172 3490 ]
@@ -3183,18 +3501,20 @@
3183 3501
3184 3502 [[package]]
3185 3503 name = "quasi-tauri"
3186 - version = "0.26.0"
3504 + version = "0.26.1"
3187 3505 dependencies = [
3188 3506 "http",
3189 3507 "quasi-http",
3508 + "quasi-notifs",
3190 3509 "quasi-router",
3191 3510 "quasi-webview",
3192 3511 "tauri",
3512 + "tauri-plugin-notification",
3193 3513 ]
3194 3514
3195 3515 [[package]]
Lines truncated
M README.md +20
@@ -63,7 +63,18 @@
63 63 - `crates/quasi-tauri/` — the Tauri custom-protocol host adapter.
64 64 - `crates/quasi-webview/` — the webview renderer: a screen in, an htmx document
65 65 out.
66 + - `crates/quasi-tui/` — the terminal renderer: a screen in, cells in a ratatui
67 + buffer out.
68 + - `crates/quasi-immediate/` — the immediate-mode renderer: a screen in, an egui
69 + frame out.
70 + - `crates/quasi-basics/` — the first-party widget set: named assemblies of
71 + primitives, shared across our apps.
72 + - `crates/quasi-notifs/` — declared notification kinds: what a notification says
73 + and what it is for, the configuration that follows from it, and the delivery
74 + every host would otherwise re-answer.
66 75 - `crates/quasi-store/` — the embedded store's migration runner.
76 + - `crates/quasi-bench/` — what a described screen costs, in time and in
77 + allocations.
67 78 - `crates/quasi/` — the scaffolder binary, and `template/`, the app it writes.
68 79
69 80 Crates are added when their component starts, not up front.
@@ -118,6 +129,15 @@
118 129 second copy. `quasi-webview` is that implementation: a screen in, an htmx
119 130 document out, with the transport entering in a single function.
120 131
132 + `quasi-notifs` is a notification declared once. A kind carries what it says,
133 + what it is for, whether it ships on and what its knobs are; the configuration
134 + follows from the declaration, keys, postures, defaults and a described settings
135 + pane, rather than being written beside it in three places. Delivery is a host
136 + adapter of one method, because everything else a host would answer for itself —
137 + consulting the kind's `enabled` key, suppressing a duplicate, staying quiet
138 + about what came due while the app was shut, bounding the memory that takes — is
139 + shared and belongs to nobody's renderer.
140 +
121 141 `quasi-store` is what `sqlx::migrate!` used to be. SQL files embedded at build
122 142 time, applied once, recorded in a ledger with a checksum, so an applied
123 143 migration is immutable. It is here because goingson and Balanced Breakfast each
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-axum"
3 - version = "0.26.0"
3 + version = "0.26.1"
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.26.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.26.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.26.1" }
17 + quasi-http = { path = "../quasi-http", version = "0.26.1" }
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.26.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.26.1" }
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.26.0"
3 + version = "0.26.1"
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.26.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.26.1" }
17 17 makeover-layout = "0.28.2"
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.26.0" }
24 - quasi-http = { path = "../quasi-http", version = "0.26.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.26.1" }
24 + quasi-http = { path = "../quasi-http", version = "0.26.1" }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-bench"
3 - version = "0.26.0"
3 + version = "0.26.1"
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.26.0" }
26 - quasi-webview = { path = "../quasi-webview", version = "0.26.0" }
27 - quasi-tui = { path = "../quasi-tui", version = "0.26.0" }
25 + quasi-router = { path = "../quasi-router", version = "0.26.1" }
26 + quasi-webview = { path = "../quasi-webview", version = "0.26.1" }
27 + quasi-tui = { path = "../quasi-tui", version = "0.26.1" }
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.26.0" }
31 + quasi-http = { path = "../quasi-http", version = "0.26.1" }
32 32 makeover-layout = "0.28.2"
33 33 makeover-tui = { version = "0.27.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.26.0"
3 + version = "0.26.1"
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.26.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.26.1" }
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.26.0"
3 + version = "0.26.1"
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.26.0" }
15 + quasi-router = { path = "../quasi-router", version = "0.26.1" }
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.26.0"
3 + version = "0.26.1"
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
@@ -12,4 +12,17 @@
12 12 [lints]
13 13 workspace = true
14 14
15 + [features]
16 + default = []
17 + # Produce a `synckit_config::ConfigSpec` from a registry. Optional because
18 + # synckit-config carries a bundled SQLite, and an app that only declares kinds
19 + # should not link one to do it.
20 + synckit = ["dep:synckit-config"]
21 + # Produce the described settings pane. Optional for the same shape of reason:
22 + # the declaration is dep-free by design, and an app delivering notifications
23 + # without describing a pane for them should not take the description suite.
24 + describe = ["dep:quasi-router"]
25 +
15 26 [dependencies]
27 + quasi-router = { path = "../quasi-router", version = "0.26.1", optional = true }
28 + synckit-config = { git = "https://makenot.work/git/max/synckit.git", version = "0.2", optional = true }