Security, inherited.

Why enterprise security belongs in the platform - not the application code.

There's a tragic pattern in enterprise software. Someone greenlights an application. It gets built. It goes live. Two years later, the compliance team comes through with a security review, and it turns out nobody can answer basic questions about it.

Who can see what? - "Depends on the page, let me check." What does the audit trail look like? - "Well, we log some things to CloudWatch." How do we know one tenant can't see another's data? - "The application code handles it."

Those aren't audit answers. Those are audit failures waiting to be formalised.

The deeper issue isn't that the team forgot security. It's where security lived in their architecture.

Security in the app is security in a thousand places

When permissions, audit, and tenant isolation live in application code, they're everywhere and nowhere at once.

Every feature you add adds permission logic. Every new field adds the question "who can see this?" Every list query adds the implicit assumption "and this is filtered to the current tenant". Every write operation adds "and by the way, log this".

In theory, all these checks are consistent and comprehensive. In practice, six developers touching forty files over three years produces drift. The "broker can see premium_amount" check is in the controller. The "but only for their own portfolio" check is in the service layer. The tenant filter is in the repository. The audit log is a decorator on the controller method that only runs for some endpoints.

Find the edge case where one of these pieces doesn't fire. Congratulations - you now have a data leak that nobody wrote, nobody tested, and nobody can easily find.

This isn't hypothetical. It's the shape of almost every breach post-mortem I've read.

Security in the platform is security by default

The alternative is to move those concerns down - out of the application, into the substrate the application runs on.

In xMS, we've made four specific choices about this:

Permissions as a matrix, not code

You don't write permission logic in xMS apps. You define a matrix: for each role, for each resource, for each field, what's the access? Read? Write? Nothing?

That matrix is the source of truth. xMS compiles it into:

  • Client-side rules that hide the buttons and fields a user can't access - so you don't ship unreachable UI.
  • API-level enforcement that rejects requests the user isn't allowed to make - so a determined user with DevTools can't bypass the UI.
  • Database-level row security that filters every query - so even a bug in the API layer can't leak data the user shouldn't see.

Three layers, one definition. When you change a permission, all three update. Nothing drifts because there's nothing to drift from.

Audit by default, not by discipline

Every write in an xMS app produces an audit record automatically. Who did it. When. What they were doing. What the record looked like before. What it looks like after. What their IP was. What session they were in. Whether they were impersonating another user, and if so, who.

Nobody had to write that logging code. Nobody has to remember to add it to a new feature. You didn't even have to think about it.

This matters at compliance time - but it matters more at debugging time. When a record's in a state nobody can explain and the user who last touched it swears they didn't, you want an honest answer. Not "we log some things to CloudWatch."

Multi-tenancy as a setting

Flip a toggle on the app, and tenant isolation is enforced at the database via the same row-level security that powers permissions. Every user's session carries their tenant context. Every query is filtered automatically.

You don't pass tenant_id around your application. You don't write filter code. You don't build a search feature that accidentally returns records from another tenant because somebody forgot the WHERE clause.

The platform makes it structurally impossible to leak data across tenants - not hard, not unlikely, not well-tested. Impossible, short of disabling the platform.

Inherited from Supabase

xMS runs on Supabase, which runs on PostgreSQL. That foundation comes with:

  • SOC 2 Type 2 certification at the platform layer
  • HIPAA-eligible infrastructure
  • Australian data centres when your compliance regime requires it
  • Open source, so nothing's black-boxed

When you build on xMS, your app inherits all of that. You didn't write the pen-test reports. You didn't get the SOC 2 audit. You get them because you're sitting on an infrastructure layer that already has them.

The practical result

Three things happen when security is in the substrate, not the app:

  1. Security review is a short conversation. Your compliance team asks "who can see what?" and you point at the matrix. They ask "what's the audit trail?" and you query the audit log. They ask "how do we know tenants are isolated?" and you show them the RLS policy.

  2. New features don't re-expose the permission problem. Every new resource you add is covered by the same matrix, the same audit, the same isolation - automatically. You don't accidentally ship a bypass because you didn't re-think security for this specific module.

  3. Handover doesn't come with security regression. When the team that built the app leaves and a new team takes over, the security posture is visible, structured, and in the platform - not in a six-month-old chat log or a senior engineer's head.

The point

"We take security seriously" is a platitude. Every vendor says it. The actual commitment is architectural: do you keep asking your app developers to remember security, or do you move security somewhere they can't forget to include it?

xMS is built around the second answer. Not because security is a feature we added - because we think security belongs below the application layer, where it can't be accidentally left out, and we built the whole platform on that premise.

Security, inherited. Not security, handwritten. Not every time. Not once.

See xMS in action

Book a personalised demo tailored to your organisation.