The architecture, for anyone evaluating it as a build tool or a collaboration — framed around what it saves you from redoing.
Stop standing up a new stack for every client project.
Plain PHP and SQLite behind a single front controller — no heavy build chain, no forced cloud stack. public_html/ is the only web-accessible folder; everything else sits as private siblings outside the web root. Deploys to standard shared PHP hosting you probably already have.
Stop writing the same CRUD by hand for every entity.
meta/*.json defines each business object's tables, fields, list/form behavior, RBAC, and scopes. The Field API normalizes types and decides storage — integer/decimal/date/related are column-backed by default; everything else lives in data_json until it needs to be.
Stop fighting the framework when a client needs something odd.
Generic CRUD (views/list.php, form.php, merge.php, import_export.php) covers the default case. override/{entity}.php customizes one entity without touching core. workflows/routes.php handles processes that need a real preview-then-commit UI and don't fit generic CRUD.
Stop hard-coding one-off business rules in PHP.
A Token API ({{entity.field}}, {{row.alias}}, {{app.*}}) backs computed fields, email templates, and rule text. Rules (meta/rules/*.json) run on create/update, evaluate token conditions, and act — notify, email, create/update a record, or loop over another entity's rows. Managed from a web UI, not hand-JSON only.
Stop writing a new SQL query for every report request.
Saved Queries and Displays (meta/queries/, meta/displays/) build tables, KPIs, and charts declaratively — joins only ever walk a field already declared type: related, filter operators are matched against a fixed allow-list, and every value is a bound parameter. The /dev/reports builder re-validates by actually compiling before a save is kept.
Stop scattering permission checks through the codebase.
Five roles (dev, admin, manager, user, view) plus per-user, per-entity scopes, all resolved through one function: auth_can($action, $meta, $row).
Stop worrying a merge or migration will corrupt data.
Record merge blank-fills the survivor from the loser, repoints every FK reference across every entity (promoted or not), then soft-deletes the loser — one transaction, no partial state. Field promotion adds a real FK constraint and refuses to run if it would ever create a dangling reference.
Stop bolting on backups and audit after launch.
Audit log, backups, SMTP/OTP (disabled by default), saved views, and a PWA (manifest, service worker, offline page) are already there. A gated /dev panel for entity/field management and the reports builder; a role-gated /admin panel for day-to-day operations.
What's genuinely not built yet: scheduling/cron, field-diff rule triggers, outgoing webhook delivery, approval state machines, un-merge, and HAVING support in the query engine. Declarative dashboards are additive-only — no existing hand-coded chart has been migrated into that format. This list is kept current on purpose; assume nothing beyond it without checking.
Every client app — manufacturing, field service, tender management, IT — started as a copy of this same base and diverged only in its entity definitions and a handful of app-specific files. Framework code stays identical across apps by design.