I made my portfolio run in a terminal.
It looks like this — an ASCII art header in lime green, six navigable sections, keyboard shortcuts, a typewriter animation, and a contact form that actually sends emails. All inside your terminal.
You can try it right now:
bunx @baghel/portfolio
My web portfolio works fine. But I spend most of my day in a terminal, and I figured other developers do too. What if you could just bunx someone's portfolio?
So I did that.
The tech
I built this with OpenTUI, a framework for building terminal UIs. OpenTUI has a React reconciler, which means you write React components but instead of rendering to a browser DOM, you render to a terminal. It uses Yoga for flexbox layout, which means the layout system actually works like CSS flexbox.
That last part was what sold me. I've built terminal UIs before and the layout story is always painful. "Put this box at row 3, column 17" gets old fast. With OpenTUI, I just say flexDirection="row" and gap={2} like I would in a browser.
The whole thing runs on Bun. No bundler, no build step. bun src/index.tsx and you're off.
What's in it
The TUI has six sections:
- Home — ASCII art of my name, a short bio, buttons for resume and contact
- Experience — Work history in bordered cards
- Projects — A list of projects with tech stack badges and links
- Skills — Frontend, backend, and misc skill categories
- Blog — Lists my blog posts, opens them in the browser on Enter
- Contact — A form with name, email, and message fields that actually sends me an email via a Cloudflare Worker
Navigation is fully keyboard-driven. Tab cycles through sections, number keys jump directly, h opens a help overlay, c opens a command palette. The sidebar stays fixed on the left while content scrolls on the right.
The ASCII art is built-in to OpenTUI via the ascii-font component. I just pass it my name and a font style and it handles the rest. That was a pleasant surprise — I expected to have to pipe figlet output or something.
The honest part
I built this using AI coding agents. I typed maybe 20% of the code.
I used two sessions with opencode, an AI coding CLI. The first session got the basic structure working — the sidebar, section navigation, keyboard handling. The second session added the contact form, command palette, and polished things up.
The AI agent had access to the OpenTUI docs and my existing portfolio data, so it could write components that matched my design system. Most of the time I was just describing what I wanted and tweaking the output.
This felt like the right kind of project for an agent — I knew the tools I wanted to use, the UI is mostly layout and data display, and I could validate everything just by looking at it. No test suite needed. Either the sidebar looks right or it doesn't.
That said, I still spent a good amount of time going back and forth. The keyboard handling in particular took some iteration — getting focus management right for the contact form while not breaking global shortcuts like q to quit required some nudging.
What's not done
Some sections are commented out in the source. The Skills and Contact sections exist as components but aren't wired into the main layout yet. I got them working in the second session but decided to ship without them to keep things clean.
The blog section links to the web version of my posts instead of rendering them inline. Rendering MDX in a terminal is doable but annoying, and linking out felt like the right trade-off.
The contact form works but only when you have a terminal that supports the input components. Some terminals are weird about this. It's not great!
Try it
bunx @baghel/portfolio
That's it. No install, no setup. It'll download and run.
If you want to look at the code, it's on GitHub. It's not great! But it works.
Thanks for reading!