Open a project once for the steps a visitor can picture, twice for the architecture and the reasons.
The Site Factory
Live. Five sites deploy from it today, including this one.
One shared engine that turns a folder of content and a palette into a live website: a brochure site in minutes, a membership site with logins, billing and gating in an afternoon.
What it does, step by step
Generate a siteOne command writes a folder that compiles: build configuration, the seams the engine reads, a palette, pages that render, a customer-service assistant already mounted. The last run took nine seconds.
Write only three thingsContent (what the site sells, its words, its legal clauses), brand CSS (four named colours, a type family, sizes) and configuration (name, origin, prices, provider ids). Anything else a new site has to write is treated as a defect in the factory.
Membership, when a site needs itThree login doors (Google, Patreon, a six-digit email code), Stripe and Patreon billing, a tier ladder, content gating, token metering, a thirty-day hold on cancelled data, crons and alarms. Every site gets the same engine; none of them rewrites it.
Prove it, every pushTwo hundred guards run before every deploy: types, dead code, secrets, a clean-room build from tracked files only, a live probe of every customer interaction on the deployed site, and a walk through every member route as every test member.
How it is built
An npm-workspace monorepo. One canon/ holds the engine and the page frame; each site is a thin folder that imports it through one alias. The canon is layered by an inward-only ring model and cut by a frame list, so a brochure site compiles the page shell, SEO and chat but never a login or a ledger.
TypeScript
Next.js 16 (App Router)
React 19
Supabase Postgres
Stripe
Patreon OAuth
Resend
Vercel (one project per site, one repository)
Node test runner, Playwright
Structure is canon, brand is the site. Canon CSS declares layout and mechanism and reads tokens it never defines; a site declares tokens and never declares structure. A guard asserts both directions.
Derived, not declared. The site roster, the guard list, the frame list, the sitemap and the factory inventory are read off the tree by scripts; a number typed into a document is treated as a bug.
A gate never seen red is a decoration. Every guard is proven by planting the defect it claims to catch and watching it fail, then restoring the tree.
Simplicity is rule one. Two designs that meet the requirements are not equal; the simpler one is correct and the other is a defect.
000 SITE FACTORY/
├── canon/ the engine and the frame, edited here and nowhere else
│ ├── lib/ auth · membership · billing · ai · seo · catalogue engine
│ ├── components/ page shell · header · hero · sections · legal · chat
│ └── scripts/ ~200 guards, run before every deploy
├── blanksite/ the template, and the fleet-wide gates
├── membershipsites/ starforgekits/ dustylighthouse/
├── brochuresites/ nocmetals/ jeffxu/ ← this site
└── brochuresitesforclients/ bomicleaning/
a site = content + brand CSS + configuration, over one canon
StarForge
Live at starforgekits.com.
A membership site for people who print miniatures: a catalogue of STL files, a browser modelling tool that does what slicers cannot, and a monthly drip of new things to print.
Browse the catalogueHundreds of STL products across categories, each with a rendered four-view sheet, served from a build-time export so a product page makes zero database calls.
Join and log inSign in with Google, Patreon or a six-digit email code. A tier ladder from starter to max; Stripe or Patreon as the billing provider, never both for one email.
Unlock and downloadA member spends monthly picks to unlock files; downloads start silently from Google Drive with no Drive page and no shareable URL.
Model in the browserSplit with pegs, hollow, drain holes, magnet sockets, engraved text, booleans, mirror, bases, undo, autosave, STL and 3MF export. Pure JavaScript; no WebAssembly, by design.
Summon a pictureMembers generate concept images with metered tokens: deduct once, produce, verify the result, keep the charge or refund once.
How it is built
The membership half of the factory canon with StarForge's content, prices and skin on top. The catalogue is a static export; the money paths are webhook-driven with two-phase event claims so a killed handler never loses a payment; token metering is a two-pass ledger.
Next.js
Supabase Postgres (RPCs for atomic reservations)
Stripe subscriptions and webhooks
Patreon sync cron
Google Drive delivery
three-bvh-csg for booleans
gpt-image-2 via fal at low quality
Vercel Blob
Minimum database: public reads come from a generated constants module; the database is for authentication, gating and the ledger only, so the catalogue survives a database outage.
Burst-pattern IP bans instead of fixed windows: ten failed logins in one second is a machine, ten in ten minutes might be a person; the punishment scales with the confidence.
Every heading is pinned by a guard: rewording an h1 fails the build, because a heading change hides inside a commit about something else.
visitor ──► catalogue (static export, 0 DB calls)
│
├─ login door ─► Google | Patreon | email code ─► signed session
│
└─ member ──► picks ledger ──► unlock ──► silent download (Drive)
└─ tokens ──► generate ──► verify ──► keep / refund once
Dusty Lighthouse
Live at dustylighthouse.com.
A Spanish graded-reader platform: books from A1 to B2, flashcards, a companion you talk to in Spanish, and a coin economy that turns reading into a game.
Read at your levelFour levels, from flash tales to novels, with a hover dictionary, speech, and study modes that earn coins.
Drill with flashcardsVocabulary, grammar and conversation decks, each a route the manifests derive; a lesson ladder that knows what came before.
Talk to a companionA cast of characters with memories, dealt a few at a time each day; unlimited chat for members, never rate limited.
Play the casinoCoins earned by reading are spent at tables whose house edge is fixed and audited; one game is shipped, Get Her Number.
How it is built
The same membership canon as StarForge, with a reader engine, a flashcard engine and a companion-chat engine that have since moved into the canon so the next site inherits them. Content is a manifest-driven corpus produced by a separate pipeline.
Next.js
Supabase
Stripe and Patreon
DeepSeek V4 Flash for chat
browser speech voices (no audio files)
Playwright renderers for social art
Vercel Blob for covers
The corpus is data, the engine is canon: a story, a deck and a companion are files; how they are read, dealt and remembered is shared code.
Chat is unlimited and never metered: a reply costs a fraction of a cent; the point is that people stay.
Content gating is documented as a sheet that a guard checks against the code in both directions, so the marketing claim and the enforcement cannot drift apart.
corpus (manifests, stories, decks) ──► reader engine ──► coins
└► flashcard engine ──► ladder
member ──► companion chat (DeepSeek) ──► memory ──► daily draw
coins ──► casino tables (audited edge) ──► one game
Bioelectric Data Commons
In progress. Version one is the schema and the first slice of the literature.
A typed claim-graph of the bioelectricity literature: every published result as a claim with its species, its evidence tag and its paper, queryable as data.
What it does, step by step
Turn papers into claimsEach result becomes a typed node: what was done, in which organism, with what evidence, cited to a PubMed id that resolves.
Keep the claim ladder honestThree tags and no upgrades: established (replicated, mechanism anchored), unresolved (real evidence, mechanism open), engineering vision (nobody has done it). The three famous overclaims are tagged as visions, not results.
Make it queryableAsk the graph which primitives write anatomy, in which species, with which tools, and get citations back instead of prose.
How it is built
A LinkML schema over Postgres with vector search for the text, object storage for the sources, and ORCID login for contributors. Funding path: focused research organisation and public science grants.
LinkML schema
Supabase Postgres with pgvector
Cloudflare R2
ORCID OAuth
NCBI E-utilities for citation verification
A citation is verified by machine, not memory: eleven wrong PubMed ids were once found in a sister fact file, six of them near misses on real unrelated papers; every id now resolves before it is written.
The tag on a claim can only go down, never up; a document cannot promote a vision to a result by rewording it.
paper ──► claim { what · species · tag EST|UR|EV · PMID } ──► graph
└─ verified against NCBI before it is stored
query ──► "which primitives write form in vertebrates?" ──► claims + citations
The Voltage Zoo
In production. Two formats: futurism documentaries and chapter-by-chapter stories.
A science-fiction suspense channel set in a biopunk future, built on a fact bank of the real bioelectricity literature so every scare has a receipt.
What it does, step by step
A fact bank firstSeven hundred and fifty-nine cited facts, four hundred and fifty-nine with a PubMed id that resolves, tagged on the claim ladder. Nothing is written from memory.
Two formatsA documentary may sensationalise a real result and never be built on an invented one; a story may invent anything, but the biology on screen does what a real organism does.
The receipt in the commentThe video entertains; the pinned comment carries the species, the year, the real size of the result and the PMID.
How it is built
A content pipeline: a grounding document that outranks every summary, a fact bank as a tab-separated table, prompts per format, image stills from one model at one quality tier, and a scheduler shared with three other channels.
Python pipeline
gpt-image-2 via fal for stills
a shared YouTube scheduling library
NCBI verification scripts
Facts outlive doctrines: the channel changed format three times in five days and every time the fact bank was the thing worth keeping.
The word for the science is never said on camera; what it does is shown instead.
Live: a cleaning company in San Diego; a tungsten-carbide powder supplier.
Brochure sites built for other businesses in a day: their words, their photos, their five colours, a customer-service assistant that knows every page, and a review button.
Read theirsTheir pages, their brand colours read off their own blocks, their fonts, every heading, their reviews and policies. Nothing invented.
Generate and fillThe factory writes the folder; the work is the content: services, questions, reviews, story, and pictures converted to webp and stored on a CDN.
An assistant that cannot lieThe fact sheet is built from the site's own data modules, so the assistant can only say what the site publishes; what is not published is left out, not forbidden.
How it is built
The frame half of the canon only: page shell, header, hero, sections, legal shell, SEO, structured data, the chat widget. No login, no tier, no payment, none of our credentials.
Next.js over the canon frame
DeepSeek V4 Flash
Vercel Blob
JSON-LD structured data
A client site never becomes a membership site and never carries a credential of ours.
Five named colours and no others; every other colour is a mix of those five, so a rebrand is five lines.
their site ──► colours · fonts · words · photos ──► content modules
factory frame ──► shell · sections · legal · SEO · chat ──► live in a day