Security & quality

Practices we can describe, not badges we cannot.

This page sets out what we actually do on every engagement: how changes are reviewed, how authorisation is resolved, how secrets and dependencies are handled, and how backups are proven. It claims no certification, because we hold none.

Scope
9 practice areas
Certifications
None held, none displayed
Standard
Built and tested to WCAG 2.2 AA
Terms
Targets live in the support agreement
01The central point

Hiding a button is not authorisation

It is the single failure we find most often in systems we are asked to review. A control is removed from the interface for users who should not have it, and the underlying request is left unprotected — so anyone who can construct that request can perform the action.

Every operation is authorised on the server, in the same order, with no exceptions for internal tools or administrative screens.

  1. 01AuthenticateEstablish who is acting, from a server-side session rather than a claim in the request.
  2. 02Check the role permissionDoes this actor’s role hold the permission this operation requires at all?
  3. 03Check the record relationshipHolding a permission is not the same as holding it over this record. A client user may read invoices — their own.
  4. 04Validate the inputOne schema per boundary, applied before the operation, so an unexpected field cannot become an unexpected write.

Only when all four pass does the operation run — and it is recorded when it does. Removing a control from the interface remains worth doing, but it is a usability decision. It is never the thing standing between an actor and your data.

Server-side authorisation pathA request carries a session. The server resolves the actor, checks the role permission, then checks the actor relationship to the specific record, then validates the input schema, and only then performs the operation. A failure at any of the four checks refuses the request. The interface layer sits outside this path and is described as cosmetic.INTERFACEhides controls for claritynot a security boundaryAUTHENTICATEwho is actingREFUSEROLE CHECKpermission heldREFUSERECORD CHECKrelationship to dataREFUSEVALIDATEschema at boundaryREFUSEALL FOUR PASS — OPERATION PERFORMED AND AUDITED

Fig. 01 — Server-side authorisation path

The interface layer sits outside the authorisation path entirely: it hides controls for clarity and is not a security boundary. The request itself passes through authentication, a role check, a record-relationship check and schema validation, and a failure at any of the four refuses it.

02Practices

Nine areas, described in enough detail to be checked

Open any of them for what it means in practice. Each is written so you could ask us to demonstrate it — which is the only useful test of a claim on a page like this.

Secure development lifecycle

Security work is distributed across the project, not appended to the end of it.

Threats are considered when the data model is designed, not after the interface is built. Each significant feature is examined for what an authenticated but unauthorised actor could do with it, what happens when an input is hostile rather than merely wrong, and what is written to logs. A written review checklist is worked through before anything reaches production, and its findings are fixed or explicitly accepted with a reason.

  • Threat consideration at design time, against the data model
  • A written pre-production review checklist rather than an unrecorded read-through
  • Findings tracked to a fix or an accepted, documented decision
Code review

Every change is read by a second engineer before it can merge.

Work lands in short-lived branches behind pull requests. Automated checks — types, linting, tests and accessibility — run first, so review time is spent on the parts a machine cannot judge: whether the authorisation is in the right place, whether the failure modes were considered, and whether the next person will understand it. Nothing reaches production by another route, including work done under time pressure.

  • No self-merged changes to production branches
  • Automated checks gate the review rather than follow it
  • Review covers authorisation placement and failure handling explicitly
Access control and role-based permissions

Authorisation is resolved on the server, in the same order, every time.

Authenticate the actor, check that their role holds the permission, check their relationship to the specific record, validate the input against a schema, then perform the operation and record it. Client scoping is a database predicate, never a filter applied after data has been fetched. Roles carry the narrowest set of permissions that lets someone do their job, and privileged actions are written to an append-only audit log with sensitive values redacted.

  • Role permission, then record relationship — both, in that order
  • Client scoping expressed as a query predicate, not a post-fetch filter
  • Privileged actions audited with the actor, the record and the change
Environment and secret management

Credentials live in a managed secret store, and environments are genuinely separate.

Secrets are never committed to a repository, never placed in a configuration file that travels with the code, and never included in a browser bundle. Development, staging and production are separate environments with separate credentials, so a compromised development key cannot reach live data. Staging is populated with anonymised or synthetic data wherever the real thing is not required, and access to production credentials is limited to the people who need it and revoked when they no longer do.

  • Managed secret store with rotation, not environment files in a repository
  • Separate credentials per environment; development cannot reach production data
  • Production access granted narrowly and withdrawn when it is no longer needed
Dependency management

Third-party code is watched, updated on a cadence, and kept deliberately small.

Automated advisories run against the dependency tree, and updates are applied as routine scheduled work rather than as an emergency after a disclosure. We prefer fewer dependencies with clearer provenance to a large tree of transitive packages nobody has read. Lockfiles are committed so a build is reproducible, and a dependency that is unmaintained is treated as a defect to be planned out, not a fact of life.

  • Automated advisories with an agreed patching cadence written into the support terms
  • Reproducible builds from committed lockfiles
  • Unmaintained dependencies planned out rather than tolerated indefinitely
Backups and tested restores

A backup that has never been restored is a belief, not a backup.

Backups are automated, encrypted and retained on a schedule agreed with you. More importantly, restores are actually performed on a schedule into a scratch environment, timed, and carried out by following a written runbook that somebody other than its author can execute. The result of each test — including how long it took — is recorded, because the number you need in an incident is the one you measured, not the one you assumed.

  • Encrypted, automated backups with an agreed retention period
  • Scheduled restore tests into a scratch environment, timed and recorded
  • A runbook a second person can follow without the author present
Monitoring and alerting

Alerts route to a person, and the dashboards are handed over.

Availability, error rates, performance budgets and backup success are monitored, with alerts routed to somebody who can act rather than into a channel nobody reads. Logs are structured and retained long enough to investigate an incident, and never contain secrets or full personal records. Dashboards and alert rules are part of the handover, so you can see the system yourself rather than asking us what it is doing.

  • Alerting on availability, errors, performance budgets and backup success
  • Structured logs with secrets and unnecessary personal data excluded
  • Dashboards and alert rules handed over with the rest of the system
Data protection

Collect less, keep it for less time, and be able to explain both.

Personal data is minimised at the point of collection, has a defined retention period, and is deletable on request without a manual database intervention. Transport is encrypted, storage is encrypted at rest where the platform supports it, and passwords are stored using a memory-hard hash — never encrypted, never recoverable. Where a project involves a processor relationship, the responsibilities are written down rather than assumed.

  • Minimisation and a defined retention period per data type
  • Deletion and export possible without hand-editing the database
  • Passwords hashed with a memory-hard function; never reversible
Testing

Automated where it pays for itself, manual where judgement is required.

Unit tests cover logic, integration tests cover the boundaries where systems disagree, and end-to-end tests cover the handful of journeys that must never break. Authorisation is tested as behaviour — a request from the wrong actor is expected to be refused — rather than assumed from the fact that the control is hidden. Accessibility and cross-device checks run as part of the definition of done, not as a phase that gets compressed when a date moves.

  • Authorisation refusals covered by tests, not inferred from the interface
  • Integration tests at the boundaries where two systems can disagree
  • Accessibility and device checks inside the definition of done
03What we do not claim

The part of this page worth reading twice

Everything above describes work we do. This section describes what we are not telling you, and why — because the absence of a claim is easier to verify than its presence.

No certifications are held or displayed

We hold no SOC 2 report, no ISO 27001 certification, no PCI DSS attestation and no Cyber Essentials mark, and none appears anywhere on this site. Formal certification is carried out by independent, accredited assessors — never by the supplier being assessed. If certification is a requirement of your procurement process, tell us early and we will say plainly whether we can meet it rather than implying that we already do.
  • We hold no certifications, and we display noneNo SOC 2 report, no ISO 27001 certificate, no PCI attestation, no Cyber Essentials mark. You will not find those logos on this site, because we have not earned them and a badge nobody checks is worth precisely nothing.
  • Certification is performed by accredited assessors, not by suppliersThose schemes mean something because an independent, accredited body carries out the assessment and issues the certificate. No engineering company can confer one on itself, and any supplier describing its own practices as "certified" without naming the assessor and the certificate is telling you something else.
  • We never describe a system as absolutely secureSecurity is a set of practices that reduce the likelihood and the blast radius of a compromise. It is not a state a system arrives at. Anyone who tells you their software is unhackable is either mistaken or selling.
  • We publish no uptime or response-time figuresAvailability targets and response times are agreed per engagement and written into the support agreement, where they carry an obligation. A number on a marketing page carries none.
  • We do not claim to have prevented incidentsNo breach statistics, no "zero incidents" line, no anonymised war stories offered as proof. Where a practice has a limit, the sections above say so.
04Shared responsibility

The parts that are yours

A system is only as protected as the accounts and processes around it. These sit with you, and we will say so during discovery rather than after an incident.

  • Account hygiene inside your organisationWho holds an administrative account, whether multi-factor authentication is enforced, and how quickly access is withdrawn when somebody leaves. We can build the controls; we cannot operate your joiners and leavers process.
  • Third-party systems you already runWhere we integrate with a system you own, its posture is yours. We will describe what the integration exposes and what we would change, and leave the decision with you.
  • Deciding what data is actually neededWe will always argue for collecting less. Whether a field is required is ultimately a business decision, and it is one worth making deliberately.
  • Keeping the support agreement currentPatching cadence, monitoring and restore testing continue for as long as there is an agreement covering them. When one lapses, the practices stop with it, and we would rather that were stated here than discovered later.
START HERE

Ask us to demonstrate any of this

Every practice on this page is one you can ask about specifically — how authorisation is tested, when the last restore was timed, what the patching cadence would be for your system. Specific questions get specific answers.

We read every enquiry ourselves. If we are not the right fit, we will say so and tell you what to look for instead.