Feed of "Daniel Flanagan"https://git.lyte.dev/lytedev2026-08-13T01:01:26-05:00lytedev pushed to pinephone-niri at lytedev/nix2026-08-12T23:04:59-05:0015392: https://git.lyte.dev/lytedev/nix/commit/cda3e22f49b55f3bdbddae0e8769cf2e63272f4a<a href="https://git.lyte.dev/lytedev/nix/commit/cda3e22f49b55f3bdbddae0e8769cf2e63272f4a" rel="nofollow">cda3e22f49b55f3bdbddae0e8769cf2e63272f4a</a>
feat(pinephone): add a Flutter app that opens a window<a href="https://git.lyte.dev/lytedev/nix/commit/cda3e22f49b55f3bdbddae0e8769cf2e63272f4a">cda3e22f49b55f3bdbddae0e8769cf2e63272f4a</a>
feat(pinephone): add a Flutter app that opens a windowlytedev[email protected]lytedev pushed to pinephone-niri at lytedev/nix2026-08-12T22:42:16-05:0015391: https://git.lyte.dev/lytedev/nix/commit/f0cb648c1e09c9cd9702e01a0317ce704963b6a0<a href="https://git.lyte.dev/lytedev/nix/commit/f0cb648c1e09c9cd9702e01a0317ce704963b6a0" rel="nofollow">f0cb648c1e09c9cd9702e01a0317ce704963b6a0</a>
feat(pinephone): one Flutter app, to find out whether Flutter runs here<a href="https://git.lyte.dev/lytedev/nix/commit/f0cb648c1e09c9cd9702e01a0317ce704963b6a0">f0cb648c1e09c9cd9702e01a0317ce704963b6a0</a>
feat(pinephone): one Flutter app, to find out whether Flutter runs herelytedev[email protected]lytedev pushed to pinephone-niri at lytedev/nix2026-08-12T20:29:54-05:0015390: https://git.lyte.dev/lytedev/nix/compare/5ef6b445cc8edf647c3ec9ab2c51189c5c74c14c...cb53d117d82c7998349db320bdced52f36ca668c<a href="https://git.lyte.dev/lytedev/nix/commit/cb53d117d82c7998349db320bdced52f36ca668c" rel="nofollow">cb53d117d82c7998349db320bdced52f36ca668c</a>
feat(pinephone): three Flutter apps, to find out whether Flutter runs here
<a href="https://git.lyte.dev/lytedev/nix/commit/65674a8cc34894d496f162ceccd6b65cac5e2645" rel="nofollow">65674a8cc34894d496f162ceccd6b65cac5e2645</a>
feat(pinephone): every niri transition is instant<a href="https://git.lyte.dev/lytedev/nix/commit/cb53d117d82c7998349db320bdced52f36ca668c">cb53d117d82c7998349db320bdced52f36ca668c</a>
feat(pinephone): three Flutter apps, to find out whether Flutter runs here
<a href="https://git.lyte.dev/lytedev/nix/commit/65674a8cc34894d496f162ceccd6b65cac5e2645">65674a8cc34894d496f162ceccd6b65cac5e2645</a>
feat(pinephone): every niri transition is instantlytedev[email protected]lytedev created pull request lytedev/deck-pose#12026-08-12T16:24:56-05:0015389: https://git.lyte.dev/lytedev/deck-pose/pulls/1<p dir="auto">Edit <code>$XDG_RUNTIME_DIR/deck-pose-tuning.toml</code>, save, and the daemon applies it within half a second — crop, score floor, tracking thresholds and smoothing. A documented template is written on first run.</p>
<p dir="auto">Companion to the same feature in deck-slice (its PR <a href="/lytedev/deck-pose/issues/1" class="ref-issue" rel="nofollow">#1</a>); the two are built alike so there is one idea to learn.</p>
<p dir="auto"><strong>Not reloadable, deliberately:</strong> camera device/resolution/format (needs the capture pipeline reopened), model path and size (needs the session rebuilt), sockets (clients attached). The template says so rather than accepting an edit that does nothing.</p>
<p dir="auto"><strong>Safety:</strong> a file that does not parse leaves running values alone and logs why — it is edited over ssh while a game runs in front of people, and half-saved is its ordinary state. Every reload applies to the daemons STARTUP values, so deleting one line restores that one value rather than leaving the previous experiment in place.</p>
<p dir="auto">Retuning leaves existing tracks alone: ids, appearance signatures and smoothing state survive, so a threshold can be judged against the same people who were standing there a moment ago.</p>
<p dir="auto">7 new unit tests (133 total pass), plus a live daemon exercise: template written, edit applied without restart, deletion returning to defaults.</p>
1#Live-editable tuning, hot-reloaded while the daemon runs#lytedev[email protected]lytedev pushed to live-tuning at lytedev/deck-pose2026-08-12T16:24:41-05:0015388: https://git.lyte.dev/lytedev/deck-pose/commit/2bf36398f58645ce282fabb8a7099168e5634ca1<a href="https://git.lyte.dev/lytedev/deck-pose/commit/2bf36398f58645ce282fabb8a7099168e5634ca1" rel="nofollow">2bf36398f58645ce282fabb8a7099168e5634ca1</a>
feat: live-editable tuning, reloaded while the daemon runs<a href="https://git.lyte.dev/lytedev/deck-pose/commit/2bf36398f58645ce282fabb8a7099168e5634ca1">2bf36398f58645ce282fabb8a7099168e5634ca1</a>
feat: live-editable tuning, reloaded while the daemon runslytedev[email protected]lytedev created branch live-tuning in lytedev/deck-pose2026-08-12T16:24:41-05:0015387: https://git.lyte.dev/lytedev/deck-pose/src/branch/live-tuninglytedev[email protected]lytedev deleted branch propose/hearth-credential-doc from lytedev/nix2026-08-12T16:15:18-05:0015386: https://git.lyte.dev/lytedev/nixlytedev[email protected]lytedev pushed to main at lytedev/nix2026-08-12T16:15:18-05:0015385: https://git.lyte.dev/lytedev/nix/commit/2fcad6e13fb78840589d78100e8ddf70935216cf<a href="https://git.lyte.dev/lytedev/nix/commit/2fcad6e13fb78840589d78100e8ddf70935216cf" rel="nofollow">2fcad6e13fb78840589d78100e8ddf70935216cf</a>
docs(hearth): where hearth's calendar credential should come from<a href="https://git.lyte.dev/lytedev/nix/commit/2fcad6e13fb78840589d78100e8ddf70935216cf">2fcad6e13fb78840589d78100e8ddf70935216cf</a>
docs(hearth): where hearth's calendar credential should come fromlytedev[email protected]lytedev merged pull request lytedev/nix#9872026-08-12T16:15:16-05:0015384: https://git.lyte.dev/lytedev/nix/pulls/987docs(hearth): where hearth's calendar credential should come fromdocs(hearth): where hearth's calendar credential should come fromlytedev[email protected]lytedev pushed to log-calibration-runs at lytedev/deck-slice2026-08-12T16:07:37-05:0015383: https://git.lyte.dev/lytedev/deck-slice/commit/13994f67c8dd1a8f49b3e8d1ce2e96ca7dd339e9<a href="https://git.lyte.dev/lytedev/deck-slice/commit/13994f67c8dd1a8f49b3e8d1ce2e96ca7dd339e9" rel="nofollow">13994f67c8dd1a8f49b3e8d1ce2e96ca7dd339e9</a>
feat: the tuning file explains each value instead of listing numbers<a href="https://git.lyte.dev/lytedev/deck-slice/commit/13994f67c8dd1a8f49b3e8d1ce2e96ca7dd339e9">13994f67c8dd1a8f49b3e8d1ce2e96ca7dd339e9</a>
feat: the tuning file explains each value instead of listing numberslytedev[email protected]lytedev created pull request lytedev/nix#9872026-08-12T16:00:21-05:0015382: https://git.lyte.dev/lytedev/nix/pulls/987<p dir="auto">Hearth still reads the household calendar from Google; moving it to Stalwart is blocked on a credential, and every obvious candidate is the wrong one. This records why.</p>
<p dir="auto">Written to the repo because the original lived in <code>/tmp</code> and was <strong>lost to a reboot</strong> before anyone acted on it.</p>
<p dir="auto">Corrected on the way in: the family calendar moved to a Stalwart <em>group</em> collection on 2026-08-12, so the URL the original recommended now 403s — a failure that presents as a credential problem and isn't one.</p>
987#docs(hearth): where hearth's calendar credential should come from#lytedev[email protected]lytedev pushed to propose/hearth-credential-doc at lytedev/nix2026-08-12T15:59:49-05:0015381: https://git.lyte.dev/lytedev/nix/commit/2fcad6e13fb78840589d78100e8ddf70935216cf<a href="https://git.lyte.dev/lytedev/nix/commit/2fcad6e13fb78840589d78100e8ddf70935216cf" rel="nofollow">2fcad6e13fb78840589d78100e8ddf70935216cf</a>
docs(hearth): where hearth's calendar credential should come from<a href="https://git.lyte.dev/lytedev/nix/commit/2fcad6e13fb78840589d78100e8ddf70935216cf">2fcad6e13fb78840589d78100e8ddf70935216cf</a>
docs(hearth): where hearth's calendar credential should come fromlytedev[email protected]lytedev created branch propose/hearth-credential-doc in lytedev/nix2026-08-12T15:59:49-05:0015380: https://git.lyte.dev/lytedev/nix/src/branch/propose/hearth-credential-doclytedev[email protected]lytedev deleted branch propose/socket-is-the-assistant from lytedev/nix2026-08-12T15:23:54-05:0015379: https://git.lyte.dev/lytedev/nixlytedev[email protected]lytedev pushed to main at lytedev/nix2026-08-12T15:23:54-05:0015378: https://git.lyte.dev/lytedev/nix/commit/a2f32c97df91a8f80c35ab525624c70d6662d035<a href="https://git.lyte.dev/lytedev/nix/commit/a2f32c97df91a8f80c35ab525624c70d6662d035" rel="nofollow">a2f32c97df91a8f80c35ab525624c70d6662d035</a>
docs(assistant): the socket IS the assistant, not an unknown caller<a href="https://git.lyte.dev/lytedev/nix/commit/a2f32c97df91a8f80c35ab525624c70d6662d035">a2f32c97df91a8f80c35ab525624c70d6662d035</a>
docs(assistant): the socket IS the assistant, not an unknown callerlytedev[email protected]lytedev merged pull request lytedev/nix#9862026-08-12T15:23:53-05:0015377: https://git.lyte.dev/lytedev/nix/pulls/986docs(assistant): the socket IS the assistant, not an unknown callerdocs(assistant): the socket IS the assistant, not an unknown callerlytedev[email protected]lytedev pushed to log-calibration-runs at lytedev/deck-slice2026-08-12T15:22:53-05:0015376: https://git.lyte.dev/lytedev/deck-slice/commit/172878659627e5eeb53cde9e4ed6bc67387a61af<a href="https://git.lyte.dev/lytedev/deck-slice/commit/172878659627e5eeb53cde9e4ed6bc67387a61af" rel="nofollow">172878659627e5eeb53cde9e4ed6bc67387a61af</a>
feat: live-editable tuning, reloaded while the game runs<a href="https://git.lyte.dev/lytedev/deck-slice/commit/172878659627e5eeb53cde9e4ed6bc67387a61af">172878659627e5eeb53cde9e4ed6bc67387a61af</a>
feat: live-editable tuning, reloaded while the game runslytedev[email protected]lytedev created pull request lytedev/nix#9862026-08-12T15:22:35-05:0015375: https://git.lyte.dev/lytedev/nix/pulls/986<p dir="auto">Same behaviour, corrected reasoning — a follow-up to <a href="/lytedev/nix/issues/984" class="ref-issue" rel="nofollow">#984</a>.</p>
<p dir="auto">That PR justified the approval gate by an <em>inability</em> ("the socket cannot authenticate its caller"). True, but it invites someone later to remove the gate by adding caller identification. The rule is stronger: the socket is the agent's interface, so a caller on it <strong>is</strong> the assistant, and the assistant holds no privileged authority — which stays true no matter what the transport learns to prove.</p>
<p dir="auto">Also states that approval must come from a <strong>known admin</strong>, and why, and fixes a doc comment <a href="/lytedev/nix/issues/984" class="ref-issue" rel="nofollow">#984</a> misplaced (<code>perform_approved</code>'s explanation had been left attached to <code>ask_approval</code>).</p>
986#docs(assistant): the socket IS the assistant, not an unknown caller#lytedev[email protected]lytedev pushed to propose/socket-is-the-assistant at lytedev/nix2026-08-12T15:22:14-05:0015374: https://git.lyte.dev/lytedev/nix/commit/d1d25f586835654bbf1483a045db006df736f86c<a href="https://git.lyte.dev/lytedev/nix/commit/d1d25f586835654bbf1483a045db006df736f86c" rel="nofollow">d1d25f586835654bbf1483a045db006df736f86c</a>
docs(assistant): the socket IS the assistant, not an unknown caller<a href="https://git.lyte.dev/lytedev/nix/commit/d1d25f586835654bbf1483a045db006df736f86c">d1d25f586835654bbf1483a045db006df736f86c</a>
docs(assistant): the socket IS the assistant, not an unknown callerlytedev[email protected]lytedev created branch propose/socket-is-the-assistant in lytedev/nix2026-08-12T15:22:13-05:0015373: https://git.lyte.dev/lytedev/nix/src/branch/propose/socket-is-the-assistantlytedev[email protected]lytedev deleted branch iamb-drift from lytedev/nix2026-08-12T15:21:59-05:0015372: https://git.lyte.dev/lytedev/nixlytedev[email protected]lytedev pushed to main at lytedev/nix2026-08-12T15:21:58-05:0015371: https://git.lyte.dev/lytedev/nix/commit/8e587616dff17dcd91321cd0770100a25709a435<a href="https://git.lyte.dev/lytedev/nix/commit/8e587616dff17dcd91321cd0770100a25709a435" rel="nofollow">8e587616dff17dcd91321cd0770100a25709a435</a>
fix(iamb): stop the scrollback walking up the pane<a href="https://git.lyte.dev/lytedev/nix/commit/8e587616dff17dcd91321cd0770100a25709a435">8e587616dff17dcd91321cd0770100a25709a435</a>
fix(iamb): stop the scrollback walking up the panelytedev[email protected]lytedev merged pull request lytedev/nix#9852026-08-12T15:21:56-05:0015370: https://git.lyte.dev/lytedev/nix/pulls/985fix(iamb): stop the scrollback walking up the panefix(iamb): stop the scrollback walking up the panelytedev[email protected]lytedev deleted branch propose/cli-bang-parity from lytedev/nix2026-08-12T15:21:29-05:0015369: https://git.lyte.dev/lytedev/nixlytedev[email protected]lytedev pushed to main at lytedev/nix2026-08-12T15:21:29-05:0015368: https://git.lyte.dev/lytedev/nix/commit/542b5d4ecc935b19a4e18463bfd5aae62a2d31d2<a href="https://git.lyte.dev/lytedev/nix/commit/542b5d4ecc935b19a4e18463bfd5aae62a2d31d2" rel="nofollow">542b5d4ecc935b19a4e18463bfd5aae62a2d31d2</a>
feat(assistant): CLI parity with the bang commands<a href="https://git.lyte.dev/lytedev/nix/commit/542b5d4ecc935b19a4e18463bfd5aae62a2d31d2">542b5d4ecc935b19a4e18463bfd5aae62a2d31d2</a>
feat(assistant): CLI parity with the bang commandslytedev[email protected]lytedev merged pull request lytedev/nix#9842026-08-12T15:21:28-05:0015367: https://git.lyte.dev/lytedev/nix/pulls/984feat(assistant): CLI parity with the bang commandsfeat(assistant): CLI parity with the bang commandslytedev[email protected]lytedev created pull request lytedev/nix#9852026-08-12T15:20:08-05:0015366: https://git.lyte.dev/lytedev/nix/pulls/985<p dir="auto">Bumps the iamb pin from <code>df80101</code> to <code>d598ed8</code>.</p>
<p dir="auto">Daniel: "there's a bug somewhere that causes iamb to scroll up a line like once per second unnecessarily, causing this gap".</p>
<p dir="auto">The "earlier messages" hint takes the top row of the pane from the first drawn line. The render set the viewport corner <strong>after</strong> removing that line, so the corner moved down a row on every frame and the pane held one line less each time. A periodic redraw — a typing notice, a receipt — then walked the messages up the pane once a second, leaving a growing gap below them.</p>
<p dir="auto">It only showed after scrolling away from the newest message, because the pane otherwise takes a fresh corner from the cursor on every render and the drift cannot accumulate.</p>
<p dir="auto">The corner now comes from the full set of lines. The hint still covers the top row.</p>
<p dir="auto">The hint arrived in the same batch as this fix, so the fault never reached a release — it was live on Daniel's client for about an hour.</p>
<h2 id="user-content-verified" dir="auto">Verified</h2>
<p dir="auto">267 tests, one new: rendering the same state twice must produce the same corner. That is the invariant the bug violated, and it is checkable without a terminal.</p>
985#fix(iamb): stop the scrollback walking up the pane#lytedev[email protected]lytedev pushed to iamb-drift at lytedev/nix2026-08-12T15:20:04-05:0015365: https://git.lyte.dev/lytedev/nix/commit/d7f261e3a185d6596cf5cbda121e383ea016569e<a href="https://git.lyte.dev/lytedev/nix/commit/d7f261e3a185d6596cf5cbda121e383ea016569e" rel="nofollow">d7f261e3a185d6596cf5cbda121e383ea016569e</a>
fix(iamb): stop the scrollback walking up the pane<a href="https://git.lyte.dev/lytedev/nix/commit/d7f261e3a185d6596cf5cbda121e383ea016569e">d7f261e3a185d6596cf5cbda121e383ea016569e</a>
fix(iamb): stop the scrollback walking up the panelytedev[email protected]lytedev created branch iamb-drift in lytedev/nix2026-08-12T15:20:04-05:0015364: https://git.lyte.dev/lytedev/nix/src/branch/iamb-driftlytedev[email protected]lytedev pushed to log-calibration-runs at lytedev/deck-slice2026-08-12T15:15:30-05:0015363: https://git.lyte.dev/lytedev/deck-slice/commit/4ee8a806294f4b95c36e23556fc704b53de19fa2<a href="https://git.lyte.dev/lytedev/deck-slice/commit/4ee8a806294f4b95c36e23556fc704b53de19fa2" rel="nofollow">4ee8a806294f4b95c36e23556fc704b53de19fa2</a>
fix: end a corner when the reach stops improving, not when the hand pauses<a href="https://git.lyte.dev/lytedev/deck-slice/commit/4ee8a806294f4b95c36e23556fc704b53de19fa2">4ee8a806294f4b95c36e23556fc704b53de19fa2</a>
fix: end a corner when the reach stops improving, not when the hand pauseslytedev[email protected]