Hawkup turns a fresh Ubuntu machine into a modern, terminal‑focused development environment: shell, tools, runtimes, Neovim, Docker, databases, fonts, and a small CLI to keep it all up to date.
- Supported OS: Ubuntu 24.04+ (Desktop/Server)
- Architecture: x86 (
x86_64/i686) only (checked during install) - Scope: terminal and CLI tooling only (no desktop apps)
Feel free to dig into the source code to see how things work. Will add more detailed documentation shortly.
Run as a regular sudo-enabled user on a fresh system.
From a fresh Ubuntu 24.04+ shell:
bash -c "$(curl -fsSL https://raw.githubusercontent.com/abhishekbhardwaj/hawkup/main/boot.sh)"The bootstrapper will:
- Ensure
gitis installed (fixing apt/dpkg locks first) - Clone Hawkup into
~/.local/share/hawkup - Run the installer and guide you through a few choices
You’ll be prompted to reboot at the end so group memberships and shell config take effect.
-
Terminal baseline
curl,git,unzip, build-essential,fzf,ripgrep,bat(viabatcat),eza,zoxide,plocate,fd(viafd-find), ImageMagick, libvips,mupdf,pipx, and more.
-
Shell & prompt (Bash)
- Replaces
~/.bashrcand~/.inputrcwith tuned defaults (backs up existing files as.bak). - Syncs
~/.config/bash/*(aliases, prompt, functions, init). - Starship prompt configured via
~/.config/starship.toml. HAWKUP_PATH/PATHwiring sohawkupis on PATH.- Secrets auto-loaded from
~/.secretsif present.
- Replaces
-
Languages via
mise- Installs
miseand any languages you select:Bun,Deno,Elixir(with Erlang),Go,Java,Node.js(LTS),PHP(+ Composer),Python,Ruby(+ Rails),Rust,Zig(+ ZLS).
- Installs
-
Docker & databases
- Official Docker engine + Buildx/Compose, user added to
dockergroup, conservative log rotation (/etc/docker/daemon.json). - Optional Dockerized databases: Redis (
redis:7), MySQL 8.4 (mysql:8.4), PostgreSQL 16 (postgres:16) with local client libs.
- Official Docker engine + Buildx/Compose, user added to
-
Editor & terminal apps
- Neovim from upstream tarball, with LazyVim starter, Catppuccin theme, transparency, tweaked options, and Neo-tree enabled.
lazygit,lazydocker,btop(with Catppuccin theme),fastfetch(with custom config), and GitHub CLI (gh).tldrviapipxfor simplified man pages.
-
Fonts & tmux
- Nerd Fonts (JetBrainsMono, FiraCode, Hack by default; configurable).
- Terminfo aliases for common modern terminals (Ghostty, Kitty, Alacritty, WezTerm,
tmux-256colorfallback). - Tmux config (
~/.tmux.conf) with Catppuccin theme and TPM plugins, installed and bootstrapped automatically (skippable).
-
Hawkup CLI
hawkuphelper for updates, migrations, config syncing, Nerd Fonts, secrets, Tailscale, and AI tooling.
- OS/arch check ensures Ubuntu 24.04+ on x86 before proceeding.
- You choose:
- Programming languages (via
gumTUI; defaults: Bun + Node.js). - Databases (Redis/MySQL/PostgreSQL) to run in Docker.
- Nerd Fonts to install (defaults: CascadiaMono, FiraMono, JetBrainsMono, Meslo).
- Programming languages (via
- You’re asked once for full name and email to configure global git identity.
- Existing dotfiles (
.bashrc,.inputrc,~/.config/bash) are backed up once and replaced with Hawkup defaults. ~/.secretsis created securely if missing and wired into the shell.
- Reboot when prompted (recommended) so:
- Docker group membership activates (no
sudofordocker). - Shell config, PATH, and terminfo tweaks are loaded everywhere.
- Docker group membership activates (no
- After reboot, open a new terminal and verify:
hawkupworks and is on PATH.docker run hello-worldworks withoutsudo.
- Ubuntu 24.04+ (enforced by
install/pre-flight/check-version.sh). - x86 CPU (
x86_64ori686); ARM is not supported yet. - Internet access (downloads packages, binaries, fonts, and configs).
sudoprivileges for package and system changes.
If you don’t want to use the one-liner:
# 1) Clone to the expected location
git clone https://github.com/abhishekbhardwaj/hawkup.git ~/.local/share/hawkup
# 2) Start the installer
HAWKUP_DIR="$HOME/.local/share/hawkup" bash ~/.local/share/hawkup/install.shYou can run Hawkup without prompts by exporting a few environment variables and then running the normal installer. This is useful for servers, CI images, or provisioning tools.
HAWKUP_USER_NAME="Jane Doe" \
HAWKUP_USER_EMAIL="jane@example.com" \
HAWKUP_FIRST_RUN_LANGUAGES="Bun,Node.js,Rust" \
HAWKUP_FIRST_RUN_DBS="PostgreSQL,Redis" \
NERDFONTS_FONTS="JetBrainsMono FiraCode" \
HAWKUP_SKIP_REBOOT=1 \
bash -c "$(curl -fsSL https://raw.githubusercontent.com/abhishekbhardwaj/hawkup/main/boot.sh)"export HAWKUP_DIR="$HOME/.local/share/hawkup" # or your clone path
export HAWKUP_USER_NAME="Jane Doe"
export HAWKUP_USER_EMAIL="jane@example.com"
export HAWKUP_FIRST_RUN_LANGUAGES="Bun,Node.js,Rust" # subset of: Bun, Deno, Elixir, Go, Java, Node.js, PHP, Python, Ruby, Rust, Zig
export HAWKUP_FIRST_RUN_DBS="MySQL,PostgreSQL,Redis" # any subset
export NERDFONTS_FONTS="JetBrainsMono FiraCode Hack" # space-separated font names
# Optional: export NERDFONTS_VERSION=v3.4.0 # pin Nerd Fonts release
# Optional: export HAWKUP_SKIP_NERDFONTS=1 # skip Nerd Fonts step entirely
# Optional: export HAWKUP_SKIP_TMUX=1 # skip tmux + TPM plugins
# Optional: export HAWKUP_SKIP_REBOOT=1 # do not reboot at the end
bash "$HAWKUP_DIR/install.sh"HAWKUP_DIR– path where the repo lives. Defaults to~/.local/share/hawkup(used by both installer andbin/hawkup).HAWKUP_USER_NAME/HAWKUP_USER_EMAIL– git identity used byinstall/terminal/base/git.sh. If unset, you’re prompted once viagum.HAWKUP_FIRST_RUN_LANGUAGES– comma‑ or space‑separated list of languages to install viamise(Bun,Deno,Elixir,Go,Java,Node.js,PHP,Python,Ruby,Rust,Zig).HAWKUP_FIRST_RUN_DBS– comma‑separated list of databases (MySQL,PostgreSQL,Redis); controls which Docker containers are created.NERDFONTS_FONTS– space‑separated font names to install (for exampleJetBrainsMono FiraCode Hack). If explicitly set to an empty string (NERDFONTS_FONTS=""), the Nerd Fonts install step is skipped.NERDFONTS_VERSION– Nerd Fonts release tag (for examplev3.4.0). Defaults to the latest release if unset.NERDFONTS_DIR– directory where fonts are installed. Defaults to~/.local/share/fonts/NerdFonts.NERDFONTS_FORCE– set to1to force reinstalling fonts even if they already exist inNERDFONTS_DIR.HAWKUP_SKIP_NERDFONTS– set to1to skip Nerd Fonts installation entirely.HAWKUP_SKIP_TMUX– set to1to skip tmux installation and TPM plugin bootstrap (handy in pure server/CI environments).HAWKUP_SKIP_REBOOT– set to1to suppress the final reboot prompt.
The hawkup helper lives in ~/.local/share/hawkup/bin and is added to PATH by the Bash config (~/.config/bash/shell).
hawkup update # apt-get update/upgrade
hawkup upgrade # apt-get update/upgrade + rerun terminal app installers
hawkup sync-configs # re-sync dotfiles from this repo (backs up current)
hawkup migrate # run repo migrations (migrations/*.sh)
hawkup setup-tailscale # install Tailscale (official script)
hawkup enable-ssh # detect ssh/sshd service, enable it, and start it nowhawkup nerdfonts list # list available fonts from latest Nerd Fonts release
hawkup nerdfonts list v3.4.0 # list fonts from a specific release
hawkup nerdfonts install JetBrainsMono # install one font
hawkup nerdfonts install "JetBrainsMono" "FiraCode" "Hack" # install multiple fonts
hawkup nerdfonts update JetBrainsMono # force reinstall a font
NERDFONTS_VERSION=v3.4.0 hawkup nerdfonts install CascadiaMono # pin to a releaseDetails:
- Installed to
~/.local/share/fonts/NerdFontsby default (one subdirectory per font). - Existing font directories are detected to avoid duplicate downloads unless
NERDFONTS_FORCE=1. - Common aliases are normalized, for example:
CaskaydiaMono→CascadiaMonoMesloLGS,MesloLGSNF→MesloSymbols,SymbolsOnly→NerdFontsSymbolsOnly
- Font cache is refreshed automatically if
fc-cacheis available.
After installation, configure your terminal emulator to use a Nerd Font (for example JetBrainsMono Nerd Font), and icons will show up in tools like eza --icons, lazygit, neovim, and starship.
Hawkup manages a simple environment‑variable file at ~/.secrets and loads it automatically from Bash.
hawkup secrets add OPENAI_API_KEY sk-xxxxx # prompts if value omitted
hawkup secrets list # list secret keys (not values)
hawkup secrets remove OPENAI_API_KEY
# Print export lines for all or specific secrets
hawkup secrets env # all exports
hawkup secrets env OPENAI_API_KEY # single export
# Apply immediately to the current shell
source ~/.secrets
# or
eval "$(hawkup secrets env)"- Secrets are stored as
export KEY=VALUEin~/.secrets. - Writes are atomic and file permissions are hardened to
600. - A backup (
~/.secrets.bakor timestamped variants) is created from the installer when needed.
hawkup ai install # default: install opencode-ai via npm
hawkup ai install opencode # explicitly install opencode-ai
hawkup ai install claude-codeNotes:
opencodeinstalls theopencode-ainpm package, so Node.js/npm must be available (for example viamise).claude-coderunscurl -fsSL https://claude.ai/install.sh | bash.
boot.sh– remote entrypoint used by the curl one‑liner. Ensures apt/dpkg are in a sane state (viawait_for_apt), installsgit, clones into~/.local/share/hawkup, then sourcesinstall.sh.install.sh– main installer orchestrator. SetsHAWKUP_DIR, wires in the apt helper, runs OS/arch checks, gathers first‑run choices withgum, then callsinstall/terminal.shand post‑flight steps.install/pre-flight/*.sh– early checks and prompts:check-version.sh– enforces Ubuntu 24.04+ on x86.gum.sh– installs thegumTUI binary on minimal images.first-run-choices.sh– captures languages, databases, and Nerd Fonts (honoringHAWKUP_FIRST_RUN_*andNERDFONTS_*env vars).identification.sh– collectsHAWKUP_USER_NAME/HAWKUP_USER_EMAILfor git.
install/terminal.sh– core terminal installer:- Installs baseline packages and syncs dotfiles from
configs/into your home directory. - Ensures
~/.secretsexists (viainstall/lib/secrets.sh) and loads~/.config/bash/shellinto the current session. - Runs all
install/terminal/base/*.sh(Docker, terminfo,mise, Nerd Fonts, git, tmux, vim, etc.), theninstall/terminal/base/database.sh, then allinstall/terminal/apps/*.sh(Neovim,btop,fastfetch,gh,lazygit,lazydocker, AI tooling).
- Installs baseline packages and syncs dotfiles from
install/lib/*.sh– shared helpers:apt.sh– robust apt/dpkg lock handling viawait_for_apt.nerdfonts.sh– Nerd Fonts HTTP, parsing, and unzip helpers used by the installer andhawkup nerdfonts.secrets.sh– helpers providingsecrets_*functions backinghawkup secrets.
install/post-flight/zsh-mounts.sh– optional tweak that hides ZFS system pools from the Ubuntu dock using a udev rule (no effect if ZFS isn’t present).configs/– all the shipped dotfiles:configs/.bashrc,.inputrc,.tmux.conf,.vimrc.configs/bash/*– aliases, functions, prompt, shell, and init logic.configs/fastfetch,configs/btop,configs/nvim,configs/starship.toml,configs/terminfo/aliases.src.
bin/hawkup– the CLI wrapper for updates, migrations, config syncing, Tailscale, Nerd Fonts, secrets, and AI tooling.migrations/– timestamped migration scripts run byhawkup migrate(pluscreate-migration.shfor authoring new migrations).
- Run as non‑root – use a normal user with
sudoso Docker group membership and dotfile ownership apply to your account. - Dotfile backups – your existing
~/.bashrc,~/.inputrc, and~/.config/bashare backed up as.bakonce. Laterhawkup sync-configscalls back up your current versions again before reapplying defaults. - APT/dpkg errors – if you see errors like
E: subprocess /usr/bin/dpkg returned an error code (1)or “no apport report written … followup error”, your apt state is likely broken from an earlier failure. Repair and rerun:sudo -v sudo dpkg --configure -a sudo apt-get -f install sudo apt-get clean sudo apt-get update sudo apt-get install -y git bash -c "$(curl -fsSL https://raw.githubusercontent.com/abhishekbhardwaj/hawkup/main/boot.sh)"
