Articles

Engineering notes from the production seam: sovereign infrastructure, Drupal and Next.js, deployment assurance, access control, AI governance, and the failures that sharpened our operating practices.

Notes from the practice — on sovereign infrastructure, headless CMS, federal DevSecOps, and the architecture decisions behind them. Written for the engineers and buyers who have to make these systems work.

Latest articles


When a download link isn't enough

- August 3, 2026
A signed link keeps a file's address secret. It does not check who opens it. Here is why sensitive downloads increasingly ask for a hardware key, and how to add that step without turning every file into a chore.
Read article

One Key for Login and Delivery

- August 2, 2026
Most teams that gate sensitive files end up with two credential systems: one for logging in, one for downloading. We built the other arrangement — one security key, enrolled once at the identity provider, authorising both — and the build taught us three things worth passing on.
Read article

Assurance Is a Claim, Not a Ceremony

- August 2, 2026
If a download has to be authorised by a security key, something has to check the key. Making your file service a second relying party is one answer; verifying what the identity provider asserts is the other. The second is federation, and it changes what you verify, what you may call it, and how long it stays true.
Read article

Who the Commit Says Wrote It

- August 2, 2026
An AI-attribution policy is a sentence in a contributing guide until something reads the author field. We had the policy, we had the check, and a bot-authored commit still merged clean. What we found fixing it.
Read article






Config-as-code with Config Split: never cex what a split is hiding

- July 14, 2026
Config Split keeps env-specific configuration out of the canonical sync directory, but running drush cex while a split is active deletes the split-owned files from config/sync. The safe model: hand-edit the split's member lists, verify with cim instead of cex, and route per-environment values through settings.php overrides rather than the split.
Read article

The composer.lock that only builds on your machine

- July 14, 2026
A git-ignored path repository that symlinks a registry module to a local checkout writes a path dist into composer.lock. Commit that lock and every CI job and image build fails, because the sibling directory only exists on your machine. Relock with the override set aside, and add a CI guard that rejects a path dist.
Read article

The deploy that couldn't recreate its own container

- July 14, 2026
An interrupted docker compose up leaves an orphaned, hash-prefixed container squatting a service name, so every later deploy fails to recreate it until someone removes it by hand. Adding --remove-orphans (or a pre-clean) lets the deploy heal its own stack instead of failing on state left by a previous run.
Read article


A status endpoint that's coarse in public, detailed in private

- July 14, 2026
How to expose a health endpoint that gives the public a coarse up/degraded roll-up while unlocking full per-service detail only to a server-to-server caller holding a shared secret. Covers constant-time comparison, private caching, fail-closed defaults, and a deploy-order-safe rollout.
Read article

The redirect loop that only happens behind HTTPS

- July 14, 2026
A locale rewrite forced onto http: is cross-origin behind an HTTPS proxy, so Next re-issues it as an external request that re-enters the proxy and 301-loops the homepage. It passes every local test because the loop only appears when X-Forwarded-Proto: https is set. The fix: mark the internal rewrite with a per-process secret so canonicalization skips it.
Read article


The claim you can drop: an HMAC canonicalization lesson

- July 14, 2026
Binding a value into a signature is necessary but not sufficient. If the way you serialize claims before signing is ambiguous, an attacker can reshape a request so a bound claim silently disappears — and the signature still verifies. The pitfall, a concrete example, and the rule that prevents it.
Read article