Commit Graph
189 Commits
Author SHA1 Message Date
lyrathorpe 840b35aa6e memory: index the SIBO Workabout MX project memory
CI / flake (pull_request) Successful in 22s
2026-07-10 10:59:11 +01:00
lyrathorpe 573ff362e4 memory: add SIBO Workabout MX project state for cross-session resume 2026-07-10 10:59:10 +01:00
lyrathorpe ad9decdf47 Merge pull request 'docs: repo layout, module catalogue, host READMEs, stale-path fixes' (#56) from docs/audit-improvements into main
CI / flake (push) Failing after 4m2s
Reviewed-on: #56
2026-07-06 15:37:28 +01:00
lyrathorpe 819633260e docs(rpi5): fix stale module paths
CI / flake (pull_request) Successful in 19s
2026-07-06 15:27:03 +01:00
lyrathorpe 610d5d8b28 docs(macpro31): fix stale module paths 2026-07-06 15:27:02 +01:00
lyrathorpe 58c0004f20 docs(t400): fix stale module paths 2026-07-06 15:27:02 +01:00
lyrathorpe f57d6ab1f9 docs(darwin): add host README 2026-07-06 15:27:01 +01:00
lyrathorpe 574773de73 docs(edaas): add host README 2026-07-06 15:27:00 +01:00
lyrathorpe a857365cc3 docs: add repo layout, module catalogue and add-a-host guide 2026-07-06 15:26:59 +01:00
lyrathorpeandEmma Thorpe c06a57f249 chore: post-refactor cleanups (#50-#53) (#54)
CI / flake (push) Successful in 3m30s
## Summary

Follow-up cleanups from the post-refactor audit (issues #50–#53). All behaviour-preserving except the work-host changes (kube-tmux + Lens removal).

## Changes

- **#51** `refactor(ssh)` — move `services.openssh.enable` + `firewall.allowedTCPPorts = [ 22 ]` into `modules/ssh.nix`; drop the duplicated lines from T400, MacPro31, RPi5.
- **#50** `fix/feat(work)` — load kube-tmux from a pinned `flake = false` input (it is not in nixpkgs) and reference `${inputs.kube-tmux}/kube.tmux` directly, so the status line no longer depends on a manual `$HOME/code/kube-tmux` checkout. (Supersedes the interim file-existence guard.)
- **#52** `chore` — gitignore the untracked `tf-inspect/` scratch project.
- **#53** `chore` — remove the unused Lens package entirely (`pkgs.lens` + its unfree entry; `unfreePackages` is now just `claude-code`), fix the `nil`→`nil_ls` LSP doc, remove the redundant `.editorconfig` block, name the RPi5 Docker subnet in a `let` binding.

## Deferred (from #53, noted in the commit)

- `.gitignore` firmware entry — documented behaviour, low value, left as-is.
- Per-eval `nixpkgs-unstable` overlay import — inherently per-system; no clean single-import hoist.

## Verification

- `nix flake check` passes (treefmt, deadnix, statix, pre-commit, all hosts + Darwin + homeConfigurations).
- Derivation-path diff vs `main`: `lyrathorpe-mbp`, `lyrathorpe-t400`, `lyrathorpe-macpro31`, `lyrathorpe-rpi5` are byte-identical (confirms #51 and the subnet `let` binding change nothing). Only `emmathorpe-edaas` differs — the kube-tmux input (#50) and the Lens removal (#53).

Closes #50, #51, #52, #53.

---------

Co-authored-by: Emma Thorpe <emma.thorpe@citrix.com>
Reviewed-on: #54
2026-06-29 14:09:38 +01:00
lyrathorpeandEmma Thorpe 128deca2e3 refactor(flake): user registry, multi-user hosts, and portable home outputs (#49)
CI / flake (push) Successful in 3m26s
## Summary

Separates user identity (data) from the reusable Nix modules and lets a host declare any number of users, replacing the previous one-user-per-host structure. Also restructures the tree and exposes the home config for use off these hosts.

## Changes

- **User registry** (`users/registry.nix`): per-user identity (name, email, groups, authorized + signing keys) as the single source of truth; no user data hardcoded in modules.
- **Multi-user `mkHost`**: a host declares a `users` set keyed by username; per-user identity is injected into each home config via the `identity` module arg.
- **Restructured layout**: `users/`, `home/`, `modules/`, `hosts/`, `lib/` replace the former `lyrathorpe/` and `system/` trees.
- **Portable outputs**: standalone `homeConfigurations."<user>@<system>"` (the portable subset — shell, git, editor, claude) plus an exported `homeModules` for use on machines not managed by this flake, or as an input to other flakes.
- Docs (`README.md`, `home/README.md`) and `.gitignore` updated for the new paths.

## Fixes

- Closes #46 — shared user module authorized one user's SSH key for every account.
- Closes #47 — git committer identity hardcoded as defaults instead of per-user.
- Closes #48 — EDaaS systemd linger hardcoded to a literal username.

## Verification

- `nix flake check` passes: treefmt, deadnix, statix, pre-commit, and evaluation of all NixOS hosts + Darwin + homeConfigurations.
- Derivation-path comparison vs `main`: `lyrathorpe-mbp` and `emmathorpe-edaas` are byte-identical; `lyrathorpe-t400`, `lyrathorpe-macpro31` and `lyrathorpe-rpi5` differ only by de-duplicating a repeated `authorized_keys` entry (confirmed with nix-diff — no other change).
- Standalone `homeConfigurations."lyrathorpe@x86_64-linux".activationPackage` builds.

## Notes

- `emmathorpe` has no personal authorized key yet (it previously inherited Lyra's key via the bug in #46); the registry entry is intentionally empty — add a real key if SSH login as `emmathorpe` is wanted (moot on the WSL host).
- A two-repo (public dotfiles / private systems) split is deferred by design; this internal restructure is the prerequisite for it.

---------

Co-authored-by: Emma Thorpe <emma.thorpe@citrix.com>
Reviewed-on: #49
2026-06-29 13:06:23 +01:00
lyrathorpe 906fae7e7b Merge pull request 'feat(ssh): add some needed SSH config' (#45) from feat/ssh-updates into main
CI / flake (push) Successful in 3m23s
Reviewed-on: #45
2026-06-29 11:20:36 +01:00
lyrathorpe 1230e39aac feat(ssh): add some needed SSH config
CI / flake (pull_request) Successful in 3m28s
2026-06-29 11:15:40 +01:00
lyrathorpe 9ad8567bdf Merge pull request 'fix(wsl): remove non-existent interop options' (#43) from fix/wsl-interop-options into main
CI / flake (push) Successful in 3m31s
Reviewed-on: #43
2026-06-24 15:38:36 +01:00
Emma ThorpeandClaude Opus 4.8 bcabfd49bb fix(wsl): remove non-existent interop options
CI / flake (pull_request) Successful in 3m43s
The NixOS-WSL module's wslConf.interop submodule declares only `enabled`
and `appendWindowsPath`. `register` and `includePath` are not valid
wsl.conf interop keys, and the freeform INI type does not cover keys
nested under the already-declared `interop` group, so they were rejected
as unknown options. Remove them.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 15:33:55 +01:00
lyrathorpe eef7203621 fix(darwin): emu2 isn't in brew, i installed it manually (#41)
CI / flake (push) Successful in 3m37s
Reviewed-on: #41
Co-authored-by: Lyra Thorpe <iam@emmathe.dev>
Co-committed-by: Lyra Thorpe <iam@emmathe.dev>
2026-06-23 16:40:10 +01:00
lyrathorpeandEmma Thorpe 6064a5a1a7 feat(editor): add nvim-cmp completion keymaps (#40)
CI / flake (push) Successful in 3m39s
Closes #39.

nvim-cmp ships no default keymaps, so the completion menu (including the path source) appeared but nothing could navigate or accept it.

Bind the usual set in `plugins.cmp.settings.mapping`:

- `<C-n>` / `<C-p>` and `<Tab>` / `<S-Tab>` — select next/previous
- `<C-Space>` — open the menu
- `<C-e>` — abort
- `<CR>` — confirm with `select = false` (bare Enter stays a newline unless an entry is highlighted)

Documentation: `KEYBINDINGS.md` gains a completion-menu table under the Neovim section covering these keys, and the Neovim summary is reworded accordingly.

Verified by rendering the generated nvim config: the mappings emit as raw Lua (e.g. `["<CR>"] = cmp.mapping.confirm({ select = false })`), not quoted strings.

---------

Co-authored-by: Emma Thorpe <emma.thorpe@citrix.com>
Reviewed-on: #40
2026-06-23 16:33:12 +01:00
lyrathorpe df7747f876 Merge pull request 'feat(darwin): add apps i need' (#38) from feat/add-dosbox into main
CI / flake (push) Successful in 4m13s
Reviewed-on: #38
2026-06-23 16:26:30 +01:00
lyrathorpe 1e0485efde fix(darwin): emu2 not available via nixpkgs, use brew
CI / flake (pull_request) Successful in 3m55s
2026-06-23 16:22:20 +01:00
lyrathorpe fce75e9f4c feat(darwin): add apps i need
CI / flake (pull_request) Failing after 3m26s
dosbox and emu2, psion time
2026-06-23 16:16:07 +01:00
lyrathorpe e6e280cc73 Merge pull request 'chore(deps): update gitea actions to v7' (#34) from renovate/major-gitea-actions into main
CI / flake (push) Successful in 3m43s
Reviewed-on: #34
2026-06-22 16:28:10 +01:00
lyrathorpe 44245d16a2 Merge pull request 'fix(editor): use renamed catppuccin-mocha lualine theme' (#37) from fix/lualine-catppuccin-theme into main
CI / flake (push) Successful in 3m50s
Reviewed-on: #37
2026-06-22 15:39:09 +01:00
Emma ThorpeandClaude Opus 4.8 123032aff9 fix(editor): use renamed catppuccin-mocha lualine theme
CI / flake (pull_request) Successful in 4m11s
catppuccin v2.0.0 renamed its lualine theme files; there is no longer a
plain "catppuccin" theme, only per-flavour files (catppuccin-mocha, etc.)
and catppuccin-nvim. The old name no longer resolved, so lualine fell back
to the auto theme and emitted a notice. Pin to catppuccin-mocha to match
the configured colorscheme flavour.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 15:29:10 +01:00
renovate-bot 94b0b33338 Merge pull request 'chore(deps): lock file maintenance flake inputs' (#35) from renovate/lock-file-maintenance-flake-inputs into main
CI / flake (push) Successful in 3m55s
2026-06-22 00:07:10 +01:00
Renovate Bot d84b35c5ce chore(deps): lock file maintenance flake inputs
renovate/stability-days Updates have not met minimum release age requirement
CI / flake (pull_request) Successful in 4m30s
2026-06-21 23:02:33 +00:00
Renovate Bot 6f3801621f chore(deps): update gitea actions to v7
renovate/stability-days Updates have met minimum release age requirement
CI / flake (pull_request) Successful in 4m29s
2026-06-21 23:01:19 +00:00
lyrathorpe 1e49af53e7 Merge pull request 'feat: Raspberry Pi 5 host (Docker host + nginx reverse proxy)' (#32) from feat/rpi5-host into main
CI / flake (push) Successful in 3m50s
Reviewed-on: #32
2026-06-16 14:12:48 +01:00
Emma Thorpe efa9aa93da docs(rpi5): add install notes and update host table
CI / flake (pull_request) Successful in 3m47s
Add system/machine/RPi5/README.md (flash/boot, regenerate hardware-config,
Docker-socket security caveat and remote-client usage, how to add a
reverse-proxy vhost). Add lyrathorpe-rpi5 to the README host table and note
that the swayDesktop flag now lives in system/modules/features.nix so headless
hosts keep TTY login.
2026-06-16 13:32:11 +01:00
Emma Thorpe 277dfa4251 feat(flake): register lyrathorpe-rpi5 host
Add the aarch64-linux Raspberry Pi 5 host to the host table: the RPi5
machine config, the raspberry-pi-5 nixos-hardware profile, and key-only
sshd. Headless, so no swaywm.nix; base home modules only.
2026-06-16 13:31:16 +01:00
Emma Thorpe 3470751c3e refactor(modules): declare swayDesktop feature flag in a base module
lyrathorpe/user.nix reads features.swayDesktop.enable on every host, but the
option was declared inside lyrathorpe/swaywm.nix -- so a host that does not
import swaywm.nix (a headless server) would fail evaluation. Move the option
declaration to a new always-imported system/modules/features.nix and wire it
into baseModules; swaywm.nix keeps only its implementation (config) block.
Headless hosts can now omit swaywm.nix and the flag defaults to false.
2026-06-16 13:29:15 +01:00
Emma Thorpe b56641aaee feat(rpi5): add host configuration (boot, network, sshd)
Tie the RPi5 submodules together: import hardware-config, docker.nix and
reverse-proxy.nix; pin networking.hostName to the flake attr name so nh
resolves; use U-Boot/extlinux boot (raspberry-pi-5 profile supplies kernel +
firmware); enable key-only sshd and a default-deny firewall opening 22.
Headless -- swaywm.nix is not imported, so swayDesktop stays off.
2026-06-16 13:26:31 +01:00
Emma Thorpe 108f7b9528 feat(rpi5): add nginx reverse-proxy module
Enable nginx with the recommended proxy/TLS/optimisation/gzip settings and a
declarative virtualHosts table -- each proxied service is a Nix entry, so the
routing lives in-repo. Ships one HTTP-only example vhost; enableACME/forceSSL
are present but commented, to be flipped per-vhost once a DNS name and cert
exist. Opens 80 and 443.
2026-06-16 13:25:57 +01:00
Emma Thorpe 1cb8371775 feat(rpi5): add Docker host with LAN-restricted network socket
Enable Docker and expose the daemon over TCP 2375 by extending the systemd
docker.socket ListenStream (avoids the daemon.json hosts vs unit -H fd://
conflict). The port is not added to allowedTCPPorts; instead an nftables
rule accepts it only from the trusted LAN subnet. Plain 2375 is
root-equivalent, so the source restriction is the only safeguard -- mTLS on
2376 is the documented upgrade path.
2026-06-16 13:25:31 +01:00
Emma Thorpe 2fc39a5f15 feat(rpi5): add placeholder hardware-configuration
Committed so the lyrathorpe-rpi5 host evaluates in CI before the Pi is
provisioned. It is a placeholder, not a bootable config: on first install,
regenerate it on the device with nixos-generate-config and replace this file.
Excluded from formatters/linters by the existing hardware-configuration.nix
rules.
2026-06-16 13:25:02 +01:00
lyrathorpe 5f4fd8d74e Merge pull request 'Feat/extra needed apps' (#29) from feat/extra-needed-apps into main
CI / flake (push) Successful in 3m38s
Reviewed-on: #29
2026-06-16 11:56:13 +01:00
lyrathorpe d8c4f6bb0b Merge pull request 'fix(renovaterc.json): ensure lockfile updates auto merge' (#30) from fix/renovate-automerge into main
CI / flake (push) Successful in 3m36s
Reviewed-on: #30
2026-06-16 11:55:35 +01:00
Emma Thorpe 8c3b101a14 ci: always run the workflow on PRs, guard the heavy steps
CI / flake (pull_request) Successful in 3m24s
This job is a required status check on main. The workflow was path-filtered
to **.nix/flake.lock/ci.yaml, so a PR touching none of those (e.g. a
.renovaterc.json-only change) skipped the workflow entirely, leaving the
required check pending forever and making the PR unmergeable.

Run the workflow on every PR so the check is always reported, but keep a
'detect' step that diffs the PR against its base and runs nix flake check
and the per-host evals only when a .nix file, flake.lock, or this workflow
changed. When nothing Nix-relevant changed the heavy steps skip and the job
still passes, so the required check stays green-reportable without burning a
full evaluation on unrelated changes. Checkout uses fetch-depth: 0 so the
diff has the base history.
2026-06-16 11:51:18 +01:00
Emma Thorpe 2b69485107 feat(edaas): set hostName to emmathorpe-edaas
CI / flake (pull_request) Successful in 3m44s
The host inherited the stock NixOS default hostname 'nixos', which does not
match the flake's nixosConfigurations attribute 'emmathorpe-edaas'. nh
selects the configuration by the local hostname, so bare 'nh os switch'
failed to resolve. Pin the hostname to the attribute name so it resolves
without an explicit -H/--hostname flag.
2026-06-16 11:30:22 +01:00
Emma Thorpe 886ac4eb36 fix(git.nix): make personal signingkey a mkDefault
git.nix and work.nix both define user.signingkey. They used to hold the
same value, which types.str tolerates, but git.nix now sets the personal
key while work.nix sets the work key, so the two plain definitions
conflict on the EDaaS host.

Mark git.nix's signingkey as mkDefault, mirroring user.email: personal
hosts get the personal key, and work.nix's plain work-key definition wins
on the work host.
2026-06-16 11:27:17 +01:00
Emma Thorpe ffedf769a0 fix(shell.nix): let gh own its config.yml so auth login works
home-manager renders ~/.config/gh/config.yml as a read-only /nix/store
symlink whenever programs.gh is enabled (unconditionally, not gated on
settings). gh rewrites that file on 'gh auth login' and 'gh config set',
which then fail with a permission error.

Suppress the managed config.yml via xdg.configFile and drop the
settings.git_protocol declaration that created it; gh now owns the file.
The token lives in hosts.yml, which home-manager never manages. Set the
SSH protocol at runtime with 'gh config set git_protocol ssh'.
2026-06-16 11:21:51 +01:00
Emma Thorpe eec713e886 refactor(git.nix): drop redundant gh and duplicate tea packages
programs.gh.enable (in shell.nix) already installs gh, so the explicit
pkgs.gh was redundant. pkgs.tea was also declared in shell.nix; keep the
single declaration there and remove the duplicate here.
2026-06-16 11:12:48 +01:00
Emma Thorpe e995283363 feat(shell.nix): configure htop settings and meters
Flesh out programs.htop: tree view, sensible highlights, hidden kernel
threads, left CPU/Memory/Swap bar meters and right Tasks/LoadAverage/Uptime
text meters. color_scheme = 0 inherits the terminal's Catppuccin Mocha
palette, as htop has no custom-theme support of its own.

Drop the explicit pkgs.htop: programs.htop.enable already installs it.
2026-06-16 11:12:44 +01:00
Emma Thorpe a753355c0f fix(shell.nix): correct home.activation typo
The zcompdump reset was declared under home.actiVation (stray capital V),
an unknown option that fails module evaluation, so the activation script
never ran. Restore the correct home.activation attribute.
2026-06-16 11:12:38 +01:00
lyrathorpe e125296015 feat(shell.nix): add htop installation 2026-06-16 10:55:57 +01:00
lyrathorpe e0b3eb2393 feat(git.nix): add GitHub and Gitea CLI 2026-06-16 10:50:49 +01:00
lyrathorpe 35c3b08862 fix(renovaterc.json): ensure lockfile updates auto merge 2026-06-16 10:44:46 +01:00
lyrathorpe 6730efa3ce Merge pull request 'Feat/edaas renovate review timer' (#28) from feat/edaas-renovate-review-timer into main
CI / flake (push) Successful in 3m55s
Reviewed-on: #28
2026-06-16 10:40:50 +01:00
lyrathorpe fc459ddb1b Merge pull request 'chore(deps): lock file maintenance flake inputs' (#27) from renovate/lock-file-maintenance-flake-inputs into main
CI / flake (push) Successful in 4m28s
Reviewed-on: #27
2026-06-16 10:37:36 +01:00
Renovate Bot 052b95c00e chore(deps): lock file maintenance flake inputs
CI / flake (pull_request) Successful in 4m25s
2026-06-15 00:02:51 +00:00
Emma Thorpe 783754bda2 feat(edaas): auto-approve low-risk Renovate PRs + daily shell reminder
CI / flake (pull_request) Successful in 4m0s
Extend the daily Renovate review so it triages instead of only advising,
and surface results in the interactive shell.

- Auto-approve: PRs graded low risk (patch/minor bumps to tooling, infra,
  test or framework libs; symmetric diff; CI passing; no app logic) that
  are not already approved get an APPROVE review via
  pull_request_review_write. These repos automerge on approval, so this
  merges them with no human in the loop -- intentional. Medium/high risk,
  failing/pending CI, stale branches and anything needing judgement are
  left untouched for Emma. No merge tool is granted.
- State + reminder: each run records ~/.local/state/renovate-review/
  {last-run,needs-review.txt}. A once-a-day interactive zsh reminder
  (programs.zsh.initContent) warns if the timer hasn't run, lists the PRs
  needing review, or confirms an all-clear.

Verified: nix build (eval + shellcheck) green; triage parsing and the
reminder's run/stale/all-clear/throttle branches exercised against
synthetic state. The first live auto-approval is left for a supervised
scheduled/manual run.
2026-06-11 15:46:12 +01:00