How I rebuilt my personal site with Quarto, uv, and a terminal-inspired aesthetic for the AI CLI era
Author
Brian Deignan
Published
January 19, 2026
2025 changed how I write code. AI-powered CLIs like Claude Code became my daily driver, and I found myself spending more time in terminals than ever before. So when I decided to rebuild my personal website, I wanted it to reflect that shift—a brutalist, TUI-inspired design that embraces the command line aesthetic.
This post walks through the stack, design choices, and workflow I landed on.
The Stack
Quarto — Static site generator that renders Jupyter notebooks natively
GitHub Pages — Free hosting, deploys from docs/ folder
Jupyter — Write posts as notebooks with executable code
Design Choices
I went for a brutalist aesthetic—raw, bold, minimal decoration:
Sharp corners everywhere — No border-radius, hard edges
Hard drop shadows — That “sticker” look from neo-brutalism
Monospace headings — IBM Plex Mono for that terminal feel
Markdown-style prefixes — Headings show #, ##, ###
Dark/light mode — Toggle in the navbar
Dithered profile photo — Matches the TUI vibe
Code Runs Here
The best part of Quarto + Jupyter: code cells execute and render inline. Here’s a quick demo:
import pandas as pd# What's in our pyproject.toml?import tomllibwithopen("../../pyproject.toml", "rb") as f: config = tomllib.load(f)deps = config["project"]["dependencies"]pd.DataFrame({"dependency": deps})
dependency
0
duckdb>=1.4.3
1
jupyter>=1.1.1
2
matplotlib>=3.10.8
3
numpy>=2.4.1
4
pandas>=2.3.3
Workflow
Writing a post is simple:
# Start Jupyteruv run jupyter lab _drafts/# Preview with live reloaduv run quarto preview# When ready, move to posts/mv _drafts/my-post.ipynb posts/2026-01-19-my-post/index.ipynb
Need a new package? Just run !uv add package-name in a cell.
If you’re interested in the source code, it’s all on GitHub.