Personal workstation bootstrap scripts.
keydwithCaps Lockremapped toEscapefor all keyboards, plus optional per-keyboard profiles inkeyd/profiles/- Spanish (Catalan ·) keyboard layout via
localectland GNOME input sources - English user directories (
Desktop,Downloads, etc.) - CLI tools:
ripgrep,fd,zoxide,btop,jq,lazygit,shellcheck,gh(GitHub apt repo),glab(GitLab release .deb) - Neovim config from
https://github.com/sergio-gimenez/lazyvim-config - LaTeX: TeX Live,
latexmk,biber,chktex,zathura(what the LazyVimlang.texextra expects) gpaste-2clipboard history manager withSuper+Ckeybindingflameshotbound toShift+Ctrl+Home; GNOME's screenshot UI moved toShift+Ctrl+Endzshwith Oh-My-Zsh,fzf,zsh-autosuggestions,zsh-syntax-highlighting, andautoswitch_virtualenv- Ghostty from the
mkasberg/ghostty-ubuntu.deb for the running Debian/Ubuntu release, with the Neovim theme (dotfiles/ghostty/themes/tokyonight-nvim-{moon,day}, following GNOME light/dark) - herdr config in
dotfiles/herdr/(tokyonight moon/day like Neovim, auto light/dark switch, Ghostty-style keys:prefix+ctrl+e/prefix+ctrl+osplit down/right,ctrl+tab,ctrl+alt+arrowswhen Ghostty has no split; resize in herdr's defaultprefix+rmode, since Ghostty keepsctrl+shift+arrows); pluginsergio.agb(dotfiles/herdr/plugins/agb,prefix+aopens the agb session picker in a new tab; on hosts with Collie it keeps launcher rows in~/.config/collie/launchers.toml: one per recent session (AGB_COLLIE_ROWS, default 5) and, for each running session, one per other agb target (CX1 → CC2 · 29% free · <title>), each run asexec agb open <id> [--target T], each with a· YOLOtwin; rows use only stock Collie keys, so Collie updates without a patch; linked only whenagbis installed); herdr itself is not installed here - Docker CE from Docker's apt repo, plus
lazydocker - Agents: Node 24 from NodeSource when the system Node is older than 22, Claude Code (native installer), Codex and
claude-mermaid(npm, prefix~/.npm-global), OpenCode with theopencode-claude-memoryv2 plugin inopencode.jsonand thetokyonight-nvimtheme (moon/day) incli.json, Claude pluginscavemanandclaude-code-wakatime,~/.wakatime.cfgpointing at Wakapi, Claude Codetheme: autoin~/.claude*/settings.json(cc1, cc2, cc3) - One Claude Code memory for all accounts (cc1, cc2, cc3;
cc1()/cc2()/cc3()wrappers indotfiles/.zshrc):install-agb-memory.shsets"memory": {"share": [...]}on every agb setup profile to all the Claude accounts it targets, cc1 first, runsagb sync(the others' per-projectmemoryfolders become links to cc1's after merging; nothing deleted, replaced folders in~/.config/agentbridge/sync-backups/memory) and enables an hourlyagb-sync.timerso projects cc2 opens later join too; skipped when agb isn't installed - Flatpaks listed in
flatpaks.txt - Tactile GNOME extension with the config in
dotfiles/tactile/ - GNOME keybindings and desktop preferences (dark mode, clock, numlock, hot corners)
- Syncthing with the user service enabled and
~/Synccreated - Logseq graph cloned from Forgejo into
~/logseq-graph, with managed shortcuts and plugin registry - With
--gaming: Steam (Proton), MangoHud, GameMode, i386 Mesa, andrender/videogroup membership - With
--rdp(optional): GNOME Remote Login over RDP on port 3389, one headless GNOME session per connection
Source machine bootstrap for a new laptop:
make bootstrap-remote HOST=sergio-personal-laptopThen SSH into laptop, copy or pull this repo there, and run:
./install.shRun the full setup:
./install.shOn a machine with a real GPU (the desk VM on gem12), add the gaming stack:
./install.sh --gamingOptional remote desktop (GNOME Remote Login over RDP):
./install.sh --rdp # or on its own:
RDP_USER=sergio RDP_PASSWORD=... ./scripts/install-rdp.shThe account needs a real password for the GDM greeter (sudo passwd $USER;
cloud images lock it). Connect with Remmina from Flathub, which flatpaks.txt
installs. The Debian 1.4.39 package crashes on GNOME's server redirection.
Prompts only appear on a TTY. For unattended runs, answer them with env vars:
KEYD_PROFILES=sino-wealth WAKAPI_API_KEY=... ./install.shRun headless remote setup:
./install-headless.shRun individual parts:
./scripts/install-keyd.sh
./scripts/install-cli-tools.sh
./scripts/install-latex.sh
./scripts/install-docker.sh
./scripts/install-agents.sh
./scripts/install-flatpaks.sh
./scripts/install-tactile.sh
./scripts/install-gaming.sh
./scripts/install-keyboard.sh
./scripts/install-user-dirs.sh
./scripts/install-lazyvim.sh
./scripts/install-gpaste.sh
./scripts/install-flameshot.sh
./scripts/install-zsh.sh
./scripts/install-ghostty.sh
./scripts/install-syncthing.sh
./scripts/install-logseq.sh
./scripts/install-opencode.sh
./scripts/setup-remote-minimal.sh
./scripts/sync-ssh-to-remote.sh sergio-personal-laptop
./scripts/sync-agents-to-remote.sh sergio-personal-laptopinstall-headless.sh installs headless remote dev tools only: zsh, tmux, LazyVim, OpenCode, mosh, and CLI dependencies. It skips GUI, desktop, and hardware-specific setup.
- Root steps use
pkexecin a local desktop session andsudoover SSH (SUDO_PASSWORDfor scripted runs). install-keyboard.shsets X11 keyboard to Spanish (Catalan ·) vialocalectl.install-user-dirs.shsets user directories to English names.install-lazyvim.shinstalls the config in~/.config/nvim.install-lazyvim.shinstallsgitandneovimif they are missing.- If
~/.config/nvimalready exists and is not a git checkout, it is moved to a timestamped backup. install-flameshot.shinstalls Flameshot;sync-gnome-keybindings.showns every GNOME shortcut, including the terminal onCtrl+Alt+T.install-keyd.shasks per profile inkeyd/profiles/(KEYD_PROFILES=all|none|<names>skips the question). A profile that names a device id replacesdefault.conffor that keyboard.sino-wealthswaps PageUp and End.install-ghostty.shhas no apt repo to follow; re-run it to upgrade.install-rdp.shpatches three gaps in Debian 13's GNOME Remote Login: the GDM greeter doesn't start the handover daemon (autostart added to/usr/share/gdm/greeter/autostart/), the user-session handover unit gets stopped as gnome-shell starts (replaced by an/etc/xdg/autostartentry), and the daemon only reads credentials at start (restarted afterset-credentials). A blank Remmina window means a handover daemon is missing; checkjournalctl -u gnome-remote-desktop.install-agents.shnever stores the Wakapi key in the repo: it readsWAKAPI_API_KEYor prompts. The Codex WakaTime plugin still needs adding by hand.install-zsh.shinstalls Oh-My-Zsh and plugins, copies the.zshrcfromdotfiles/.zshrc, and changes the default shell to zsh.install-syncthing.shinstalls Syncthing, enables thesystemd --userservice, creates~/Sync, and prints the local device ID for phone pairing.install-logseq.shclonesssh://git@git.home.sergiogimenez.com/sergio/logseq-graph.gitwhen~/logseq-graphis missing, fast-forward pulls when the checkout is clean, and then restores the managed config into~/logseq-graph/.logseq/config.- If the existing Logseq graph checkout has local changes,
install-logseq.shskips the pull and leaves your worktree untouched. scripts/sync-ssh-to-remote.shis a source-machine helper: it copies your local~/.sshto a remote machine and fixes permissions so private Git remotes work before setup.scripts/sync-agents-to-remote.shis a source-machine helper: it copies your local~/.agentsto a remote machine so Caveman skills and lockfiles exist before setup.make bootstrap-remote HOST=...runs source-side bootstrap helpers for a new machine.- Set
SYNCTHING_SYNC_DIR,LOGSEQ_GRAPH_DIR, orLOGSEQ_GRAPH_REPO_URLbefore running a script if you want different target paths or a different remote.