Consulting · Open source · Research

Ship at AI speed. Skip the gamble.

We ship production code with AI, inside engineering guardrails that make most wrong versions impossible to build — so the speed compounds, while the breakage doesn't.

move fast and break things

ten thousand ways to fail, each one somebody's 2 a.m.

move fast and fix things

a hundred ways left — you're still gambling

move fast

three ways, one chosen — the rest won't even compile

Narrowing: the same shape that runs through every engagement.

01 — Positioning

A consultancy for serious codebases.

You're a fit if you run a platform team using a typed language (C++, Rust, Scala, TypeScript) — typically Series B–D, 20–80 engineers — with a regression you can name, an improvement plan you've already postponed twice, and a real interest in letting LLMs accelerate the work without quietly eroding what types guarantee.

  • aTechnical strategy A defensible second opinion before you commit a quarter to the wrong plan.
  • bType-driven architecture Design review through a cardinality lens — fewer representable states, fewer bugs.
  • cFull-stack delivery Typed-FP features shipped in Scala, Rust, and TypeScript, inside your repo.
  • dAgent-native AI workflows LLMs constrained by types, properties, and evals — output you can trust.
  • eCloud-native systems P95s, uptime, and the infra bill treated as design inputs, not afterthoughts.
  • fTeam enablement Workshops distilled from a decade of constructive-programming practice.

02 — Services

For teams that can't afford another regressive improvement plan.

Constructive Programming partners with teams on codebases that have accumulated the usual debts of growth — typed boundaries treated as untyped, required fields treated as optional, 800-line objects nobody dares touch. A single thread runs through every engagement: narrowing. Shrinking the set of values a type can hold so that fewer wrong programs compile, so thousands of lines go red and can be safely deleted.

What is different about our practice: we ship production code paired with LLMs. Narrow types and machine-checked properties are the strictest guardrails an agent can operate against — they turn non-deterministic output into a verifiable artefact.

Advisory

Architecture & advisory

Design review through a cardinality lens; narrowing type signatures; identifying where capability-based abstractions, refinement types, or algebraic effects unlock simpler code.

→ A written, defensible improvement plan — with effort estimates — before you spend two quarters on the wrong one.

Architecture review

Delivery

Embedded IC contributions

Embedded in your team to ship typed-FP features in Scala or Rust, with the same constructive discipline applied to PRs as to architecture.

→ Senior delivery hands in your repo within weeks — and a team the discipline rubs off on.

Embedded IC

AI

Agent-native development

Building the deterministic harness around your codebase — linters, types, properties, eval suites — so the non-deterministic behaviour of agents becomes a self-correcting development session.

→ Your team moves faster with LLMs, and can trust the output.

Fractional advisory

Enablement

Workshops & training

Distilled from a decade of constructive-programming workshops, tailored to your stack and your team's seniority mix.

→ The practice stays after we leave.

All engagements

03 — Process

Systematic, collaborative, low-risk.

  1. 01

    Discover

    A 30-minute scoping call — free, and honest about fit and start dates. You describe the problem; we work out together which offering fits. A written one-page scope follows within 48 hours.

  2. 02

    Design

    Architecture review through a cardinality lens: observed structure, the strongest risks, and three to five concrete narrowing moves with effort estimates.

  3. 03

    Build

    Pull requests, design docs, and eval suites — shipped under your repo and your release cadence, paired with LLMs against deterministic harnesses.

  4. 04

    Launch

    Machine-checked before it merges: types, properties, and evals green. Pair sessions on demand so your team owns what ships.

  5. 05

    Improve

    Monthly written summaries for stakeholders, a hiring rubric, team rituals — the constructive discipline stays after we leave.

If the readout doesn't surface at least one narrowing move worth more than the fee, we refund half. The report is yours to keep regardless.

04 — Recent outcomes

Results you can put in a board deck.

Otravo · Travel e-commerce

A data pipeline measured in hours

A core pipeline ran for eleven hours — too slow to rerun, too central to ignore. Rebuilt with optics and a narrowed data model.

Eleven hours to fifteen minutes.

Bodireel · Consumer product

Fast, up, and cheaper to run

A consumer-facing system that had to stay fast and stay up while the infrastructure bill came down — performance and cost treated as design inputs.

P95 under 20ms, 100% uptime, 30% less infra.

Royal Philips · Health technology

Correctness at programme scale

Static analysis grounded in Total Program Cardinality — counting the inhabitants of a program's types to keep quality measurable as the codebase grows.

A code-quality metric the compiler can enforce.

05 — Engineering depth

Machine-checked, by construction.

The harness we build around every codebase — each layer narrows what the one above it can get wrong.

  • Scalable architecture Capability-based abstractions and algebraic effects that stay simple as the system grows.
  • APIs & contracts Narrowed type signatures at every boundary — required means required.
  • Security Illegal states unrepresentable beats illegal states validated.
  • Performance P95s and pipeline runtimes treated as deliverables, not side effects.
  • Clean code Fewer representable states means thousands of lines can go red — and be safely deleted.
  • Maintainable systems Deterministic harnesses your team — and your agents — keep building against.

06 — Research & open source

The practice, in public.

cats-eo

Existential optics for Scala 3, built on cats.

One Optic[S, T, A, B, F] trait unifies Lens, Prism, Optional, Traversal, Grate, AlgLens and Kaleidoscope. Discipline-checked laws, scoverage-driven quality, JMH benchmarks against Monocle, and circe + avro integrations with an observable-by-default Ior failure surface.

  • Stack Scala 3 + cats
  • Status Active — v0.1.0 (2026)

scala-cardinality

Counting type inhabitants — keep your types small.

A type-cardinality calculator for Scala ADTs (|T| over +, *, ^), plus a scalafix rule that flags sum types used as function arguments. Backs the "Keep Your Types Small" argument with code.

  • Stack Scala + scalafix
  • Status Dormant (2022)

Fixed — a new functional language

Program against capabilities, not data structures. Fixed pushes algebraic effects, Perceus reference counting, and functional-but-in-place updates up to a capabilities level: you describe what your methods need (cap), the compiler picks the data structures and machine layout. Properties (prop) live alongside the capabilities they govern; refinement types are first-class. Phase 0 — design — with eleven example programs exercising the language.

07 — Writing

Long-form on type systems, optics, cardinality, and LLM-augmented engineering.

The ONE fp Design Pattern

Sep 2024

How functional programmers actually approach software architecture — under the misconceptions.

Poor man's Pi (types)

Mar 2023

Practical dependent typing in mainstream languages, without a specialised compiler.

More on Medium →

Available for select engagements

Build something useful, scalable, and beautifully crafted.

Engagements range from a focused two-week review to a multi-month embedded role. Based in the Netherlands; comfortable with EU MSAs and standard NDAs. The scoping call is free — and honest about fit.