← Blog
TechnicalMar 20, 2026·6 min read

How I Built a Terminal That Lives in the Browser (And Why It Has Neofetch)

terminaldesignreacteaster-eggs

Most developer tools have a landing page with a hero section, a feature grid, and a big purple "Get Started" button. MetaStrip had one too. It was clean, it was functional, and it was boring. So I threw it away and rebuilt the entire app inside a terminal emulator. This is the story of how that happened, what it took to build, and why the photo.jpg on the desktop is actually draggable.

It started with a metadata problem

I needed to strip EXIF data from a batch of photos before uploading them to a marketplace. Every tool I found was either abandoned, ugly, or wanted me to upload my files to someone else’s server — which kind of defeats the purpose when the whole point is privacy.

The CLI tools worked fine, but they required installing dependencies and reading man pages. I wanted something that worked in the browser, processed everything client-side, and didn’t look like it was last updated when Ubuntu still shipped with Unity.

So I built a clean, modern web app. It worked. Files never left the browser. The metadata got stripped. Job done.

Then I stared at it and thought: this is just another landing page.

The terminal idea

The best metadata tools have always been CLI programs. ExifTool, mat2, ImageMagick — they all live in the terminal. The irony of wrapping that functionality in a generic web UI felt wrong. What if the web app was a terminal?

Not a real terminal — a theatrical one. Something that looks and feels like Warp or iTerm2, with tabs, a powerline prompt, and actual interactive commands — but runs in the browser and processes your files client-side.

The terminal became the entire UI. The drop zone is a command prompt. The file list renders like ls -la. The stripping process animates like a real CLI program running through each metadata category with progress bars. Even the download button lives inside the terminal output.

Try MetaStrip — it's free

Strip metadata from any photo in seconds. No upload, no account.

Open Tool →

Building the terminal layer by layer

The terminal is a stack of React components pretending to be a window manager. At the top, macOS-style traffic lights and a draggable title bar. Below that, a tab bar where each tab is its own session — metastrip, ko-fi, privacy policy, about, and blog all render inside the same terminal window.

The powerline prompt was one of the most satisfying details. It mimics a real Zsh setup with Powerline symbols: the MetaStrip icon, a directory breadcrumb, and a git branch indicator. The blinking cursor sits at the end, waiting for input. When you drag files in, the prompt updates with the metastrip command and your selected flags. When you execute, a typewriter effect types out the full command before the stripping animation begins.

Each file gets its own processing block that looks like a real CLI log — tree-branch characters, per-category progress bars that fill with a purple-to-cyan gradient, and status labels that flip from "stripping..." to "removed" as the animation plays through. The actual processing happens instantly (it’s JavaScript in your browser), but the animation creates a satisfying sense of work being done.

The desktop easter eggs

The background behind the terminal isn’t just a gradient — it’s a desktop. Scattered around the edges are draggable file and folder icons: privacy.txt, .env, node_modules (47 GB, naturally), uploads, README.md, and photo.jpg.

Each one is a real interactive element. Double-click node_modules and a floating window opens showing is-odd, is-even, and is-thirteen with absurd file sizes. Open .env and you’ll find SECRET_KEY=nice-try-buddy and UPLOAD_TO_SERVER=false. The uploads folder shows files with their exposed metadata highlighted in red — GPS coordinates, device info, author names — a subtle reminder of why the tool exists.

The wildest one: you can drag photo.jpg from the desktop directly into the terminal, and it actually works. The app generates a real JPEG with injected EXIF metadata using a canvas element and piexifjs, creates a File object, and feeds it into the processor. The terminal picks it up, runs the strip animation, and offers a download. A desktop icon became a functional demo.

The interactive terminal commands

Since it looks like a terminal, people are going to type into it. So I made it actually work. The prompt accepts real commands.

help lists everything available. neofetch displays system info in ASCII art — your OS, browser, the MetaStrip "shell" version, uptime, installed packages (piexifjs, pdf-lib, jszip), and privacy status. whoami returns "anonymous — as it should be." ls shows your uploaded files. clear clears the terminal. version and status give you app info.

Then there are the vim jokes. Type vim and you get: "Error: vim detected. This is a safe space. Use a real editor." Type :wq and it responds: "You’re not in vim. You’re free. Breathe." :q! gets you "There is nothing to quit. You’re already in the best metadata tool ever made." emacs triggers "We don’t talk about emacs here."

sudo rm -rf / returns a dramatic pause followed by "nice try. all your metadata are belong to us." And exit tells you "There is no escape. Only metadata removal."

Content pages as terminal tabs

The privacy policy, about page, and blog all render inside terminal tabs, styled like you’re reading man pages or README files. The privacy policy opens with a cat privacy.txt prompt. The about page reads like a --verbose flag output. Blog articles render with markdown-style headers and monospace text.

This means the entire app is a single page. There’s no navigation, no route changes, no loading screens. You click a tab and the content appears in the same terminal window. It feels like switching between tmux panes.

What I'd do differently

The animation timing was the hardest part to get right. Each file’s stripping animation needs to feel fast enough to be satisfying but slow enough to actually read. Too fast and it looks broken; too slow and it feels like the tool is actually slow. The sweet spot was about 150ms between category lines with 300ms progress bar fills.

Mobile was tricky. The terminal metaphor works beautifully on desktop where you have gutter space for the desktop icons and the window feels like it’s floating. On mobile, the terminal goes full-screen and the desktop icons hide. It’s still a terminal, just without the desktop theater around it.

If I built it again, I’d probably add more commands. A man metastrip page. Maybe cat to preview file metadata before stripping. The terminal metaphor is infinitely extensible — every feature can be a command.

The point of all this

MetaStrip started as a simple problem: strip metadata without uploading files. The solution could have stayed simple too. But somewhere between "this works" and "this is fun," the terminal idea took over.

The result is a privacy tool that feels like a toy — in the best way. It does exactly one thing (remove metadata), does it entirely in your browser, and wraps the whole experience in enough nerdy details to make the process genuinely enjoyable.

And if you type neofetch, you’ll see exactly where your files don’t go: nowhere. That’s the point.

Strip metadata from your files now

Free for single files. No account, no upload, no tracking.

Open MetaStrip →