Bootstrap Linux Runbook
Aug 2026 · Greenfield native install · Debian/Ubuntu (apt) · bare metal
Scope / assumptions
- Fresh Debian/Ubuntu install, no prior config on the box.
- Greenfield — self-contained for native metal, not reusing WSL2/Termux notes (different targets: Windows subsystem / Android).
- Remote-usage check: Claude Code, Gemini CLI, OpenCode all need a local binary/runtime — none has a zero-config remote mode, so local install stays top priority.
- No GUI apps, gaming, or browser extensions here — out of scope (see other files in this folder).
Order of operations active — do now
Assumes base system already normalized (see Deferred → Normalization script) before starting at step 1.
1 Node.js runtime — dependency for step 2
- Install via
nvm (preferred — avoids sudo for global npm installs)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
nvm install --lts
node -v && npm -v
2 CLI AI assistants — highest priority tier
- Claude Code — native installer
curl -fsSL https://claude.ai/install.sh | bash
npm install -g @google/gemini-cli
- OpenCode — native installer works directly on Linux metal (unlike Termux, which needed proot-distro workarounds)
curl -fsSL https://opencode.ai/install | bash
claude --version
gemini --version
opencode --version
Auth/login each — interactive, can't fully automate. Manual step per install.
3 Core dev tooling
git — set global user.name/email
- GitHub CLI (
gh) via apt repo, then gh auth login
- Docker Engine (not Docker Desktop — Windows/Mac only) via official apt repo, add user to
docker group
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
Deferred not needed right now
Normalization script
Was section 1 — base system prep. Pulled out to script separately; runs before step 1 above once written.
sudo apt update && sudo apt full-upgrade -y
sudo apt install -y curl git build-essential ca-certificates unzip
- Confirm shell (
bash/zsh) and default locale
Automation wrapper
- Once steps 1–3 above are confirmed working manually, consolidate into
bootstrap.sh
- Idempotent checks (
command -v X || install) per tool, matching the pattern already used in AI_Tools_Setup.ps1
- Held until confirmed/amended
Final stage
Was section 6 / appendix.
- Desktop environment / GUI apps
- VPN, backup sync tools (Syncthing, Dropbox, etc.)
- Browser + extensions
- Anything gaming-related
Access options — reaching this runbook/script from a fresh laptop
For serving files from this machine to fresh laptops on the same network. Pick one, both work side by side.
Option A — by IP simplest
- Serve this folder, then on the fresh laptop:
curl -fsSL http://192.168.8.209:8000/bootstrap.sh | bash
Reserve this IP via router DHCP reservation so it never changes.
Option B — by mDNS hostname confirmed working on this laptop
curl -fsSL http://Yoguillo2512.local:8000/bootstrap.sh | bash
No DNS server needed — Windows advertises this natively. Works if the fresh Linux box resolves .local names (true out of box on Ubuntu Desktop live ISOs).
Start the server on this machine
python -m http.server 8000
Run from the folder containing bootstrap.sh. Allow the port through Windows Firewall on the Private profile if prompted.
Open items to confirm before scripting
- Exact OpenCode repo/install command to pin (check current docs)
- Whether Claude Code / Gemini CLI / OpenCode auth can be pre-seeded via env vars/config file for unattended setup, or must stay manual per install
- Docker: needed day one, or defer to Final stage?