<?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: Jason Y. (dev_in_the_fog)</title>
    <description>The latest articles on DEV Community by Jason Y. (dev_in_the_fog) (@dev_in_the_fog).</description>
    <link>https://dev.to/dev_in_the_fog</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4170198%2F5297706a-5c2e-4322-b7c7-69dc350592c6.jpg</url>
      <title>DEV Community: Jason Y. (dev_in_the_fog)</title>
      <link>https://dev.to/dev_in_the_fog</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dev_in_the_fog"/>
    <language>en</language>
    <item>
      <title>Kafka Exactly-Once Semantics (EOS): Preventing Idempotent Producer PID Churn and Coordinator Timeouts</title>
      <dc:creator>Jason Y. (dev_in_the_fog)</dc:creator>
      <pubDate>Thu, 08 Oct 2026 05:52:18 +0000</pubDate>
      <link>https://dev.to/dev_in_the_fog/kafka-exactly-once-semantics-eos-preventing-idempotent-producer-pid-churn-and-coordinator-523h</link>
      <guid>https://dev.to/dev_in_the_fog/kafka-exactly-once-semantics-eos-preventing-idempotent-producer-pid-churn-and-coordinator-523h</guid>
      <description>&lt;p&gt;In mission-critical distributed event streaming architectures, achieving &lt;strong&gt;Exactly-Once Semantics (EOS)&lt;/strong&gt; with Apache Kafka is often treated as a simple configuration toggle (&lt;code&gt;enable.idempotence=true&lt;/code&gt; and &lt;code&gt;transactional.id&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;However, in high-throughput microservice clusters, ephemeral producer restarts, short-lived serverless invocations, and network timeouts frequently cause severe &lt;strong&gt;Producer ID (PID) Churn&lt;/strong&gt;, exhausting broker memory and triggering cascading Transaction Coordinator timeouts.&lt;/p&gt;

&lt;p&gt;In this deep architectural post-mortem, we analyze the root cause of PID churn and provide production-hardened configurations to maintain deterministic EOS.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Anatomy of PID Churn &amp;amp; Coordinator Timeouts
&lt;/h2&gt;

&lt;p&gt;When an idempotent Kafka producer initializes without a static transactional ID, the broker's Transaction Coordinator assigns a new 64-bit Producer ID (PID).&lt;/p&gt;

&lt;p&gt;Each broker retains PID state tracking sequences in memory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Producer App Pool]
       │ (Restart / Network Hiccup)
       ▼
 [Assign New PID] ──► [Broker PID Cache Bloat] ──► [JVM OldGen GC Saturation]
                               │
                               ▼
                   [Transaction Coordinator Timeout]
                               ▼
                [HTTP 503 / Producer Fenced Exception]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Failure Symptoms:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ProducerFencedException&lt;/strong&gt;: When a previous producer instance with an unexpired transaction coordinator lease conflicts with a new instance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OutOfOrderSequenceException&lt;/strong&gt;: When retries occur after a TCP socket reset while the broker's sequence window hasn't cleared the expired PID.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broker JVM Garbage Collection Spikes&lt;/strong&gt;: Millions of dangling PIDs accumulating in the active transaction topic (&lt;code&gt;__transaction_state&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  2. Hardened Production Configuration
&lt;/h2&gt;

&lt;p&gt;To eliminate PID churn in high-traffic deployments:&lt;/p&gt;

&lt;h3&gt;
  
  
  A. Broker-Side Hardening (&lt;code&gt;server.properties&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="c"&gt;# Prevent PID accumulation across ephemeral producer restarts
&lt;/span&gt;&lt;span class="py"&gt;transaction.id.expiration.ms&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1800000&lt;/span&gt;
&lt;span class="py"&gt;transaction.state.log.min.isr&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;
&lt;span class="py"&gt;transaction.state.log.replication.factor&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;

&lt;span class="c"&gt;# Limit sequence window memory per partition
&lt;/span&gt;&lt;span class="py"&gt;max.producer.id.blocks&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  B. Producer-Side Deterministic Static Leasing (Go / Java / Node.js)
&lt;/h3&gt;

&lt;p&gt;Instead of assigning random ephemeral transaction IDs, bind transactional IDs deterministically to worker pod identities or partition assignments:&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="c1"&gt;// ✅ DETERMINISTIC TRANSACTION LEASING&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Kafka&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;kafkajs&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;podIdentity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;POD_NAME&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;worker-partition-0&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;kafka&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;Kafka&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`order-ingest-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;podIdentity&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;brokers&lt;/span&gt;&lt;span class="p"&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;kafka-broker-1:9092&lt;/span&gt;&lt;span class="dl"&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;kafka-broker-2:9092&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;producer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;kafka&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;producer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;idempotent&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="na"&gt;maxInFlightRequests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;transactionalId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`tx-order-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;podIdentity&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;transactionTimeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30000&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Verification &amp;amp; Observability Checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Monitor Active PID Churn&lt;/strong&gt;: Alert when JMX metric &lt;code&gt;kafka.server:type=TransactionCoordinator,name=ActiveProducerIdCount&lt;/code&gt; grows monotonically without plateauing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transaction Commit Latency&lt;/strong&gt;: Track 99th percentile commit latency on &lt;code&gt;__transaction_state&lt;/code&gt; partitions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TCP Socket Buffer Alignment&lt;/strong&gt;: Ensure &lt;code&gt;send.buffer.bytes&lt;/code&gt; and &lt;code&gt;receive.buffer.bytes&lt;/code&gt; match kernel &lt;code&gt;net.core.wmem_max&lt;/code&gt; to prevent socket pool thrashing.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🛠️ Distributed Engineering &amp;amp; Developer Utilities
&lt;/h3&gt;

&lt;p&gt;If you are debugging distributed systems, network archives, or CORS preflights in production, check out our free zero-trust developer utilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Trust HAR Sanitizer &amp;amp; Visualizer&lt;/strong&gt;: &lt;a href="https://global-utils.com/en/har-analyzer" rel="noopener noreferrer"&gt;https://global-utils.com/en/har-analyzer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive CORS Simulator &amp;amp; Configuration Generator&lt;/strong&gt;: &lt;a href="https://global-utils.com/en/cors-simulator" rel="noopener noreferrer"&gt;https://global-utils.com/en/cors-simulator&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full Architecture Playbooks &amp;amp; Deep Dives&lt;/strong&gt;: &lt;a href="https://global-utils.com/en/blog" rel="noopener noreferrer"&gt;https://global-utils.com/en/blog&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://global-utils.com/en/blog/kafka-eos-coordinator-producer-pid-churn-timeout-deterministic-ttl-expiry-forensics" rel="noopener noreferrer"&gt;NerdKit Engineering&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kafka</category>
      <category>distributed</category>
      <category>backend</category>
      <category>architecture</category>
    </item>
    <item>
      <title>React 19 useActionState: Preventing SSR State Pollution and Event Listener Memory Leaks</title>
      <dc:creator>Jason Y. (dev_in_the_fog)</dc:creator>
      <pubDate>Thu, 08 Oct 2026 04:52:11 +0000</pubDate>
      <link>https://dev.to/dev_in_the_fog/react-19-useactionstate-preventing-ssr-state-pollution-and-event-listener-memory-leaks-5dd3</link>
      <guid>https://dev.to/dev_in_the_fog/react-19-useactionstate-preventing-ssr-state-pollution-and-event-listener-memory-leaks-5dd3</guid>
      <description>&lt;p&gt;When scaling Next.js 15 and React 19 Server Components in heavy production environments, one of the most subtle yet dangerous pitfalls is &lt;strong&gt;cross-request state pollution&lt;/strong&gt; when combining server actions, optimistic UI (&lt;code&gt;useActionState&lt;/code&gt;), and shared event emitters or singletons.&lt;/p&gt;

&lt;p&gt;In this deep post-mortem, we dissect how dangling event listeners survive across SSR lifecycles, how optimistic rollbacks corrupt node memory, and how to structure robust cleanup resilience.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Symptoms &amp;amp; Root Cause Analysis
&lt;/h2&gt;

&lt;p&gt;During traffic surges, worker nodes often experience memory bloat and connection degradation. Ingress access logs report intermittent data leaks where User A intermittently sees cached state or optimistic payloads belonging to User B.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Mechanism of State Pollution:
&lt;/h3&gt;

&lt;p&gt;In Node.js SSR environments, module-level variables and global event emitters are singletons shared across all concurrent HTTP requests hitting the same process.&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="c1"&gt;// ⚠️ ANTI-PATTERN: Shared module-level listener&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stateEmitter&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;EventEmitter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;formAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isPending&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useActionState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;updateUserProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;stateEmitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profileUpdated&lt;/span&gt;&lt;span class="dl"&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="kc"&gt;null&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// In SSR, if cleanup fails or aborts early, this listener leaks!&lt;/span&gt;
  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;handler&lt;/span&gt; &lt;span class="o"&gt;=&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="o"&gt;=&amp;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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Updated:&lt;/span&gt;&lt;span class="dl"&gt;'&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;stateEmitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profileUpdated&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return &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;stateEmitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;off&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profileUpdated&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handler&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When an SSR render aborts prematurely (e.g., client disconnects or timeout), React unmount effects never fire on the server. The listener remains registered forever in Node.js global memory, causing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Memory leaks (&lt;code&gt;MaxListenersExceededWarning&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Cross-request data bleeding across asynchronous execution contexts&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  2. The Solution: AsyncLocalStorage &amp;amp; Explicit Cleanup Resilience
&lt;/h2&gt;

&lt;p&gt;To guarantee zero cross-request pollution, never rely on global event emitters. Instead, scope event dispatchers strictly to the active request lifecycle using Node's &lt;code&gt;AsyncLocalStorage&lt;/code&gt; or React's component-scoped context.&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="c1"&gt;// ✅ RESILIENT PATTERN: Scoped Request Context&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AsyncLocalStorage&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;node:async_hooks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;RequestStore&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;requestId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;emitter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EventEmitter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;requestContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;AsyncLocalStorage&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;RequestStore&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useScopedActionState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Payload&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;State&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;formAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isPending&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useActionState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;requestContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getStore&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;try&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="nf"&gt;action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;emitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;actionSuccess&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="nx"&gt;result&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;emitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;actionRollback&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="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prevState&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;err&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="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;formAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isPending&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Production Verification &amp;amp; Benchmark Checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Memory Leak Profiling&lt;/strong&gt;: Run &lt;code&gt;node --inspect&lt;/code&gt; with load testing (&lt;code&gt;autocannon -c 100 -d 30s&lt;/code&gt;) to ensure heap allocation stays flat after requests terminate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Listener Audit&lt;/strong&gt;: Add automated tests checking &lt;code&gt;process.listenerCount()&lt;/code&gt; before and after rendering passes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimistic Rollback Testing&lt;/strong&gt;: Verify that rejected Server Actions properly revert optimistic state on the client without affecting concurrent renders.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🛠️ More Developer Tools &amp;amp; Architecture Guides
&lt;/h3&gt;

&lt;p&gt;If you are debugging distributed systems, SSR memory leaks, or CORS issues in production, check out our free zero-trust engineering toolkit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Trust HAR Sanitizer &amp;amp; Visualizer&lt;/strong&gt;: &lt;a href="https://global-utils.com/en/har-analyzer" rel="noopener noreferrer"&gt;https://global-utils.com/en/har-analyzer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive CORS Simulator &amp;amp; Config Generator&lt;/strong&gt;: &lt;a href="https://global-utils.com/en/cors-simulator" rel="noopener noreferrer"&gt;https://global-utils.com/en/cors-simulator&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full Architecture Playbooks &amp;amp; Deep Dives&lt;/strong&gt;: &lt;a href="https://global-utils.com/en/blog" rel="noopener noreferrer"&gt;https://global-utils.com/en/blog&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://global-utils.com/en/blog/react19-use-action-state-cross-request-state-pollution-dangling-event-listener-cleanup-failure-resilience" rel="noopener noreferrer"&gt;NerdKit Engineering&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Why I Built 35 Zero-Trust Developer Utilities Running 100% in the Browser</title>
      <dc:creator>Jason Y. (dev_in_the_fog)</dc:creator>
      <pubDate>Thu, 08 Oct 2026 04:51:16 +0000</pubDate>
      <link>https://dev.to/dev_in_the_fog/why-i-built-35-zero-trust-developer-utilities-running-100-in-the-browser-4op0</link>
      <guid>https://dev.to/dev_in_the_fog/why-i-built-35-zero-trust-developer-utilities-running-100-in-the-browser-4op0</guid>
      <description>&lt;p&gt;Every week, thousands of developers paste internal company JWT tokens, sensitive customer JSON payloads, production HAR network dumps, and confidential API logs into random online web formatters.&lt;/p&gt;

&lt;p&gt;Most developers never think twice about it. But when you inspect the network tab of some popular "free" developer tools, you'll see a shocking amount of telemetry:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full text payloads sent back to remote analytics servers&lt;/li&gt;
&lt;li&gt;Third-party tracking scripts recording keystrokes&lt;/li&gt;
&lt;li&gt;Query parameters logging your tokens in backend access logs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In corporate and enterprise environments with strict SOC2, ISO 27001, or GDPR compliance, using those tools is a critical security vulnerability waiting to happen.&lt;/p&gt;

&lt;p&gt;To solve this, I spent the last few months building &lt;strong&gt;&lt;a href="https://global-utils.com/en" rel="noopener noreferrer"&gt;NerdKit&lt;/a&gt;&lt;/strong&gt; — a developer utility hub built entirely on a &lt;strong&gt;Zero-Trust architecture&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔒 What does "Zero-Trust" mean here?
&lt;/h2&gt;

&lt;p&gt;Every single utility inside NerdKit executes &lt;strong&gt;100% inside your browser's local client runtime&lt;/strong&gt; (JavaScript, WASM, and Web APIs).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;0 Bytes sent to servers&lt;/strong&gt;: Your data never leaves your machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No accounts or logins&lt;/strong&gt;: No tracking profiles or email spam.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline / PWA Ready&lt;/strong&gt;: Fully cached via Service Workers. You can turn off your Wi-Fi or go into airplane mode and every tool still works seamlessly.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ The Flagship Utilities
&lt;/h2&gt;

&lt;p&gt;Here are some of the tools we built to solve real engineering headaches:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Live Interactive CORS Simulator
&lt;/h3&gt;

&lt;p&gt;CORS errors are notoriously annoying. Instead of trial-and-error in production, this simulator visually models &lt;strong&gt;Simple Requests vs Preflight OPTIONS&lt;/strong&gt; calls, checks header rules, and generates drop-in, tested CORS configs for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nginx reverse proxies&lt;/li&gt;
&lt;li&gt;Next.js Middleware&lt;/li&gt;
&lt;li&gt;FastAPI (Python)&lt;/li&gt;
&lt;li&gt;Express.js / Node.js&lt;/li&gt;
&lt;li&gt;Spring Boot (Java)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Try it: &lt;a href="https://global-utils.com/en/cors-simulator" rel="noopener noreferrer"&gt;https://global-utils.com/en/cors-simulator&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Zero-Trust HAR File Waterfall &amp;amp; Sanitizer
&lt;/h3&gt;

&lt;p&gt;When debugging client-side network bottlenecks, engineers often need to share &lt;code&gt;.har&lt;/code&gt; files. But HAR files contain cookies, Bearer tokens, and auth headers.&lt;br&gt;
NerdKit's HAR analyzer parses gigabyte-sized HAR files in-memory, renders interactive waterfalls, and automatically masks all sensitive authorization headers and cookies before you share them with colleagues.&lt;/p&gt;

&lt;p&gt;👉 Try it: &lt;a href="https://global-utils.com/en/har-analyzer" rel="noopener noreferrer"&gt;https://global-utils.com/en/har-analyzer&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Frontier LLM Token &amp;amp; Cost Calculator (2026 Models)
&lt;/h3&gt;

&lt;p&gt;Real-time client-side BPE tokenizer comparing exact API inference costs across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI GPT-6 (Astra, Sol, Luna)&lt;/li&gt;
&lt;li&gt;Anthropic Claude Opus 5.5, Sonnet 5, Haiku 4.5&lt;/li&gt;
&lt;li&gt;Google Gemini 3.1 Pro &amp;amp; 3.8 Flash&lt;/li&gt;
&lt;li&gt;DeepSeek R1 &amp;amp; V3
It includes interactive sliders for &lt;strong&gt;Reasoning/Thinking tokens&lt;/strong&gt; and &lt;strong&gt;Prompt Caching hit rates&lt;/strong&gt; so you can estimate true production bills.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Try it: &lt;a href="https://global-utils.com/en/llm-token-calculator" rel="noopener noreferrer"&gt;https://global-utils.com/en/llm-token-calculator&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Magic Input OmniBox
&lt;/h3&gt;

&lt;p&gt;On the homepage, you don't even need to pick a tool. Just paste raw data (a JWT token, a Cron expression, a Unix timestamp, Base64, or JSON) into the OmniBox. The heuristic engine automatically detects the data type and routes you directly to the right tool with your data pre-filled.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. 30+ Core Daily Utilities
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JSON Formatter &amp;amp; Validator&lt;/strong&gt; (supports 10MB+ with zero freezing)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSON to TypeScript / Zod Schema Generator&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker Compose to Kubernetes Manifest Converter&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQL to Drizzle ORM / Prisma Schema Converter&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regex Visualizer &amp;amp; ReDoS safety tester&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UUID v4 generator, Base64 converter, Timestamp epoch converter&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💻 Tech Stack &amp;amp; Architecture
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework&lt;/strong&gt;: Next.js 16 (Static Site Generation - SSG)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling&lt;/strong&gt;: Tailwind CSS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge Deployment&lt;/strong&gt;: Vercel Edge CDN with 0 server-side revalidation writes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internationalization&lt;/strong&gt;: 20 localized languages with localized route clusters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything is completely free and open for the developer community.&lt;/p&gt;

&lt;p&gt;I'd love to hear your feedback! What's an everyday utility you find yourself reaching for that could use a privacy-first, zero-trust alternative?&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Check out NerdKit&lt;/strong&gt;: &lt;a href="https://global-utils.com/en" rel="noopener noreferrer"&gt;https://global-utils.com/en&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>security</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
