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
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
I've updated my React Component Testing with Vitest workshop to include a new exercise on migrating to Vitest 4.0!

Discover what changed, what's relevant for component testing, and how to migrate your tests in a breeze.

react-component-testing-with-vitest.epicweb.dev/exercise/05...
Migrating to Vitest 4.0
Extras step 1 problem
react-component-testing-with-vitest.epicweb.dev
November 25, 2025 at 5:17 PM
📣 A huge mega epic sale is happening!

You can grab my entire Testing Bundle 50% off. Just bear in mind that it has a solid chance of making you fall in love with testing. You've been warned.

www.epicweb.dev/testing
Master Testing for Better Web Applications Using Vitest
Learn from the creator and maintainer of Mock Service Worker, Artem Zakharchenko.
www.epicweb.dev
November 24, 2025 at 4:16 PM
📰 Today, I've got a practical testing tip for you. I've picked this one up relatively recently and I've been using it for testing anything async since. And I think you should use it, too!

Let's talk about the `.resolves` chaining in your assertions.

www.epicweb.dev/prefer-the-...
Prefer the `.resolves` Chaining
Improve the error experience when testing asynchronous code with the `.resolves`/`.rejects` chaining.
www.epicweb.dev
November 24, 2025 at 3:12 PM