I Built My Portfolio in the Terminal (Because Why Not?)
As a first-year CS student who spent months in the command line building Java and C++ projects, I thought: what if my portfolio lived there too? So I built it with Bubble Tea and Lipgloss.
First year was all Java and C++ in the terminal. Compile, debug, run, repeat. No hot reload, no fancy UI, just you, javac, and a blinking cursor.
So when I sat down to build a portfolio, one that wasn’t just another site with a hero section and a contact form, I thought: why not bring it back there? Build the thing in the exact place I learned to think like a programmer.
go run main.goThat’s it. Interactive portfolio, arrow-key navigation, smooth transitions, no browser required.
Why Go, Specifically
I’d been eyeing Go for a while, no real excuse to use it outside a tutorial. A portfolio felt low-stakes enough to actually learn it properly. Go’s whole pitch is simplicity, a standard library that already covers what you need.
Coming from Java’s ceremony, that hit different. I’d think twice before trying something in Java, the compile-run loop cost a few seconds each time. In Go I just tried it, trying it was basically free.
The Stack
Bubble Tea for the TUI framework, Lipgloss for styling, both from Charm. The Elm Architecture sits underneath: Model holds state, Update handles keypresses, View renders it. Made more sense to me in an afternoon than Redux ever did.
titleStyle := lipgloss.NewStyle(). Bold(true). Foreground(lipgloss.Color("#7D56F4")). Padding(1, 2)Lipgloss is basically CSS for text, colors, borders, padding, alignment, none of the DOM. You describe how a block should look, Bubble Tea renders it into the terminal buffer.
What Surprised Me
I assumed a TUI would feel restrictive, text-only, no images. It isn’t. Color, layout, a little animation, and the constraint forces creativity instead of killing it.
The bigger surprise: how much of “frontend work” is state management wearing a costume. Swap <div>s for lipgloss.Style calls and the underlying problem is identical to what I’d solve in React. Made a framework I half-understood click from a totally different angle.
Where It Actually Broke
Terminal resize is its own small nightmare. Bubble Tea gives you a WindowSizeMsg, you recalculate every layout by hand. Coming from CSS flexbox where the browser handles reflow for you, I got it wrong more than once, text spilling past a hardcoded width.
The Honest Take
Practical? Not really. Most people are skimming on a phone, not opening a terminal for a portfolio. Did I learn a ton about state management and Go in one weekend? Genuinely, yeah.
That’s the whole point of a project like this. No pressure to make it production-ready, no deadline, no team reviewing every PR. Build something a little weird and let the learning happen as a side effect.
If you already live in a terminal, try building a TUI. Doesn’t have to be a portfolio, a todo app or git browser works fine. You’ll understand your language and state model better than most tutorials teach.
Check it out: Clifolio on GitHub
Conversation
Discussion
Comments will appear here after GitHub Discussions and Giscus are configured for this repository.