For colleagues and students

Tools I Use

The command line I actually live in: Unix and Linux tools, the languages I write, and the frameworks I teach with. Most of these replaced something older and clunkier, and I only kept the ones that earned it.

Everything here is free and open source unless noted, and every name links to its home page. Nothing is sponsored. If one of these changes how you work, that is the whole point. Last updated .

Shell & terminal

The foundation. If you change one thing on this page, change your shell.

Shell framework

Oh My Zsh

Configuration framework for zsh. Sensible defaults, completions, and plugins without hand-rolling a shell config from nothing. The gentlest possible on-ramp to a comfortable terminal.

Prompt

Starship

A fast, minimal prompt that shows the git branch, language version, and exit status only when they matter. One config file, works in any shell.

Multiplexer

tmux

Splits one terminal into panes and windows, and keeps sessions alive on the far end of an SSH connection. Close the laptop, reconnect, everything is exactly where you left it. Indispensable for remote work on lab machines.

Terminal

Ghostty

My terminal. Fast, GPU-accelerated, and native on every platform it runs on, with sane defaults that need almost no configuration. Pleasingly, it is written in Zig.

Terminal

kitty

A GPU-accelerated terminal emulator. Fast, scriptable, and it renders ligatures and images without fuss.

Everyday command line

Modern replacements for the classic Unix utilities. Each one does a familiar job noticeably better, and most are drop-in.

Fuzzy finder

fzf

A general-purpose fuzzy finder. Pipe anything into it and filter interactively: files, git branches, shell history, process lists. It composes with everything, which is what makes it the single highest-leverage tool here.

cd replacement

zoxide

Learns the directories you visit and jumps to them by fragment: z 426 instead of a long path. I have it aliased directly over cd, so it is simply how I move around now.

cat replacement

bat

Like cat, but with syntax highlighting, line numbers, and git change markers, paging automatically when output is long. Reading source in the terminal stops being a chore.

ls replacement

lsd

A friendlier ls with colors, icons, and a built-in tree view. Aliased over ls here, with a handful of shortcuts for long and tree listings.

grep replacement

ripgrep

Recursive search that respects .gitignore and is fast enough that searching an entire codebase feels instant. Worth it for the speed alone; the sane defaults are a bonus.

find replacement

fd

Finding files without remembering find's argument grammar. fd config does what you meant.

Markdown viewer

Leaf

My most recent addition and a genuine delight. It previews Markdown in the terminal with a GUI-like reading experience, which means notes, READMEs, and course material render properly without leaving the shell.

JSON

jq

A query language for JSON. Essential the moment you start poking at an API from the command line, which in my courses is immediately.

Editing & version control

Editor

Neovim

My editor and my $EDITOR. Modal editing means the muscle memory transfers to any machine with vi on it, which is every machine. I have vim aliased to it out of habit.

Editor config

LazyVim

A curated Neovim setup with LSP, completion, and fuzzy finding already wired together. The honest shortcut past a weekend of configuring your editor instead of using it.

Version control

Git

The thing everything else here sits on top of. Worth learning properly rather than as four memorised commands: once the model of commits, branches, and history clicks, the tooling below stops being magic and starts being convenience.

Git UI

lazygit

A terminal interface for git. Staging individual hunks, rewording commits, and untangling a messy history are all far easier here than at the bare command line, without hiding what git is actually doing.

GitHub

GitHub CLI

Pull requests, issues, and releases from the terminal. Scriptable, which makes bulk work across a semester's worth of student repositories tractable.

Containers & environments

Containers

Docker

How I give a whole class the same environment. "Works on my machine" stops being a problem when the machine is a container, and it is the same shape as what students will meet in industry.

Container runtime

Colima

Runs Docker containers on macOS without Docker Desktop. Lighter, open source, and it stays out of the way.

Docker UI

lazydocker

The same idea as lazygit, for containers. Logs, stats, and cleanup without memorising another set of subcommands.

Runtime versions

mise

Manages per-project versions of Node, Python, and anything else, so a course repository pins the runtime it expects. Replaces a pile of separate version managers with one tool.

Languages

What I write and teach in.

Systems

C

The language of COMPSCI 198C and the one I keep coming back to. Nothing else makes the machine as visible: memory, pointers, and the cost of every choice.

Web

TypeScript

JavaScript with types, which turns a whole category of runtime surprises into editor errors. What my web courses are built in.

Runtime

Node.js

The server-side runtime behind the web work in COMPSCI 326 and 426.

Scripting

Python

For scripting, data wrangling, and anything that needs to exist by tomorrow morning.

Systems

Rust

Memory safety without a garbage collector. A useful foil to C when talking with students about what the compiler can and cannot prove.

Systems

Zig

A small, explicit systems language with no hidden control flow or allocation. Currently the one I am enjoying exploring most.

Web stack

The frameworks and libraries my courses build on.

Server framework

Express

Small enough that students can see the whole request lifecycle, and standard enough that what they learn transfers. The backbone of both web courses.

Templating

EJS

Server-rendered templates that are just HTML with embedded JavaScript. A good first stop before any client-side framework enters the picture.

Database

Prisma

A typed ORM with real migrations. Paired with SQLite it gives every student a working database with no server to install.

Testing

Jest

Test runner for the web courses, usually alongside SuperTest for exercising HTTP endpoints end to end.

Client

React

Where the capstone teams usually end up when a project outgrows server-rendered pages.

Have something that genuinely changed how you work? Send it my way and I will try it.