<?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: Sanjeev</title>
    <description>The latest articles on DEV Community by Sanjeev (@speedsharmaai).</description>
    <link>https://dev.to/speedsharmaai</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%2F3982398%2F1777fd1a-de94-460e-9502-c40286c41cc2.png</url>
      <title>DEV Community: Sanjeev</title>
      <link>https://dev.to/speedsharmaai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/speedsharmaai"/>
    <language>en</language>
    <item>
      <title>I rebuilt the HTTP client setup I copy-paste into every project — into one package</title>
      <dc:creator>Sanjeev</dc:creator>
      <pubDate>Sat, 13 Jun 2026 08:49:51 +0000</pubDate>
      <link>https://dev.to/speedsharmaai/i-rebuilt-the-http-client-setup-i-copy-paste-into-every-project-into-one-package-mnj</link>
      <guid>https://dev.to/speedsharmaai/i-rebuilt-the-http-client-setup-i-copy-paste-into-every-project-into-one-package-mnj</guid>
      <description>&lt;p&gt;Every project starts the same way. You reach for &lt;code&gt;axios&lt;/code&gt;. Then reality sets in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;axios
&lt;span class="c"&gt;# ...then axios-retry for retry logic&lt;/span&gt;
&lt;span class="c"&gt;# ...then axios-cache-interceptor for caching&lt;/span&gt;
&lt;span class="c"&gt;# ...then you discover a circuit breaker just doesn't exist&lt;/span&gt;
&lt;span class="c"&gt;# ...then you wrap every single call in try/catch&lt;/span&gt;
&lt;span class="c"&gt;# ...then you realize WebSocket, SSE, and GraphQL aren't included either&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ky&lt;/code&gt;? Lovely, but browser-only by design — no circuit breaker, no offline queue, no GraphQL, no Result.&lt;/p&gt;

&lt;p&gt;I got tired of reassembling the same resilience stack on every project, so I built it once: reixo — an HTTP client that ships complete.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;reixo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No peer dependencies. Runs unchanged on Node.js 20+, Bun, Deno, Cloudflare Workers, Vercel Edge, and browsers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one idea that changed how I write request code
&lt;/h2&gt;

&lt;p&gt;reixo returns errors as values, not exceptions. The &lt;strong&gt;try&lt;/strong&gt;* methods give you a "Result", and TypeScript won't let you touch the data until you've handled the error branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;HTTPClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;reixo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HTTPClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/v1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;            &lt;span class="c1"&gt;// 3 retries, exponential backoff, 5xx / 429 / 408&lt;/span&gt;
  &lt;span class="na"&gt;circuitBreaker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// open after 5 failures, reset after 30s&lt;/span&gt;
  &lt;span class="na"&gt;cacheConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// in-memory LRU, 5 min TTL&lt;/span&gt;
  &lt;span class="na"&gt;enableDeduplication&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tryGet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/users/1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;handleError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// fully typed HTTPError&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// TypeScript knows the type here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No try/catch. No "did I remember to handle the 500?" An entire class of runtime errors just disappears.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "ships complete" actually means
&lt;/h2&gt;

&lt;p&gt;All of this is in the box — zero extra installs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Result API — tryGet, tryPost, etc. force you to handle both branches&lt;/li&gt;
&lt;li&gt;Resilience stack — retry w/ backoff, circuit breaker (with half-open probing), rate limiter, offline queue — configured in one place&lt;/li&gt;
&lt;li&gt;Request deduplication — three simultaneous GETs to the same URL share one round-trip&lt;/li&gt;
&lt;li&gt;Caching — LRU memory + localStorage/sessionStorage, cache-first / network-first / stale-while-revalidate&lt;/li&gt;
&lt;li&gt;Real-time transports — typed WebSocket client (reconnect + heartbeat) and SSE client&lt;/li&gt;
&lt;li&gt;GraphQL client — queries, mutations, Automatic Persisted Queries&lt;/li&gt;
&lt;li&gt;Zero-dependency OpenTelemetry — W3C traceparent, no OTEL SDK&lt;/li&gt;
&lt;li&gt;Data utilities — infinite query, cursor pagination, priority task queue with persistence, resumable chunked upload&lt;/li&gt;
&lt;li&gt;Dev ergonomics — fluent HTTPBuilder, MockAdapter for tests, NetworkRecorder for fixtures&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How it stacks up
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjw36uy09s2m8b1ji50tq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjw36uy09s2m8b1ji50tq.png" alt=" " width="800" height="979"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A real example: poll a job until it's done
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;poll&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;reixo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cancel&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Job&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/jobs/42&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;until&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;done&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No hand-rolled setInterval, no leak-prone cleanup. Built in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;reixo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📦 npm: &lt;a href="https://www.npmjs.com/package/reixo" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/reixo&lt;/a&gt;&lt;br&gt;
⭐ GitHub: &lt;a href="https://github.com/webcoderspeed/reixo" rel="noopener noreferrer"&gt;https://github.com/webcoderspeed/reixo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's MIT, TypeScript-first, Node 20+. I'm building in public — if you try it, tell me what your "copy-paste into every project" HTTP setup looks like. That's exactly the gap I'm trying to close.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>node</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I got tired of re-installing 6 logging packages in every project, so I built one that ships complete</title>
      <dc:creator>Sanjeev</dc:creator>
      <pubDate>Sat, 13 Jun 2026 08:43:51 +0000</pubDate>
      <link>https://dev.to/speedsharmaai/i-got-tired-of-re-installing-6-logging-packages-in-every-project-so-i-built-one-that-ships-complete-18ig</link>
      <guid>https://dev.to/speedsharmaai/i-got-tired-of-re-installing-6-logging-packages-in-every-project-so-i-built-one-that-ships-complete-18ig</guid>
      <description>&lt;p&gt;Every new Node project, the same ritual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;pino pino-pretty pino-roll pino-redact pino-nestjs pino-http
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you wire up 4 config objects. Then you discover there's no built-in database transport. Then request tracing turns out to be manual. Then — under real I/O pressure — your logger is blocking the event loop.&lt;/p&gt;

&lt;p&gt;I did this enough times that I built the thing I kept wishing existed: logixia — an async-first TypeScript logger that ships complete.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;logixia
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One install gives you: console + file rotation + database transports + request tracing + a NestJS module + field redaction + log search + OpenTelemetry + a plugin API + Prometheus metrics + a visual TUI log explorer — and every transport is non-blocking.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 30-second version
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createLogger&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;logixia&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createLogger&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;appName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;transports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;console&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app.log&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./logs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;maxSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;50MB&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postgresql&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;localhost&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;appdb&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;table&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;logs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Server started&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// Writes to console + file + postgres simultaneously. Non-blocking. Done.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No try/catch needed — a flaky DB or disk-full condition never crashes your app; transport errors are swallowed internally.&lt;/p&gt;

&lt;p&gt;Why I went "batteries-included"&lt;br&gt;
console.log doesn't scale. pino is fast but leaves database persistence, NestJS integration, log search, and redaction to plugins. winston is flexible but synchronous and boilerplate-heavy.&lt;/p&gt;

&lt;p&gt;logixia's bet: everything ships built-in, and nothing blocks your event loop.&lt;/p&gt;

&lt;p&gt;A few of the things that come in the box:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Async by design — every log call is non-blocking, even to file and DB transports&lt;/li&gt;
&lt;li&gt;Built-in database transports — PostgreSQL, MySQL, MongoDB, SQLite&lt;/li&gt;
&lt;li&gt;Cloud adapters — AWS CloudWatch (with EMF metrics), GCP Logging, Azure Monitor&lt;/li&gt;
&lt;li&gt;NestJS module — LogixiaLoggerModule.forRoot(), inject anywhere, @LogMethod() for auto entry/exit logging&lt;/li&gt;
&lt;li&gt;Request tracing — AsyncLocalStorage-based trace propagation, no manual context threading&lt;/li&gt;
&lt;li&gt;Correlation ID propagation — auto-forward X-Correlation-ID through fetch, axios, Kafka, SQS&lt;/li&gt;
&lt;li&gt;Field redaction — mask passwords/tokens/PII before they touch any transport (dot-paths + regex)&lt;/li&gt;
&lt;li&gt;Browser/Edge/Bun/Deno — tree-shakeable logixia/browser entry, zero Node built-ins&lt;/li&gt;
&lt;li&gt;Prometheus metrics — turn log events into counters/histograms/gauges, expose /metrics&lt;/li&gt;
&lt;li&gt;Visual TUI explorer — logixia explore opens a full-screen terminal log browser with real-time search&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;"But is it actually fast?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fair question for an async-first logger. Benchmarked against pino, winston, and bunyan (all writing to /dev/null, Node 20, Apple M-series; ops/sec, higher is better):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kyum33ue0sxobd5dh57.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kyum33ue0sxobd5dh57.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;logixia beats pino on 5 of 6 scenarios — including +114% on error logging and +58% on high-cardinality — the shapes that dominate real production traffic. It beats winston and bunyan across the board, often 2–3×, while keeping p99 latency at 1–3µs with no tail spikes.&lt;/p&gt;

&lt;p&gt;pino still wins the trivial simple-string case (−14%) because it writes synchronously straight to process.stdout — fast in a microbenchmark, but it blocks the event loop under real I/O. logixia stays non-blocking and pulls ahead the moment you log anything structured.&lt;/p&gt;

&lt;p&gt;(Reproduce with &lt;strong&gt;npm run benchmark&lt;/strong&gt;.)&lt;/p&gt;

&lt;p&gt;Try it&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;logixia
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📦 npm: &lt;a href="https://www.npmjs.com/package/logixia" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/logixia&lt;/a&gt;&lt;br&gt;
⭐ GitHub: &lt;a href="https://github.com/Logixia/logixia" rel="noopener noreferrer"&gt;https://github.com/Logixia/logixia&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's MIT, TypeScript-first, Node 18+. I'm building in public — if you try it, I'd genuinely love to know what you'd want a logger to do that none of them do today. That's how the next version gets shaped.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>node</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
