Before kaushik.cv there were five private repos on my account, each one a portfolio site that I opened, half-built, and walked away from. The dates run from June 2024 to August 2025. None of them are live. The last one in the list is the one this site is actually built on. This post is a straight retrospective of what each attempt was trying to fix, what I kept, and why the personal site is the artifact I have found hardest to finish.
portfolio, June 9 2024
The first one is called portfolio. It exists for exactly thirty-four seconds of push history: the Create React App template landed at 18:54:25 UTC, and one commit called add landed at 18:54:59. That is the entire life of the repo on GitHub. The local branch got a bit further before I lost interest.
What was in it? A Summary.js component that used react-type-animation to typewrite the sentence Versatile language-agnostic engineer excelling in algorithms / data structures / web frameworks with a strong foundation in Python. Experienced in Quantum Computing / GUI applications / top-notch internships / hackathons. Reading that sentence back in 2026 is embarrassing in a very specific way. It is the resume-summary voice of someone who has not yet figured out that the thing that makes a portfolio interesting is one specific project, described honestly, not a rotating pool of five adjectives.
There was also an App.js that hard-coded my profile object: name, PSG email, phone number, LinkedIn, LeetCode, and my CGPA to two decimal places. The education array listed the Qubit by Qubit Google Quantum AI course with a grade of 100. That grade is real. The mistake was thinking anyone reading a portfolio wanted a JSON dump of my transcript.
What I carried forward: nothing structural. The lesson was voice. The Summary.js typewriter is the moment I learned that a portfolio built on adjectives ages badly in less than a year.
portfolio-website, July 10 2024
One month later I made a repo called portfolio-website. It has never held a single commit. gh api repos/kaushiksaravanan/portfolio-website/commits returns Git Repository is empty. (HTTP 409). I created the repo, presumably ran npx create-something locally, and never pushed.
I list it here because empty repos are data too. I opened it a month after abandoning the first one, which tells me I already knew portfolio was not going to ship, and I was hoping the fresh name would do the work. It did not.
onceportfolio, April 4 2025
Nine months of nothing. Then in April 2025 I created onceportfolio. This one was a Vercel one-click deploy of the @once-ui-system/magic-portfolio template. Its package.json still identifies itself as @once-ui-system/magic-portfolio version 1.3.0 because I never renamed it. The src/ folder is Next 14 App Router with once-ui/, SCSS, prismjs for code highlighting, and a react-masonry-css grid for the work page.
I spent one afternoon on it. The Initial commit message reads Created from https://vercel.com/new, which is Vercel's default. I never wrote a real one over the top.
Why did this die? The template was too finished. Once UI is a nice design system, but every page already looked like a demo, and every edit I made to break out of the demo look was fighting the framework. The masonry grid was locked to image-card work, and the case-study layout expected images I did not have. I could have thrown out the design system and kept the content model, but the whole point of adopting a template was to skip the design work, and now the design work was back.
What I carried forward: the idea of a case-study first content model. The current site's content/ directory of MDX files is the descendant of the blog/ and work/ folders in the Once UI template. The MDX-plus-front-matter shape is the same. I threw away the presentation layer and kept the data shape.
ffport, August 10 2025
Four months later, on the same day I created the fifth repo, I also created one called ffport. Its package.json has the field "name": "porfolio", with the typo, because I never fixed it. This repo is what I opened when I thought I was going to build a portfolio from scratch using shadcn primitives directly. It has @radix-ui/react-avatar, framer-motion, motion, next-themes, react-markdown, and rehype-pretty-code. It has the current site's exact rehype and remark stack.
ffport never made it past the Vercel initial commit either. What killed it was that I had already opened Kaushik-s-Portfolio eleven minutes earlier, decided the fork route was faster, and closed the ffport tab.
I list it because the stack in ffport/package.json is almost exactly the stack the current site uses. When people ask me how I picked the current site's dependencies, the honest answer is that I picked them once in an August afternoon, walked away from that repo, and then re-picked them in the next one. There is no design document that explains the choice. There is just a package.json in a dead repo.
Kaushik-s-Portfolio, August 10 2025
The fifth repo, opened the same day as ffport, is a fork of Dillion Verma's Next.js portfolio template. The README still contains the line Built with next.js, shadcn/ui, and magic ui, deployed on Vercel and the Deploy with Vercel button that clones the template from Dillion's account rather than mine. The src/data/resume.tsx config file the README points at is the shape that all my case studies now live inside.
I did not rename this repo cleanly, which is why the current working directory on my machine is called Fportfolio and the repo on GitHub is called Kaushik-s-Portfolio. If you're reading this on the live site, this is the repo the deploy pipeline is pulling from. Every MDX file in content/, including this one, is committed there.
Why the portfolio is the hardest thing to finish
Five repos, one shipped. That ratio is worse than my ratio on any real project. It is worse than my hackathon submission ratio. A portfolio has no external deadline, no user waiting for a fix, no ticket you're blocking. The only person forcing it is you, and you are also the person judging whether the current draft is good enough to show anyone. The judge and the shipper are the same person, and the judge always wins.
The thing that broke the pattern with the current site was giving up on the design work first. Dillion's template was already good enough. I stopped rebuilding the shell and spent the time writing the case studies instead. Once there were fifteen posts, throwing the site out would have meant throwing out the writing, which is the part I actually care about. That is the difference between this repo and the four before it: the sunk cost is in the prose now, not in the CSS.
The other thing that changed is that I started shipping small commits every day. The 60-cycle ship loop retrospective covers the mechanic. Cycle 78 was a Vercel Analytics add. Cycle 74 was a 28.9MB GIF converted to a 3.3MB WebM. Each one is small enough that the judge in my head does not have time to reject it before I push.
If you are looking at your own graveyard of unfinished portfolio repos, the pattern I would look for is whether the abandoned ones died on the day you tried to redesign the shell. Mine all did. The one that lived is the one where I gave up and started writing.
See also
- /blog/building-kaushik-cv-tech-stack: the current stack that grew out of those five iterations.