Types that catch mistakes at the call site
Generics that infer, discriminated unions instead of flags, unknown at the boundary and Zod where data enters. A typed utility library with hundreds of functions and full tests, published to npm.
TypeScript and Node.js since 2017
Nine years of TypeScript and Node.js in production: typed APIs, Postgres partitioned to 300+ GB, Playwright suites that encode security controls, libraries with generics that infer instead of annotate.
Available from November 2026 · Wrocław, Poland (CET), remote

Generics that infer, discriminated unions instead of flags, unknown at the boundary and Zod where data enters. A typed utility library with hundreds of functions and full tests, published to npm.
Hardening flags before incidents, OWASP Node.js practices, same-day patches when React2Shell and friends land, a regex sweep of our own code for the same class of bug.
Postgres partitioning by tenant, parallel request pipelines, constant-time sign-up, blue/green deploys. 300+ GB and millions of events in production for a platform rated 5.0 on Clutch.
Server-sent events for live updates, streaming HTML for agent output, WebSockets where they earn their keep. Fewer requests, faster first paint.
Proof
Problem, what I did, result. Client names only where I am allowed to use them.
See also: Full-stack & custom software · Email
See also: Mobile & desktop apps
One foot in the door
Two ways to see how I work before you commit to a sprint. Fixed scope, a number in writing after a short call.
I read the repo, CI, tests, security and the parts the team avoids. You get a written report with findings ranked by risk, a plan with milestones and a go or no-go you can defend. I have run this for a large software house before its clients saw the code.
Send me the diff that worries you. Within a few days you get line-level comments, the three things I would change first and whether I would merge it.
Live demo
Paste any JSON. The demo infers interfaces on the spot: optional fields across array items, literal unions, discriminated unions on a shared key, nested type names, plus a runtime guard and a typed fetch wrapper. No compiler involved, just the rules of the type system written out by hand.
Demo loading…
Try an array of objects where some fields are missing or differ in type. Toggle “widen literals” and “readonly”.
How it works
You describe the product and the problem. I ask the questions I would ask on day one. If I am not the right person, I say so and point you to someone who is.
A short written plan follows: what we build first, what we measure, how we work together and what it costs. No slide deck.
The first slice ships in the first week: deployed, measured, reviewable. From there the work is paced by what the numbers say.
Fit check
Working style
Hundreds of pull requests reviewed. I review for the product and its reasons. The code comes second.
A bug is fixed or consciously closed, never parked. Alerts and error tracking in every project, so I learn about problems before the client does.
Claude Code and Codex work on main with hooks, lint and test gates. The model suggests, the criteria decide. Every PR gets a human review and AI-assisted content is disclosed.
FAQ
any at boundaries, unknown plus a schema where data comes in, generics where they remove annotations, and a lint rule for everything that cannot be a type.
A free 30-minute call. You bring the problem, I bring questions. No prices on this page because scope comes first.
If I am the wrong person I will say so on the call and point you to someone better.
After you book: a calendar invite, then the call. Nothing else to fill in.
Available from November 2026 · B2B contract or employment · Wrocław, Poland (CET), remote