____ _ _ _ ____
/ ___| | \ | | / \ | _ \
| | _ | \| | / _ \ | |_) |
| |_| | | |\ | / ___ \ | _ <
\____| |_| \_| /_/ \_\ |_| \_\
GNAR is an opinionated home-server bootstrap for Arch Linux. One script turns a fresh install into a headless box for remote development over SSH.
It is intentionally heavy — a personal home-server bootstrap, not a minimal TTY distribution.
What you get
- Shell — zsh + Oh My Zsh + Spaceship prompt, tmux with vim-style splits
- Editor — code-server (VS Code in the browser) at
http://vscode.local, plus neovim - Kiosk dashboard — plug a display into the box,
gnar-dashboardauto-launches a 4-pane TUI (btop + services + docker/pm2 + Claude Code stats) under Hyprland. Truly headless = no-op. - Web — Caddy reverse proxy with automatic HTTPS,
add-site <name> <port> - Containers — Docker + docker-compose
- Databases — PostgreSQL, Valkey, sqlite
- Runtimes — Node (npm/yarn/pnpm/bun/pm2), Python (uv), Ruby, Rust, Go, Java
- AI — Claude Code (
claude), reads~/CLAUDE.mdfor system context - Snapshots — Snapper +
snap-pacauto-snapshot everypacmantransaction (btrfs only); boot-into-snapshot via GRUB recovers from a bad update in 30s - Modern CLI — eza, bat, fd, fzf, zoxide, ripgrep, jq, fastfetch, btop
- Security — UFW deny-incoming, fail2ban sshd jail, hardened SSH
Requirements
A fresh Arch Linux install with a non-root user that has sudo access.
Installation
Git (Recommended)
git clone https://github.com/iammatthias/gnar.git
cd gnar
sudo ./scripts/setup.sh
Curl
curl -L https://github.com/iammatthias/gnar/archive/main.tar.gz | tar xz
cd gnar-main
sudo ./scripts/setup.sh
Wget
wget https://github.com/iammatthias/gnar/archive/main.tar.gz
tar xzf main.tar.gz
cd gnar-main
sudo ./scripts/setup.sh
Post-installation
sudo reboot # Reload group memberships, etc.
ssh user@your-server # Reconnect
tmux # Tiling terminal
gnar-info # System information
gnar-help # Command reference
add-site myapp 3000 # Reverse-proxy a service through Caddy
The code-server password is generated at install time and printed once. It is also saved (mode 600) at ~/.config/code-server/config.yaml. Use vscode-password to print it later.
Uninstall
sudo ./scripts/uninstall.sh