Nine years finding the missing wires.

The right architecture doesn't fail silently. Missing connections do. I instrument before I build, fix root causes before I patch, and wire prevention into CI so the same bug can't ship twice.

Experience

Senior Frontend Engineer

Proxify
2025–present

Architecture owner for a Vue 3 / Nuxt platform. Drove a Nuxt 4 migration to Feature-Sliced Design to enforce clear ownership boundaries. Established a token-driven design system over PrimeVue. Introduced structured observability with Mixpanel and Sentry.

Vue.jsNuxt.jsTypeScriptFSDStorybook
400Kapplications / year
architecture owner

Senior Software Engineer

Proxify
2022–2025

Owned an ATS funnel processing 400K applications a year. Took completion from 39% to 65% — instrumenting first, measuring drop-off, forming hypotheses, shipping fixes, confirming with data. Built the shared UI component library. Proxify Quality Award 2024.

Vue.jsNuxt.jsTypeScriptReactNode.jsCI/CD
39→65%funnel completion
400K apps / year

Frontend Engineer

Skeyl
2016–2022

Primary React/TypeScript owner for client SPAs and dashboards. Made performance regressions visible before they reached users. Built backend utilities with Node.js and AWS Lambda.

ReactTypeScriptNode.jsAWS Lambda
40s→90sLighthouse scores
all properties

How I work

1.

Contracts first

Agree on API and data shapes before building screens. Generate types, mock early, keep a contract check in CI.

2.

Vertical slices

Own one slice end to end — from user goal to contract, UI states, monitoring, and a calm rollout plan.

3.

Quality in the pipeline

Linting, tests, and performance checks live in CI — every change, not only before releases.

4.

Clear collaboration

Ask precise questions, write short docs, make trade-offs visible so others can decide with you.

5.

Agentic engineering

Claude Code as a configured system. CLAUDE.md encodes stop rules and constraints. Hooks enforce what CLAUDE.md requests. The loop improves itself.

Engineering decisions

14 ADRs from production — a 400K-application ATS, a German legal-tech platform, agentic tooling. Start with the reversals.

  1. ADR-006

    Fix instrumentation before fixing UX

    The team wanted to redesign screens. I refused scope until we could measure where users dropped. Instrumentation first, hypotheses second, UX changes third.

    39% → 65%funnel completion after instrumenting
    Read ADR →
  2. ADR-007

    SonarQube + semantic release as CI gates

    Code review culture had plateaued. Wired SonarQube and semantic release into CI so quality became structural, not cultural.

    ~60%fewer UI bugs post-CI gates
    Read ADR →
  3. ADR-010

    Decisions I reversed

    What I got wrong, what changed my mind, what the second version looked like. Read this one first.

    Read ADR →
Browse all 14 ADRs

Selected projects

Sorrel — conversion engineering funnel

Live · Next.js 16

8-step subscription wizard. Typed funnel events — a wrong event name is a compile error. Flag-gated A/B test from PostHog through Stripe, with a /insights page reading live telemetry back in-app.

Next.jsTypeScriptPostHogGraphQLStripe

Nord Signup — design system integration

Live · Nuxt 4

12 ADRs documenting every decision. Three AI suggestions documented and rejected. Selective imports cut the JS bundle by half.

49%bundle reduction · 497→251 KB
Nuxt 4VueTypeScriptPlaywrightVitest

PropertyOS — debugging investigation

Multi-tenant · Python

Traced 14 production-class failures. Cross-tenant cache poisoning, float() on money, fail-open auth exposing real client data. CI now blocks the whole class.

14production failures blocked at CI
PythonFastAPIReactRedisPostgreSQL

Next SWR quality demo

Frontend

Next.js app showing data fetching, caching, loading states, and error paths with SWR and a complete quality setup.

Next.jsSWRTypeScriptTesting

Writing

What Ownership Looks Like When You Lose the Argument

You fought for a clear spec and lost. The work still needs to happen. Here is what ownership looks like when the process does not go your way.

Read →

Contracts Are the New Firewall

Contract-first development isn't process overhead. Here's what happens when you skip it, and why it matters even more when AI agents are writing your code.

Read →

What 14 Bugs Taught Me About Trust

A debug exercise with 3 reported bugs turned into 50 findings with one root cause. Here's what 14 fixes taught me about trust, patterns, and knowing when to stop.

Read →

How to Write Agent-Ready Tickets Before AI Breaks Your Product

Vague tickets become production bugs when AI agents write the code. Here's the 5-part template that makes tickets agent-ready before a single line is written.

Read →

Incidents Are Product Work

Failures are feedback from the system.

Read →

Saying No, Offering Better

The discipline behind saying no the right way.

Read →

Ownership of a Vertical Slice

How one clear owner prevents features from scattering.

Read →

Stop Performance Regressions at CI

Catch drift early, before users feel it

Read →

Contracts First. Screens Second.

Agree the shape once. Generate types. Mock. Guard in CI.

Read →

Stop Starting Vague Tickets

Reader takeaway: how to turn a fuzzy “add city” ask into a safe first release you can extend.

Read →

Contact

Based in EU time zones. Open to senior and staff product engineer roles at product companies. Let's talk.

Email meLinkedInNewsletter