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.

About Now Email