Jakub Czajka [Mon, 20 Jul 2026 21:21:21 +0000 (21:21 +0000)]
[tests] Simplify test code: extract shared assertion helpers, trim vps-base.scm.
- Add tests/common.scm with assert-service-running and
assert-binary-exists helpers, DRYing patterns repeated
across 6 per-component test files.
- Remove unnecessary let block from %test-vps — test
functions already have descriptive names.
- Inline single-use os binding in run-vps-test.
Jakub Czajka [Wed, 15 Jul 2026 22:52:27 +0000 (22:52 +0000)]
[vps] Add dnscrypt-proxy.
Package dnscrypt-proxy 2.1.7 with Shepherd service and
resolv-conf-service-type that extends etc-service-type.
Wire into vps-operating-system (dedicated user/group,
resolver pointing at 127.0.0.1). Test dnscrypt-proxy
service, port 53 TCP, resolv.conf, and NTP daemon.
Jakub Czajka [Wed, 15 Jul 2026 22:49:55 +0000 (22:49 +0000)]
[tests] Add VPS test harness infrastructure.
Boot a marionette VM that inherits from vps-operating-system
with static networking and a throwaway SSH key. No
individual test cases yet — the harness validates that the
VM boots and the marionette REPL is reachable. Add
test-vps / test-vps-fresh Makefile targets with cache.
Jakub Czajka [Wed, 15 Jul 2026 22:37:29 +0000 (22:37 +0000)]
[vps] Module-ify vps-system and vps-home;
update Makefile targets.
Convert vps-system.scm and vps-home.scm from plain Guile
scripts to proper modules with #:export. Update Makefile
build targets to use -L and -e syntax. Set dak shell to
bash and add sudoers entry.
Jakub Czajka [Mon, 13 Jul 2026 22:06:32 +0000 (22:06 +0000)]
[vps] Extract sshd configuration into conf/vps/sshd.scm.
Move the inline openssh-configuration out of vps-system.scm into a
dedicated module. Update settings to match the reference sshd_config:
port 72, disable password auth, tune keepalive timeouts, and accept
locale environment variables. Only override fields that differ from
the Guix defaults.
Jakub Czajka [Sun, 12 Jul 2026 20:23:48 +0000 (22:23 +0200)]
[vps] Install paseo and Claude Code in vps-home.scm.
Add imports for (conf home paseo) and (conf home claude), a packages
field with claude-code, and paseo-service plus paseo-daemon-service
to the VPS home configuration.
Jakub Czajka [Thu, 9 Jul 2026 16:21:29 +0000 (18:21 +0200)]
[home] Simplify and clarify npm-install-build-system
Rename functions for clarity, drop coreutils dependency, merge
helpers into the build system as an inline lambda. Reduce four
top-level definitions to two.
Jakub Czajka [Tue, 7 Jul 2026 15:11:14 +0000 (17:11 +0200)]
[style] Separate then from if in shell scripts.
Move 'then' to its own line after 'if' for readability. Also
converts the remaining extended regex patterns in guix-check to basic
regex, and fixes a comment case in notify.
Jakub Czajka [Tue, 7 Jul 2026 16:13:40 +0000 (18:13 +0200)]
[home] Add paseo CLI package and services.
The paseo daemon spawns Claude Code agents, so CLAUDE_CONFIG_DIR is
set in the daemon environment to point to ~/.config/claude/, where the
home claude service installs its configuration. This ensures spawned
agents find their config without relying on shell init files.
Jakub Czajka [Mon, 6 Jul 2026 10:23:44 +0000 (12:23 +0200)]
[ai] Replace guard-commands with block-builds, block, and create hooks.
Splits the monolithic guard-commands hook into three single-purpose
hooks with more granular matchers in settings.json.
block-builds:
Guards guix and make build/reconfigure commands. Asks on main,
denies in for destructive operations (reconfigure,
home-*, system-*).
block:
Denies git checkout/switch outright. Enforces Enter
(must not already be in a ) and Exit (must not
have unpushed commits diverging from main). Sends a desktop
notification on Enter success.
create:
Uses a universal matcher ("*") to deny all tool calls on main
unless already inside the session's . Allows
Enter through to let the user enter an isolated session.
Jakub Czajka [Mon, 6 Jul 2026 09:43:07 +0000 (11:43 +0200)]
[ai] Move ask-build-queue from hooks/ to scripts/.
Relocates the build-queue dialog from the hooks directory to the
scripts directory, reflecting its role as a manually-invoked helper
rather than an automatic hook. Also adds branch-awareness: the
script now asks about builds on non-main branches and reconfigures
on main.
Jakub Czajka [Mon, 6 Jul 2026 08:37:59 +0000 (10:37 +0200)]
[ai] Add status-line hook showing session in prompt.
Displays the current session ID or branch name in the
Claude Code status line, making it visible at a glance whether
the session is running in an isolated or on main.
Jakub Czajka [Tue, 23 Jun 2026 20:49:10 +0000 (22:49 +0200)]
[ai] Extract build-queue dialog to standalone ask-build-queue script.
Move the AskUserQuestion dialog out of the guix-build Stop hook into
a separate script so it can be invoked proactively (before code changes
begin) rather than only at Stop time.
- ask-build-queue: new script with the build-target selection dialog.
Exits early if a queue file already exists for the session.
- guix-build: simplified to use $CLAUDE_CODE_SESSION_ID directly
instead of JSON parsing. Delegates the no-queue case to
ask-build-queue.
- CLAUDE.md: instructs to run ask-build-queue before any prompt that
looks like it will modify code.
Jakub Czajka [Mon, 22 Jun 2026 08:56:24 +0000 (10:56 +0200)]
[home] Use guix repl as the Geiser Guile REPL backend.
Set geiser-guile-binary to ("guix" "repl") so the Geiser REPL
starts inside the Guix execution environment, giving it access to all
Guix-installed Guile libraries.
Jakub Czajka [Sun, 21 Jun 2026 13:43:30 +0000 (15:43 +0200)]
[home] Add desktop notification hooks for Claude Code.
Send dunstify notifications on permission_prompt and idle_prompt
events via a shell script alongside the existing guix-check hook.
Uses a single Notification matcher entry in project settings.json
referenced via CLAUDE_PROJECT_DIR.
Jakub Czajka [Sat, 20 Jun 2026 22:39:24 +0000 (00:39 +0200)]
[home] Introduce Claude Code settings.json installed via Guix home.
- Add claude/.config/claude/settings.json with model overrides, max
- effort and apiKeyHelper wired to pass.
- Add conf/home/claude.scm service module bundling the claude-code
package with its dotfile.
- Wire claude-service into home.scm, replacing the raw claude-code
package.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Jakub Czajka [Sat, 20 Jun 2026 22:38:14 +0000 (00:38 +0200)]
[emacs] Add geiser-guile and flymake-guile for Scheme editing.
Configure geiser-guile and flymake-guile in conf-lisp.el, gated on the
guile binary being present for portability. Document the Lisp/Scheme
ecosystem and the environment variables set in .dir-locals.el.
Update .dir-locals.el copyright year to 2026.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Jakub Czajka [Sat, 20 Jun 2026 21:44:28 +0000 (23:44 +0200)]
[home] Fix duplicate service type conflict in home reconfigure.
home-symlink-service-type was named 'home-profile', colliding with
the built-in home-profile-service-type. Additionally, both
profile-service (bash.scm) and channels-service (guix.scm) directly
instantiated home-symlink-service-type — but Guix allows only one
direct (service <type> ...) per service type across the entire service
graph.
Changes:
- symlink.scm: Rename service type from 'home-profile' to
'home-symlink', reflecting its actual purpose.
- bash.scm: Route profile-service through home-program-service-type
(which extends home-symlink-service-type via service-extension)
instead of directly instantiating it. Remove unused
(conf home symlink) import.
- guix.scm: Same for channels-service. Switch import from
(conf home symlink) to (conf home program).
Service extensions can be merged by Guix; direct instantiations
cannot, hence the "more than one target service" error.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Jakub Czajka [Sat, 20 Jun 2026 21:40:24 +0000 (23:40 +0200)]
[home] Install Claude Code.
Introduce a Guix package for the upstream Claude Code binary. The
binary is prebuilt for FHS systems, so wrap it in a shell script that
sets LD_LIBRARY_PATH to Guix store paths and invokes it via ld-linux.
Set CLAUDE_CONFIG_DIR to store its configuration under ~/.config/claude
instead of ~/.claude. Document manual version-update instructions in
the README.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Jakub Czajka [Sat, 20 Jun 2026 20:58:16 +0000 (22:58 +0200)]
[emacs] Set Guile environment variables in dir-locals.
.dir-locals.el now sets GUILE_LOAD_PATH and GUILE_LOAD_COMPILED_PATH
so that Emacs can compile Guile files with guild compile. TAGS file is
no longer necessary as geiser provides references.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Jakub Czajka [Sun, 12 May 2024 10:54:23 +0000 (12:54 +0200)]
[system] Explicly disable Wayland.
Accordion to documentation, `(wayland? #f)` is the default
setting. However, Guix installed Xwayland which broke the
system. By disabling Wayland explicitly Guix returned to Xorg.
Jakub Czajka [Sat, 24 Dec 2022 12:31:41 +0000 (13:31 +0100)]
[home] Install custom st.
This commit installs custom version of the st terminal. It includes
the libxft-bgra patche and more. The source code is obtained from a
self-hosted git instance.
Jakub Czajka [Fri, 23 Dec 2022 19:57:37 +0000 (20:57 +0100)]
[common] Package libxft with the bgra patch.
Libxft has a bug which crashes the library when displaying colorful
emojis. A patch is available online. This commit packages libxft with
the patch applied.