Herramientas CLI de escritorio (pop-os / minibook)

Set base de herramientas de línea de comandos que se instalan en cada computadora personal nueva con Pop!_OS, todas vía repo apt oficial del proveedor (no snap, no instaladores curl-pipe-bash salvo donde no hay alternativa) para que apt upgrade las mantenga sin fricción.

HerramientaRepoLogin
gcloud CLIpackages.cloud.google.com/aptgcloud auth login (browser)
GitHub CLI (gh)cli.github.com/packagesgh auth login --web (device code)
cloudflaredpkg.cloudflare.comcloudflared tunnel login (browser)
Bitwarden CLI (bw)npm global, sobre Node 20bw login <email> (master password)

gcloud

gcloud config set project project-vm-personal
gcloud config set compute/zone us-central1-a
gcloud config set compute/region us-central1

gcloud config set para compute/zone y compute/region falla con «You do not currently have an active account selected» si se corre antes de gcloud auth login — a diferencia de core/project, que sí se puede fijar sin cuenta activa. Hay que loguearse primero.

Bitwarden CLI — requiere Node 20

Node 18 (el que trae Ubuntu/Pop!_OS por default) da error Web Crypto API is unavailable al correr bw. Se instala Node 20 vía NodeSource solo para esto:

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo npm install -g @bitwarden/cli
bw config server https://vault.estebanalcocer.cloud

Bug conocido de la extensión de navegador (no del CLI): la extensión 2026.7.0 no muestra items contra el Vaultwarden self-hosted — error en consola invalid type: JsValue(...), expected a string, issue abierto en el repo oficial. El Web Vault y el CLI funcionan bien contra el mismo servidor; el bug es específico de la extensión. Solución temporal: downgrade de la extensión a 2026.6.1.

Sudo sin contraseña

sudo tee /etc/sudoers.d/esteban-nopasswd > /dev/null << 'EOF'
esteban ALL=(ALL) NOPASSWD: ALL
EOF
sudo visudo -c -f /etc/sudoers.d/esteban-nopasswd
sudo chmod 440 /etc/sudoers.d/esteban-nopasswd

A diferencia de vm-personal, que también corre sin contraseña para funcionar como jump host, acá no hay una razón de automatización detrás — es simplemente comodidad en una máquina de uso personal exclusivo. Queda documentado como decisión consciente, no como default: quita la barrera de reconfirmación en cualquier comando con sudo, y no se activó autologin del sistema operativo en paralelo (se evaluó y se descartó por riesgo de dejar el boot atorado).

Claude Code + tmux

Claude Code se instala con el instalador nativo (curl https://claude.ai/install.sh | bash), sin depender de Node.js. Se corre normalmente dentro de una sesión de tmux nombrada, para poder desconectarse sin matar el proceso:

tmux new-session -d -s claude-general 'claude'
tmux attach -t claude-general

En pop-os (t640-pop) esto está además automatizado, solo por cron: ~/.local/bin/tmux-claude-watchdog.sh (crontab de usuario, cada minuto) crea la sesión t640-pop si no existe y la relanza si se cierra o truena durante el día — mismo script que el watchdog de ctunlinux, instalado ahí primero y replicado acá el 2026-09-02.

Al principio se instaló también tmux-t640-pop.service (systemd --user, Type=oneshot) para replicar exactamente el patrón de ctunlinux, pero se eliminó el mismo día — el watchdog de cron ya cubre por sí solo tanto la creación inicial (dispara igual en el primer tick tras un reboot) como la vigilancia en caliente, y Restart= de systemd no sirve para esto de todas formas (tmux new-session -d desacopla el proceso del árbol que systemd rastrea, así que nunca se entera si claude truena adentro). Mantener las dos unidades era redundancia sin ganancia — veredicto completo.

Véase también

  • NetBird — también se instala en cada host nuevo, pero tiene página propia por ser infraestructura compartida con las VMs
  • Syncthing — ídem