This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

2configs/kanvibe: replace vibe-kanban with kanvibe fork

+290 -105
+164
2configs/kanvibe.nix
··· 1 + { 2 + self, 3 + config, 4 + pkgs, 5 + ... 6 + }: 7 + let 8 + kanvibe = self.packages.${pkgs.system}.kanvibe; 9 + port = 4242; 10 + in 11 + { 12 + users.users.kanban = { 13 + isNormalUser = true; 14 + home = "/var/lib/kanvibe"; 15 + createHome = true; 16 + group = "users"; 17 + openssh.authorizedKeys.keys = [ 18 + self.keys.ssh.barnacle.public 19 + self.keys.ssh.yubi_pgp.public 20 + self.keys.ssh.yubi1.public 21 + self.keys.ssh.yubi2.public 22 + self.keys.ssh.solo2.public 23 + self.keys.ssh.xerxes.public 24 + self.keys.ssh.massulus.public 25 + ]; 26 + }; 27 + 28 + clan.core.vars.generators.vibe-kanban = { 29 + files."htpasswd" = { 30 + owner = "root"; 31 + group = "nginx"; 32 + mode = "0640"; 33 + }; 34 + files."password" = { 35 + owner = "kanban"; 36 + group = "kanban"; 37 + mode = "0400"; 38 + }; 39 + runtimeInputs = with pkgs; [ 40 + apacheHttpd 41 + coreutils 42 + ]; 43 + script = '' 44 + password=$(head -c 32 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9' | head -c 24) 45 + echo "$password" > "$out/password" 46 + htpasswd -nbB kanban "$password" > "$out/htpasswd" 47 + ''; 48 + }; 49 + 50 + services.postgresql = { 51 + enable = true; 52 + ensureDatabases = [ "kanban" ]; 53 + ensureUsers = [ 54 + { 55 + name = "kanban"; 56 + ensureDBOwnership = true; 57 + } 58 + ]; 59 + }; 60 + 61 + systemd.services.kanvibe = { 62 + description = "KanVibe AI Agent Kanban Board"; 63 + wantedBy = [ "multi-user.target" ]; 64 + after = [ 65 + "network-online.target" 66 + "postgresql.service" 67 + ]; 68 + wants = [ "network-online.target" ]; 69 + requires = [ "postgresql.service" ]; 70 + 71 + path = with pkgs; [ 72 + tmux 73 + git 74 + openssh 75 + nodejs 76 + bash 77 + coreutils 78 + nix 79 + ]; 80 + 81 + environment = { 82 + PORT = toString port; 83 + NODE_ENV = "production"; 84 + KANVIBE_USER = "kanban"; 85 + }; 86 + 87 + serviceConfig = { 88 + Type = "simple"; 89 + LoadCredential = "password:${config.clan.core.vars.generators.vibe-kanban.files."password".path}"; 90 + ExecStart = 91 + let 92 + startScript = pkgs.writeShellScript "kanvibe-start" '' 93 + export KANVIBE_PASSWORD="$(cat "$CREDENTIALS_DIRECTORY/password")" 94 + export DATABASE_URL="postgresql:///kanban?host=/run/postgresql" 95 + 96 + # Run TypeORM migrations 97 + cd ${kanvibe}/lib/kanvibe 98 + ${pkgs.nodejs}/bin/node -e " 99 + require('tsx/cjs'); 100 + const ds = require('./src/lib/typeorm-cli.config.ts').default; 101 + ds.initialize().then(d => d.runMigrations()).then(() => { console.log('Migrations done'); process.exit(0); }).catch(e => { console.error(e); process.exit(1); }); 102 + " 103 + 104 + exec ${kanvibe}/bin/kanvibe 105 + ''; 106 + in 107 + toString startScript; 108 + Restart = "on-failure"; 109 + RestartSec = 10; 110 + User = "kanban"; 111 + Group = "users"; 112 + WorkingDirectory = "/var/lib/kanvibe"; 113 + 114 + # Hardening 115 + NoNewPrivileges = true; 116 + ProtectSystem = "strict"; 117 + ProtectHome = "read-only"; 118 + ReadWritePaths = [ "/var/lib/kanvibe" ]; 119 + PrivateTmp = true; 120 + }; 121 + }; 122 + 123 + services.nginx.virtualHosts."kanban.lassul.us" = { 124 + enableACME = true; 125 + forceSSL = true; 126 + locations."/" = { 127 + proxyPass = "http://127.0.0.1:${toString port}"; 128 + proxyWebsockets = true; 129 + extraConfig = '' 130 + auth_basic "Kanban"; 131 + auth_basic_user_file ${config.clan.core.vars.generators.vibe-kanban.files."htpasswd".path}; 132 + proxy_set_header Host $host; 133 + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 134 + proxy_set_header X-Forwarded-Proto $scheme; 135 + proxy_read_timeout 300s; 136 + proxy_send_timeout 300s; 137 + ''; 138 + }; 139 + locations."/api/terminal/" = { 140 + proxyPass = "http://127.0.0.1:${toString (port - 1)}"; 141 + proxyWebsockets = true; 142 + extraConfig = '' 143 + auth_basic "Kanban"; 144 + auth_basic_user_file ${config.clan.core.vars.generators.vibe-kanban.files."htpasswd".path}; 145 + proxy_set_header Host $host; 146 + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 147 + proxy_set_header X-Forwarded-Proto $scheme; 148 + proxy_read_timeout 3600s; 149 + proxy_send_timeout 3600s; 150 + ''; 151 + }; 152 + locations."/api/board/" = { 153 + proxyPass = "http://127.0.0.1:${toString (port - 1)}"; 154 + proxyWebsockets = true; 155 + extraConfig = '' 156 + auth_basic "Kanban"; 157 + auth_basic_user_file ${config.clan.core.vars.generators.vibe-kanban.files."htpasswd".path}; 158 + proxy_set_header Host $host; 159 + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 160 + proxy_set_header X-Forwarded-Proto $scheme; 161 + ''; 162 + }; 163 + }; 164 + }
-100
2configs/vibe-kanban.nix
··· 1 - { 2 - self, 3 - config, 4 - pkgs, 5 - ... 6 - }: 7 - let 8 - vibe-kanban-base = self.inputs.llm-agents.packages.${pkgs.system}.vibe-kanban; 9 - # HACK: binary-patch pinned claude-code version for claude 4.6 support 10 - # TODO: fork upstream and bump properly, then submit PR 11 - vibe-kanban = vibe-kanban-base.overrideAttrs (old: { 12 - postInstall = (old.postInstall or "") + '' 13 - ${pkgs.gnused}/bin/sed -i 's|@anthropic-ai/claude-code@2\.1\.45|@anthropic-ai/claude-code@2.1.71|g' $out/bin/vibe-kanban 14 - ''; 15 - }); 16 - port = 4242; 17 - in 18 - { 19 - users.users.kanban = { 20 - isNormalUser = true; 21 - home = "/var/lib/vibe-kanban"; 22 - createHome = true; 23 - group = "users"; 24 - useDefaultShell = true; 25 - openssh.authorizedKeys.keys = [ 26 - self.keys.ssh.barnacle.public 27 - self.keys.ssh.yubi_pgp.public 28 - self.keys.ssh.yubi1.public 29 - self.keys.ssh.yubi2.public 30 - self.keys.ssh.solo2.public 31 - self.keys.ssh.xerxes.public 32 - self.keys.ssh.massulus.public 33 - ]; 34 - }; 35 - 36 - clan.core.vars.generators.vibe-kanban = { 37 - files."htpasswd" = { 38 - owner = "root"; 39 - group = "nginx"; 40 - mode = "0640"; 41 - }; 42 - files."password" = { }; 43 - runtimeInputs = with pkgs; [ 44 - apacheHttpd 45 - coreutils 46 - ]; 47 - script = '' 48 - password=$(head -c 32 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9' | head -c 24) 49 - echo "$password" > "$out/password" 50 - htpasswd -nbB kanban "$password" > "$out/htpasswd" 51 - ''; 52 - }; 53 - 54 - systemd.services.vibe-kanban = { 55 - description = "Vibe Kanban Board"; 56 - wantedBy = [ "multi-user.target" ]; 57 - after = [ "network-online.target" ]; 58 - wants = [ "network-online.target" ]; 59 - 60 - path = [ 61 - pkgs.nodejs 62 - pkgs.git 63 - pkgs.bash 64 - pkgs.coreutils 65 - pkgs.nix 66 - ]; 67 - 68 - environment = { 69 - HOST = "127.0.0.1"; 70 - PORT = toString port; 71 - }; 72 - 73 - serviceConfig = { 74 - ExecStart = "${vibe-kanban}/bin/vibe-kanban"; 75 - Restart = "on-failure"; 76 - RestartSec = 10; 77 - User = "kanban"; 78 - Group = "users"; 79 - WorkingDirectory = "/var/lib/vibe-kanban"; 80 - }; 81 - }; 82 - 83 - services.nginx.virtualHosts."kanban.lassul.us" = { 84 - enableACME = true; 85 - forceSSL = true; 86 - locations."/" = { 87 - proxyPass = "http://127.0.0.1:${toString port}"; 88 - proxyWebsockets = true; 89 - extraConfig = '' 90 - auth_basic "Vibe Kanban"; 91 - auth_basic_user_file ${config.clan.core.vars.generators.vibe-kanban.files."htpasswd".path}; 92 - proxy_set_header Host $host; 93 - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 94 - proxy_set_header X-Forwarded-Proto $scheme; 95 - proxy_read_timeout 300s; 96 - proxy_send_timeout 300s; 97 - ''; 98 - }; 99 - }; 100 - }
+121
5pkgs/kanvibe/package.nix
··· 1 + { 2 + lib, 3 + stdenv, 4 + nodejs, 5 + pnpm_10, 6 + fetchPnpmDeps, 7 + pnpmConfigHook, 8 + makeWrapper, 9 + tmux, 10 + git, 11 + openssh, 12 + fetchFromGitHub, 13 + }: 14 + 15 + let 16 + src = fetchFromGitHub { 17 + owner = "Lassulus"; 18 + repo = "kanvibe"; 19 + rev = "6887b163b7ab36c2f4f41bd02bf6c648ebe85840"; 20 + hash = "sha256-FTszbYyYlTqDJxHVRPV9VMu9i+gRrdTq1du1nbzHjdA="; 21 + }; 22 + in 23 + stdenv.mkDerivation (finalAttrs: { 24 + pname = "kanvibe"; 25 + version = "0.1.0"; 26 + 27 + inherit src; 28 + 29 + nativeBuildInputs = [ 30 + nodejs 31 + pnpm_10 32 + pnpmConfigHook 33 + makeWrapper 34 + ]; 35 + 36 + pnpmDeps = fetchPnpmDeps { 37 + pname = "kanvibe"; 38 + inherit (finalAttrs) version src; 39 + pnpm = pnpm_10; 40 + hash = "sha256-POorUzaa5JFmQygDNlGY7G4XoZOf7iW6UIyqgmF05b0="; 41 + fetcherVersion = 2; 42 + }; 43 + 44 + buildPhase = '' 45 + runHook preBuild 46 + 47 + export NEXT_TELEMETRY_DISABLED=1 48 + 49 + # Set default locale to English 50 + substituteInPlace src/i18n/routing.ts \ 51 + --replace-fail 'defaultLocale: "ko"' 'defaultLocale: "en"' 52 + 53 + # Patch out Google Fonts (no network in sandbox) 54 + substituteInPlace src/app/\[locale\]/layout.tsx \ 55 + --replace-fail 'import { Inter } from "next/font/google";' "" \ 56 + --replace-fail 'const inter = Inter({ 57 + variable: "--font-inter", 58 + subsets: ["latin"], 59 + });' 'const inter = { variable: "" };' 60 + 61 + pnpm build 62 + 63 + # Replace @/ path aliases with absolute paths for runtime tsx resolution 64 + # (Next.js require-hook interferes with tsx's tsconfig paths resolution) 65 + find . -name '*.ts' -not -path './node_modules/*' -not -path './.next/*' \ 66 + -exec sed -i "s|from \"@/|from \"$out/lib/kanvibe/src/|g" {} + 67 + find . -name '*.ts' -not -path './node_modules/*' -not -path './.next/*' \ 68 + -exec sed -i "s|from '@/|from '$out/lib/kanvibe/src/|g" {} + 69 + 70 + runHook postBuild 71 + ''; 72 + 73 + installPhase = '' 74 + runHook preInstall 75 + 76 + mkdir -p $out/lib/kanvibe 77 + 78 + # Copy the built Next.js app 79 + cp -r .next $out/lib/kanvibe/.next 80 + 81 + # Copy runtime files 82 + cp boot.js $out/lib/kanvibe/ 83 + cp server.ts $out/lib/kanvibe/ 84 + cp next.config.ts $out/lib/kanvibe/ 85 + cp package.json $out/lib/kanvibe/ 86 + cp tsconfig.json $out/lib/kanvibe/ 87 + cp -r src $out/lib/kanvibe/src 88 + cp -r messages $out/lib/kanvibe/messages 89 + cp -r public $out/lib/kanvibe/public 2>/dev/null || true 90 + 91 + # node_modules needed at runtime (tsx, typeorm, node-pty, etc.) 92 + cp -r node_modules $out/lib/kanvibe/node_modules 93 + 94 + mkdir -p $out/bin 95 + # Patch boot.js to chdir to package directory so tsx finds tsconfig.json 96 + substituteInPlace $out/lib/kanvibe/boot.js \ 97 + --replace-fail 'require("tsx/cjs");' \ 98 + 'process.chdir(__dirname); require("tsx/cjs");' 99 + 100 + makeWrapper ${nodejs}/bin/node $out/bin/kanvibe \ 101 + --add-flags "$out/lib/kanvibe/boot.js" \ 102 + --set NODE_ENV production \ 103 + --prefix PATH : ${ 104 + lib.makeBinPath [ 105 + tmux 106 + git 107 + openssh 108 + ] 109 + } 110 + 111 + runHook postInstall 112 + ''; 113 + 114 + meta = { 115 + description = "AI Agent Task Management Kanban Board"; 116 + homepage = "https://github.com/Lassulus/kanvibe"; 117 + license = lib.licenses.agpl3Only; 118 + mainProgram = "kanvibe"; 119 + platforms = lib.platforms.unix; 120 + }; 121 + })
+3 -3
machines/neoprism/backup.nix
··· 31 31 "/var/lib/matrix-synapse/media_store/local_content" 32 32 "/var/lib/radicale" 33 33 "/home/bot" 34 - "/var/lib/vibe-kanban" 34 + "/var/lib/kanvibe" 35 35 "/var/vmail" 36 36 "/var/dkim" 37 37 "/var/sieve" ··· 41 41 "/home/bot/.cache" 42 42 "/home/bot/.nix-defexpr" 43 43 "/home/bot/.nix-profile" 44 - "/var/lib/vibe-kanban/.cache" 45 - "/var/lib/vibe-kanban/.npm" 44 + "/var/lib/kanvibe/.cache" 45 + "/var/lib/kanvibe/.npm" 46 46 ]; 47 47 repo = "u550643@u550643.your-storagebox.de:/./neoprism"; 48 48 encryption.mode = "none";
+2 -2
machines/neoprism/config.nix
··· 68 68 # opencrow matrix bot 69 69 ../../2configs/opencrow.nix 70 70 71 - # vibe kanban 72 - ../../2configs/vibe-kanban.nix 71 + # kanvibe (kanban board) 72 + ../../2configs/kanvibe.nix 73 73 74 74 # backups 75 75 ./backup.nix