Documenting software like it's already for sale
Most side projects are optimized to demo well. Almost none are optimized to survive a stranger actually trying to run, extend, or acquire them — and that gap stays invisible right up until someone tries.
Every project in the Full Stack Assets catalog gets built under one non-negotiable rule: if it can't be handed off to someone else, it isn't finished. Not "shipped," not "deployed," not "working on my machine" — finished. That standard sounds obvious until you actually try to enforce it, because almost everything about how side projects and portfolio pieces get built pushes in the opposite direction. You optimize for the demo. You optimize for the moment a stranger looks at a live URL, clicks around for ninety seconds, and forms an opinion. Nothing about that moment rewards you for writing down why you chose Postgres over a document store, or for making your deploy script work on a machine that isn't yours. So most of us don't, and the gap between "demos well" and "survives contact with a stranger" sits there quietly, undiscovered, until someone actually tries to run the thing without you standing next to them.
Documentation above the README line
A README that lists install commands is table stakes, not documentation. It tells a reader what to type. It doesn't tell them anything about the decisions that produced the system they're about to inherit — and decisions are exactly what a technical buyer or a future engineer needs, because code alone only shows you the state that decisions produced, not the reasoning that ruled out the alternatives.
The level I hold my own catalog to is closer to due diligence than to onboarding: why is the queue backed by this broker instead of a simpler polling job, what happens under partial failure, why does this service own its own data instead of sharing a table with the one next to it. Not because every choice needs to be defended forever, but because a system a reviewer can't reconstruct the reasoning for is a system they can't safely change. They'll either break something they didn't understand, or — more commonly — they'll assume the whole thing is fragile and walk away from an asset that was actually sound. Architecture documentation isn't decoration. It's the difference between a buyer trusting the design and a buyer distrusting everything they can't personally verify.
Deployment instructions and tests that prove behavior
The second half of due-diligence-grade documentation is assuming zero tribal knowledge on the way out the door. Not "should work with standard config," but a deployment path that a reviewer can follow on a clean machine with no Slack thread to fall back on and no call with me to unblock them. The TaskFlow case study is the clearest example in the catalog: it shipped with 30 files and roughly 36,000 words of deployment documentation, covering three separate targets — Vercel, Docker, and a bare VPS — because "it deploys" isn't a claim, it's three different claims depending on where someone actually needs to run it, and each one needed to be proven independently rather than assumed to generalize from the other two.
Tests matter here too, but not as a percentage. A coverage number tells a reviewer nothing about whether the system does what it claims to do — it only tells them how much of the code got executed while some assertion, of unknown quality, ran alongside it. Tests that demonstrate behavior look different: they name the scenario, assert the actual business outcome, and fail in a way that tells you what broke rather than just that something did. StoreForge is built and labeled in the catalog as an acquisition asset for exactly this reason — full backend plus storefront, not a prototype with a happy path — and that label only holds up if the tests underneath it actually prove the checkout, inventory, and payment flows behave correctly under the conditions a real store hits, not just that the functions execute without throwing.
Commit history as a trust signal
Nobody reads commit history for fun, but a technical reviewer doing real diligence will read it, and what they find changes how much they trust everything else in the repo. A history that's mostly "fix," "wip," and "update stuff" tells a reviewer that decisions got made and lost — that the current state of the code is the only artifact left, with no trail back to why it looks the way it does. A history where commits are scoped, messages explain the reasoning behind a change and not just its mechanics, and the sequence reads like a reconstructable narrative tells a completely different story: that the person who built this thinks about the next reader, even when the next reader might just be themselves in six months.
I treat this as a discipline that pays for itself regardless of whether an asset is ever actually sold. Legible history is what lets me pick a project back up after eight months away and understand my own reasoning without re-deriving it. The acquisition framing just raises the stakes on a habit that was already worth having — a wall of "fix" commits is a bad experience for a stranger doing diligence, but it's also a bad experience for future-me, and I'd rather build the habit once than maintain two different standards depending on who might eventually be reading.
Benchmarks, claims, and the credibility tax
"Fast" is not a claim a technical buyer can verify, which means it's not really a claim at all — it's marketing copy wearing an engineering costume. The Constellation COO case study is where I hold myself to the opposite standard: 16.5% better SLA compliance measured against a documented baseline, under repeated trials, with bootstrap confidence intervals separating real signal from noise, backed by a test suite of 39 passing tests a reviewer can run themselves rather than take my word for.
The reason I insist on that level of specificity isn't perfectionism — it's that vague performance claims actively cost more credibility than having no benchmark at all. A reviewer who reads "blazing fast" learns nothing and trusts you a little less, because the phrase signals that either the number wasn't measured or wasn't good enough to publish honestly. A reviewer who reads a documented methodology, a stated baseline, and a confidence interval learns something real, and — just as importantly — can go check it. Unverifiable claims put the burden of trust entirely on the reader. Verifiable ones put the burden of proof on the artifact, which is where it belongs when someone is deciding whether to pay for what you built.
The discipline pays off even if it's never sold
I'd be lying if I said every project in the catalog gets a formal acquisition inquiry. Most don't, at least not yet. But I've come to think the acquisition framing was never really about acquisition — it's a forcing function for a standard that's easy to let slip if the only audience you're writing for is yourself. "Document this well enough that a stranger with no context could run it, extend it, and trust the numbers in it" is a much harder bar than "document this well enough that I remember how it works." Hold yourself to the harder bar and the easier one takes care of itself.
So I build every asset in the catalog — designed, built, tested, and documented solo — as if the next reader is someone I've never met, running technical diligence on whether to trust it with money or a production workload. Software is real estate: find undervalued ground, build something solid on it, and make it produce. A property with no clean paper trail isn't an asset yet, no matter how good it looks from the street. Documentation is the paper trail. Do it like someone's always about to check.
Buying or selling a software asset?
Every asset in my catalog is packaged for diligence — and available to license or acquire with a proper data room and transition support.
Keep reading
Building something similar and want a second opinion?
Happy to talk through documentation standards, due-diligence readiness, or what it'd take to get one of these assets deploy-ready for you.