Feed of "Daniel Flanagan" https://git.lyte.dev/lytedev Sat, 20 Jun 2026 01:33:21 -0500 lytedev created pull request lytedev/nix#589 https://git.lyte.dev/lytedev/nix/pulls/589 589#feat(stalwart): codify account aliases + domain catch-all# <![CDATA[

Mail to [email protected] / [email protected] (and any unlisted lyte.dev address) was being rejected 550 mailbox does not exist — e.g. a Spotify mail to oliver@ bounced. There was no alias or catch-all for them, and the module doesn't manage accounts (user data), so this was config drift waiting to happen.

What this adds (declarative, ensured on every stalwart-apply)

  • accountAliases — extra aliases ensured on an account's aliases (a list<EmailAlias>). Configured: daniel gets dax@/oliver@.
  • catchAllAddress — sets Domain.catchAllAddress so any otherwise-unmatched lyte.dev address is delivered to daniel. Subsumes the explicit aliases; the tradeoff is accepting spam to bogus addresses (spam filter still routes most to Junk).

Both run in stalwart-apply with admin creds, are idempotent, and survive a DB rebuild (the whole point — like the trusted-domain rule that silently vanished before).

0.16 management-API format notes (the fiddly part)

  • An account's aliases are list<EmailAlias> where EmailAlias = {enabled, name, domainId, description?}; name is the local part (+ domainId forms the address).
  • The patch encodes the list as an index-keyed map ({"0":{…},"1":{…}}), not a JSON array.
  • An empty name is rejected, so the catch-all is NOT an empty-name alias — it's the separate Domain.catchAllAddress field.

Verified live (SMTP RCPT against the MX, no actual delivery)

RCPT TO Before After
made-up @lyte.dev 550 mailbox does not exist 250 OK ✓ (catch-all)
[email protected] 550 250 OK ✓ (alias)

🤖 Generated with Claude Code

]]>
lytedev 10490: https://git.lyte.dev/lytedev/nix/pulls/589 Thu, 18 Jun 2026 23:33:19 -0500
lytedev pushed to stalwart-account-aliases at lytedev/nix https://git.lyte.dev/lytedev/nix/commit/3a8eac5a4405e864d04f971407621c0add2400f1 <a href="https://git.lyte.dev/lytedev/nix/commit/3a8eac5a4405e864d04f971407621c0add2400f1">3a8eac5a4405e864d04f971407621c0add2400f1</a> feat(stalwart): codify account aliases + domain catch-all <![CDATA[3a8eac5a4405e864d04f971407621c0add2400f1 feat(stalwart): codify account aliases + domain catch-all]]> lytedev 10489: https://git.lyte.dev/lytedev/nix/commit/3a8eac5a4405e864d04f971407621c0add2400f1 Thu, 18 Jun 2026 23:32:57 -0500 lytedev created branch stalwart-account-aliases in lytedev/nix https://git.lyte.dev/lytedev/nix/src/branch/stalwart-account-aliases lytedev 10488: https://git.lyte.dev/lytedev/nix/src/branch/stalwart-account-aliases Thu, 18 Jun 2026 23:32:57 -0500 lytedev deleted branch sunshine-cve-bump from lytedev/nix https://git.lyte.dev/lytedev/nix lytedev 10487: https://git.lyte.dev/lytedev/nix Thu, 18 Jun 2026 19:01:51 -0500 lytedev pushed to main at lytedev/nix https://git.lyte.dev/lytedev/nix/commit/ee502a592e884f598c769ff9582da0b10609c4af <a href="https://git.lyte.dev/lytedev/nix/commit/ee502a592e884f598c769ff9582da0b10609c4af">ee502a592e884f598c769ff9582da0b10609c4af</a> fix(sunshine): vendor nixpkgs PR #521906 bump to 2026.516 (critical CVE-2026-32253) <![CDATA[ee502a592e884f598c769ff9582da0b10609c4af fix(sunshine): vendor nixpkgs PR #521906 bump to 2026.516 (critical CVE-2026-32253)]]> lytedev 10486: https://git.lyte.dev/lytedev/nix/commit/ee502a592e884f598c769ff9582da0b10609c4af Thu, 18 Jun 2026 19:01:51 -0500 lytedev merged pull request lytedev/nix#582 https://git.lyte.dev/lytedev/nix/pulls/582 fix(sunshine): vendor nixpkgs PR #521906 bump to 2026.516 (critical CVE-2026-32253) <![CDATA[fix(sunshine): vendor nixpkgs PR #521906 bump to 2026.516 (critical CVE-2026-32253)]]> lytedev 10485: https://git.lyte.dev/lytedev/nix/pulls/582 Thu, 18 Jun 2026 19:01:50 -0500 lytedev deleted branch beefcake-lan-lockdown from lytedev/nix https://git.lyte.dev/lytedev/nix lytedev 10484: https://git.lyte.dev/lytedev/nix Thu, 18 Jun 2026 19:00:48 -0500 lytedev pushed to main at lytedev/nix https://git.lyte.dev/lytedev/nix/compare/94201408ebbbfac743d773c109ae56a6a682cd72...fcf9d47d545723b15fc2584b527652a9b29435d5 <a href="https://git.lyte.dev/lytedev/nix/commit/fcf9d47d545723b15fc2584b527652a9b29435d5">fcf9d47d545723b15fc2584b527652a9b29435d5</a> feat(beefcake): default-deny LAN -&gt; beefcake (supersede narrow denylist) <a href="https://git.lyte.dev/lytedev/nix/commit/dea70b269a834f02073f56ace64ff70235b23799">dea70b269a834f02073f56ace64ff70235b23799</a> feat(beefcake): lock sensitive LAN services to the dragon bastion <![CDATA[fcf9d47d545723b15fc2584b527652a9b29435d5 feat(beefcake): default-deny LAN -> beefcake (supersede narrow denylist) dea70b269a834f02073f56ace64ff70235b23799 feat(beefcake): lock sensitive LAN services to the dragon bastion]]> lytedev 10483: https://git.lyte.dev/lytedev/nix/compare/94201408ebbbfac743d773c109ae56a6a682cd72...fcf9d47d545723b15fc2584b527652a9b29435d5 Thu, 18 Jun 2026 19:00:48 -0500 lytedev merged pull request lytedev/nix#588 https://git.lyte.dev/lytedev/nix/pulls/588 feat(beefcake): lock sensitive LAN services to the dragon bastion <![CDATA[feat(beefcake): lock sensitive LAN services to the dragon bastion]]> lytedev 10482: https://git.lyte.dev/lytedev/nix/pulls/588 Thu, 18 Jun 2026 19:00:46 -0500 lytedev commented on pull request lytedev/nix#588 https://git.lyte.dev/lytedev/nix/pulls/588#issuecomment-3797 feat(beefcake): lock sensitive LAN services to the dragon bastion <p dir="auto">Reworked from the initial narrow denylist (Samba/arr/k3s) to <strong>default-deny</strong>: non-dragon LAN clients can only reach an explicit allowlist (router-forwarded public ports + UniFi/mDNS); everything else — Samba, MQTT, and any future service — is dropped. Future-proofs against new services being silently LAN-exposed.</p> <p dir="auto">Verified live on beefcake from a non-dragon LAN source:</p> <ul dir="auto"> <li>Samba 445 → BLOCKED ✓ · MQTT 1883 → BLOCKED ✓ · WSD 5357 → BLOCKED ✓</li> <li>HTTPS 443 → open ✓ · SSH 22 → open ✓ (both internet-forwarded anyway)</li> <li>dragon .0.10 → Samba/MQTT open ✓ (full access)</li> </ul> <p dir="auto">IPv4 only (dragon&#39;s v6 is SLAAC; guest VLAN closes v6 at L2). SSH stays open because it&#39;s WAN-forwarded — say the word if you also want it locked to dragon/tailnet (would mean dropping the router&#39;s :22 forward too).</p> <![CDATA[feat(beefcake): lock sensitive LAN services to the dragon bastion

Reworked from the initial narrow denylist (Samba/arr/k3s) to default-deny: non-dragon LAN clients can only reach an explicit allowlist (router-forwarded public ports + UniFi/mDNS); everything else — Samba, MQTT, and any future service — is dropped. Future-proofs against new services being silently LAN-exposed.

Verified live on beefcake from a non-dragon LAN source:

  • Samba 445 → BLOCKED ✓ · MQTT 1883 → BLOCKED ✓ · WSD 5357 → BLOCKED ✓
  • HTTPS 443 → open ✓ · SSH 22 → open ✓ (both internet-forwarded anyway)
  • dragon .0.10 → Samba/MQTT open ✓ (full access)

IPv4 only (dragon's v6 is SLAAC; guest VLAN closes v6 at L2). SSH stays open because it's WAN-forwarded — say the word if you also want it locked to dragon/tailnet (would mean dropping the router's :22 forward too).

]]>
lytedev 10481: https://git.lyte.dev/lytedev/nix/pulls/588#issuecomment-3797 Thu, 18 Jun 2026 18:54:31 -0500
lytedev pushed to beefcake-lan-lockdown at lytedev/nix https://git.lyte.dev/lytedev/nix/commit/fcf9d47d545723b15fc2584b527652a9b29435d5 <a href="https://git.lyte.dev/lytedev/nix/commit/fcf9d47d545723b15fc2584b527652a9b29435d5">fcf9d47d545723b15fc2584b527652a9b29435d5</a> feat(beefcake): default-deny LAN -&gt; beefcake (supersede narrow denylist) <![CDATA[fcf9d47d545723b15fc2584b527652a9b29435d5 feat(beefcake): default-deny LAN -> beefcake (supersede narrow denylist)]]> lytedev 10480: https://git.lyte.dev/lytedev/nix/commit/fcf9d47d545723b15fc2584b527652a9b29435d5 Thu, 18 Jun 2026 18:54:14 -0500 lytedev pushed to sunshine-cve-bump at lytedev/nix https://git.lyte.dev/lytedev/nix/compare/882e79acf5cc09132976a3f81ee1f398f569645f...58ee2d5949a8c237dcd13dab1c19f0dbbecd3fc5 <a href="https://git.lyte.dev/lytedev/nix/commit/58ee2d5949a8c237dcd13dab1c19f0dbbecd3fc5">58ee2d5949a8c237dcd13dab1c19f0dbbecd3fc5</a> fix(sunshine): vendor nixpkgs PR #521906 bump to 2026.516 (critical CVE-2026-32253) <a href="https://git.lyte.dev/lytedev/nix/commit/94201408ebbbfac743d773c109ae56a6a682cd72">94201408ebbbfac743d773c109ae56a6a682cd72</a> chore(beefcake): broker-only — disable meshtasticd/mmrelay until real secrets <a href="https://git.lyte.dev/lytedev/nix/commit/08df9a6a93857070773be1039fda5550a6131a04">08df9a6a93857070773be1039fda5550a6131a04</a> feat(router): isolated, internet-only guest VLAN (hardened) <a href="https://git.lyte.dev/lytedev/nix/commit/bcaf3a2d52443f581cac5a0336ea5d394cb4827b">bcaf3a2d52443f581cac5a0336ea5d394cb4827b</a> feat(beefcake): mmrelay container — Meshtastic↔Matrix bridge <a href="https://git.lyte.dev/lytedev/nix/commit/59c82a8913286c146480900bb0cab01e1289a10c">59c82a8913286c146480900bb0cab01e1289a10c</a> feat(beefcake): meshtasticd virtual node (MQTT-joined) for Matrix bridge <![CDATA[58ee2d5949a8c237dcd13dab1c19f0dbbecd3fc5 fix(sunshine): vendor nixpkgs PR #521906 bump to 2026.516 (critical CVE-2026-32253) 94201408ebbbfac743d773c109ae56a6a682cd72 chore(beefcake): broker-only — disable meshtasticd/mmrelay until real secrets 08df9a6a93857070773be1039fda5550a6131a04 feat(router): isolated, internet-only guest VLAN (hardened) bcaf3a2d52443f581cac5a0336ea5d394cb4827b feat(beefcake): mmrelay container — Meshtastic↔Matrix bridge 59c82a8913286c146480900bb0cab01e1289a10c feat(beefcake): meshtasticd virtual node (MQTT-joined) for Matrix bridge]]> lytedev 10479: https://git.lyte.dev/lytedev/nix/compare/882e79acf5cc09132976a3f81ee1f398f569645f...58ee2d5949a8c237dcd13dab1c19f0dbbecd3fc5 Thu, 18 Jun 2026 18:33:15 -0500 lytedev created pull request lytedev/nix#588 https://git.lyte.dev/lytedev/nix/pulls/588 588#feat(beefcake): lock sensitive LAN services to the dragon bastion# <![CDATA[

Interim LAN hardening ahead of the isolated guest VLAN (which needs a UniFi SSID tag — pending controller creds).

Problem

WiFi clients currently share the untagged LAN with wired gear, and beefcake opens several sensitive services on all interfaces: Samba (445/139), the *arr stack (9876/9877), and the k3s API/kubelet (6443/10250). A guest on the main WiFi could reach any of them.

What this does

Drops LAN access to those ports unless the source is dragon (192.168.0.10, MAC-reserved bastion). Per design:

  • tailnet (headscale) is the primary admin path and is fully untouched — these rules only match the eno1 (LAN) interface, never tailscale0.
  • dragon is the LAN fallback — you hop through it for direct LAN admin when the tailnet is down.
  • SSH (22), web (80/443, SSO-gated), mail, and game-server ports stay open on the LAN.
  • IPv4 only: dragon's LAN v6 is SLAAC (unstable), so locking v6 risks breaking dragon via happy-eyeballs. The residual v6 gap is closed properly by the guest VLAN (L2 isolation, both protocols). Samba discovery is v4/mDNS, so the casual-guest hole is closed.

Reversible: pure firewall extraCommands; remove the import + redeploy to revert.

Verified live on beefcake

Source → beefcake:445 Result
dragon ethernet .0.10 succeeds (allowlisted)
non-dragon LAN .0.67 DROP (blocked)
non-dragon → :22 SSH open (intentionally not locked)

🤖 Generated with Claude Code

]]>
lytedev 10478: https://git.lyte.dev/lytedev/nix/pulls/588 Thu, 18 Jun 2026 12:11:32 -0500
lytedev pushed to beefcake-lan-lockdown at lytedev/nix https://git.lyte.dev/lytedev/nix/commit/dea70b269a834f02073f56ace64ff70235b23799 <a href="https://git.lyte.dev/lytedev/nix/commit/dea70b269a834f02073f56ace64ff70235b23799">dea70b269a834f02073f56ace64ff70235b23799</a> feat(beefcake): lock sensitive LAN services to the dragon bastion <![CDATA[dea70b269a834f02073f56ace64ff70235b23799 feat(beefcake): lock sensitive LAN services to the dragon bastion]]> lytedev 10477: https://git.lyte.dev/lytedev/nix/commit/dea70b269a834f02073f56ace64ff70235b23799 Thu, 18 Jun 2026 12:11:14 -0500 lytedev created branch beefcake-lan-lockdown in lytedev/nix https://git.lyte.dev/lytedev/nix/src/branch/beefcake-lan-lockdown lytedev 10476: https://git.lyte.dev/lytedev/nix/src/branch/beefcake-lan-lockdown Thu, 18 Jun 2026 12:11:14 -0500 lytedev deleted branch beefcake-broker-only from lytedev/nix https://git.lyte.dev/lytedev/nix lytedev 10475: https://git.lyte.dev/lytedev/nix Thu, 18 Jun 2026 06:35:26 -0500 lytedev pushed to main at lytedev/nix https://git.lyte.dev/lytedev/nix/commit/94201408ebbbfac743d773c109ae56a6a682cd72 <a href="https://git.lyte.dev/lytedev/nix/commit/94201408ebbbfac743d773c109ae56a6a682cd72">94201408ebbbfac743d773c109ae56a6a682cd72</a> chore(beefcake): broker-only — disable meshtasticd/mmrelay until real secrets <![CDATA[94201408ebbbfac743d773c109ae56a6a682cd72 chore(beefcake): broker-only — disable meshtasticd/mmrelay until real secrets]]> lytedev 10474: https://git.lyte.dev/lytedev/nix/commit/94201408ebbbfac743d773c109ae56a6a682cd72 Thu, 18 Jun 2026 06:35:25 -0500 lytedev merged pull request lytedev/nix#587 https://git.lyte.dev/lytedev/nix/pulls/587 chore(beefcake): broker-only — disable meshtasticd/mmrelay until real secrets <![CDATA[chore(beefcake): broker-only — disable meshtasticd/mmrelay until real secrets]]> lytedev 10473: https://git.lyte.dev/lytedev/nix/pulls/587 Thu, 18 Jun 2026 06:35:23 -0500 lytedev created pull request lytedev/nix#587 https://git.lyte.dev/lytedev/nix/pulls/587 587#chore(beefcake): broker-only — disable meshtasticd/mmrelay until real secrets# <![CDATA[

Comments out the meshtasticd.nix + mmrelay.nix imports so only the Mosquitto broker is active. The other two depend on secrets that are still placeholders (meshtastic-channel-url, mmrelay-credentials); enabling them now would fail-loop (meshtasticd-provision errors on the placeholder --seturl, mmrelay crash-loops on bad Matrix creds).

Already deployed to beefcake (broker-only) — mosquitto is active and listening on 1883. This PR brings main in line with what's deployed so a future deploy doesn't re-enable the broken units.

Re-enable by uncommenting the two imports once meshtastic-channel-url + mmrelay-credentials are filled in sops (and an unencrypted Matrix room + bot exist).

]]>
lytedev 10472: https://git.lyte.dev/lytedev/nix/pulls/587 Wed, 17 Jun 2026 23:38:24 -0500
lytedev pushed to beefcake-broker-only at lytedev/nix https://git.lyte.dev/lytedev/nix/commit/94201408ebbbfac743d773c109ae56a6a682cd72 <a href="https://git.lyte.dev/lytedev/nix/commit/94201408ebbbfac743d773c109ae56a6a682cd72">94201408ebbbfac743d773c109ae56a6a682cd72</a> chore(beefcake): broker-only — disable meshtasticd/mmrelay until real secrets <![CDATA[94201408ebbbfac743d773c109ae56a6a682cd72 chore(beefcake): broker-only — disable meshtasticd/mmrelay until real secrets]]> lytedev 10471: https://git.lyte.dev/lytedev/nix/commit/94201408ebbbfac743d773c109ae56a6a682cd72 Wed, 17 Jun 2026 23:38:05 -0500 lytedev created branch beefcake-broker-only in lytedev/nix https://git.lyte.dev/lytedev/nix/src/branch/beefcake-broker-only lytedev 10470: https://git.lyte.dev/lytedev/nix/src/branch/beefcake-broker-only Wed, 17 Jun 2026 23:38:05 -0500 lytedev deleted branch router-guest-vlan-hardened from lytedev/nix https://git.lyte.dev/lytedev/nix lytedev 10469: https://git.lyte.dev/lytedev/nix Wed, 17 Jun 2026 23:24:08 -0500 lytedev pushed to main at lytedev/nix https://git.lyte.dev/lytedev/nix/commit/08df9a6a93857070773be1039fda5550a6131a04 <a href="https://git.lyte.dev/lytedev/nix/commit/08df9a6a93857070773be1039fda5550a6131a04">08df9a6a93857070773be1039fda5550a6131a04</a> feat(router): isolated, internet-only guest VLAN (hardened) <![CDATA[08df9a6a93857070773be1039fda5550a6131a04 feat(router): isolated, internet-only guest VLAN (hardened)]]> lytedev 10468: https://git.lyte.dev/lytedev/nix/commit/08df9a6a93857070773be1039fda5550a6131a04 Wed, 17 Jun 2026 23:24:07 -0500 lytedev merged pull request lytedev/nix#559 https://git.lyte.dev/lytedev/nix/pulls/559 feat(router): isolated guest VLAN (hardened) <![CDATA[feat(router): isolated guest VLAN (hardened)]]> lytedev 10467: https://git.lyte.dev/lytedev/nix/pulls/559 Wed, 17 Jun 2026 23:24:06 -0500 lytedev deleted branch beefcake-mmrelay from lytedev/nix https://git.lyte.dev/lytedev/nix lytedev 10466: https://git.lyte.dev/lytedev/nix Wed, 17 Jun 2026 23:23:53 -0500 lytedev pushed to main at lytedev/nix https://git.lyte.dev/lytedev/nix/commit/bcaf3a2d52443f581cac5a0336ea5d394cb4827b <a href="https://git.lyte.dev/lytedev/nix/commit/bcaf3a2d52443f581cac5a0336ea5d394cb4827b">bcaf3a2d52443f581cac5a0336ea5d394cb4827b</a> feat(beefcake): mmrelay container — Meshtastic↔Matrix bridge <![CDATA[bcaf3a2d52443f581cac5a0336ea5d394cb4827b feat(beefcake): mmrelay container — Meshtastic↔Matrix bridge]]> lytedev 10465: https://git.lyte.dev/lytedev/nix/commit/bcaf3a2d52443f581cac5a0336ea5d394cb4827b Wed, 17 Jun 2026 23:23:52 -0500 lytedev merged pull request lytedev/nix#586 https://git.lyte.dev/lytedev/nix/pulls/586 feat(beefcake): mmrelay container — Meshtastic↔Matrix bridge <![CDATA[feat(beefcake): mmrelay container — Meshtastic↔Matrix bridge]]> lytedev 10464: https://git.lyte.dev/lytedev/nix/pulls/586 Wed, 17 Jun 2026 23:23:52 -0500 lytedev deleted branch beefcake-meshtasticd from lytedev/nix https://git.lyte.dev/lytedev/nix lytedev 10463: https://git.lyte.dev/lytedev/nix Wed, 17 Jun 2026 23:23:45 -0500 lytedev pushed to main at lytedev/nix https://git.lyte.dev/lytedev/nix/commit/59c82a8913286c146480900bb0cab01e1289a10c <a href="https://git.lyte.dev/lytedev/nix/commit/59c82a8913286c146480900bb0cab01e1289a10c">59c82a8913286c146480900bb0cab01e1289a10c</a> feat(beefcake): meshtasticd virtual node (MQTT-joined) for Matrix bridge <![CDATA[59c82a8913286c146480900bb0cab01e1289a10c feat(beefcake): meshtasticd virtual node (MQTT-joined) for Matrix bridge]]> lytedev 10462: https://git.lyte.dev/lytedev/nix/commit/59c82a8913286c146480900bb0cab01e1289a10c Wed, 17 Jun 2026 23:23:45 -0500 lytedev merged pull request lytedev/nix#585 https://git.lyte.dev/lytedev/nix/pulls/585 feat(beefcake): meshtasticd virtual node (MQTT-joined) for Matrix bridge <![CDATA[feat(beefcake): meshtasticd virtual node (MQTT-joined) for Matrix bridge]]> lytedev 10461: https://git.lyte.dev/lytedev/nix/pulls/585 Wed, 17 Jun 2026 23:23:44 -0500