Artem Zakharchenko
banner
kettanaito.com
Artem Zakharchenko
@kettanaito.com
Software engineer. Helping you master automated testing at http://EpicWeb.dev. Author mswjs.io. Instructor egghead.io.

I tell stories @zakarcher.com.

My debut book "LOGGERHEADS" it out 👇
https://zakarcher.com/books/loggerheads
Pinned
Huge news! I've written a book.

This is a story of light and dark that won't leave you indifferent. Illustrated, atmospheric, and meaningful. The kind that stays with you.

Please enjoy this cover reveal for Loggerheads:
zakarcher.com/blog/cover-...

📚💙
Cover reveal: Loggerheads
zakarcher.com
It sucks that Playwright doesn't have a test run level `beforeAll` hook. Or any hook, for that matter. Why? Global browser mocks for browser APIs it doesn't support.
December 1, 2025 at 7:11 PM
Reposted by Artem Zakharchenko
After many long years, the most widely used React framework in the world has React Server Components support! And the migration story is iterative, not "big bang" 💥

I think React Router's take on RSC is really great. Read the article and watch the whole video here: www.epicreact.dev/react-router...
December 1, 2025 at 4:06 PM
@profanity.accountant do the thing, I guess?
December 1, 2025 at 10:18 AM
I've been building on Remix 3 exclusively for about a month and I'm slowly gathering enough tidbits to put into an article. I will likely wait for the team to ship the next version next spring though. There's a chance most of my criticism will be addressed there.
November 30, 2025 at 7:43 PM
I really dislike sharing negative sentiment toward tools, but npm's CLI has forever cemented the title of one of the worst CLIs I have been subjected to use. It constantly wastes my time. It prints irrelevant errors and warnings that have nothing to do with what's actually wrong.
November 30, 2025 at 6:37 PM
TIL there's a common mapping between font subfamilies and `font-weight` in CSS: developer.mozilla.org/en-US/docs/...

This is the kind of world I want to live in. Beautiful.
font-weight - CSS | MDN
The font-weight CSS property sets the weight (or boldness) of the font. The weights available depend on the font-family that is currently set.
developer.mozilla.org
November 30, 2025 at 12:07 PM
Just implemented my first view transition in CSS. Woah.
November 29, 2025 at 4:53 PM
Can we please appreciate how freaking fast Vite is?

I've got a medium-sized app with a bunch of routes, components, styles, and it boots up instantly. Love this.
November 29, 2025 at 10:58 AM
If your app/tests cannot import and run ESM code you need to stop whatever you're doing, open your JIRA, and book yourself 5 days of work in the first sprint of next year to solve that.

ESM has been around for years. It's a standard. Please use it.

Thank you.
November 28, 2025 at 3:12 PM
So ya'll rotate your NPM tokens every 90 days now? Or is there a way that promotes secure publishing without turning it into a total chore? 👀
November 28, 2025 at 3:01 PM
Reposted by Artem Zakharchenko
For those of you who have not muted the words "Black Friday" and "Sale" yet, you can grab a 50% (‼️) discount on all things Epic here: www.epicweb.dev/2025-50

Get really good at full stack React development and testing with these premium workshops.
50% Off: Finally Ship Code You're Proud Of
Stop piecing together random tutorials. Epic Web workshops cut years off your learning curve. 50% off this week only.
www.epicweb.dev
November 28, 2025 at 2:57 PM
I appreciate the irony of recommending scoped NPM tokens before publishing and not being able to publish a NEW package because you cannot scope permissions to packages that don't exist yet.

So you create a readwrite token for ALL packages. Which defeats this feature entirely.
November 28, 2025 at 2:58 PM
My first Chromium issue, yay!
issues.chromium.org/issues/4643...
November 28, 2025 at 10:38 AM
This is insane! Thank you, ‪François! The origins of your last name require no explanation.
I'm signing the @opensourcepledge.com, it's time to give back to the maintainers of the projects @nuqs.dev depends on.

I just gave 2700€ ($3,212) to 18 maintainers & projects I use, love, and want to support.

Happy Thanksgiving! 💖

nuqs.dev/blog/open-so...
Signing the Open Source Pledge | nuqs
Giving back to maintainers of the OSS projects nuqs depends on.
nuqs.dev
November 27, 2025 at 6:58 PM
The recent "wow" moment I had was that I didn't need to ship 250MB of Chrome to have an app. My PWA is 3MB, boots up and works times faster than your most performant Electron app.
November 27, 2025 at 6:47 PM
Engineers needs more "Frieren drawing" moments. Someone posts their approach to a problem and we collectively provide meaningful advice and support while acknowledging how difficult engineering actually is.

Be like artists, you artists of code.
November 27, 2025 at 6:37 PM
Very few companies are building serious products as PWAs and it shows. Most PWAs you encounter in the wild are just view shortcuts for websites. They don't utilize PWA-specific APIs in any way.

If more products built PWAs, the APIs overall would be better.
November 27, 2025 at 6:27 PM
Turns out this is an issue that's been unresolved for 1,5 years. A shame, truly.
I cannot wrap my head around the Launch Queue API. It persists the file handle you opened with your app across reloads. This means if your app can handle more than 1 file during its session, which it 99.9% does, you are getting a broken app every time:
November 27, 2025 at 6:25 PM
This is actually pretty neat and a big reason why I chose to be active on Bluesky.
log in with your internet handle
Internet Handle
internethandle.org
November 27, 2025 at 6:21 PM
I cannot wrap my head around the Launch Queue API. It persists the file handle you opened with your app across reloads. This means if your app can handle more than 1 file during its session, which it 99.9% does, you are getting a broken app every time:
November 27, 2025 at 4:57 PM
💡 One of the major questions to answer when designing APIs is: what is the input and the output of this API?

And there are a few things to consider here.
November 27, 2025 at 3:29 PM
I prefer an [error, data] over { error, data } for async operation results. Why? Because a tuple guarantees the order. Put the error first, which reminds the consumer to handle it. Object keys are order-insensitive and it's easy to forget to check for the "error" key.
November 27, 2025 at 2:37 PM
Reposted by Artem Zakharchenko
Half off all things epic for the next few days: www.epicweb.dev/2025-50
50% Off: Finally Ship Code You're Proud Of
Stop piecing together random tutorials. Epic Web workshops cut years off your learning curve. 50% off this week only.
www.epicweb.dev
November 26, 2025 at 2:24 PM
Turns out, I've needed Promise.try() more than I thought!
Been using it a lot lately to reduce event loop ticks with async/await.

developer.mozilla.org/en-US/docs/...
Promise.try() - JavaScript | MDN
The Promise.try() static method takes a callback of any kind (returns or throws, synchronously or asynchronously) and wraps its result in a Promise.
developer.mozilla.org
November 26, 2025 at 2:26 PM
An undo/redo history is one of those things that look clear enough on the surface, but once you dive into async/batching/cancellation, you realize how more difficult and exciting it actually is to build!
November 25, 2025 at 5:40 PM