Least privilege by default
Every account, service and key starts with nothing and earns exactly what the job needs.
Not a badge, not a paragraph in a contract. This page describes how we build, what we protect, who can reach what, and exactly what happens on the worst day — in enough detail that you can hold us to it.
Every account, service and key starts with nothing and earns exactly what the job needs.
Isolation is enforced by the database itself — not by remembering to write the right filter.
Keys sit in the environment and the secret store. They are not rows, and they are never inside a backup.
Nothing that moves value is trusted from a browser. The server recalculates from the source, then decides.
Most breaches are not exotic. They are an ordinary mistake that nothing was in place to catch. These are the defaults that make the ordinary mistake harmless.
Every identity in the system starts with no access and receives only what it must have to work.
Every table is created with policies enabled, and the policy is written before the feature that needs it.
Private keys, provider tokens and passwords never become a row in a table — not even temporarily.
An amount, a balance, an odds value or a permission arriving from the client is a request — never a fact.
Deny is the default. An error is never allowed to degrade into permissive behaviour.
Nothing reaches production without a second pair of eyes and a way back.
In every system we build there is a point where a number becomes real value. That point always sits on the server. This is the full chain, and every link in it exists to cancel an assumption somebody might otherwise make.
The client asks. Asking is the entire extent of what the client gets to do.
The session is verified against the server's own store, not against whatever the caller attached to the request.
Prices, odds, balances and bonuses are read from the source of truth. Numbers sent by the browser are simply not used.
Limits, permissions, risk rules and tenant configuration are all evaluated before anything is written.
The write is idempotent, so a retry cannot duplicate it, and it leaves an audit record nobody can quietly revise.
Encryption is the floor, not the achievement. What really decides the outcome is how little data reaches us at all, and where the wall between one brand and the next actually stands.
TLS on every connection — browser to server, server to database, service to service. No internal hop is treated as safe just because it is internal.
Storage-level encryption across databases, backups and files. Particularly sensitive fields get a second layer on top of that.
One codebase, many brands, and no route between them. Every query is bound to its tenant at the database level, not in the application's good intentions.
Data we never store cannot leak. Card numbers stay with regulated processors, private keys never reach us, and logs are stripped of anything they do not need.
Each brand is a tenant with its own identifier. That identifier is never taken from the request — it is resolved on the server and then enforced by a database policy. Even if application code forgets to filter, the database does not forget.
The same boundary protects the other direction too: a bug in one brand's configuration cannot spill into another brand's data, because the policy does not care which code asked.
Access control is only real when it is boring: a small number of roles, each with an obvious ceiling, and a record of everything anyone did above the ordinary line.
Every privileged action writes a record: who, what, when, from where, and what changed. Those records are append-only, so the people able to perform an action are not able to quietly rewrite the history of it. When something looks wrong, the first question always has an answer.
A system that is secure on launch day has achieved nothing. The achievement is staying that way through two years of changes, new people and features nobody planned for.
Automated, encrypted and retained to a schedule — and restored on purpose, because a backup nobody has ever restored is a rumour rather than a plan.
Health, errors, latency and security events, with alerting tuned so that an alert means something. Noise is a security problem: it trains people to ignore alarms.
Dependencies are tracked and updated deliberately, and an urgent fix jumps the queue instead of waiting politely for the next release.
Every change goes through review and a repeatable deploy, with a way back. Production is never edited by hand, however small the fix looks.
Every serious operator has a plan for the bad day. Ours is written down, and short enough that people actually follow it under pressure.
Stop the bleeding first — revoke, isolate, or take the affected path offline. Explanations come afterwards.
Establish what was reached, by whom and for how long, from logs that were designed to answer exactly this question.
Affected customers hear it directly from us, and regulators within the window the law sets. No spin, and no waiting for a more comfortable version of the story.
Rotate the credentials, close the path, and verify the fix instead of assuming it worked.
A written review that names the systemic cause rather than a person, and produces changes that actually ship.
If you have found a weakness in anything we run, we would much rather hear it from you than from someone else. Report it in good faith and you will be treated as an ally, not a threat.
Write in whatever language you are comfortable with, and include the steps to reproduce. A short, reproducible report beats a long, impressive one every time.
Send a report by emailWe would rather be precise than impressive. Here is our actual posture, described in plain terms.
Data protection principles — minimisation, purpose limitation, retention limits — sit inside the architecture rather than being stitched on in a hurry before a review.
Data processing agreements with the providers we use and the clients we build for, so responsibility is written down before any data moves.
We build for gambling, payments and messaging — fields where auditors, processors and regulators ask hard questions. The architecture is designed to survive them.
Security questionnaires, architecture documentation and a written description of the access model, answered by the people who built the system rather than a sales team.
We support penetration testing and security review commissioned by our clients against what we built, and we fix what it turns up.
We do not advertise certifications we do not hold, and we do not turn audit findings into marketing copy. If a mark ever appears on this site, it will be because the work behind it was genuinely done. Until then the honest answer is this page: here is how the system is built, and here is how you can check us.
Architecture diagrams, the access model, a security questionnaire that needs answering, or a project you want built properly from day one — same window, real engineers on the other side.