<?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: Divyansh Kumar</title>
    <description>The latest articles on DEV Community by Divyansh Kumar (@divyansh_kumar_1).</description>
    <link>https://dev.to/divyansh_kumar_1</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%2F1529507%2Ffcd9de79-29f6-4eac-b5ae-b0d4076b26e6.jpg</url>
      <title>DEV Community: Divyansh Kumar</title>
      <link>https://dev.to/divyansh_kumar_1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/divyansh_kumar_1"/>
    <language>en</language>
    <item>
      <title>Why Your Testcontainers Check Is Flaky: The Quarkus Port 9000 Trap</title>
      <dc:creator>Divyansh Kumar</dc:creator>
      <pubDate>Wed, 07 Oct 2026 14:53:58 +0000</pubDate>
      <link>https://dev.to/divyansh_kumar_1/why-your-testcontainers-check-is-flaky-the-quarkus-port-9000-trap-4oll</link>
      <guid>https://dev.to/divyansh_kumar_1/why-your-testcontainers-check-is-flaky-the-quarkus-port-9000-trap-4oll</guid>
      <description>&lt;p&gt;We've all seen integration tests that fail randomly in CI. You run them on your laptop five times in a row, and they pass cleanly every single time without a hiccup. Then you push your commit, and GitHub Actions blows up during initialization with a completely unexpected connection drop. You hit retry. It goes green. It's deeply frustrating.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Drafted with AI assistance from my notes and code, then reviewed and edited by me.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I ran into this exact headache while debugging &lt;code&gt;JsonSchemaRecordValidationIT&lt;/code&gt; in the Kroxylicious open source project. Our test suite spins up an Apicurio Registry container via Testcontainers, registers a JSON schema in &lt;code&gt;@BeforeAll&lt;/code&gt;, and runs record validation against Kafka.&lt;/p&gt;

&lt;p&gt;Locally, my test passed instantly. In CI, builds broke intermittently during initialization. The socket died.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;java.lang.RuntimeException: could not close the reader
    at io.kiota.serialization.json.JsonParseNodeFactory.getParseNode(...)
    at io.apicurio.registry.rest.client.groups.item.artifacts.ArtifactsRequestBuilder.post(...)
    at io.kroxylicious.it.filter.validation.JsonSchemaRecordValidationIT.init(...)
Caused by: java.io.IOException: closed
Caused by: java.io.IOException: fixed content-length: 429, bytes received: 0
Caused by: java.io.EOFException: EOF reached while reading
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The error felt bizarre. Kiota expected 429 bytes back from the registry, but received zero bytes before the socket slammed shut. Why would an HTTP server drop an incoming connection right after booting?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Deceptive Wait Strategy
&lt;/h2&gt;

&lt;p&gt;I looked at &lt;code&gt;RecordSchemaValidationBaseIT&lt;/code&gt;. Our test used a standard HTTP wait strategy on port 8080:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;GenericContainer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;startRegistryContainer&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GenericContainer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;dockerImageName&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withExposedPorts&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;waitingFor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Wait&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forHttp&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/apis/registry/v3/system/info"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;forStatusCode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On paper, that looks completely sound. Testcontainers pings &lt;code&gt;/apis/registry/v3/system/info&lt;/code&gt; until it gets an HTTP 200 response, flags the container as healthy, and hands off control to JUnit. Our code then immediately calls &lt;code&gt;client.groups().byGroupId("default").artifacts().post(...)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If the endpoint returns 200, why did our requests crash?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Startup Race in Quarkus
&lt;/h2&gt;

&lt;p&gt;Here's what I discovered under the hood. Apicurio Registry 3 runs on Quarkus. When Quarkus boots, Netty binds port 8080 right away. Any endpoint that serves static build metadata straight from memory, like &lt;code&gt;/system/info&lt;/code&gt;, starts returning 200 in a fraction of a second.&lt;/p&gt;

&lt;p&gt;Meanwhile, the actual database engine is still initializing on a background thread:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INFO [io.quarkus.bootstrap.runner.Timing] Listening on: http://0.0.0.0:8080. Management interface listening on http://0.0.0.0:9000.
INFO [io.apicurio.registry.storage.impl.sql.AbstractSqlRegistryStorage] Acquiring database initialization lock...
INFO [io.apicurio.registry.storage.impl.sql.AbstractSqlRegistryStorage] Database not initialized.
INFO [io.apicurio.registry.storage.impl.sql.AbstractSqlRegistryStorage] Initializing the Apicurio Registry database...
INFO [io.apicurio.registry.storage.impl.sql.AbstractSqlRegistryStorage] Database initialization lock released.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Port 8080 accepts traffic while &lt;code&gt;AbstractSqlRegistryStorage&lt;/code&gt; is still running schema migrations on H2.&lt;/p&gt;

&lt;p&gt;On my workstation, the database was ready before Testcontainers even sent its first ping. But on a heavily loaded CI runner with constrained CPU, the timing inverted. Testcontainers saw &lt;code&gt;/system/info&lt;/code&gt; return 200, thought everything was ready, and triggered our test. Because the HTTP server bound port 8080 almost immediately upon process launch, polling a static system information endpoint gave Testcontainers the false impression that the entire containerized application was completely healthy and prepared to process incoming write operations. Whenever our test runner tried to connect while the internal schema tables were still locked by the migration worker, the Quarkus runtime simply reset the underlying TCP connection without transmitting any bytes back to the waiting Kiota client. That produced the zero-byte EOFException.&lt;/p&gt;

&lt;p&gt;Keith Wall, a maintainer on the repo, caught this in issue #5031: &lt;em&gt;"We currently probe &lt;code&gt;/apis/registry/v3/system/info&lt;/code&gt; as an indication of readiness. I wonder if this is sufficient?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It wasn't. A metadata endpoint isn't a readiness probe.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix: Quarkus Management Port 9000
&lt;/h2&gt;

&lt;p&gt;In Quarkus and SmallRye Health, readiness checks don't live on the application port. In Apicurio Registry 3.x, they live on port 9000.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;/health/ready&lt;/code&gt; probe on port 9000 queries the Agroal datasource and storage subsystem directly. If database locks or migrations are running, it returns HTTP 503. It returns 200 only when the storage engine can safely accept writes.&lt;/p&gt;

&lt;p&gt;I updated &lt;code&gt;RecordSchemaValidationBaseIT&lt;/code&gt; to expose port 9000 and pointed the wait strategy to &lt;code&gt;/health/ready&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;CONTAINER_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;MANAGEMENT_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9000&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;GenericContainer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;startRegistryContainer&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GenericContainer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;dockerImageName&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withExposedPorts&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;CONTAINER_PORT&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;MANAGEMENT_PORT&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;waitingFor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Wait&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forHttp&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/health/ready"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;forPort&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;MANAGEMENT_PORT&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;forStatusCode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our client still talks to port 8080, but Testcontainers won't let our tests run until port 9000 confirms the database is completely ready.&lt;/p&gt;

&lt;p&gt;The flakiness disappeared completely. It worked cleanly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Remember
&lt;/h2&gt;

&lt;p&gt;Don't use static metadata endpoints for container readiness. If an app boots its web server before its database or cache is ready, polling an info URL creates a race condition. Always find the framework's dedicated readiness probe, and check if it lives on a separate management port.&lt;/p&gt;

</description>
      <category>java</category>
      <category>testing</category>
      <category>docker</category>
      <category>quarkus</category>
    </item>
    <item>
      <title>What Testing a Real App Taught Me About Building One</title>
      <dc:creator>Divyansh Kumar</dc:creator>
      <pubDate>Sun, 26 Oct 2025 18:15:56 +0000</pubDate>
      <link>https://dev.to/divyansh_kumar_1/what-testing-a-real-app-taught-me-about-building-one-2ifm</link>
      <guid>https://dev.to/divyansh_kumar_1/what-testing-a-real-app-taught-me-about-building-one-2ifm</guid>
      <description>&lt;p&gt;When I joined Stapubox as a Backend + QA Intern, I thought testing would be the “less exciting” part of the journey.&lt;br&gt;
But I was wrong.&lt;/p&gt;

&lt;p&gt;Within the first week, I realized testing isn’t about clicking buttons or breaking things—it’s about understanding how &lt;em&gt;real users&lt;/em&gt; think. And that changed the way I look at building products forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  📖 My Story
&lt;/h2&gt;

&lt;p&gt;Since this was my first experience in QA, I honestly didn’t know where to start.&lt;/p&gt;

&lt;p&gt;A senior teammate gave me a simple but powerful suggestion:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Before you think like a developer, think like a user. Do a bit of monkey testing first.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At first, it sounded funny. But when I started exploring the app like a curious user—signing up, creating a profile, testing chats, checking recommendations—I began noticing small details I would’ve completely ignored as a developer.&lt;/p&gt;

&lt;p&gt;Tiny loading delays.&lt;br&gt;
A misplaced button on the onboarding screen.&lt;br&gt;
A chat message that didn’t update in real-time unless I refreshed.&lt;/p&gt;

&lt;p&gt;Individually, they seemed minor. But together, they told a bigger story about user experience.&lt;/p&gt;

&lt;p&gt;That’s when it hit me—every tiny inconsistency matters because that’s exactly what a user notices first.&lt;/p&gt;

&lt;p&gt;By the second week, I wasn’t just finding bugs anymore.&lt;br&gt;
I was understanding why they happened—and more importantly, how to prevent them while building.&lt;br&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%2Fk5es5f5kqudrqlmxbnbl.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%2Fk5es5f5kqudrqlmxbnbl.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 What I learned?
&lt;/h2&gt;

&lt;p&gt;Testing taught me lessons no coding tutorial ever could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Empathy beats logic. You can’t build something great unless you understand how it feels to use it.&lt;/li&gt;
&lt;li&gt;Small details aren’t small. A one-second delay or an unhandled state can define how users perceive your entire product.&lt;/li&gt;
&lt;li&gt;QA makes you a sharper developer. It forces you to think beyond “does this code work?” to “does this experience make sense?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, whenever I write backend logic, I automatically imagine how a user will interact with that flow on the front end.&lt;br&gt;
And that mindset shift alone has been priceless.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤝 Over to you!
&lt;/h2&gt;

&lt;p&gt;I used to think testing was the final step in development.&lt;br&gt;
Now, I see it as the foundation of building something truly meaningful.&lt;/p&gt;

&lt;p&gt;If you’re a developer—especially early in your journey—I’d love to hear this from you:&lt;br&gt;
👉 How do you make sure your code feels human to the end user?&lt;/p&gt;

&lt;p&gt;Let’s share stories, not just syntax. 👇&lt;/p&gt;

</description>
      <category>testing</category>
      <category>developer</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>Stop Shipping Broken .env Files — Meet env-check-ts</title>
      <dc:creator>Divyansh Kumar</dc:creator>
      <pubDate>Mon, 07 Jul 2025 05:15:02 +0000</pubDate>
      <link>https://dev.to/divyansh_kumar_1/stop-shipping-broken-env-files-meet-env-check-ts-17p8</link>
      <guid>https://dev.to/divyansh_kumar_1/stop-shipping-broken-env-files-meet-env-check-ts-17p8</guid>
      <description>&lt;p&gt;Have you ever deployed your Node.js app, only to see it crash due to a missing or incorrect environment variable?&lt;/p&gt;

&lt;p&gt;If yes — you’re not alone.&lt;/p&gt;

&lt;p&gt;Environment variables (&lt;code&gt;.env&lt;/code&gt; files) are essential for configuring secrets, ports, database URLs, and more — but they’re also &lt;strong&gt;fragile&lt;/strong&gt; and &lt;strong&gt;invisible&lt;/strong&gt;. A single missing or mistyped key can break your entire app in production, CI/CD, or even onboarding new teammates.&lt;/p&gt;

&lt;p&gt;That’s exactly the kind of problem I wanted to solve when I created:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.npmjs.com/package/env-check-ts" rel="noopener noreferrer"&gt;&lt;code&gt;env-check-ts&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A simple, TypeScript-powered CLI that validates your &lt;code&gt;.env&lt;/code&gt; file against a schema and even auto-generates &lt;code&gt;.env.example&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🤷‍♂️The Problem We Often Ignore
&lt;/h2&gt;

&lt;p&gt;Let’s say you’ve got a &lt;code&gt;.env&lt;/code&gt; like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NODE_ENV=prod
PORT=3000
DATABASE_URL=https://secure-db.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What if:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;NODE_ENV was expected to be "production", not "prod"? &lt;/li&gt;
&lt;li&gt;PORT was accidentally deleted? &lt;/li&gt;
&lt;li&gt;You forgot to include DATABASE_URL in .env.example?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These bugs don’t get caught until runtime... and by then it’s too late.&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%2Fue3o37k7d78v40wgiiik.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%2Fue3o37k7d78v40wgiiik.png" alt="Invalidated code due to missing env" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪The Solution — env-check-ts
&lt;/h2&gt;

&lt;p&gt;env-check-ts solves this with schema validation, powered by Zod. It ensures your .env is:&lt;/p&gt;

&lt;p&gt;✅ Present&lt;/p&gt;

&lt;p&gt;✅ Complete&lt;/p&gt;

&lt;p&gt;✅ Valid by type and value&lt;/p&gt;

&lt;p&gt;You can also auto-generate a neat &lt;strong&gt;&lt;em&gt;.env.example&lt;/em&gt;&lt;/strong&gt; based on your schema.&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%2F8vajdcpkp39bs1j5ph4r.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%2F8vajdcpkp39bs1j5ph4r.png" alt="Generate .env.example as per your schema" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧑‍💻 Try it Now
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npm install -g env-check-ts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;or use via:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx env-check-ts validate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Full docs + GitHub: &lt;a href="https://github.com/Divyanshkumar62/env-check-ts-npm-package" rel="noopener noreferrer"&gt;Here&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔Why I Built This
&lt;/h2&gt;

&lt;p&gt;As a developer working on open-source and team projects, I faced recurring issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI/CD failing due to missing envs&lt;/li&gt;
&lt;li&gt;Confusion over .env files in onboarding&lt;/li&gt;
&lt;li&gt;Forgetting to update .env.example&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted something:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple and Type-safe&lt;/li&gt;
&lt;li&gt;And powered by a schema — not just regex&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So env-check-ts was born. It’s lightweight, zero-config, and developer-first.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔮What's Next?
&lt;/h2&gt;

&lt;p&gt;I'm actively improving this tool. Upcoming features:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Support for .env.production, .env.test, etc. &lt;/li&gt;
&lt;li&gt; Ability to redact secrets when generating .env.example &lt;/li&gt;
&lt;li&gt; VS Code extension for inline validation &lt;/li&gt;
&lt;li&gt; Auto-run as part of CI/CD pipelines&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Have suggestions or ideas? I’d love your feedback!&lt;/p&gt;




&lt;h2&gt;
  
  
  🫡Final Words
&lt;/h2&gt;

&lt;p&gt;If this tool helped you or your team:&lt;/p&gt;

&lt;p&gt;⭐️ Give it a star on GitHub&lt;/p&gt;

&lt;p&gt;🗣 Share it with a dev friend or a crazy techy&lt;/p&gt;

&lt;p&gt;📥 DM or comment — I'd love to hear your thoughts!&lt;/p&gt;

&lt;p&gt;Thanks for reading 🙌&lt;br&gt;
Built with ❤️ by Divyansh Kumar&lt;/p&gt;

</description>
      <category>npm</category>
      <category>node</category>
      <category>typescript</category>
      <category>firstpost</category>
    </item>
  </channel>
</rss>
