Przemysław Zalewski

JavaScript since 2012, browser and Node.js

A JavaScript developer who knows what the runtime does next

Fifteen years of shipping, the last nine in JavaScript and TypeScript on both sides of the wire. I write code that works with the event loop instead of against it, with a framework when it earns its place and without one when it does not.

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
15+years shipping software
9years of TypeScript, React and Node.js
100,000+players of Korona Krulów, built in two weeks
30,000concurrent users on my own chat app

Why me

No framework is also an option

A streaming HTML page with no client framework, a game with 100,000+ players, a Workers API in plain modules. When React or Next.js would add cost without value, I say so. When they fit, see the React page.

Legacy that keeps working

jQuery, ES5, a bundler nobody dares to touch. I modernize in slices: tests around the risky parts first, then modules, then types. The site never goes dark. The target is usually TypeScript.

Performance you can measure

Fewer requests, streaming instead of polling, work off the main thread, images that arrive at the right size. Measured with real-user data in PostHog, not with a lighthouse score alone.

One language, both sides

Browser, Node.js, Cloudflare Workers, Electron, React Native. The same team member can fix the API and the UI in one pull request, and the agents I work with follow the same rules on both.

Proof

Work I can show

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

Korona Krulów: a satirical React game for 100,000+ players, built in two weeks

The problem
Spring 2020, lockdown, a joke that deserved a game before the joke got old.
What I did
React, 400+ actions, a leaderboard, open source on GitHub, shipped in two weeks of evenings.
Result
100,000+ players and ~700 upvotes on Wykop at launch.

100,000+ players 2 weeks open source Open ↗

See also: React · Games

Streaming agent output in one HTML request, no client framework

The problem
Agent output arrives out of order and takes a while. A page that waits for everything feels broken.
What I did
One HTML response streamed from the server, slots filled out of order as results arrive, no hydration, no client framework.
Result
First paint in milliseconds, the rest fills in live. The same idea runs the stream demo on the Next.js page.

streaming HTML no hydration

See also: Next.js

GovTech 2019: ID photo validation in the browser, no photo leaves the device

The problem
A government competition asked for a tool that checks ID photos. Sending citizens’ faces to a server was the wrong default.
What I did
TensorFlow and OpenCV compiled to WebAssembly and run on the applicant’s device inside a mobile web app.
Result
On-device validation with zero uploads, submitted to Poland’s GovTech program.

WebAssembly on-device

See also: AI & agents

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.

JavaScript 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

The event loop, visualized

Edit the snippet. It runs in an isolated module in your browser and the timeline shows the real order: synchronous code first, then microtasks (Promise.then, queueMicrotask), then macrotasks (setTimeout), with requestAnimationFrame before the next paint. The order surprises most candidates in interviews. It should not surprise your codebase.

Demo loading…

Try nesting a setTimeout inside a Promise.then, or add an await in the middle. The timeline updates on every run.

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

JavaScript or TypeScript?
TypeScript for anything that lives longer than a weekend, plain JavaScript where a build step would cost more than it saves: small sites, scripts, Workers, demos like the one on this page. Both are on my daily stack, see the TypeScript and Node.js page.
Can you modernize an old jQuery or ES5 codebase?
Yes, in slices and without a big-bang rewrite. First a Playwright suite around the flows that make money, then modules, then types, then whatever framework the product needs. The site keeps running throughout.
Do you build without a framework?
When it fits: content sites, dashboards with one HTML stream, embeddable widgets, edge functions. Korona Krulów reached 100,000+ players on a small React core, and the agent output page I built streams HTML with no client framework at all.
Node.js on the server?
Yes: Express APIs, streaming endpoints, workers and queues, Postgres. Hardening flags on, dependencies reviewed, same-day response to advisories. Details on the TypeScript and Node.js page and the Cloudflare page.
Performance work?
Measure first with real users, then fix the three things that matter: request waterfalls, bundle weight, main-thread work. The Next.js page has a live demo of the waterfall problem.
How soon can you start?
November 2026. Book the call and bring the repo, or a link to the page that feels slow.
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