Skip to content
All letters

Running an Honesty Pass on Your Own Portfolio

I deleted half my projects page in one afternoon. Here is why.

I opened my own portfolio site one Tuesday afternoon and read it as if I were a stranger. By Tuesday evening half the projects page was gone. Two routes were deleted. A handful of "in progress" tags were either dropped, replaced with honest language, or moved to this section of the site. The site got smaller. It also got truer.

Here's how I ran the pass, what I cut, and the rule I wrote afterwards to keep this from happening again.

The trigger

I noticed I'd stopped sending people my own portfolio link. When I wanted someone to evaluate me, I'd send the GitHub profile, or a specific repo, or a Loom video, never the site. That's a strong signal. If the author of the site doesn't trust the site, the site is broken.

I sat down to figure out why. The reason became obvious in the first ten minutes: too many of the projects were fictions. Not lies, exactly. But not facts either. They were aspirational. "Coming soon." "In progress." "Prototype." Some had screenshots of UI that no longer existed. One had a live URL that returned a 502 if you actually clicked it.

I would not have trusted a stranger's site that looked like this. I should not have trusted my own.

The three-question filter

I sat with each project and ran it through three questions:

One, Can I open it right now and demo it? If a recruiter or a client is on a Zoom call and asks "can you show me this thing on your page," can I share my screen and use the product? If no, the project doesn't belong on the projects page.

Two, Is it functional? Not "does it have a landing page." Not "does the homepage load." Does the core feature work? If the demo button is broken, if the auth flow loops, if the API key has expired. It's not functional. It's a museum piece.

Three, Is the work mine to claim? Some of my best work was done for clients under NDA. Some was done as a small contribution to a larger team. The honesty test: if the original team read my project page, would they nod or would they wince? Anything that produced a wince came off.

A surprising number of entries failed at least one question.

What got cut, and where the cuts went

Things in the "concept" and "coming soon" buckets got deleted outright. They weren't projects. They were intentions. Intentions don't belong on a projects page.

Things that had been shipped but were no longer maintained moved to a writeup in this letters section. The framing changed from "I built X" to "I explored X." That framing matters more than I expected. The first frame implies a current artifact you can interact with. The second frame implies an essay about thinking that happened. They are different products and they earn different trust.

Things that were halfway between, real artifacts but not really mine, or mine but not really artifacts, got demoted to a smaller mention inside the about page rather than a featured project tile.

One entry I genuinely hesitated on: a stealth project I'm building right now that has real commits, real code, but no shipped product yet. I'll come back to that one.

What got kept

Six projects survived the pass. Each one passes all three questions. Each one I could demo on a phone, in a coffee shop, with no preparation. Six is fewer than I had. Six is more than enough.

The page now feels different. Sparser, but less defensive. I read it back and it sounds like someone who knows what they actually did versus what they meant to do.

The stealth slot, one vapor project, allowed

Here's the rule I wrote at the end of the pass, because I'm not naïve about how the temptation works.

Exactly one unshipped project may appear on the projects page at any time. All of these conditions must hold for it to qualify:

  • Active development. Real repo, commits this month.
  • Public artifacts exist elsewhere. Related shipped templates, design files, public repos. Stealth is not vapor.
  • Intentionally cryptic copy. No fake screenshots, no feature lies, no grand "revolutionizing X" claims. Honest about being unshipped.
  • No link out. If there's nothing to click to, don't link to nothing.
  • Six-month expiry. If it hasn't shipped in six months, the slot empties. No extensions.

One slot is the cheat code that lets you tease real work without polluting the page with vapor. It also serves as a forcing function, if you can't get the thing shipped before the timer expires, the timer expiring is information about whether you should have started it.

What the pass taught me about my own pipeline

I expected to feel embarrassed afterwards. I expected to feel like I had been lying. I didn't. I felt the way you feel after cleaning out a closet. Surprised at how much was in there, surprised at how much of it I had stopped seeing.

The bigger surprise was what came next. With the page slimmer, I started thinking more clearly about which projects I should actually start. The honesty pass wasn't only retrospective. It became a filter on what got added going forward. "Could I imagine demoing this in six months?" became a question I started asking before I committed to building anything.

If you maintain a portfolio of any kind, code, writing, design, whatever, the exercise is worth running. Open it tomorrow morning. Read it like a stranger. Cut what you would have made fun of if someone else had written it.


The full ruleset I wrote down lives in the project's CLAUDE.md file. It's terse, but it's the only thing standing between me and the next round of vapor.

Back to all lettersayal.tech / letters