Skip to content
Contact

Work

Work you can check yourself

Shipped products, client sites and public repositories, nothing else. Open them and judge for yourself.

Cases

Four builds, from CMS to CLI

  1. 01 My own product

    PageSquirrel

    The multi-tenant CMS I've been building since 2017. Each project gets its own domains and template. pagesquirrel.com itself was built entirely through its own Content API.

    • Content API with 189 documented operations (OpenAPI)
    • A versioned manifest, published by the psq CLI: a re-run reports create 0, update 0
    • Six modules: blog, brag, booker, estate, shop, chef
    • 936 commits on main and 395 test files
    • PHP 8.5
    • Symfony 8.1
    • Doctrine ORM 3
    • DBAL 4
    • PostgreSQL
    • Redis
    The PageSquirrel back office showing the blocks of a page
  2. 02 My own studio

    Websoufflé

    My one-person business in Bruges, since August 2022. The tagline: "Web design with flair, ready for anyone to share."

    • Custom websites and software
    • Backend systems, APIs and microservices
    • Automation workflows with AI and n8n
    • APIs
    • microservices
    • n8n
    • AI
    The home page of websouffle.com
  3. 03 Public repo

    Cashsense

    A local-first personal finance app on Tauri v2, from one React and TypeScript codebase with a Rust core.

    • macOS, Windows, Linux, Android and iOS from one codebase
    • Data stays in local SQLite
    • OCR and AI cloud calls are opt-in
    • Tauri v2
    • React
    • TypeScript
    • Rust
    • SQLite
    Cashsense: local first on macOS, Windows, Linux, Android and iOS
  4. 04 Public repo

    spotify-web-cli

    A TypeScript command-line interface for the Spotify Web API.

    • 1:1 coverage of every non-deprecated endpoint
    • Authorization Code + PKCE login
    • Runs on Node.js 24+
    • TypeScript
    • Node.js 24+
    • Spotify Web API
    spotify-web-cli in a terminal, every non-deprecated endpoint 1:1

Agentic engineering

What keeps an agent in line

An agent on a live site should do what you allow and nothing more. These are the guardrails in PageSquirrel's Content API.

  1. Scoped keys, gated publishing

    Keys belong to a project and come with scope presets. Publishing sits behind its own gate.

  2. Dry runs first

    With ?dryRun=true you see what a write would do, before anything changes.

  3. No blind writes

    ETag and If-Match refuse a write based on stale data. An Idempotency-Key makes a retry safe.

  4. A trail for every run

    X-Agent-Run-Id ties calls to a run, so the audit trail shows what an agent did. Rate limits keep it polite.

Questions

Curious what's under the hood?

Happy to walk through the choices, the trade-offs and what I'd do differently next time.

Schedule a call