I have three things live on the internet: a recipe extractor, a link-in-bio page for missionaries, and a home maintenance calendar. Each one has its own domain, its own database, and its own checkout. None of them knew about the others.
This site is the fix for that — but not in the way I first planned it.
The plan I nearly built
The obvious move was a store. One app that lists everything, takes the money, and unlocks what you bought. I got far enough to build most of it: a product registry, server-side entitlement checks against a payment provider, webhooks to keep access current, a scaffolder to add new products without hand-typing ids.
Then I looked properly at what I'd be putting in it.
Not Half Baked is a Python API with a Postgres database, a browser extension, an installable app, and its own subscription billing wired end to end. SentLink is a Next.js frontend over another Python API with its own tiers. Neither is a "small tool" you drop into a storefront. Folding them in would have meant rewriting two working applications to fit a shell that existed for the convenience of the shell.
So the store is still there, unlinked, waiting for something that actually suits it. What went live instead is simpler: a page per product that explains what it does and sends you to it.
What a hub is actually for
Once I stopped trying to make this site the runtime, its real jobs got clearer.
One voice. Three products built by the same person, described the same way, in one place — instead of three sites with three tones and no relationship.
One support address. Every product pointed at a single inbox with a stated response time, and a page of answers to the questions that otherwise arrive as email. The cheapest support ticket is the one that never gets written.
Somewhere to write. Which is this. Markdown files in the same repository as the site, rendered at build time. No CMS, no database, no monthly bill, no vendor to outlive.
No comments. Deliberately. A comment box is a support queue wearing a costume — mostly questions rather than conversation, each arriving as an obligation. There's an email address at the bottom of every post instead. It converts the same intent into something I can answer properly, once.
The decision with a closing window
Here's the part worth writing down, because it's the kind of thing that's cheap now and expensive in three months.
Not Half Baked takes subscriptions through Stripe. Stripe is excellent at moving money, but it does not make anyone else the seller. That means I am the seller of record, and sales tax on digital subscriptions is mine to register for and remit — in the EU, notably, with no threshold at all for a non-EU supplier of digital services. The obligation starts at the first sale, not the thousandth.
The alternative is a merchant of record: a company that legally sells to your customer and buys from you, absorbing the tax question entirely. You trade a larger cut for never thinking about VAT registration again.
I don't have paying subscribers yet. That's the whole point. Switching processors today is a code change in one file. Switching after a hundred people have active subscriptions means asking a hundred people to cancel and re-subscribe, because subscriptions do not transfer between processors — there is no migration path, only a conversation with every customer.
The window is open exactly until the first person pays. Most of the genuinely expensive mistakes look like this: not dramatic, just a door quietly closing while you work on something else.