From Mr-wii to ProxySoul
Every developer's portfolio tells a story. Not just about the projects listed on it, but about the person who built it. Over the past 7 years, mine has been rewritten three times — each version a reflection of where I was as an engineer at that point in time.
This is that story.
v1 — Mr-wii (2019)
$ git log --oneline mr-wii
edae5b0 Mr WiiThe very first version. Built with Create React App, Material UI for components, styled-components for custom styling, and react-spring for animations. React Router handled navigation, and the whole thing was bootstrapped with react-scripts.
It was rough around the edges — the code was messy and the design was basic — but it worked. It was the first thing I ever put on the internet, and deploying it felt like launching a rocket. For 2019, using React 16 with Material UI felt like wielding serious power.
Looking back, the most important thing about v1 wasn't the code. It was the decision to build it at all. That single choice set everything else in motion.
v2 — Pouiiro (2023)
$ git log --oneline pouiiro
154baaa PouiiroFour years later, everything was different. I had learned React, TypeScript, and the entire modern frontend ecosystem. The second portfolio reflected that growth.
Pouiiro was a full React SPA powered by Vite, with GraphQL queries hitting the GitHub API through urql to dynamically pull in my repositories. It had Tailwind CSS for styling, Framer Motion for animations, tsparticles for that interactive particle background, and styled-components for the bits that needed more control.
The stack was ambitious — maybe too ambitious for a portfolio. GraphQL codegen, urql cache exchanges, custom theming, form validation with react-hook-form and zod. I treated it like a production app because I wanted to prove I could build one.
It shipped. It looked good. It did the job.
But over time, the SPA approach started to show its limits. SEO was possible but required extra work and wasn't as reliable as server-rendered HTML. The initial load was slower since the browser had to download and execute the entire JS bundle before rendering anything. And the codebase was increasingly hard to maintain for what was essentially a personal website.
v3 — ProxySoul (2026)
$ git log --oneline proxysoul
86cc98d ProxySoulThe current version. A complete rewrite from scratch.
This time the priorities were different: performance first, content first, maintainability first. The choice of Next.js 16 with App Router and React Server Components was deliberate — server-rendered pages, automatic code splitting, and a file-system router that just makes sense.
Tailwind v4 with its CSS-first config replaced the old JavaScript-based setup. Framer Motion stayed for animations, but this time with a lighter touch — page transitions, scroll-triggered reveals, and a custom animated icon system that brings the UI to life without overwhelming it.
The terminal aesthetic wasn't planned. It started with the navigation labels (~/home, ~/about, ~/projects) and grew from there — the blinking cursor, the git show commit references, the monospace typography. It became the identity of the site.
The blog runs on Velite with MDX, compiled at build time. No CMS, no database — just markdown files in a content/ directory that get transformed into pages. Simple, fast, version-controlled.
Zod v4 validates the contact form. The GitHub integration switched from GraphQL to the simpler REST API via Octokit. Less complexity, same result.
What changed between versions
It's not just the tech that evolved:
| v1 (2019) | v2 (2023) | v3 (2026) | |
|---|---|---|---|
| Framework | React (CRA) | React + Vite | Next.js 16 |
| Styling | Material UI + styled-components | Tailwind + styled-components | Tailwind v4 |
| Data | Static | GraphQL (urql) | REST API (Octokit) |
| Deployment | Static hosting | Netlify | Vercel |
| Rendering | Client-side SPA | Client-side SPA | Server Components |
| Blog | None | None | MDX + Velite |
| TypeScript | No | Yes | Yes |
The pattern is clear: each version moved toward less complexity and more content. v1 was about existing. v2 was about proving technical skill. v3 is about communicating clearly and shipping something maintainable.
Lessons
You don't need the fanciest stack. v2 had GraphQL, cache exchanges, and codegen pipelines for a portfolio that displayed 6 repos. v3 uses a simple REST call and gets the same data.
Rewrites are worth it — sometimes. I wouldn't rewrite a production app for fun. But a portfolio is different. Each rewrite forced me to re-evaluate what matters, learn new tools, and practice making architectural decisions from scratch.
Ship it, then improve. v1 wasn't the best version — but it existed. That's more than most people's "I'll get to it someday" portfolio.
What's next
There's always a v4 somewhere in the future. But for now, ProxySoul is the one — dark, fast, and built to last.
You can explore all three versions on the evolution page.
const versions = ["Mr-wii", "Pouiiro", "ProxySoul"];
console.log(`${versions.length} versions. Same developer. Always shipping.`);