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.
JavaScript since 2012, browser and Node.js
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

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.
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.
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.
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
Problem, what I did, result. Client names only where I am allowed to use them.
See also: Next.js
See also: AI & agents
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
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
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

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