What it is
Genwork is in production today, running sites for clients as different as a music festival and a consulting firm. Genwork is the engine behind the websites we build, and it starts from a deliberate decision not to write a content management system. It is built on Payload, a mature open-source headless CMS, with Next.js in front and PostgreSQL underneath. We did not reinvent the document model, field types, drafts and version history, localisation, access-rule engine, administration interface or migration machinery. They are proven parts, and they are a large part of why everything built on top holds together.
What Genwork adds sits above that line: how a page is composed from blocks, how industry-specific concerns are kept out of the framework, how one codebase runs many sites without their data ever meeting, how a deploy proves itself before it takes traffic, and what an AI agent is allowed to do.
It exists because of a question that kept coming up in client work. Everyone wants an assistant that can maintain their site. Far fewer can say what that assistant would be allowed to do, how anyone would find out afterwards what it did, or what stops it from widening its own access. Genwork is one answer, written out in full and running at real scale.
Generic underneath, specific on top
Every business has its own core concepts, whether that is a booking, a product, a listing or a case. They matter, but none of them belongs next to pages, media and permissions. So the framework at the bottom knows nothing about any industry. Business-specific structure lives in a template above it, commercial features are plugins above that, and a customer's own site is the thinnest layer of all: it may choose and configure, but never define.
Dependencies run one way only, and that is the part worth stating out loud. Every layering rule is a script that runs on every push, because layering that is only written down drifts within a quarter.
What the boundary costs
The fair question is what happens when one client needs something no other client wants. The answer is that it costs more than a setting. A site's own layer may pick a theme, a page preset or different wording, but it may not invent a field. That work belongs in a template, behind a flag only that client switches on, and it ships with the migration that creates the column. Blocks stay narrow for the same reason: each one lives in the template that needs it and is simply absent everywhere else, so nothing has to be made vague and multi-purpose just to be allowed.
The trade-off is worth naming rather than hiding. Schema drift is checked once, against a configuration with every feature switched on, and that check is only trustworthy while every real site is a subset of it. If a single site declares something the platform has never seen, the check quietly stops meaning much for any of them. So the boundary is not about tidiness. It keeps one verification honest across every site at once, and the price is that a bespoke field is a deliberate change rather than a quick one. When a change touches a schema that holds other people's data, that is the right way round.