Blog

Notes on the architecture.

How Whity is built, and why — written for people who want the mechanism rather than the marketing.

FLOATING TAGEXACT PINphp8.4php8.4php8.4===php8.4.25php8.4.26php8.4.27bumpnothing to bumpa version that movesthe watcher ran every week in both cases
Security8 minAmro Saleh

The dependency watcher that could not see

PHP shipped fixes for two unauthenticated RCEs on 21 October. Our Dependabot had watched the base image for months and opened zero pull requests — because a floating tag gives it nothing to bump. The failure, and why the fix is a test rather than a version.

Read →
ROUTE DECLARATIONDERIVED MCP TOOLPOST /documentsforms:createGET /documentsdocuments:readGET /formsforms:readOpenAPI schemapost_api_v1_…same permissionget_api_v1_…same permissionget_api_v1_…same permissionnothing hand-written · nothing to drift
Agents8 min

Every API route is already an agent tool

Most products bolt a chat box onto an existing API and call it agent support. Whity derives its MCP tool catalogue from the same schema the router already generates — so the tools cannot drift, and an agent gets exactly the permissions its token carries.

Read →
en · LTRar · RTLforms.incidentIncident reportDepartment headبلاغ حادثةرئيس القسمone key · two directions · neither is the fallback
i18n9 min

Arabic is not a translation pass

Bolting a second language onto a finished product produces a product that works in one language and apologises in another. Here is what treating Arabic as a first-class case actually cost us: a generated English catalogue, a sync that cannot overwrite a human, and layouts that mirror.

Read →
REQUEST FROM TENANT A, FOR TENANT B'S ROWmiddlewareJWT scopequerytenant_idcontextreset per requestdataany one layer failing alone is still not a leak
Architecture7 min

Tenant isolation and the plugin boundary

How Whity enforces multi-tenancy three separate times, why plugins never touch core source, and why that boundary is also what makes closed-source plugins possible under the licence.

Read →