Przemysław Zalewski

TypeScript and Node.js since 2017

A TypeScript developer who lets the compiler do the arguing

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

Przemysław Zalewski
  • “someone you can always count on”public LinkedIn recommendation
  • “a true bias for action”client CTO, on LinkedIn
  • 15+ yearsshipping software
  • Free call, no pitch deck30 minutes, then you decide
9years of TypeScript, React and Node.js
300+ GBof production data on one platform I led
~30%of merged PRs in 2026 opened by an AI agent, ~85% reviewed by me
15+years shipping software

Why me

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.

Node.js that survives advisories

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.

Data at scale, boringly

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.

Streams, not polling

Server-sent events for live updates, streaming HTML for agent output, WebSockets where they earn their keep. Fewer requests, faster first paint.

Proof

Work I can show

Problem, what I did, result. Client names only where I am allowed to use them.

Suppression-list platform: MVP to product, 300+ GB in production

The problem
A UK email publisher needed suppression lists at terabyte scale with constant-time sign-up and zero-downtime deploys.
What I did
I led three engineers from MVP to the full platform. Postgres partitioning by tenant and list, parallel request pipelines, blue/green deploys. One-click unsubscribe shipped four months before Google and Yahoo required it.
Result
300+ GB and millions of events in production, zero-downtime deploys, and a compliance feature that landed before the deadline existed.

300+ GB team of 3 blue/green

See also: Full-stack & custom software · Email

A typed utility library, hundreds of functions, full test coverage

The problem
Teams kept rewriting the same helpers with slightly different bugs.
What I did
Hundreds of TypeScript functions with generics that infer instead of annotate, codegen in CI, full tests, published to npm.
Result
One library across projects, types that catch mistakes at the call site.

npm generics codegen

CASA Tier 2 turned into a Playwright suite

The problem
OAuth access to Gmail requires Google’s CASA assessment every year. A questionnaire does not stop regressions.
What I did
Each CASA and OWASP ASVS control encoded as a Playwright test. E2E and visual regression across six browser and device targets, run on every pull request.
Result
CASA Tier 2 passed, Yahoo’s OAuth review passed, and an annual chore became a continuous check.

CASA Tier 2 OWASP ASVS 6 targets

See also: Mobile & desktop apps

One foot in the door

Not ready for a project? Start smaller.

Two ways to see how I work before you commit to a sprint. Fixed scope, a number in writing after a short call.

TypeScript & Node.js codebase audit, one week

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.

Code review of one pull request or one module

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.

Ask about an audit Free 30-minute call first. If an audit is the wrong tool, I say so on the call.

Live demo

JSON in, TypeScript out

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

Three steps from this page to a running project.

  1. 1

    A 30-minute call

    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.

  2. 2

    Scope in writing

    A short written plan follows: what we build first, what we measure, how we work together and what it costs. No slide deck.

  3. 3

    Something to touch in week one

    The first slice ships in the first week: deployed, measured, reviewable. From there the work is paced by what the numbers say.

Fit check

Is this a fit?

A good fit when

  • You need a senior who owns delivery, not a pair of hands
  • The product has to ship and be measured, with or without a product manager
  • A solo engagement or a team of up to four
  • TypeScript, React, Node.js, Cloudflare, Postgres, PostHog

Probably not when

  • A program that needs a ten-person vendor team
  • A stack built around Java, Python or a cloud I do not sell
  • Body leasing by the hour with no say in how the work is done
  • A start before November 2026

Working style

How I work

Review as a craft

Hundreds of pull requests reviewed. I review for the product and its reasons. The code comes second.

Zero bug policy

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.

Agents under rules

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

Questions people ask before they book

Express, Fastify or something else?
Express most often, because every team already knows it and the middleware ecosystem is boring in the good way. Fastify when throughput is the bottleneck. Workers when the shape is request-and-response.
How strict is your TypeScript?
Strict mode, no 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.
How do you handle validation?
Zod at the edges: request bodies, environment, external APIs. One schema, one inferred type, one place to change.
Monorepo?
When several packages share types and a release, yes. When it is one app, a flat repo with clear folders beats tooling nobody understands.
Testing?
Unit tests where the logic lives, Playwright for end-to-end and visual regression, and security controls encoded as tests. On one product Google’s CASA Tier 2 controls run as a Playwright suite on every PR.
What about plain JavaScript?
Same person, same runtime. Browser code without a framework, Node.js scripts, legacy ES5 that needs a careful upgrade: it is all on the JavaScript page, with a live event-loop demo.
How soon can you start?
November 2026. Book the call and we scope the first milestone.
Przemysław Zalewski

Let’s find out in 30 minutes

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