
Senior frontend engineer at @evilmartians. I build interfaces, component systems, and frontend architecture for products that need to last.
Lisbon
Joined January 2011
- Tweets435
- Following189
- Followers237
- Likes1.9K
Pinned Tweet
We dropped 100 KB (brotli) from our customer @astrodotbuild marketing site.
How? We replaced React + Ark UI with native Web Components.
And built a tiny framework to make it painless: psd-coder.github.io/nanotags
It's great! We need more good local-first engines!
jazz-tools v2 alpha.60 is out! 🎷
- Jazz is now based on SQLite
- 20x-600x faster reads
- 4x-30x faster writes
- 10x-35x less RAM use
it’s also the first step of our new goal to make Jazz the easiest modern db to self-host. see our new homepage for details!
7
114
Pavel Grinchenko retweeted
Announcing Parcel v3, a ground up rewrite in Rust! 🚀
• Up to 100x faster than v2, 6x less memory
• Standalone Rust binary – no Node
• Native plugins in Rust, Go, Swift, or C
• Multi-threaded JS plugin runtime
• Smarter code splitting
• New library mode
Now in alpha. 👇
Pavel Grinchenko retweeted
Cursors for base appearance. CSSWG settled the long-standing debate: form controls with appearance: base get cursor: pointer when clickable, grab on range sliders, and not-allowed when disabled. #css #html
github.com/w3c/csswg-drafts/…
Pavel Grinchenko retweeted
Have you ever wanted to use Astro inside another Vite project? Soon you'll be able to render Astro components, islands included, in any Vite app. Here, with @honojs
Recently, I released a new version of typed-channel. For those who haven’t heard of it before, it’s a small library that simplifies communication between different realms (and not only!) in your application.
The new version introduces a Requests API, so now you can wait for responses without writing any extra code.
Read more about it in my new article!
typed-channel makes postMessage type-safe in ~350 bytes. Define message names and payload types once, and TypeScript checks them on both sides. The same code works for Web Workers, iframes, tabs, and in-page event buses. v0.11 adds cancelable requests, and canceling stops the worker too: evilmartians.com/chronicles/…
Pavel Grinchenko retweeted
Customizable <select> isn’t about prettier dropdowns. It’s about what an option can say.
Quick demo for what we can achieve today and what it means for our users.
alfy.blog/2026/10/27/a-selec…
Pavel Grinchenko retweeted
I want Slow Reader to set new standards for protecting users.
It's open source, local-first, and end-to-end encrypted.
But how can you prove a website was actually built from its published source code?
Thread ↓
hplush.gitlab.io/slowreader-…
Wow! The Content Mappers API in TypeScript 7.1 lets you get a TypeScript representation of any file (as long as you've registered the relevant content mapper package). And the one for Astro (and many others) has already been merged!
github.com/withastro/astro/p…
TypeScript 7.1 Beta is now available! Now with a preview API, content mapper support, new features, and some great optimizations. Give it a try and give us some feedback! devblogs.microsoft.com/types…
4
117
Pavel Grinchenko retweeted
Nano Stores finally has a website!
We've seen huge growth thanks to LLMs. Not having a site was embarrassing.
nanostores.net/
Check out the design: fresh and personal. Too many modern sites look the same. No React. Just Astro.
Thanks to @YodaPunk and @valbelaziorau!
Well-deserved!
Valibot (@valibot) is an open source, type-safe schema library. Its modular design is tree-shakeable, so you only ship the validation code you use, keeping your bundles small.
Its maintainer, @FabianHiller, actively contributes to the TypeScript ecosystem and is on a mission to improve the web for everyone.
We support his vision, so this month we're donating to him as part of our open source donation program.
If you use any of his tools, consider donating too: github.com/sponsors/fabian-h…
5
202
Pavel Grinchenko retweeted
Debugging multi-layer CSS gradients/masks in the DevTools is painful, so I built a tool to help me visualize each layer. It works for CSS art/drawings, too.
Check it out: lab.ishadeed.com/tools/gradi…
If you didn't know what to watch on the weekend. Check out how tap to pay really works and why it's secure. youtube.com/watch?v=N_6k_jd5…
Love their channel!
81
Btw, this skill installation snippet is part of the latest astro-pigment version. If you need a good documentation website for your OSS project but don't want to waste time, try building it with the astro-pigment theme.
It includes everything you need: easy setup, LLM endpoints, built-in search, and more!
astro-pigment.psdcoder.dev
We live in a time when code is mostly written by agents. Fortunately or unfortunately.
nanotags 0.17 comes with an agent skill that helps agents write good components: use proper composition and handle everything the way it's supposed to be handled.
If that's the only thing that has kept you from using nanotags, just try it out!
nanotags.psdcoder.dev/#agent…
3
161
We live in a time when code is mostly written by agents. Fortunately or unfortunately.
nanotags 0.17 comes with an agent skill that helps agents write good components: use proper composition and handle everything the way it's supposed to be handled.
If that's the only thing that has kept you from using nanotags, just try it out!
nanotags.psdcoder.dev/#agent…
I finally released the piece that nanotags.psdcoder.dev has been missing for a long time: a set of testing utils.
The new nanotags/testing API makes component testing simpler. It includes a set of utilities for repetitive tasks and works with jsdom and happy-dom, as well as with any test runner.
Testing utilities help you build, mount, and check what the DOM shows:
Besides that, they help you with these things:
- Types are inferred from the component itself. You'll get a compilation error for a misspelled prop or ref.
- h looks like React's createElement, but with nanotags specifics: it writes attribute props as attributes, keeps p.json() props as JSON seeds, and so on.
- stubElement and provideContext help isolate the component under test from other components.
- It fixes jsdom discrepancies: instead of losing errors that happen during setup, the helper rethrows them.
1
29
The helpers are available through a separate entry point, so nothing reaches your production bundle.
The Cookbook has a full Testing section covering stubs, contexts, reconnect tests, and jsdom vs. happy-dom differences.
Try it: nanotags.psdcoder.dev/cookbo… and let me know what's missing!
21
Pavel Grinchenko retweeted
Vite+ 1.0 is here 🚀
A single `vp` CLI for managing your Node.js runtime, package manager, and frontend toolchain. Built on top of Vite, Vitest, Rolldown, Oxc, and tsdown.
All with a single config.
Free and open source under the MIT license.
Start with `vp create` or migrate with `vp migrate`.
voidzero.dev/posts/announcin…
Pavel Grinchenko retweeted
My colleague Yuri Mandrikov and I have developed a framework that enforces the design system for AI agents and prevents the slop from leaking into the codebase.
evilmartians.com/chronicles/…





![Comment by fantasai on GitHub issue “[css-forms-1] Cursors for base appearance #14251” with CSS rules for form control cursors and a red “Resolved” stamp.](https://pbs.twimg.com/media/HWHXYEIWsAAVtLV.jpg?name=small&format=webp)
















