Uses
Inspired by uses.tech, this is the running list of what I use to write code, run services, and stay productive. I update it when something materially changes — not every time I try a new font.
Editor
Neovim
Primary editor for Go, Python, Markdown, everything.
Config is Lua, custom plugins live under ~/.config/nvim/lua/user/. Leader key is space; LSP via nvim-lspconfig, completion via nvim-cmp, fuzzy finding via telescope.nvim.
I've also been on JetBrains GoLand for the rare deep debugging session — the inline struct field inspector is still unmatched.
Terminal & shell
Ghostty
Daily driver terminal.
Native, GPU-rendered, fast. Config is TOML, kept under ~/.config/ghostty/config. One window, many tabs, tmux inside for panes — splits feel right with Ctrl+b + %.
tmux
Session persistence + pane splits.
tmux-resurrect saves layouts across reboots. Prefix remapped from Ctrl+b to Ctrl+a out of long habit.
fish shell
Interactive shell.
Autosuggestions out of the box. fzf integration through fzf.fish. Scripts get #!/usr/bin/env bash instead — fish syntax doesn't survive being called as sh.
Dotfiles
Git config
Aliases, rerere, delta as the pager.
git config --global include.path ~/.config/git/config keeps machine-specific blocks out of the main file. Delta renders diffs side-by-side with theme colours.
Starship prompt
Cross-shell prompt that just works.
Custom module for the active Go module path. Battery indicator on the laptop only — the VPS box has no UPS.
GNU stow
Manages the dotfiles repo.
Each tool is its own package directory; stow <tool> symlinks into $HOME.
Go toolchain
Go
Primary language.
Pinned to the latest two minor releases — currently 1.23 / 1.24. go.work for multi-module local development.
golangci-lint
The linter, the whole linter, and nothing but the linter.
.golangci.yml at the repo root. Enabled: errcheck, gosec, staticcheck, govet, gofmt. Disabled: most of the pedantic group — they bikeshed more than they catch.
Delve (dlv)
Debugger when printf-debugging stops being enough.
dlv debug --headless --listen=:2345 + Neovim's :DapContinue for remote debugging against staging.
Ops
Docker + docker compose
Local infra for Postgres / Redis / a tiny Kafka.
make up brings the whole stack online; make down tears it down. Compose files are hand-written, no Helm — too much overhead for a laptop.
k9s
When I have to look at the cluster.
Most of the time I should be looking at dashboards instead. k9s is the fallback when the dashboard is broken, which is always at the worst possible moment.
kubectl + jq + gron
The CLI trio.
kubectl get ... -o json | jq '.items[] | .metadata.name'. gron flattens nested JSON to grep-able assignments when jq's selectors start to hurt.
Hosted services
GitHub
Source control, CI, package registry.
Personal repos on the free tier; private repos for the lunch-tracker code. Actions for CI; no third-party CI vendor.
DigitalOcean
VPS for the portfolio.
One $6 droplet, Nginx in front, rsync-on-deploy. Six months uptime so far, which is more than I expected for the price.
Tailscale
WireGuard mesh to the VPS.
Replaced an SSH jump host. The VPS advertises its Tailscale IP as a DNS name; deploys are rsync public/ fahim@portfolio:....
Hardware
MacBook Pro 14" (M3 Pro, 18 GB)
Daily driver.
Bought mid-2024. 512 GB SSD is the only regret — Docker images eat it alive. Plugged into a single LG 27\" 4K monitor at home.
Custom Mini-ITX desktop (Ryzen 7, 32 GB, 1 TB NVMe)
Linux box for the heavier workloads.
Runs Fedora 40 with Wayland. This is where the Go compiler stops complaining about my fan noise. Used as a remote build/test box over Tailscale when the Mac gets hot.
Logitech MX Master 3S
Mouse.
Thumb-scroll horizontal is the killer feature for code review.
Browser
Firefox Developer Edition
Default browser.
Container tabs for separating work / personal / shopping logins. Tree Style Tab extension because vertical tabs are non-negotiable on a 4K monitor.