Day One: A Repo Shaped Like the Argument It Makes
The self-host stack begins — three directories, two vendored tools, and a README carrying the full vendor-by-vendor savings case. The shape chosen on day one is the one still running four client stacks today.
Backfilled 2026-08-15. Written from the commit record months after the fact, because the founding period had no entry and the repo's own origin deserves one.
Why Care?
Most infrastructure repos start as a folder and acquire a shape later. This one started as an argument, and the directory layout was chosen to hold it.
The claim: a VC firm pays somewhere between $50k and $250k a year for software that has open-source equivalents good enough to run a fund on. Making that claim credible needs three separate things — the evidence (vendor pricing, honest comparisons), the tools themselves (vendored, pinned, deployable), and the deployments (real, per-client, full of secrets). Those have completely different audiences and completely different safety requirements.
So the repo got three directories on the first commit, and they still hold.
What's New?
The repo exists —
vc-self-host-stack, scaffolded as a pseudomonorepo.core/— submodule deploy wrappers for the tools we actually run.studies/— alternatives considered but not chosen, pinned so the reasoning survives.client-stacks/— gitignored from the very first commit.Two tools vendored: Twenty CRM and Papermark.
The README became the thesis — the full vendor-by-vendor analysis pulled in from
lossless.group, with savings math and footnoted sources.
The decision that mattered most
client-stacks/ was gitignored in the initial commit, before a single client
existed. Not added to .gitignore later, after a scare — designed out from the
start.
The repo is a public marketing surface. Real deployments carry real .env
files, real database passwords, real bucket credentials. Those two facts are
irreconcilable in one tracked tree, and the only reliable way to keep them apart
is structural rather than procedural.
Three months on, that single line is why four clients' secrets have never been at
risk of a stray git add -A. It also created a real cost — anything that must
survive a rebuild has to live in docs/, not in the client directory — but that
constraint has been worth paying every time.
The first two tools, and why those two
Twenty CRM — the Affinity / Salesforce Financial Services Cloud replacement. Affinity runs $167–$225 per seat per month; FSC runs $325–$750 plus implementation. It is the single largest line item on a VC's software bill, so it was the obvious first target.
Papermark — the DealRoom / ShareVault replacement, and the only genuinely fully-open-source VDR. DealRoom bills flat at $12k–$15k a year; ShareVault charges per deal.
Both were pinned to lossless-group forks rather than upstream, on the
theory that deploy wrappers would need layering without polluting the source
repos. Worth noting how that assumption aged: every tool added since — plunk,
postiz, karakeep, plane — is pinned to plain upstream, because the wrapper
layering never turned out to be necessary. The fork was insurance we have not had
to claim.
The README as the product
Pulling the whole thesis into the README rather than linking out to it was deliberate. A reader who lands on a GitHub repo from a search result will not click through to a marketing site to find out whether the idea is serious. The front page has to carry the argument: the category tables, the pricing, the savings math, the citations.
That instinct compounded. The README's category taxonomy became the structure everything else hangs off — it is what new tools get slotted into, what the watchlist sorts against, and eventually what the 99-tool portal catalog was generated from.
What day one got right, and what it did not
Right: the three-directory split, gitignoring client deployments before there were any, and treating the README as the product rather than as documentation.
Not right, in hindsight: studies/ never really filled up — alternatives got
recorded in context-v/explorations/ and a watchlist instead. And the fork-first
default for core/ submodules was solving a problem that never arrived.
