pinwheel: Add ct for side threads in Claude Code sessions

Install ct from its flake, with its config, a tmux menu on prefix T and a user service for the web UI. Also keep Claude Code transcripts for ten years instead of 30 days, since threads are meant to be revisited.
This commit is contained in:
Alexander Heldt committed 2026-10-27 14:49:43 +01:00
1 parent a74e75d9ab
commit cd807b550f
3 files changed
+77

No files matched your search

+49
View File
@@ -1,4 +1,5 @@
{
inputs,
pkgs,
lib,
config,
@@ -7,6 +8,25 @@
let
enabled = config.mod.ai.enable;
ct = inputs.ct.packages.${pkgs.stdenv.hostPlatform.system}.default;
ctConfig = builtins.toJSON {
addr = "127.0.0.1:7777";
open = "split";
defaultProfile = "personal";
profiles = {
work = {
configDir = "/home/alex/.claude-work";
tmuxSession = "w";
paths = [ "/home/alex/code/work" ];
};
personal = {
configDir = "/home/alex/.claude-personal";
tmuxSession = "p";
};
};
};
# Shared statusline: show the logged-in account email.
statusLine = {
type = "command";
@@ -27,6 +47,7 @@ let
inherit statusLine;
theme = "dark";
editorMode = "vim";
cleanupPeriodDays = 3650;
attribution = {
commit = "";
pr = "";
@@ -57,6 +78,7 @@ in
home-manager.users.alex = {
home.packages = [
pkgs.claude-code
ct
];
programs.zsh.shellAliases = {
@@ -67,6 +89,33 @@ in
home.file.".claude-work/settings.json".text = settings;
home.file.".claude-personal/settings.json".text = settings;
xdg.configFile."ct/config.json".text = ctConfig;
programs.tmux.extraConfig = lib.mkAfter ''
bind-key T display-menu -T "ct" \
"New thread (full context)" t 'display-popup -EE -w 80 -h 10 -T " new thread " "ct thread --pane #{pane_id}"' \
"New thread (pick turns)" p 'display-popup -EE -w 90% -h 90% -T " pick turns " "ct thread --pick --pane #{pane_id}"' \
"" \
"Browse threads" b 'display-popup -EE -w 90% -h 90% -T " threads " "ct --pane #{pane_id}"' \
"Open in browser" w 'run-shell -b "ct web --pane #{pane_id}"'
'';
systemd.user.services.ct-web = {
Unit = {
Description = "ct web UI";
};
Service = {
Type = "simple";
ExecStart = "${lib.getExe ct} serve";
Environment = "TMUX_TMPDIR=%t";
Restart = "on-failure";
RestartSec = 5;
};
Install = {
WantedBy = [ "default.target" ];
};
};
};
};
}