<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Steve Lebleu</title>
    <description>The latest articles on DEV Community by Steve Lebleu (@steve-lebleu).</description>
    <link>https://dev.to/steve-lebleu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F433352%2Fa0975aef-cebc-431b-b7b7-092c615d2d94.jpg</url>
      <title>DEV Community: Steve Lebleu</title>
      <link>https://dev.to/steve-lebleu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/steve-lebleu"/>
    <language>en</language>
    <item>
      <title>VoidZero is driving the unification of the JS ecosystem</title>
      <dc:creator>Steve Lebleu</dc:creator>
      <pubDate>Sat, 21 Mar 2026 13:24:38 +0000</pubDate>
      <link>https://dev.to/steve-lebleu/voidzero-is-driving-the-unification-of-the-javascript-ecosystem-3k1h</link>
      <guid>https://dev.to/steve-lebleu/voidzero-is-driving-the-unification-of-the-javascript-ecosystem-3k1h</guid>
      <description>&lt;p&gt;&lt;a href="https://voidzero.dev/" rel="noopener noreferrer"&gt;VoidZero&lt;/a&gt; launch week is drawing to a close, and the world of Javascript development has just been given a significant boost. If you follow developments in build tools, you’ll know that fragmentation is rife, and that it’s difficult to stay at the cutting edge without using the best tool for each task. With the latest announcements regarding &lt;a href="https://vite.dev/" rel="noopener noreferrer"&gt;Vite&lt;/a&gt;, &lt;a href="https://oxc.rs/" rel="noopener noreferrer"&gt;Oxlint&lt;/a&gt; and &lt;a href="https://vitest.dev/" rel="noopener noreferrer"&gt;Vitest&lt;/a&gt;, Evan You team is taking a major step towards the goal of unifying everything to improve performance and simplicity.&lt;/p&gt;

&lt;p&gt;Here are the key takeaways from this wave of updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Oxlint: no more trade-offs between speed and compatibility
&lt;/h2&gt;

&lt;p&gt;Until now, choosing Oxlint meant sacrificing the ESLint plugin ecosystem in favour of Rust’s performance.&lt;/p&gt;

&lt;p&gt;That is no longer the case: Oxlint has reached a major milestone with its JS Plugins Alpha.&lt;/p&gt;

&lt;p&gt;In fact, your ESLint plugins now run in Oxlint without any modifications, with execution speeds up to 100 times faster than with ESLint. And as the folks at Void are so helpful, they’ve provided a migration tool (&lt;code&gt;@oxlint/migrate&lt;/code&gt;) that allows for an automatic transition from your existing configuration.&lt;/p&gt;

&lt;p&gt;Suffice to say that following the arrival of &lt;a href="https://biomejs.dev/" rel="noopener noreferrer"&gt;Biome.js&lt;/a&gt;, competition is becoming very, very fierce for ESLint, which has historically always suffered from limitations in execution, configuration and compatibility. It’s a drop-in replacement for around 80% of users, already adopted by major projects such as Preact and PostHog.&lt;/p&gt;

&lt;h2&gt;
  
  
  One bundler to rule them all with Vite 8 and Rolldown
&lt;/h2&gt;

&lt;p&gt;This is undoubtedly the most significant architectural change. Vite 8 is moving away from the esbuild (dev) / Rollup (prod) combination in favour of Rolldown, its new bundler, which is also written in Rust.&lt;/p&gt;

&lt;p&gt;In practical terms, what does this mean?&lt;/p&gt;

&lt;p&gt;Firstly, a clear unification between your local build and your production build. No more surprises or inconsistencies between your environments.&lt;/p&gt;

&lt;p&gt;Secondly, well – thanks to Rust – builds are 10 to 30 times faster than with Rollup. For example, the teams at Linear reportedly saw their build times drop from 46 seconds to 6 seconds, which is quite significant.&lt;/p&gt;

&lt;p&gt;Finally, the bundler now natively supports tsconfig paths and decorators, and offers a new, much more flexible codeSplitting API. A breath of fresh spring air, as they say.&lt;/p&gt;

&lt;h2&gt;
  
  
  More stability and less “flaky tests” at Vitest side
&lt;/h2&gt;

&lt;p&gt;Vitest 4.1 keeps pace with native support for Vite 8 and features designed for large-scale projects.&lt;/p&gt;

&lt;p&gt;Anyone who has written tests for an asynchronous application knows the drill: they leak, they hang left, right and centre, and they’re often difficult to debug. Vitest now offers asynchronous leak detection to put an end once and for all to the timers that clutter up workflows.&lt;/p&gt;

&lt;p&gt;In addition, you can now assign tags to your test suites to organise them more effectively. It’s not the most groundbreaking update, but it can be useful for large codebases.&lt;/p&gt;

&lt;p&gt;Finally, VoidZero is already anticipating new development workflows by equipping Vitest with a “reporter agent”, an output optimised for AI coding agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Towards a “Zero Config” experience
&lt;/h2&gt;

&lt;p&gt;The project goes beyond individual tools. The aim is to cover the entire application lifecycle to provide a complete value chain.&lt;/p&gt;

&lt;p&gt;Vite+ (Alpha) centralises everything via a single binary called vp. It acts as a task orchestrator with a persistent cache. No need to configure ESLint, Prettier or Vitest separately! A single vite.config.ts file drives the entire toolchain.&lt;/p&gt;

&lt;p&gt;This makes setup very simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;vp create&lt;/code&gt; generates a new project&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vp dev&lt;/code&gt; starts the development server&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vp check&lt;/code&gt; performs linting, formatting and type checking in a single line&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vp test&lt;/code&gt; runs tests using Vitest,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vp build&lt;/code&gt; creates an optimised production build,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vp run&lt;/code&gt; orchestrates monorepo tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Void, the deployment platform announced by Evan You, brings things full circle by offering an Infrastructure-as-Code approach, where the Void SDK analyses your code to automatically provision the necessary resources (DB, Auth, AI inference). And it doesn’t stop there, as the platform offers native support for the MCP protocol: developers can now not only write your code, but also autonomously set up and deploy the infrastructure on Void.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;p&gt;The Javascript ecosystem is emerging from a (long) period of having a “scattered toolkit” to now natively integrate linting, testing, building and deployment under a single technological umbrella (Rust + Vite).&lt;/p&gt;

&lt;p&gt;VoidZero offers a super-smooth developer experience, where performance comes as standard.&lt;/p&gt;

&lt;p&gt;They are not the only ones heading in this direction – Biome springs to mind – but they provide a more comprehensive solution that will significantly improve business workflows and influence the ecosystem.&lt;/p&gt;

&lt;p&gt;To find out more, you can consult the official migration guides on the &lt;a href="https://voidzero.dev/blog" rel="noopener noreferrer"&gt;VoidZero blog&lt;/a&gt; or explore the &lt;a href="https://vite.dev/" rel="noopener noreferrer"&gt;Vite 8&lt;/a&gt; documentation.&lt;/p&gt;




&lt;p&gt;This article has been translated from french original publication &lt;a href="https://lab.konfer.be/veille/voidzero-pousse-lunification-de-lecosysteme-js.html" rel="noopener noreferrer"&gt;VoidZero pousse l'unification de l'écosystème Javascript&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>bundler</category>
      <category>webdev</category>
      <category>vite</category>
    </item>
    <item>
      <title>Email sending in Node.js</title>
      <dc:creator>Steve Lebleu</dc:creator>
      <pubDate>Thu, 22 Feb 2024 16:34:25 +0000</pubDate>
      <link>https://dev.to/steve-lebleu/email-sending-in-nodejs-7ka</link>
      <guid>https://dev.to/steve-lebleu/email-sending-in-nodejs-7ka</guid>
      <description>&lt;p&gt;As a developer, email sending is a recurent task across the projects.&lt;/p&gt;

&lt;p&gt;Most part of time, you have to deal with open source libraries, to switch from a library to another accross the projects, with some particular implementations and / or behaviors.&lt;/p&gt;

&lt;p&gt;As well, you can have a different need inside a same project just regarding the use case.&lt;/p&gt;

&lt;p&gt;For example, you can still need to send an email to a developer when a particular event is fired, or send a transactionnal email to say welcome to a new user. &lt;/p&gt;

&lt;p&gt;In the first case, a simple SMTP server can do the job internally.&lt;/p&gt;

&lt;p&gt;In the second case, it's more efficient to rely to a web API, able to manage statistics, bouncing, DKIM, templating, ...&lt;/p&gt;

&lt;p&gt;As well, you can need to deal with different providers at the same time. During a migration, for example. &lt;/p&gt;

&lt;p&gt;Some months ago, I was wondering how to provide something flexible and consistent to deal with this kind of repetitive issue.&lt;/p&gt;

&lt;p&gt;And I did it myself, because it was quite fun. 😎&lt;/p&gt;

&lt;p&gt;All the cases described above - and some others - are covered by a light NPM package.&lt;/p&gt;

&lt;p&gt;The main features are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configuration based&lt;/li&gt;
&lt;li&gt;Agnostic appoach: same input, same output for all configurations&lt;/li&gt;
&lt;li&gt;Formalized transactions conventions&lt;/li&gt;
&lt;li&gt;Unlimited number of transporters inside the same project&lt;/li&gt;
&lt;li&gt;Support of different sending modes (SMTP and web API)&lt;/li&gt;
&lt;li&gt;Embeded view engine, stream or web API templates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is Cliam, an agnostic and very flexible tool to deal with transactional email sending.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/steve-lebleu" rel="noopener noreferrer"&gt;
        steve-lebleu
      &lt;/a&gt; / &lt;a href="https://github.com/steve-lebleu/cliam" rel="noopener noreferrer"&gt;
        cliam
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Agnostic transactional email sending in Node.js environment
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/a5c7f7ea852d863f06ac72f00eab81188ab739315a7eb36ac880db18b7307ec7/68747470733a2f2f63646e2e6b6f6e6665722e62652f696d616765732f636c69616d2f6173736574732f62616e6e65722d636c69616d2e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/a5c7f7ea852d863f06ac72f00eab81188ab739315a7eb36ac880db18b7307ec7/68747470733a2f2f63646e2e6b6f6e6665722e62652f696d616765732f636c69616d2f6173736574732f62616e6e65722d636c69616d2e706e67" alt="Cliam"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/steve-lebleu/cliam/actions/workflows/build.yml/badge.svg?branch=main"&gt;&lt;img src="https://github.com/steve-lebleu/cliam/actions/workflows/build.yml/badge.svg?branch=main" alt="Github action workflow status"&gt;&lt;/a&gt;
&lt;a href="https://coveralls.io/github/steve-lebleu/cliam?branch=main" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2a9377b1b97cd4589ed029775db0a040538ce4716681f99287daacf18e356f9f/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f73746576652d6c65626c65752f636c69616d2f62616467652e7376673f6272616e63683d6d61696e" alt="Coverage Status"&gt;&lt;/a&gt;
&lt;a href="https://www.codefactor.io/repository/github/steve-lebleu/cliam" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b6e2c9c534d29a133e8ad5307d9f62cedf89df704094c81f0c9d900f9b70dfc5/68747470733a2f2f7777772e636f6465666163746f722e696f2f7265706f7369746f72792f6769746875622f73746576652d6c65626c65752f636c69616d2f6261646765" alt="CodeFactor"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/61c4f346300fe91790ee0c675bf8006ac96d4c8179ea67a57825d3e740d78f4d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73746576652d6c65626c65752f636c69616d3f6c6f676f3d476974687562"&gt;&lt;img src="https://camo.githubusercontent.com/61c4f346300fe91790ee0c675bf8006ac96d4c8179ea67a57825d3e740d78f4d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73746576652d6c65626c65752f636c69616d3f6c6f676f3d476974687562" alt="GitHub Release"&gt;&lt;/a&gt;
&lt;a href="https://opensource.org/licenses/gpl-license.php" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/43075ac8ea7c9db28c5b00746349c52e1a49099a9eca5d90a75396f022163f8b/68747470733a2f2f6261646765732e66726170736f66742e636f6d2f6f732f67706c2f67706c2e7376673f763d313033" alt="GPL Licence"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Transactional emails with a kick&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Agnostic transactional email sending in Node.js environment 💥 💪 💊&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&amp;gt; Why ?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;To improve and facilitate the implementation, flexibility and maintenance of transactional emailing tasks.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&amp;gt; Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Agnostic transactional email sending using web API or SMTP server. One &lt;a href="https://github.com/steve-lebleu/cliam/wiki/Email-payload" rel="noopener noreferrer"&gt;input&lt;/a&gt;, one &lt;a href="https://github.com/steve-lebleu/cliam/wiki/Email-response" rel="noopener noreferrer"&gt;output&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Multiple simultaneous transporters.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/steve-lebleu/cliam/wiki/Configuration-with-cliamrc.js" rel="noopener noreferrer"&gt;Configuration&lt;/a&gt; based, not implementation based : easy switch between different modes.&lt;/li&gt;
&lt;li&gt;Normalized &lt;a href="https://github.com/steve-lebleu/cliam/wiki/Transactions" rel="noopener noreferrer"&gt;transactions events&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Securized payloads.&lt;/li&gt;
&lt;li&gt;Customisable default templates.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&amp;gt; Table of contents&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/steve-lebleu/cliam#requirements" rel="noopener noreferrer"&gt;Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/steve-lebleu/cliam#getting-started" rel="noopener noreferrer"&gt;Getting started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/steve-lebleu/cliam#beneficiary-use-cases" rel="noopener noreferrer"&gt;Beneficiary use cases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/steve-lebleu/cliam#supported-web-api-providers" rel="noopener noreferrer"&gt;Supported web API providers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/steve-lebleu/cliam#licence" rel="noopener noreferrer"&gt;Licence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/steve-lebleu/cliam/wiki" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 id="user-content-requirements" class="heading-element"&gt;&amp;gt; Requirements&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Node.js &amp;gt;= 18.19.0&lt;/li&gt;
&lt;li&gt;NPM &amp;gt;= 10.2.3&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 id="user-content-getting-started" class="heading-element"&gt;&amp;gt; Getting started&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Install&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;&amp;gt;&lt;/span&gt; npm i cliam --save&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Configure&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Create a &lt;em&gt;.cliamrc.js&lt;/em&gt; module on the root of your project.&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;&amp;gt;&lt;/span&gt; touch .cliamrc.js&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Define a minimalist configuration in &lt;em&gt;.cliamrc.js&lt;/em&gt; newly created:&lt;/p&gt;
&lt;div class="highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-smi"&gt;module&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;exports&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
  &lt;span class="pl-s"&gt;"sandbox"&lt;/span&gt;: &lt;span class="pl-c1"&gt;true&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
  &lt;span class="pl-s"&gt;"transporters"&lt;/span&gt;: &lt;span class="pl-kos"&gt;[&lt;/span&gt;
    &lt;span class="pl-kos"&gt;{&lt;/span&gt;
      &lt;span class="pl-s"&gt;"id"&lt;/span&gt;: &lt;span class="pl-s"&gt;"unique-transporter-key"&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
      &lt;span class="pl-s"&gt;"auth"&lt;/span&gt;: &lt;span class="pl-kos"&gt;{&lt;/span&gt;
        &lt;span class="pl-s"&gt;"username"&lt;/span&gt;: &lt;span class="pl-s1"&gt;process&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/steve-lebleu/cliam" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Currently, following web api providers are supported: Mailgun, Mailjet, Brevo, Sendinblue, Sendgrid, Mandrill, Sparkpost, Mailsender and Postmark. Amazon SES and a lot of others should be integrated soon, but I prefer take the focus on some new features and to push more robustness before to embedd too much transporters.&lt;/p&gt;

&lt;p&gt;Have a good dev, enjoy and feel free to use and to share 🚀&lt;/p&gt;

</description>
      <category>email</category>
      <category>node</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
