basecamp: bump flake input to github:basecamp/basecamp-cli/v0.8.0-rc.1.
The rc.1 tag ships a stale nix/package.nix whose vendorHash does not
match the tagged go.sum (buildGoModule FOD fails) and whose `version`
was not bumped (still reads 0.7.2). Override both on the pass-through so
the input builds and reports 0.8.0-rc.1. Drop the override back to a
plain pass-through once upstream fixes package.nix for the 0.8.0 final.
vibetyper: 1.4.0 -> 1.4.1 with refreshed AppImage sha256.
Upstream renamed the desktop file from openwork.desktop to
com.differentai.openwork.desktop (reverse-DNS), causing the build to
fail with "cannot stat '.../openwork.desktop'". Source the new name
while keeping the install destination as openwork.desktop so icon and
Exec substitution stay unchanged.
n8n 2.32 replaced the sheetjs-CDN xlsx@0.20.2 tarball (which lacked an
integrity checksum and had to be patched into pnpm-lock.yaml) with the
regular npm package @e965/xlsx@0.20.3, which already carries an integrity
field. The patchXlsxLockfile workaround is therefore obsolete and actively
harmful: substituteInPlace --replace-fail no longer matches, making
fetchPnpmDeps fail with a build error (not a hash mismatch), which left the
fake-hash sentinel behind in n8n.nix on update.
- overlays/mods/n8n.nix: remove xlsx workaround; bump to 2.32.6 with real
src (sha256-wWm6...) and pnpmDeps (sha256-QzUJCF+...) hashes.
- tests/n8n-overlay-test.nix: update expectations to 2.32.6; drop the
obsolete checkXlsxIntegrityPatch.
- overlays/mods/update.sh: use a literal SRI sentinel instead of lib.fakeHash
(lib is not in scope inside the {prev}: overlay); add a snapshot-based EXIT
trap that restores n8n.nix on any failure (error/SIGINT/SIGTERM/killed
build) while preserving pre-existing working-tree edits; surface a clearer
message when fetchPnpmDeps fails for a non-hash reason.
Expose the opencode-desktop Electron app as a package via a pure
pass-through from a new 'opencode' flake input
(github:anomalyco/opencode/dev).
The input intentionally does NOT follow nixpkgs: upstream pins a
node_modules fixed-output derivation hash in nix/hashes.json against
its own nixpkgs snapshot, so following would risk FOD hash mismatches.
- flake.nix: add 'opencode' input (own nixpkgs, dev branch)
- pkgs/default.nix: opencode-desktop pass-through
- docs/packages/opencode.md + README.md: refreshed (Electron, not Tauri)
- CHANGELOG: unreleased entry
Verified: nix flake show lists opencode-desktop (all 4 systems);
output opencode-desktop-1.18.9+f720490 builds & wraps electron-41.
The pinned n8n version moved to 2.31.6 in 30c753f but the test was still
asserting 2.29.8 with the old src/pnpmDeps hashes, so the test broke.
Sync expectedVersion, expectedSrcHash and expectedPnpmHash to the values
currently in overlays/mods/n8n.nix.
The eigent package directory was deleted in 96f5d7f (which was titled
"chore: update n8n, openwork, vibetyper") but the callPackage reference
in pkgs/default.nix and the row in docs/packages/README.md were left
behind. As a result `nix build .#eigent` and `nix flake check` failed
with "undefined variable" errors when the eigent attribute was forced.
Drop both references so the package set evaluates cleanly.
- overlays/mods/n8n.nix: add passthru.updateScript pointing to ./update.sh
- overlays/mods/update.sh: self-contained updater that fetches the latest
stable n8n-io/n8n release, recomputes both src and pnpmDeps hashes
(src via nix-prefetch-url with --name workaround for the `@` in the tag,
pnpmDeps via the lib.fakeHash mismatch trick)
- .gitea/workflows/nix-update.yml: discover and run overlays/mods/*/update.sh
after the pkgs/ loop; verify step skips overlay/* entries (covered by flake check)
The test suite (tests/n8n-overlay-test.nix) forbids exporting a local n8n
package, so the overlay cannot be exposed via pkgs/n8n/ — the workflow gets
an explicit overlay-discovery block instead.
- vibetyper/msty-studio: unversioned AppImage URLs → HEAD/Last-Modified
check via custom update.sh, refreshes sha256 when upstream binary changes
- zellij-ps: switch to branch-tracking (master tip via Gitea API) since
helper-scripts repo has no tags
- all three expose passthru.updateScript so the existing CI workflow
discovers them via is_custom_update_script
Primary: /run/agenix/elevenlabs-key (read via 'read -r' which strips
the trailing newline agenix files contain).
Fallback: ELEVENLABS_API_KEY env var (backwards compatible).
No need to export the key in shell environment anymore — if the
agenix secret exists, talk picks it up automatically.
Override path via ELEVENLABS_KEY_FILE env var if needed.
crunch script <type> <time> <script.sh> [args...]
Runs any shell script on schedule. Script stdout is piped to talk
for voice output. Empty stdout = silence (no error thrown).
Enables complex multi-step pipelines:
- Fetch data (basecamp, gh, curl)
- Write reports to disk
- Pipe through pi/opencode for AI summarization
- Final stdout → talk voice notification
Example:
crunch script daily '08:00' ~/scripts/basecamp-daily.sh
The shell '>' redirect creates ACTION_FILE immediately as an empty file.
The poll loop checked [ -f ] (exists) instead of [ -s ] (non-empty),
so it matched on the first 0.2s iteration, found no 'cancel' string,
and broke out of the loop — leaving mpv running with no listener.
[ -s ] only returns true once notify-send writes 'cancel' to the file
(i.e. when the user actually clicks the Abbrechen action).
crunch schedules transient systemd --user timers that fire talk (TTS)
or AI agents (pi/opencode) → talk at specified times.
Commands:
crunch at <time> <message> One-shot
crunch in <duration> <message> One-shot after delay
crunch daily <time> <message> Recurring daily
crunch weekly <day> <time> <message> Recurring weekly
crunch ai <engine> <type> <time> <prompt> AI crunch
crunch list List jobs
crunch cancel <name> Cancel job
crunch purge Clean fired jobs
Supports German and English day names (Montag→Mon, etc).