Maintainer of knex.js and a principal engineer at @lokalise. Mostly writing about Node.js stuff.

Joined March 2009
28 Photos and videos
Igor Savin retweeted
PostgreSQL 19 Beta 1 adds ON CONFLICT DO SELECT. Insert a row. If it already exists, return it. Atomic get-or-create, finally. 👇 #PostgreSQL #SQL
35
222
2,413
127,146
pnpm should be the default package manager to consider for any JS/TS repo these days. Both security and performance wins are very tangible.
2
133
Igor Savin retweeted
May 21
Ways to mitigate GitHub/npm supply chain attacks: - Use pnpm - Block all postinstall scripts unless necessary - Use minimumReleaseAge - Set up Trusted Publisher on npm/GitHub - Disallow npm tokens - Require 2FA for all org members - Avoid pull_request_target - If repo is public, consider restricting PRs to collaborators only - Pin GitHub actions (peter⁠-⁠evans⁠/⁠create⁠-⁠pull⁠-⁠request⁠@⁠v8 → peter⁠-⁠evans⁠/⁠create⁠-⁠pull⁠-⁠request⁠@⁠5f6978f...)
25
46
390
70,247
Igor Savin retweeted
with the soft-transition complete, I'm now recommending that ecosystem library authors support Zod 4 exclusively moving forward 👉 Zod 3 should be considered functionally EOL (last patch 10mo ago) 👉 Zod 4 is stable and no future major version is planned zod.dev/library-authors?q
1
1
14
1,329
Igor Savin retweeted
Node.js 20 is EOL. Say goodbye to: - tinyglobby: use `fs.glob` instead - picomatch: use `path.matchesGlob` instead - tsx: run TS files directly with type stripping only
5
23
251
20,715
Igor Savin retweeted
Drizzle v1.0.0-rc.1 is out 🚀 ▪︎ Effect v4 native support ▪︎ JIT row mappers to reduce ORM overhead to ~0 ▪︎ Reworked casing API (breaking change) ▪︎ Drizzle for LLM agents (preview) Drizzle is now as fast as using raw driver and mapping(or not mapping) results by hand 🙃
98
173
2,038
375,728
Igor Savin retweeted
Node excitement 😉 Congrats to Michaël Zasso on landing the V8 14.6 upgrade in upstream Node, heading for Node v26 which will be released very soon 🎉 This is the first version of V8 in Node to support unflagged Stage 4 Temporal 👍 github.com/nodejs/node/pull/…
14
122
6,328
Igor Savin retweeted
I'm so mad I didnt come up with this idea first pinball unsubscribe page (html-in-canvas)
Had to play with HTML-in-Canvas and ask Codex to create the most annoying and fun marketing unsubscribe form using pinball 😄 This API is still experimental in the latest version of Chrome but it’s super cool. It’s still an actual form behind the scenes just inside a canvas for us to mess with.
9
16
335
31,933
Igor Savin retweeted
React Hook Form, TanStack Form, or Formisch — which one should you actually pick in 2026? 🧐 We compared all three across TypeScript inference, validation architecture, and performance as forms grow. ⚡️ No API walkthroughs. Just the tradeoffs that matter for real decisions. Give it a read! formisch.dev/blog/react-form…
15
21
209
23,058
Igor Savin retweeted
Hear us, Watchers! Turn-Based Mode for Pillars of Eternity is now live on Steam, Epic Games Store, GOG, and the Xbox PC App. Whether new or returning, we hope you enjoy your adventure in the Eastern Reach. bit.ly/4e5U8lt
53
143
1,362
112,189
Igor Savin retweeted
The entire world is on the brink of war. But humanity's greatest threat is not from Earth. Command turn-based tactical battles, build a network of covert bases, & wage a global war against the alien invasion. Xenonauts 2 has launched into 1.0! store.steampowered.com/app/5…
12
59
393
26,992
Igor Savin retweeted
🚀 Valibot v1.3 is here! ✅ Smarter pipelines with `guard()` for type refinement & `parseBoolean()` for boolish inputs (env vars, forms, query strings). ✅ Result caching via `cache()` / `cacheAsync()` for repeated & async validations. ✅ New validators: `domain()`, `jwsCompact()`, `isrc()` important compatibility fixes. Huge thanks to @eskimojo, @yslpn and many others for contributing to this release! 🙌 Full details examples 👉 valibot.dev/blog/valibot-v1.… npm i valibot@latest #Valibot #TypeScript
2
18
104
5,379
Igor Savin retweeted
Introducing Void, the Vite-native deployment platform: 🚀 Full-stack SDK ⚙️ Auto-provisioned infra (db, kv, storage, AI, crons, queues...) 🔒 End-to-end type safety 🧩 React/Vue/Svelte/Solid Vite meta-frameworks 🌐 SSR, SSG, ISR, islands Markdown 🤖 AI-native tooling ☁️ One-command deploys void.cloud
221
522
4,308
739,116
Igor Savin retweeted
Vitest 4.1 is out! 🚀 ✅ Vite 8 support from day 1 🏷️ Test tags to organize, filter & apply shared options 🪝 New hooks for easier tracing, transactions and AsyncLocalStorage 🔍 Async leak detection 🤖 Agent reporter to reduce token usage And much more!
6
94
979
59,023
Igor Savin retweeted
⚡️ Vite 8.0 is here! The most significant architectural change since Vite 2. ⏬ Powered by Rolldown bringing faster production builds and more consistency 🛤️ New features such as tsconfig paths and emitDecoratorMetadata support
75
497
3,535
294,280
Igor Savin retweeted
🚀Launch Week Update #1: OXLINT JS PLUGIN ALPHA 🏃🏽Run most existing ESLint plugins w/o modification ✒️Write custom lint rules in JS/TS 🩹Get auto-fixes & suggestions from JS plugin rules 📊See JS plugin diagnostics live in your IDE via the language server
Oxlint JS plugins have reached alpha. What does that mean? A linter that runs at Rust speed AND supports the existing ecosystem of ESLint plugins. After a great deal of work by many hands, the alpha release signals that we feel it's now ready for usage in real-world projects.
11
33
381
39,759
Igor Savin retweeted
Temporal is here I literally can't believe it
Temporal is now Stage 4 at TC39 🎂🎂🎂 Thanks to all the other champions of JavaScript's new date-time API. It has been a wild ride over many years! I wrote a blog post explaining how we got here 📜 🧵
15
33
739
76,123
Igor Savin retweeted
We just released beta.16 with migration updates and fixes. The best part of this release is that we added commutativity checks for PostgreSQL and MySQL (we’ll add other dialects next). Commutativity checks are especially useful for the most painful part of drizzle migrations: working in big teams Here’s what we have in total: 1. No more _journal (auto-upgrade from 0.x) 2. Drop migrations by deleting the folder 3. Apply all migrations, not only those after the last one recorded in the DB 4. Now generate and migrate detect conflicting branches. Example: - Feature 1 adds migration_1 (alter column) - Feature 2 adds migration_2 (alters the same column) - Both land in dev - drizzle-kit flags the conflict, prints a migration tree, and points to what to fix (delete one migration and regenerate) Rule of thumb: resolve conflicts by removing the conflicted migration (and any subsequent ones) from the target branch If everything is commutative, drizzle-kit lets you apply migrations in any order We’re at ~98% - remaining work is adding commutativity checks for other dialects and testing Congrats!
9
10
160
7,277