DIY

ssh portfolio.vedsite.com

paste into your terminal and type yes to confirm the connection. trust me, i don't want your data

overview

This is my website, but accessible over SSH. When you connect to port 22, you receive a version of my homepage at vedsite.com, but in the terminal. I tried to be consistent with the DVD-player-esque animation style, with the squares bouncing off the edge. Each square maps to a different section of my portfolio (about, projects, experience, misc) and morphs into a different character every time it hits a wall. You can press 1 through 4 on your keyboard to navigate into each section, or just sit by and watch the square bounce around (don't sit idle too long, I have a timeout set for 10 minutes).

visuals

bouncing square navigation: Four squares made up of four different icons (# @ * +) drift across the terminal, with each square color-coded to a specific page. Pink = about, purple = projects, blue = experience, teal = misc. The numbers and colors match the ones on my website homepage respectively.
square morphing: When a square collides with the edge of the terminal window, its character icon cycles to the next in the set. Purely cosmetic, but helps hold up part of the original animation.
tiled background: Staying true to the background on my homepage, I have my (clever) personal domain repeating across every cell in the terminal as a dim grid, providing a nice background to watch the squares bounce around in. The text is offset per row so it reads diagonally, and the squares render on top of it.
keyboard navigation: Press 1-4 to open a subpage, b or esc to go back, q to quit. Each subpage shows the section title and links back to the real website.
per-user sessions: Every SSH connection spawns its own independent instance of the UI, which means that multiple users can connect at the same time. Every session will be unique, your squares are your session.
SSH subproject view

construction

Go Wish Bubble Tea Lip Gloss Docker AWS EC2

The app is written in Go using the Charm stack which is a set of GitHub libraries specifically built for terminal UIs over SSH. Wish handles the SSH server: it listens on port 22 and bootstraps a fresh terminal UI for each incoming connection. Bubble Tea is the TUI framework that drives the render loop: an Init → Update → View cycle running at 50ms ticks for smooth animation. Lip Gloss handles all the styling including colors, bold text, positioning in the terminal.

The animation loop works like a simple physics engine: each square has an (x, y) position and a velocity vector (vx, vy). With every tick, positions update and bounce off of terminal edges. On collision, the square's character morphs to the next one in the cycle.

architecture

your terminal SSH (port 22) Docker Wish server Bubble Tea UI

The Go binary runs inside a Docker container on my AWS EC2 instance in Ohio. I chose Docker for easy deployment and isolation, I was able to quickly build the Go binary, drop it in the container, and run it without worrying about Go versions or library conflicts on the host machine. The container runs a Wish SSH server that listens on port 22, and every incoming SSH connection spawns a new instance of the Bubble Tea UI. Port 22 is mapped to the container, so ssh portfolio.vedsite.com routes directly into the Wish server. My admin SSH runs on a different port to prevent disparity and so the portfolio can own port 22. Cloudflare handles DNS as an A record on DNS-only mode since SSH cannot be proxied on the free tier.

Source? The code is on my GitHub. The main logic is a single main.go file: model, update loop, view renderer, and SSH server setup all in ~330 lines.