jm log
100 commits, newest first
- 2026-09-28b824de3examples/material-kitchen: show every ui/material component by state
- 2026-09-28412ce06ui/material: add Material 3 Expressive on jm:ui
- 2026-09-288070edbtools/material-shapes: generate the loading indicator's morphs as Odin
- 2026-09-28eca7532tools/material-tokens: generate M3 Expressive tokens as Odin
- 2026-09-28fea7b4fui: give pointer events their travel since the last one
- 2026-09-289cd2e39ui: let scroll_box lay content out wider than itself and scroll sideways
- 2026-09-28504dc06ui: add Spring, and four spring slots per widget
- 2026-09-2817b7e82ui: bump the ops wire version for Defer, and say why a child stops
- 2026-09-28336b388ui: add Defer and overlay, a layer drawn above the frame
- 2026-09-281db3bc0ui: export the helpers a widget package outside ui needs
- 2026-09-28be5ac80ui: add scroll_box, a box paint hook, and negative padding
- 2026-09-28c72fd60tools/hot-watch: link Blend2D children on unix, watch extra dirs
- 2026-09-288998e5fui/sdl: stop the hot-reload host crashing and killing its own group
- 2026-09-2745e85a2ui: port Material 3's button family onto jm:ui
- 2026-09-27777c339ui: three ways to make jm:ui cheaper for an agent to iterate on
- 2026-09-27c3c94e0ui: hot reload for real — respawn on rebuild, and a live demo
- 2026-09-2726965b6selfupdate: write byte caps with core:mem units
- 2026-09-2773f6fe4selfupdate: add the fixed-capacity writer the rewrite relies on
- 2026-09-272672fa5selfupdate: allocate nothing from the caller's context
- 2026-09-270c2106chttp: stream every transfer to an io.Writer
- 2026-09-275590bb9ui: split the host from the ui proc — the subprocess hot-reload split
- 2026-09-27d3da895selfupdate: take any base path, not a GitHub repository
- 2026-09-2760c7700selfupdate: update a distributed binary from a signed release
- 2026-09-2741f3a74ui: promote diagram kit, Tween and a shared test helper out of the example
- 2026-09-27f289589ui: harden custom-widget primitives against another dogfood pass
- 2026-09-27abab36fui/sdl: leave window moves alone and grow buffers once per resize
- 2026-09-270683636ui/render: hash a tile a solid fill covers by the fill's color
- 2026-09-278bea357ui/render: scroll only content whose whole clip chain is rects
- 2026-09-27a9a7b53ui/sdl: hold each resize frame until the compositor shows it
- 2026-09-2741fa5caui/render: repaint only what changed when a target is resized in place
- 2026-09-272cbbc20ui/sdl: turn vsync off while a resize is in progress
- 2026-09-27c13ba5bui/sdl: keep drawing while the window is being resized
- 2026-09-27059eb50ui: ask for one more frame after handling input
- 2026-09-27ddb5eb0ui/render/fuzz: fuzz the compositor against whole renders
- 2026-09-27010cf69ui/render: run the scroll sequence test on a fixed sequence
- 2026-09-27b250da2ui/render: let unmoved content vote in scroll detection
- 2026-09-27c61c8feui/render: never hand the crew overlapping rects
- 2026-09-273e1b6eeui/render: bound a draw by the pixels its clip can reach
- 2026-09-2760b22abui/render: hash which run a masked draw is in, per tile
- 2026-09-275d34fd0ui/render: group a band's draws the way the whole frame groups them
- 2026-09-27c2770eeui/render: say a crew's allocator must be thread-safe
- 2026-09-26794c3b4ui/sdl: wait for input or a requested frame instead of every refresh
- 2026-09-2621b8acaexamples/ui-kitchen: ask for frames only while the badge turns
- 2026-09-26e050a89ui: let the ui ask the host for its next frame
- 2026-09-26211b66bui/sdl: move scrolled pixels on the GPU instead of uploading them
- 2026-09-267efa786ui/render: cut thin bands so the crew shares a scroll's strip
- 2026-09-267a81537ui/render: hand out per-draw work in chunks of 256 draws
- 2026-09-268bfadf2ui/render: share scroll detection's per-draw work with the crew
- 2026-09-26cda90a7ui/render: move a large scroll's pixels on the whole crew
- 2026-09-2624c3a06ui/render: draw a clip's interior without its mask
- 2026-09-2680c8129tools/ui-bench: add -compose to time partial repaints
- 2026-09-26db36b48ui/sdl: compose frames and upload only changed rects
- 2026-09-268da7fbfui/render: repaint damaged bands on a worker crew
- 2026-09-269b01bddui/render: track which tiles a frame changed
- 2026-09-260d719eaui/render: paint runs of draws sharing a clip through one mask
- 2026-09-26cb900fbtools/ui-bench: add -sweep to find how much content fits a frame
- 2026-09-26d267979ui/sdl: free the temp allocator every frame
- 2026-09-26f324a4cui/sdl: render on Blend2D workers when App.threads is set
- 2026-09-2640b052bui/sdl: render into a CPU-side image, not the locked texture
- 2026-09-26ab46d42build: build Blend2D and the kitchen demo on Windows
- 2026-09-2689217a8sh: make the spooled stdin inheritable on Windows
- 2026-09-25cbc7d99ui: (wip) benchmark multithreaded rendering
- 2026-09-254c60e63tools/ui-bench: time layout and the Blend2D executor per frame
- 2026-09-25de38a3epq: document the dynamic link and how tests find a server
- 2026-09-250024b52examples: add the jm:ui kitchen demo and the recipes that build it
- 2026-09-251c2690cpq: fuzz the bindings against the properties they promise
- 2026-09-2522eeeeeui: lay out with constraints down and dims up, style from a theme, add the widgets
- 2026-09-25becf5a8pq: bind the system libpq
- 2026-09-25f4cade2ui: give the probe a layout of its own
- 2026-09-254b04695ui/render, ui/sdl: execute a frame on Blend2D and open an SDL3 window
- 2026-09-25c3ac74bui: route input against the previous frame and drive frames headlessly
- 2026-09-25e263896ui: flatten scene ops into a frame, dump them as text, encode them for the wire
- 2026-09-251b7325cui: add the raw device event and the layout hook to the contract
- 2026-09-25453d966ui: lay down the immediate-mode contract and vendor the Blend2D binding
- 2026-09-259f5a494pg_query: document the parser and what fuzzing it found
- 2026-09-25b6d4df0pg_query: fuzz the bindings against the properties they promise
- 2026-09-2572e80d3pg_query: bind libpg_query over the vendored parser
- 2026-09-25cfd3481wasm: time the bindings, and the engines they could have been
- 2026-09-253461166wasm: fuzz the bindings against the properties they promise
- 2026-09-25048659bwasm: bind wasm3 over the vendored interpreter
- 2026-09-2581e911bfuzz: run each case in a child process when asked
- 2026-09-25541387atar: compare the size field by subtraction, not by adding to it
- 2026-09-24c18f14ffuzz: move the sqlite3 suite onto jm:fuzz and add a tar one
- 2026-09-2412b3453fuzz: add a property fuzzer that shrinks what it finds
- 2026-09-24d2f70a1tar: refuse a size field and a pax record that slice backwards
- 2026-09-2459ff9c1sqlite3: fuzz the bindings against the properties they promise
- 2026-09-24924a2d9sqlite3: bind SQLite over the vendored amalgamation
- 2026-09-24190a339sqlite3: vendor the SQLite 3.53.4 amalgamation
- 2026-09-2472ed703jm: rename the collection from jfm to jm
- 2026-09-23f4d4f24examples: add a script that touches every package
- 2026-09-238daab04odin-run: compile a script once and run the cached binary after that
- 2026-09-23710fb57tar: read git archive output without a tar program
- 2026-09-2308b3ecbflow: add the worker-pool package from sonar
- 2026-09-2384ba231http: add a small client over vendor:curl
- 2026-09-233636dc0timefmt: format and parse times with strftime directives
- 2026-09-239e2ca18path: add the file-system vocabulary a script reaches for
- 2026-09-2312abde4sh: run external commands through the shell or by argv
- 2026-09-232300ca1prelude: give scripts init, must, die and a log file
- 2026-09-235a3b383debug: add the guard-byte allocator copied from sonar
- 2026-09-2395faf8ereadme, justfile: shape the jfm collection for Odin scripts