Open for work
David Friedrich

David
Friedrich

Full-Stack Engineer & Creative Coder
with a background in visual communication

I build and ship production web applications end to end. A decade of Laravel and PHP, now TypeScript and React across my own products and the codebases I join. Berlin-based, at home in distributed teams, and currently open for freelance projects or the right permanent role.

Full career →
~/durchnull whoami
nameDavid Friedrich
roleFull-Stack Engineer
basedBerlin, DE · CET, remote-native
buildingHeal Suite · audits agent code
recentMusic platform · 2025–2026
shippingsince 2014
statusopen · freelance or permanent

Start with the problem

Contact

A few lines are plenty. These three are what let me give you a straight answer instead of a follow-up questionnaire:

  1. What you are building. The product and roughly where it is: an idea, a codebase someone left behind, something live and struggling.
  2. What is in the way. The part that made you open a contact form. That is usually the whole brief.
  3. When it matters. A date, a launch, a funding round: anything that tells me whether I have the capacity.
Rather write it yourself? [email protected]

What is this about?

0/1000

Goes straight to my inbox, used only to reply (privacy policy). No list, no CRM.

What I have shipped

Selected work

Two products of my own, two client engagements and the tooling I built to keep agent-written code honest.

Own product · open source

Heal Suite

durchnull/heal-suite · v0.1.2 · public beta

/heal:sweep

preflight gates · tree clean · report-only

estimate 18 healers · 73–183M tokens · nothing is written

▸ parallel fan-out: read-only, one agent each

  • self 2 med 1 low
  • arch clean
  • security 1 med 2 low
  • tests 1 low
  • perf 93 3 low

… 13 more healers, same run

converged 62 findings .heal/backlog.md (idempotent)

burden 44.6 ▼ from 67.6 over the first two sweeps

Agents write more code than anyone reviews, and in a codebase you inherited that is exactly where drift hides. The suite makes a repository audit, fix and harden itself against the standards it already committed to: 18 specialist auditors fan out as parallel agents and fuse into one dashboard with a single trend number, unfixed findings survive in a backlog so the next run builds on the last, and anything that keeps recurring is promoted into a free deterministic gate. Precision carries an honest denominator, and the known limits are published beside it.

healers per sweep
18
slash commands
26
open source
MIT
Claude Code Plugin AI Agents Code Audits Open Source

Read the case study

Client · 2025–2026

Music platform

iOS, Android, web

Product engineer on a universal React Native app connecting artists directly with fans, venues and labels. Built the platform's analytics subsystem end to end (event emission, a typed fact and metric layer, a scheduled rollup job and the in-app dashboard) and rewrote Stripe webhook handling as a dispatcher with signature verification and idempotency. Drove a contract-first refactor that made shared Zod schemas the single source of truth, turning runtime type drift into compile-time errors.

subsystems built from zero
10
schema migrations
31
months
7
React Native Expo Express Supabase

See the detail

Own product · live

Macrop

macrop.de · ~148k lines TypeScript

The Macrop day header: a bulk-phase day at 90%, a bar reading 2,704 of 3,009 kcal, rings for calories, protein, carbs and fat with their derived gram totals, a stepper that nudges the day’s calorie target, and a "Fit to targets" action that rescales every ingredient amount so the day lands on target.

A nutrition planner where no macro value is ever stored: every figure is derived from ingredients, so the math cannot drift. One pure TypeScript engine runs on the server as the authority and in the browser for optimistic previews, and a lint rule plus a CI architecture gate make the boundary between them impossible to cross by accident. Built with agents under a 22-gate chain and shipped through 1,315 merges, every one of them made by me (as of August 2026). It carries the GDPR and DSA surface a live consumer product owes its users: export, deletion, versioned consent with a health-data gate, an audited admin. Meals can be drafted by an LLM from a sentence or a photo, and it never returns a figure: the model proposes ingredients, the engine derives every number, and a macro it guessed stays private to one household until a nutrition source confirms it.

test files
236
architecture rules
16
external nutrition APIs
3
TypeScript Hono Drizzle React PostgreSQL

Read the case study

Client · 2025

Non-planar 5-axis slicing platform

Vue 3 · Three.js · FastAPI · PostgreSQL

A browser-based CAM tool that makes experimental 5-axis 3D printing usable by people who do not write code: real-time toolpath visualisation in WebGL, a research-grade computational-geometry engine wrapped into a stable product, and long slicing jobs streamed to the browser over Server-Sent Events.

of app-source commits
84%
releases shipped
20
months
7

See the detail

Own products · open source

Claude Code plugins

6 plugins · 51 commands · MIT

The marketplace the Heal Suite ships in. Five more plugins, each carrying one working rule into any repository it is installed in: a data-privacy firewall at the hook layer, a plan lifecycle, a release flow, a page renderer, a session observer.

Claude Code Plugin Open Source

See all six

All projects →

What I build with

Stack

A decade of it in PHP and Laravel, since mid-2025 mostly in TypeScript.

backend

PHP Laravel TypeScript Node.js Hono Express Zod Python FastAPI

frontend

React Next.js React Native Expo TanStack Query Vue 3 Alpine.js Tailwind CSS Three.js

data

PostgreSQL MySQL Prisma Drizzle Eloquent Redis Supabase

infra

Docker GitHub Actions AWS Hetzner Forge Sentry

testing

PHPUnit Vitest Playwright pytest ESLint mypy ruff

practice

Test-backed refactoring Contract-first APIs CI gates Reviewed agent output Release ownership Accessibility

Keep reading

Elsewhere

Career

Career

class PlaceOrderAction extends OrderAction
{
    protected function apply(): void
    {
        DB::transaction(function (): void {
            $placed = Order::whereKey($this->order->getKey())
                ->where('version', $this->order->version)
                ->update([
                    'version' => $this->order->version + 1,
                    'status' => OrderStatus::Placing,
                    'ordered_at' => now(),
                ]);

            throw_unless($placed, StaleOrderException::class);

            Transaction::place(
                order: $this->order,
                payment: $this->validated('payment'),
            );

            Stock::reserve($this->order);
            Coupon::redeem($this->order);
        });

        OrderPlaced::dispatch($this->order->refresh());
    }
}
Academic

Academic

Mechanical Pi
About

About

Landscape Mesh

Have a project in mind?

Contact

Tell me what you’re building. A rough idea is enough, no polished brief needed. I start from optimism: most things can be made to work.

or find me on LinkedIn and GitHub

Tell me about it

Contact

A few lines are plenty. These three are what let me give you a straight answer instead of a follow-up questionnaire:

  1. What you are building. The product and roughly where it is: an idea, a codebase someone left behind, something live and struggling.
  2. What is in the way. The part that made you open a contact form. That is usually the whole brief.
  3. When it matters. A date, a launch, a funding round: anything that tells me whether I have the capacity.
Rather write it yourself? [email protected]

What is this about?

0/1000

Goes straight to my inbox, used only to reply (privacy policy). No list, no CRM.