Skip to main content

max / goingson

Follow quasi to 0.93
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session
https://claude.ai/code/session_01WHu5vBgpCULUFXsEJBHryC
Author: Max Johnson <me@maxj.phd> · 2026-08-31 01:24 UTC
Signed with PGP, not checked
Commit: f589329e29c870c7b5bec71411a63bf7d39a19d3
Parent: a8c8a29
5 files changed, +59 insertions, -83 deletions
M Cargo.lock +24 -24
@@ -1387,7 +1387,7 @@
1387 1387 "libc",
1388 1388 "option-ext",
1389 1389 "redox_users",
1390 - "windows-sys 0.61.2",
1390 + "windows-sys 0.60.2",
1391 1391 ]
1392 1392
1393 1393 [[package]]
@@ -1628,7 +1628,7 @@
1628 1628 checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
1629 1629 dependencies = [
1630 1630 "libc",
1631 - "windows-sys 0.61.2",
1631 + "windows-sys 0.60.2",
1632 1632 ]
1633 1633
1634 1634 [[package]]
@@ -3650,7 +3650,7 @@
3650 3650 "png 0.18.1",
3651 3651 "serde",
3652 3652 "thiserror 2.0.20",
3653 - "windows-sys 0.61.2",
3653 + "windows-sys 0.60.2",
3654 3654 ]
3655 3655
3656 3656 [[package]]
@@ -3783,7 +3783,7 @@
3783 3783 source = "registry+https://github.com/rust-lang/crates.io-index"
3784 3784 checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
3785 3785 dependencies = [
3786 - "windows-sys 0.61.2",
3786 + "windows-sys 0.60.2",
3787 3787 ]
3788 3788
3789 3789 [[package]]
@@ -4717,7 +4717,7 @@
4717 4717
4718 4718 [[package]]
4719 4719 name = "quasi-http"
4720 - version = "0.92.0"
4720 + version = "0.93.0"
4721 4721 dependencies = [
4722 4722 "form_urlencoded",
4723 4723 "http",
@@ -4726,7 +4726,7 @@
4726 4726
4727 4727 [[package]]
4728 4728 name = "quasi-notifs"
4729 - version = "0.92.0"
4729 + version = "0.93.0"
4730 4730 dependencies = [
4731 4731 "quasi-router",
4732 4732 "synckit-config",
@@ -4736,14 +4736,14 @@
4736 4736
4737 4737 [[package]]
4738 4738 name = "quasi-router"
4739 - version = "0.92.0"
4739 + version = "0.93.0"
4740 4740 dependencies = [
4741 4741 "makeover-layout",
4742 4742 ]
4743 4743
4744 4744 [[package]]
4745 4745 name = "quasi-tauri"
4746 - version = "0.92.0"
4746 + version = "0.93.0"
4747 4747 dependencies = [
4748 4748 "http",
4749 4749 "quasi-http",
@@ -4769,7 +4769,7 @@
4769 4769
4770 4770 [[package]]
4771 4771 name = "quasi-webview"
4772 - version = "0.92.0"
4772 + version = "0.93.0"
4773 4773 dependencies = [
4774 4774 "docengine",
4775 4775 "makeover-layout",
@@ -5208,7 +5208,7 @@
5208 5208 "errno",
5209 5209 "libc",
5210 5210 "linux-raw-sys",
5211 - "windows-sys 0.61.2",
5211 + "windows-sys 0.60.2",
5212 5212 ]
5213 5213
5214 5214 [[package]]
@@ -5265,7 +5265,7 @@
5265 5265 "security-framework",
5266 5266 "security-framework-sys",
5267 5267 "webpki-root-certs",
5268 - "windows-sys 0.61.2",
5268 + "windows-sys 0.60.2",
5269 5269 ]
5270 5270
5271 5271 [[package]]
@@ -5805,7 +5805,7 @@
5805 5805 checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4"
5806 5806 dependencies = [
5807 5807 "libc",
5808 - "windows-sys 0.61.2",
5808 + "windows-sys 0.60.2",
5809 5809 ]
5810 5810
5811 5811 [[package]]
@@ -6565,7 +6565,7 @@
6565 6565 "getrandom 0.4.3",
6566 6566 "once_cell",
6567 6567 "rustix",
6568 - "windows-sys 0.61.2",
6568 + "windows-sys 0.60.2",
6569 6569 ]
6570 6570
6571 6571 [[package]]
@@ -6587,7 +6587,7 @@
6587 6587 "parking_lot",
6588 6588 "rustix",
6589 6589 "signal-hook",
6590 - "windows-sys 0.61.2",
6590 + "windows-sys 0.60.2",
6591 6591 ]
6592 6592
6593 6593 [[package]]
@@ -7069,7 +7069,7 @@
7069 7069 "png 0.18.1",
7070 7070 "serde",
7071 7071 "thiserror 2.0.20",
7072 - "windows-sys 0.61.2",
7072 + "windows-sys 0.60.2",
7073 7073 ]
7074 7074
7075 7075 [[package]]
@@ -7104,7 +7104,7 @@
7104 7104 dependencies = [
7105 7105 "memoffset",
7106 7106 "tempfile",
7107 - "windows-sys 0.61.2",
7107 + "windows-sys 0.60.2",
7108 7108 ]
7109 7109
7110 7110 [[package]]
@@ -7634,7 +7634,7 @@
7634 7634 source = "registry+https://github.com/rust-lang/crates.io-index"
7635 7635 checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
7636 7636 dependencies = [
7637 - "windows-sys 0.61.2",
7637 + "windows-sys 0.60.2",
7638 7638 ]
7639 7639
7640 7640 [[package]]
@@ -8491,22 +8491,22 @@
8491 8491 "winnow 1.0.4",
8492 8492 ]
8493 8493
8494 - [[patch.unused]]
8495 - name = "ops-status"
8496 - version = "0.1.0"
8497 -
8498 8494 [[patch.unused]]
8499 8495 name = "quasi-axum"
8500 - version = "0.92.0"
8496 + version = "0.93.0"
8501 8497
8502 8498 [[patch.unused]]
8503 8499 name = "quasi-basics"
8504 - version = "0.92.0"
8500 + version = "0.93.0"
8505 8501
8506 8502 [[patch.unused]]
8507 8503 name = "quasi-immediate"
8508 - version = "0.92.0"
8504 + version = "0.93.0"
8509 8505
8510 8506 [[patch.unused]]
8511 8507 name = "quasi-store"
8512 8508 version = "0.1.0"
8509 +
8510 + [[patch.unused]]
8511 + name = "ops-status"
8512 + version = "0.1.0"
@@ -52,7 +52,7 @@
52 52 │ └── got/ # Terminal cockpit over the same goingson.db
53 53 ├── src-tauri/ # Tauri desktop app, and the described screens
54 54 └── migrations/
55 - └── sqlite/ # SQLite schema migrations (69 files)
55 + └── sqlite/ # SQLite schema migrations
56 56 ```
57 57
58 58 `go-mcp` and `got` open the same SQLite file as peer readers and write through
@@ -76,7 +76,7 @@
76 76
77 77 | Module | Purpose |
78 78 |--------|---------|
79 - | `models/` | Domain types (19 model files) |
79 + | `models/` | Domain types |
80 80 | `repository/` | Repository traits, one module per area |
81 81 | `urgency.rs` | TaskWarrior-inspired urgency calculation algorithm |
82 82 | `parser.rs`, `search_parser.rs`, `date_parser.rs` | Quick-add, search and date parsing |
@@ -129,13 +129,11 @@
129 129
130 130 ## Database Layer (`crates/db-sqlite/`)
131 131
132 - SQLite persistence, single-user and local. 69 migrations in `migrations/sqlite/`.
132 + SQLite persistence, single-user and local. Migrations in `migrations/sqlite/`.
133 133
134 134 `rusqlite` behind an `r2d2` pool. **The repositories are synchronous**: an async
135 - caller reaches them through `tokio::task::spawn_blocking`. The tree moved off
136 - sqlx-sqlite on 2026-08-07 and the repository traits went sync in the same pass,
137 - because the async had come from sqlx rather than from anything the app wanted.
138 - Wiki: `sql-library-standard`.
135 + caller reaches them through `tokio::task::spawn_blocking`. Wiki:
136 + `sql-library-standard`.
139 137
140 138 ```
141 139 src/
@@ -204,25 +202,16 @@
204 202 }
205 203 ```
206 204
207 - **Commands have two callers now, and only one of them is IPC.** A described
208 - screen calls the command as a plain Rust function (67 sites), which is why the
209 - command layer survived the swap intact rather than being absorbed into the
210 - screens. The 261 registered commands are still reachable over IPC, which is what
211 - the mobile entry point and the handful of host jobs in `frontend/js/host.js` use.
205 + **Commands have two callers, and only one of them is IPC.** A described screen
206 + calls the command as a plain Rust function. The registered commands are also
207 + reachable over IPC, which is what the mobile entry point and the host jobs in
208 + `frontend/js/host.js` use.
212 209
213 210 ## The Frontend: described screens
214 211
215 212 There is no hand-written frontend. The window opens on `quasi://localhost/tasks`
216 - and there is no other document. `index.html` and the 84 scripts under
217 - `frontend/js/` were deleted on 2026-08-22.
218 -
219 - ### What it was for
220 -
221 - Not porting screens for its own sake. `escape.js` and its 332 `esc()` call sites
222 - existed because screens were built by concatenating strings in JavaScript, and
223 - every one of them had to remember to escape. Escaping is typed in Rust at the
224 - renderer now, so the escapers and the CHRONIC-XSS gate that policed them are both
225 - gone, in that order and not the other one.
213 + and there is no other document. Escaping is typed in Rust at the renderer, so no
214 + call site can forget it.
226 215
227 216 ### The shape
228 217
@@ -245,10 +234,9 @@
245 234 ```
246 235
247 236 A screen module reads `AppState` repositories directly, or calls a command as a
248 - plain function, and returns a description. Each module also carries its own
249 - findings about what a real screen needed that the description layer could not
250 - say, because a finding that lives only in a commit message is a finding nobody
251 - acts on.
237 + plain function, and returns a description. Record in the module itself anything a
238 + screen needed that the description layer could not say; a finding that lives only
239 + in a commit message is a finding nobody acts on.
252 240
253 241 ### The five surviving scripts
254 242
@@ -267,9 +255,8 @@
267 255
268 256 ### Pre-computed response fields
269 257
270 - Response types still carry pre-computed display values, so nothing downstream
271 - calculates dates, formatting or derived state. The consumer changed from a JS
272 - render function to a description, and the reason did not.
258 + Response types carry pre-computed display values, so nothing downstream
259 + calculates dates, formatting or derived state.
273 260
274 261 | Response Type | Pre-computed Fields |
275 262 |--------------|---------------------|
@@ -278,18 +265,15 @@
278 265 | EmailResponse | `receivedFormatted` |
279 266 | EmailAccountResponse | `lastSyncFormatted` |
280 267
281 - ### What the swap left behind
268 + ### Not yet described
282 269
283 - Six features went out with `index.html` and come back as each is described. Max
284 - ruled (b) on goingson `da48cb6d`: no build ships until the flip is finished, so
285 - the interval where they are missing is an interval nobody is in. Compose,
286 - Settings > Sync and Settings > About are back. Settings > Sharing, Create Backup,
287 - the search box and the blocking graph are not, and the last two are refused
270 + No build ships until every screen is described. Settings > Sharing and Create
271 + Backup are still to come. The search box and the blocking graph are refused
288 272 rather than pending: they are things a host draws, not things a description says.
289 273
290 - `check_vocabulary_use` is a real hole rather than an obsolete check. It asked
291 - which generated classes no markup emits, and the markup is `quasi-webview`'s
292 - emitter now, in another crate. goingson `43a682b0`.
274 + `check_vocabulary_use` is an open hole: it asked which generated classes no
275 + markup emits, and the markup is `quasi-webview`'s emitter, in another crate.
276 + goingson `43a682b0`.
293 277
294 278 For the stylesheets and what may be written by hand, see `design-system.md`.
295 279
@@ -58,7 +58,7 @@
58 58 Depth, fill, edge, focus ring and disabled colour are not here. They come from
59 59 `layout.css`, and a rule that restates one is a bug.
60 60
61 - Seventeen classes are styled today: `.badge`, `.button`, `.card`, `.chrome-nav`,
61 + The styled classes: `.badge`, `.button`, `.card`, `.chrome-nav`,
62 62 `.chrome-panel`, `.chrome-place`, `.field`, `.form-checkbox-label`,
63 63 `.form-error`, `.form-group`, `.form-hint`, `.form-label`, `.progress`,
64 64 `.progress-fill`, `.tab`, `.table-heading`, `.toast`. Every one of them is the
@@ -92,13 +92,11 @@
92 92 - the intent check refuses a rule that reads a `--token` the fallback block does
93 93 not declare, since the declaration would be invalid until a theme lands.
94 94
95 - `check_vocabulary_use` is not among them. It went with the swap and nothing
96 - replaces it: goingson `43a682b0`.
95 + `check_vocabulary_use` is not among them. The gap is open: goingson `43a682b0`.
97 96
98 97 `scripts/lint-frontend.sh` holds the three rules that police a stylesheet rather
99 98 than a script: `no-var-fallback-hex`, `no-deprecated-empty-states`,
100 - `described-members-in-flow`. Its header records the seven rules the swap
101 - retired and why each one stopped having anything to read.
99 + `described-members-in-flow`.
102 100
103 101 ## Two standing rules
104 102
@@ -9,15 +9,9 @@
9 9 Mac OS 8 Platinum, informed rather than copied. Two-tone bevels, square corners,
10 10 a neutral ramp, instant state changes, native window chrome.
11 11
12 - It grew out of the neobrutalist system it replaces, which is why the token shapes
13 - carry over intact: the same border width, the same radius scale, the same offset
14 - shadow. What changed is what they resolve to. A raised object is now read by its
15 - bevel rather than by a heavy black edge and a 4px drop, and only a floating
16 - surface casts a shadow.
17 -
18 - - Depth is a fill and an edge together. Naming them apart is what let them
19 - disagree, so `makeover-layout` states them as one thing and this app states
20 - neither.
12 + - Depth is a fill and an edge together. `makeover-layout` states them as one
13 + thing and this app states neither. A raised object is read by its bevel; only
14 + a floating surface casts a shadow.
21 15 - State changes are instant. There is no transition token in this app.
22 16 - A card answers a click. If a thing does not answer a click it is a panel.
23 17
@@ -97,7 +91,7 @@
97 91 | `--font-size-3xl` | 1.5rem | page titles |
98 92 | `--font-size-4xl` | 1.75rem | main headings |
99 93
100 - `--line-height-normal` is 1.5 and is the only line-height token left.
94 + `--line-height-normal` is 1.5 and is the only line-height token.
101 95
102 96 ## Spacing
103 97
@@ -36,7 +36,7 @@
36 36 makeover-geometry = "0.7"
37 37 # Only to write its selection and clock scripts into the frontend. Those two are
38 38 # the whole of `frontend/js/` since the swap.
39 - quasi-webview = { git = "https://makenot.work/git/max/quasi.git", version = "0.92" }
39 + quasi-webview = { git = "https://makenot.work/git/max/quasi.git", version = "0.93" }
40 40
41 41 [dependencies]
42 42 goingson-core = { workspace = true }
@@ -54,10 +54,10 @@
54 54 # dependency's source even with the feature off -- so a public clone could not
55 55 # build at all against a URL it could not reach. quasi went public that day and
56 56 # the URL moved here with it.
57 - quasi-router = { git = "https://makenot.work/git/max/quasi.git", version = "0.92" }
58 - quasi-http = { git = "https://makenot.work/git/max/quasi.git", version = "0.92" }
59 - quasi-webview = { git = "https://makenot.work/git/max/quasi.git", version = "0.92" }
60 - quasi-tauri = { git = "https://makenot.work/git/max/quasi.git", version = "0.92" }
57 + quasi-router = { git = "https://makenot.work/git/max/quasi.git", version = "0.93" }
58 + quasi-http = { git = "https://makenot.work/git/max/quasi.git", version = "0.93" }
59 + quasi-webview = { git = "https://makenot.work/git/max/quasi.git", version = "0.93" }
60 + quasi-tauri = { git = "https://makenot.work/git/max/quasi.git", version = "0.93" }
61 61
62 62 # The notification declaration, and it is NOT behind the `quasi` feature: the
63 63 # watcher is desktop app behaviour rather than a described screen, and the
@@ -69,7 +69,7 @@
69 69 # so an app wanting eight lines over `tauri-plugin-notification` had to link the
70 70 # whole description stack for them. quasicoherent `c231ff13` moved it here,
71 71 # where the `Deliver` trait it implements already lives.
72 - quasi-notifs = { git = "https://makenot.work/git/max/quasi.git", version = "0.92", features = ["synckit", "describe", "tauri"] }
72 + quasi-notifs = { git = "https://makenot.work/git/max/quasi.git", version = "0.93", features = ["synckit", "describe", "tauri"] }
73 73
74 74 # Tauri
75 75 tauri = { workspace = true, features = ["image-png", "devtools"] }