<?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: keyshade</title>
    <description>The latest articles on DEV Community by keyshade (@keyshade).</description>
    <link>https://dev.to/keyshade</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%2Forganization%2Fprofile_image%2F8588%2F006e863a-444c-4b8c-bbd9-5de395cb35b8.png</url>
      <title>DEV Community: keyshade</title>
      <link>https://dev.to/keyshade</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/keyshade"/>
    <language>en</language>
    <item>
      <title>7 Day Async Developer Challenge Recap</title>
      <dc:creator>Syed Fahad</dc:creator>
      <pubDate>Wed, 04 Feb 2026 12:32:43 +0000</pubDate>
      <link>https://dev.to/keyshade/7-day-async-developer-challenge-recap-5gd</link>
      <guid>https://dev.to/keyshade/7-day-async-developer-challenge-recap-5gd</guid>
      <description>&lt;p&gt;Over the past week, we ran our first &lt;strong&gt;7-Day Async Developer Challenge&lt;/strong&gt; among our Discord community members. The idea was simple: create a low-effort, fully async space where developers could share how they actually build, what breaks in real projects, and what feels slow or frustrating in everyday workflows.&lt;/p&gt;

&lt;p&gt;No live sessions. No prep work. No pressure to participate every day. Just one thoughtful question per day and a few minutes to respond.&lt;/p&gt;

&lt;p&gt;The response from the community validated why this format matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Ran This Challenge
&lt;/h2&gt;

&lt;p&gt;Developer conversations are often shaped by best practices, polished demos, or ideal workflows. While those have value, they don't always reflect what developers experience day to day.&lt;/p&gt;

&lt;p&gt;This challenge was designed to &lt;strong&gt;listen rather than teach&lt;/strong&gt;. We wanted to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how developers really set up projects&lt;/li&gt;
&lt;li&gt;where configuration and environment issues show up&lt;/li&gt;
&lt;li&gt;how secrets are handled in practice&lt;/li&gt;
&lt;li&gt;what causes friction during development&lt;/li&gt;
&lt;li&gt;how beginners and experienced developers think differently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keeping the challenge async and beginner-friendly helped create honest responses without intimidation.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Challenge Worked
&lt;/h2&gt;

&lt;p&gt;The challenge ran for seven days inside our Discord forums. Each day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one open-ended question was posted&lt;/li&gt;
&lt;li&gt;participants responded by creating forum posts&lt;/li&gt;
&lt;li&gt;replies could be short or detailed&lt;/li&gt;
&lt;li&gt;examples and screenshots were optional&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Participation was flexible. Some people joined every day. Others dropped in when a question resonated with them.&lt;/p&gt;

&lt;p&gt;In total, &lt;strong&gt;12 developers participated&lt;/strong&gt;, sharing insights across different experience levels.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Learned From the Community
&lt;/h2&gt;

&lt;p&gt;A few strong themes emerged across the responses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-world setups are messy
&lt;/h3&gt;

&lt;p&gt;Many developers rely on a mix of environment files, configuration files in repositories, cloud dashboards, and CI variables. There's rarely a single clean system in place, especially for smaller or early-stage projects where changes are drastic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuration issues break things more often than expected
&lt;/h3&gt;

&lt;p&gt;Several participants shared stories where bugs, failed builds, or broken deployments traced back to configuration or environment mismatches rather than code itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beginners are aware but unsure
&lt;/h3&gt;

&lt;p&gt;Students and early career developers often know that better practices exist but are unsure how to implement them or where to start. Many are still experimenting and learning through trial and error.&lt;/p&gt;

&lt;h3&gt;
  
  
  Simplicity is valued over complexity
&lt;/h3&gt;

&lt;p&gt;Across responses, developers consistently expressed a preference for simple workflows that are easy to understand and explain, even if they're not perfect.&lt;/p&gt;

&lt;p&gt;These insights reinforced the importance of clarity, accessibility, and gradual learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Top Contributors
&lt;/h2&gt;

&lt;p&gt;We want to recognize a few community members who consistently shared thoughtful responses, real examples, and engaged across multiple days.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Top contributors from this challenge:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/mohammed-shakeebuddin-mehran-027149347/" rel="noopener noreferrer"&gt;Mehran&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/akhia-baseer-52a8882a5/" rel="noopener noreferrer"&gt;Akhia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/adil-mohammed-9bbb08325/" rel="noopener noreferrer"&gt;Adil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/johnnyds/" rel="noopener noreferrer"&gt;Jhonny&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/adiva-nuha-b05206335/" rel="noopener noreferrer"&gt;Nuha&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Their contributions helped set the tone for open and honest discussion and added depth to the overall challenge.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Worked Well
&lt;/h2&gt;

&lt;p&gt;Several aspects of the challenge stood out as clear wins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The async format lowered the barrier to participation&lt;/li&gt;
&lt;li&gt;Short daily questions respected developers' time&lt;/li&gt;
&lt;li&gt;Forums kept discussions organized and searchable&lt;/li&gt;
&lt;li&gt;The "non-salesy" approach built trust&lt;/li&gt;
&lt;li&gt;Beginners felt comfortable sharing openly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most importantly, the community showed up with genuine experiences rather than curated answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Would Improve Next Time
&lt;/h2&gt;

&lt;p&gt;No challenge is perfect, and there are clear takeaways for future iterations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Earlier reminders could help improve consistency&lt;/li&gt;
&lt;li&gt;Providing an example response on Day One may help first-time participants&lt;/li&gt;
&lt;li&gt;Grouping related questions more intentionally could deepen discussion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These improvements will guide future community initiatives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters Going Forward
&lt;/h2&gt;

&lt;p&gt;The value of this challenge goes beyond the seven days it ran. We now have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;real developer language and mental models&lt;/li&gt;
&lt;li&gt;clearer visibility into pain points&lt;/li&gt;
&lt;li&gt;insights that can inform documentation and onboarding&lt;/li&gt;
&lt;li&gt;a stronger sense of what the community is keen to learn next&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most importantly, it reinforced that &lt;strong&gt;listening first creates better conversations and better products&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thank You
&lt;/h2&gt;

&lt;p&gt;A huge thank you to everyone who participated, shared experiences, and took time out of their day to contribute. This challenge was small by design, but the impact was meaningful.&lt;/p&gt;

&lt;p&gt;We look forward to running more async community initiatives like this and continuing to learn directly from developers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy Hacking with Keyshade💙&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>keyshade</category>
      <category>devsecops</category>
      <category>opensource</category>
    </item>
    <item>
      <title>What is Secrets Management?</title>
      <dc:creator>Syed Fahad</dc:creator>
      <pubDate>Mon, 02 Feb 2026 19:33:04 +0000</pubDate>
      <link>https://dev.to/keyshade/what-is-secrets-management-3925</link>
      <guid>https://dev.to/keyshade/what-is-secrets-management-3925</guid>
      <description>&lt;p&gt;Over the last few years, early-stage startups, fast-growing SaaS teams, and platform engineers inside large organizations have revealed a recurring theme:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Secrets are everywhere — and no one feels fully confident about how they're handled.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In theory, secret management sounds simple. Don't commit secrets to Git. Use environment variables. Rotate credentials occasionally. In reality, things mess up fast.&lt;/p&gt;

&lt;p&gt;Teams move quickly. Environments multiply. CI pipelines grow complex. People copy &lt;code&gt;.env&lt;/code&gt; files to "just get things working." And slowly, silently, secrets sprawl across laptops, build logs, Slack threads, wikis, and cloud dashboards.&lt;/p&gt;

&lt;p&gt;What stood out most from these conversations wasn't a lack of awareness, it was &lt;strong&gt;friction&lt;/strong&gt;. Engineers &lt;em&gt;know&lt;/em&gt; secrets are sensitive, but the safer path often feels slower or harder than the insecure one.&lt;/p&gt;

&lt;p&gt;Here are a few patterns that came up again and again:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Security issues rarely start with bad intent:&lt;/strong&gt; they start with convenience-driven shortcuts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual secret handling breaks at scale&lt;/strong&gt;, especially with multiple environments and teams&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developers don't want more tools:&lt;/strong&gt; they want fewer things to think about&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most incidents trace back to static, long-lived credentials&lt;/strong&gt; that nobody owned&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Secret management, when done right, doesn't slow teams down. It removes an entire category of mental overhead.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Secret Management?
&lt;/h2&gt;

&lt;p&gt;Ask ten engineers to define secret management, and you'll likely get ten slightly different answers.&lt;/p&gt;

&lt;p&gt;At a surface, secret management is about securely storing sensitive values like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API keys&lt;/li&gt;
&lt;li&gt;Database passwords&lt;/li&gt;
&lt;li&gt;OAuth tokens&lt;/li&gt;
&lt;li&gt;Encryption keys&lt;/li&gt;
&lt;li&gt;Webhook secrets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But high-performing teams think of it more broadly.&lt;/p&gt;

&lt;p&gt;Secret management is about creating a reliable, auditable, low-friction way for software to access what it needs, without us humans becoming the weakest link.&lt;/p&gt;

&lt;p&gt;In practice, this means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secrets are never hard-coded into source code&lt;/li&gt;
&lt;li&gt;Applications fetch secrets at runtime&lt;/li&gt;
&lt;li&gt;Access is controlled by identity, not by shared passwords&lt;/li&gt;
&lt;li&gt;Secrets have lifecycles (creation, rotation, revocation)&lt;/li&gt;
&lt;li&gt;Every access is logged&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't just security. It's trust, trust that you can deploy, rotate, refactor, or scale without breaking production or leaking credentials.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Secret Management Matters More Today Than Ever
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Cloud-Native Systems Multiply Secrets
&lt;/h3&gt;

&lt;p&gt;A decade ago, a single application might have had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One database password&lt;/li&gt;
&lt;li&gt;One API key&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Today, a single product can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dozens of microservices&lt;/li&gt;
&lt;li&gt;Multiple environments (dev, staging, prod)&lt;/li&gt;
&lt;li&gt;CI/CD pipelines&lt;/li&gt;
&lt;li&gt;Third-party integrations&lt;/li&gt;
&lt;li&gt;Background workers and cron jobs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each component needs its own credentials. Static secrets simply don't scale in this world.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. CI/CD Pipelines Are High-Impact Targets
&lt;/h3&gt;

&lt;p&gt;Your CI system often has the keys to the kingdom:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud provider access&lt;/li&gt;
&lt;li&gt;Deployment credentials&lt;/li&gt;
&lt;li&gt;Artifact registries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A single leaked pipeline token can compromise production in minutes. Without centralized secret management, these credentials often end up in logs, config files, or build scripts.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Compliance Is About Proof, Not Intent
&lt;/h3&gt;

&lt;p&gt;Modern compliance standards don't care if you're &lt;em&gt;meant&lt;/em&gt; to be secure.&lt;/p&gt;

&lt;p&gt;They care whether you can prove:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who accessed a secret&lt;/li&gt;
&lt;li&gt;When it was accessed&lt;/li&gt;
&lt;li&gt;Why it was accessed&lt;/li&gt;
&lt;li&gt;How long it remained valid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Manual processes and scattered secrets make this nearly impossible.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Goes Wrong Without Proper Secret Management
&lt;/h2&gt;

&lt;p&gt;When teams don't invest early, the same failure modes appear repeatedly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secrets accidentally committed to Git (and scraped by bots within minutes)&lt;/li&gt;
&lt;li&gt;Shared credentials used across multiple services&lt;/li&gt;
&lt;li&gt;Manual secret rotation causing production outages&lt;/li&gt;
&lt;li&gt;Developers copying production secrets to local machines&lt;/li&gt;
&lt;li&gt;No clear ownership of credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These issues rarely show up during happy-path development. They surface during incidents — when stress is highest and mistakes are most costly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Core Principles of Modern Secret Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Centralize Secrets
&lt;/h3&gt;

&lt;p&gt;Secrets should live in &lt;strong&gt;one secure system&lt;/strong&gt;, not scattered across repos, cloud consoles, and laptops.&lt;/p&gt;

&lt;p&gt;Centralization enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consistent access policies&lt;/li&gt;
&lt;li&gt;Easier rotation&lt;/li&gt;
&lt;li&gt;Auditing and visibility&lt;/li&gt;
&lt;li&gt;Reduces manual intervention&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Enforce The Least Privilege Model
&lt;/h3&gt;

&lt;p&gt;Every service should have access &lt;strong&gt;only&lt;/strong&gt; to the secrets it actually needs — nothing more.&lt;/p&gt;

&lt;p&gt;This reduces blast radius when something goes wrong.&lt;/p&gt;




&lt;h3&gt;
  
  
  Prefer Short-Lived Credentials
&lt;/h3&gt;

&lt;p&gt;Long-lived secrets are liabilities.&lt;/p&gt;

&lt;p&gt;Modern systems increasingly rely on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ephemeral tokens&lt;/li&gt;
&lt;li&gt;Identity-based access&lt;/li&gt;
&lt;li&gt;Automatic expiration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a secret expires quickly, leaks hurt less.&lt;/p&gt;




&lt;h3&gt;
  
  
  Automate Rotation
&lt;/h3&gt;

&lt;p&gt;Manual rotation doesn't scale and eventually gets skipped.&lt;/p&gt;

&lt;p&gt;Good systems rotate secrets automatically and update dependent services safely.&lt;/p&gt;




&lt;h3&gt;
  
  
  Audit Everything
&lt;/h3&gt;

&lt;p&gt;You should always be able to answer:&lt;/p&gt;

&lt;p&gt;Who accessed this secret, when, and from where?&lt;/p&gt;

&lt;p&gt;Audit logs are foundational, not optional.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example: From Hard-Coded Secrets to Runtime Injection
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DB_PASSWORD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;super-secret-password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lives in code&lt;/li&gt;
&lt;li&gt;Gets copied everywhere&lt;/li&gt;
&lt;li&gt;Never expires&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  After
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dbPassword&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;DB_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The secret is injected at runtime from a secure manager.&lt;/p&gt;

&lt;p&gt;Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nothing sensitive in Git&lt;/li&gt;
&lt;li&gt;Environment-specific access&lt;/li&gt;
&lt;li&gt;Rotation without code changes&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How Teams Manage Secrets Today
&lt;/h2&gt;

&lt;p&gt;Most modern approaches fall into three broad categories:&lt;/p&gt;

&lt;h3&gt;
  
  
  Vault-Based Systems
&lt;/h3&gt;

&lt;p&gt;Highly flexible and powerful. Great for complex, regulated environments — but can be operationally heavy.&lt;/p&gt;




&lt;h3&gt;
  
  
  Cloud-Native Secret Managers
&lt;/h3&gt;

&lt;p&gt;Tightly integrated with a single cloud provider. Easy to start, harder in multi-cloud or local-first workflows.&lt;/p&gt;




&lt;h3&gt;
  
  
  Developer-First Secret Platforms
&lt;/h3&gt;

&lt;p&gt;Focus on DX:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLI-first workflows&lt;/li&gt;
&lt;li&gt;CI/CD integrations&lt;/li&gt;
&lt;li&gt;Faster onboarding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aim to reduce friction without compromising security.&lt;/p&gt;




&lt;p&gt;Another tool to mention is &lt;a href="http://keyshade.io/" rel="noopener noreferrer"&gt;keyshade.io&lt;/a&gt;, it approaches secret management with a focus on workflows and developer experience. It emphasizes more on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keeping environment variables in sync across machines and pipelines.&lt;/li&gt;
&lt;li&gt;Detecting leaked secrets early in development.&lt;/li&gt;
&lt;li&gt;Updating secrets at runtime without requiring restarts.&lt;/li&gt;
&lt;li&gt;Ensuring end-to-end encryption, with secrets decrypting only on the client&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rather than aiming to replace every enterprise vault use case, it focuses on reducing everyday friction, particularly in areas where secret sprawl often begins, like your local development and CI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes Even Mature Teams Make
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Treating secrets as static configuration&lt;/li&gt;
&lt;li&gt;Over-permissioning for convenience&lt;/li&gt;
&lt;li&gt;Ignoring audits until compliance deadlines&lt;/li&gt;
&lt;li&gt;Rotating secrets without safe rollout strategies&lt;/li&gt;
&lt;li&gt;Securing production but ignoring CI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Secret management is as much &lt;strong&gt;process&lt;/strong&gt; as tooling.&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How Do You Ensure Secrets Are Securely Distributed Across Environments?
&lt;/h3&gt;

&lt;p&gt;I've seen companies securely distribute secrets by using a centralized secrets management system that works with their CI/CD pipelines. Identity-based access controls make sure only the right people or systems can access secrets. Secrets are always encrypted, whether they're being sent or stored. Injecting secrets at runtime, instead of hard-coding them into configs or code, also helps cut down on exposure risks.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Are the Risks of Long-Lived Secrets?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Indefinite validity increases attack surface.&lt;/li&gt;
&lt;li&gt;Often forgotten, leading to unmanaged credentials.&lt;/li&gt;
&lt;li&gt;Complicates rotation in distributed systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solution: Use short-lived, auto-expiring credentials.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Do You Handle Secret Rotation Without Downtime?
&lt;/h3&gt;

&lt;p&gt;Automating secret rotation ensures seamless updates without downtime. For instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currentSecret&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;OLD_SECRET&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;newSecret&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;NEW_SECRET&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Services can temporarily use both secrets during rotation&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;validateWithSecret&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentSecret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nf"&gt;validateWithSecret&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newSecret&lt;/span&gt;&lt;span class="p"&gt;))&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Access granted&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="k"&gt;else&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Access denied&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This dual-secret strategy allows old and new secrets to overlap temporarily. Dependent services dynamically switch to the new secret without requiring restarts. Orchestration tools can further coordinate rotation across distributed systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Is Auditing Access to Secrets Critical?
&lt;/h3&gt;

&lt;p&gt;Auditing provides visibility into who accessed a secret, when, and from where. For example, access logs can reveal anomalies such as unauthorized access attempts or unusual patterns. Without auditing, detecting and responding to security incidents becomes nearly impossible, undermining accountability and compliance.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Do You Prevent Secret Sprawl in Large Teams?
&lt;/h3&gt;

&lt;p&gt;To prevent secret sprawl, centralize secrets in a dedicated management system and enforce strict usage policies. Regularly scan repositories, logs, and configurations for exposed secrets. For example, tools like secret scanners can identify sensitive data in codebases before deployment, reducing risks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Secrets are invisible when things go right, and can also be catastrophic when they don't.&lt;/p&gt;

&lt;p&gt;The tools matter, but the principles matter more:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Centralize secrets. Minimize access. Automate lifecycles. Audit everything.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If secrets are still managed manually, it's not a question of &lt;em&gt;if&lt;/em&gt; it will break, only &lt;em&gt;when&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>secretmanagement</category>
      <category>devsecops</category>
      <category>security</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Zero‑Friction Secret Management</title>
      <dc:creator>Syed Fahad</dc:creator>
      <pubDate>Thu, 22 Jan 2026 13:56:01 +0000</pubDate>
      <link>https://dev.to/keyshade/zero-friction-secret-management-1ibe</link>
      <guid>https://dev.to/keyshade/zero-friction-secret-management-1ibe</guid>
      <description>&lt;p&gt;Every modern application runs on secrets.&lt;/p&gt;

&lt;p&gt;API keys, database credentials, webhook tokens, OAuth client secrets. They’re everywhere. And yet, most teams still treat secret management as an afterthought until something breaks, leaks, or shows up in a GitHub security alert.&lt;/p&gt;

&lt;p&gt;The hard truth is this: &lt;strong&gt;developers don’t ignore security because they don’t care&lt;/strong&gt;. They ignore it because security workflows are often slow, manual, and hostile to how software is actually built today.&lt;/p&gt;

&lt;p&gt;That’s where zero‑friction secret management comes in.&lt;/p&gt;

&lt;p&gt;This isn’t about adding another tool. It’s about removing pain.&lt;/p&gt;

&lt;h2&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%2F4vlnj4k6zkelh6s9vczy.png" alt=" " width="800" height="423"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Secret Management Feels Broken Today&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In many teams that we’ve seen, secret handling looks like one of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt; files copied across machines and environments, or posted over Slack / Discord / Email&lt;/li&gt;
&lt;li&gt;Secrets hardcoded during “just for now” debugging&lt;/li&gt;
&lt;li&gt;CI variables set once and forgotten forever&lt;/li&gt;
&lt;li&gt;Long-lived credentials shared across services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem isn’t ignorance. It’s &lt;strong&gt;context switching&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When a developer is deep into shipping a feature, any workflow that requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;opening a dashboard&lt;/li&gt;
&lt;li&gt;requesting access&lt;/li&gt;
&lt;li&gt;waiting for approvals&lt;/li&gt;
&lt;li&gt;manually syncing environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…will eventually be bypassed.&lt;/p&gt;

&lt;p&gt;Security that slows velocity doesn’t get adopted.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;What “Zero‑Friction” Actually Means&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Zero‑friction secret management doesn’t mean “no security.”&lt;/p&gt;

&lt;p&gt;It means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Secrets appear exactly where developers need them&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No manual copying between environments and machines&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No special steps to rotate or revoke credentials&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No extra cognitive load during local development&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best systems fade into the background.&lt;/p&gt;

&lt;p&gt;If developers have to think about secrets every day, the system has already failed.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Principles of a Zero‑Friction System&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Environment‑Native by Default&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Secrets should naturally flow into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;local development&lt;/li&gt;
&lt;li&gt;CI pipelines&lt;/li&gt;
&lt;li&gt;staging&lt;/li&gt;
&lt;li&gt;production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a developer needs to export variables manually, friction already exists.&lt;/p&gt;

&lt;p&gt;Secrets must be injected automatically at runtime, scoped per environment, and isolated by default.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Short‑Lived Over Static&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Long‑lived secrets are silent liabilities.&lt;/p&gt;

&lt;p&gt;Modern systems should favor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ephemeral credentials&lt;/li&gt;
&lt;li&gt;automatic rotation&lt;/li&gt;
&lt;li&gt;time‑bound access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This drastically reduces blast radius without adding extra steps for developers.&lt;/p&gt;

&lt;p&gt;Security improves &lt;strong&gt;without changing developer behaviour&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Configuration First, Not Configuration Spread&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Modern infrastructure works best with clear management. A smooth approach fits well with tools like Terraform by making sure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secrets are part of the setup always.&lt;/li&gt;
&lt;li&gt;Changes can be tracked and are easy to follow.&lt;/li&gt;
&lt;li&gt;Updates are easy and can be reversed if needed.&lt;/li&gt;
&lt;li&gt;Configurations are reusable across multiple environments, reducing duplication.&lt;/li&gt;
&lt;li&gt;Automated validation ensures configurations are error free before deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This helps eliminate scattered configurations and ensures a unified, traceable and an auditable workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Minimal Permissions by Default&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Most breaches happen due to over‑privileged credentials.&lt;/p&gt;

&lt;p&gt;A frictionless system applies least‑privilege automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;service‑specific secrets&lt;/li&gt;
&lt;li&gt;environment‑scoped access&lt;/li&gt;
&lt;li&gt;clear ownership&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developers shouldn’t need to design permission models every time they deploy.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;5. Version Control and Roll-Back for Secrets&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A robust secret management system should include version control and rollback capabilities. This ensures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every change to a secret is tracked, trailed and auditable.&lt;/li&gt;
&lt;li&gt;Developers can confidently update values without fear of breaking something permanently.&lt;/li&gt;
&lt;li&gt;Rolling back to a previous version is seamless and quick.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;The Real Win: Developer Trust&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Security tooling often fails because it assumes developers are adversaries.&lt;/p&gt;

&lt;p&gt;Zero‑friction secret management assumes the opposite.&lt;/p&gt;

&lt;p&gt;It treats developers as partners by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;respecting their workflows&lt;/li&gt;
&lt;li&gt;reducing interruptions&lt;/li&gt;
&lt;li&gt;removing repetitive tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When security tools &lt;strong&gt;help developers move faster&lt;/strong&gt;, adoption becomes organic.&lt;/p&gt;

&lt;p&gt;No enforcement required in such situations.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;What This Looks Like in Practice&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In a healthy setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a new service spins up without anyone asking for secrets&lt;/li&gt;
&lt;li&gt;secrets rotate without downtime&lt;/li&gt;
&lt;li&gt;compromised credentials are revoked instantly&lt;/li&gt;
&lt;li&gt;developers never see production secrets locally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And most importantly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Developers don’t often discuss secret management because, when done right, it seamlessly integrates and simply works.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That silence is success.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Closing Thought&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The future of application security isn’t more dashboards or stricter policies.&lt;/p&gt;

&lt;p&gt;It’s &lt;strong&gt;invisible security&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When secret management becomes frictionless, teams stop choosing between speed and safety. They get both.&lt;/p&gt;

&lt;p&gt;And that’s how modern systems should be built.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Where Most Teams Actually Get This Wrong&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In real production systems, secret management rarely fails in obvious ways. It fails quietly.&lt;/p&gt;

&lt;p&gt;Secrets leak through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;debug logs pushed during incident response&lt;/li&gt;
&lt;li&gt;misconfigured CI jobs that echo environment variables&lt;/li&gt;
&lt;li&gt;abandoned staging environments that still have production credentials&lt;/li&gt;
&lt;li&gt;contractors or temporary services retaining access long after they’re gone&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are exotic attacks. They’re operational gaps.&lt;/p&gt;

&lt;p&gt;What’s dangerous is that traditional secret management tools often &lt;strong&gt;increase surface area&lt;/strong&gt; by spreading configuration across multiple places like dashboards, scripts, environment files, and tribal knowledge.&lt;/p&gt;

&lt;p&gt;The more places a secret exists, the harder it is to reason about who can access what and when.&lt;/p&gt;

&lt;p&gt;Zero-friction systems reduce this surface area instead of adding to it.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Runtime Injection Beats Build-Time Secrets&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;One of the most under-discussed problems is &lt;strong&gt;when&lt;/strong&gt; secrets are injected.&lt;/p&gt;

&lt;p&gt;Build-time secrets get baked into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;container layers&lt;/li&gt;
&lt;li&gt;build caches&lt;/li&gt;
&lt;li&gt;artifacts stored in registries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once that happens, revocation becomes reactive and messy.&lt;/p&gt;

&lt;p&gt;A senior-grade setup injects secrets &lt;strong&gt;only at runtime&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nothing sensitive exists in the image&lt;/li&gt;
&lt;li&gt;deployments remain immutable&lt;/li&gt;
&lt;li&gt;rollback doesn’t resurrect compromised credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This single design choice dramatically improves security posture without any developer-facing complexity.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Auditing Without Surveillance&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Another overlooked aspect is auditing.&lt;/p&gt;

&lt;p&gt;Good secret systems answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which service accessed which secret&lt;/li&gt;
&lt;li&gt;from which environment&lt;/li&gt;
&lt;li&gt;at what time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But they avoid turning into developer surveillance tools.&lt;/p&gt;

&lt;p&gt;Logs should exist for &lt;strong&gt;systems&lt;/strong&gt;, not for micromanaging humans.&lt;/p&gt;

&lt;p&gt;When audit trails are clean, structured, and automated, security teams gain visibility while developers retain autonomy.&lt;/p&gt;

&lt;p&gt;That balance is critical at scale.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Scaling Teams Without Scaling Risk&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As teams grow, secret sprawl grows faster.&lt;/p&gt;

&lt;p&gt;New microservices, background jobs, preview environments, and internal tools all multiply credential usage.&lt;/p&gt;

&lt;p&gt;Zero-friction secret management scales by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;default isolation between services&lt;/li&gt;
&lt;li&gt;environment-level boundaries&lt;/li&gt;
&lt;li&gt;automated cleanup when services are removed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn’t just protecting secrets today, it’s preventing tomorrow’s forgotten ones.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;FAQs&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. How can zero-friction secret management be implemented with Infrastructure as Code (IaC) tools like Terraform?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Zero-friction secret management integrates with IaC by using providers or modules that fetch secrets dynamically at deployment time (e.g., using Terraform's Vault provider). This ensures secrets are never hardcoded and are always up-to-date, supporting automated rotation and environment isolation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. What are best practices for integrating secret management with container orchestration platforms like Kubernetes?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use Kubernetes-native solutions such as external secrets operators or CSI drivers to inject secrets at runtime from centralized secret stores (like HashiCorp Vault or AWS Secrets Manager). Ensure RBAC policies restrict access, and avoid mounting secrets as files in containers when possible—prefer environment variable injection and short-lived tokens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. How do you audit and monitor secret access in a zero-friction system?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Leverage built-in audit logging from secret management tools to track which services or users accessed which secrets, from which environment, and at what time. Integrate these logs with SIEM solutions for real-time monitoring and anomaly detection, ensuring compliance without micromanaging developers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. What’s the biggest benefit of zero-friction systems?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They improve security without slowing down development.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Final Take&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Great secret management systems don’t advertise themselves.&lt;/p&gt;

&lt;p&gt;They quietly eliminate entire categories of incidents, reviews, and manual work.&lt;/p&gt;

&lt;p&gt;When security decisions disappear from daily conversations, engineering teams can focus on building systems that actually matter.&lt;/p&gt;

&lt;p&gt;That’s not just better security. That’s better engineering.&lt;/p&gt;

</description>
      <category>secretmanagement</category>
      <category>devops</category>
      <category>beginners</category>
      <category>security</category>
    </item>
    <item>
      <title>Common CI Misconfigurations That Leak Credentials</title>
      <dc:creator>Syed Fahad</dc:creator>
      <pubDate>Wed, 21 Jan 2026 21:44:16 +0000</pubDate>
      <link>https://dev.to/keyshade/common-ci-misconfigurations-that-leak-credentials-1ag1</link>
      <guid>https://dev.to/keyshade/common-ci-misconfigurations-that-leak-credentials-1ag1</guid>
      <description>&lt;p&gt;In this blog, we break down the most common CI misconfigurations that lead to credential leaks in real production systems. We will focus on practical failure modes seen in modern DevOps pipelines and explain how engineering teams can reduce risk without slowing delivery.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Table of Contents&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;Why CI Pipelines Are High Risk&lt;/li&gt;
&lt;li&gt;Common CI Misconfigurations That Leak Credentials

&lt;ul&gt;
&lt;li&gt;Secrets Printed in Logs&lt;/li&gt;
&lt;li&gt;Long-lived CI Credentials&lt;/li&gt;
&lt;li&gt;Over Privileged CI Runners&lt;/li&gt;
&lt;li&gt;Secrets Baked Into Build Artifacts&lt;/li&gt;
&lt;li&gt;Shared CI Configuration Across Repositories&lt;/li&gt;
&lt;li&gt;Fork and Pull Request Exposure&lt;/li&gt;
&lt;li&gt;Forgotten Pipelines and Environments&lt;/li&gt;
&lt;li&gt;Hardcoded CI Secrets&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tools and Platforms Commonly Involved&lt;/li&gt;
&lt;li&gt;How Better Secret Management Helps&lt;/li&gt;
&lt;li&gt;FAQs&lt;/li&gt;
&lt;li&gt;Final Thoughts&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;CI pipelines are trusted infrastructure. They build code, run tests, publish artifacts, and deploy to production. Because they sit at the center of the delivery process, they often hold powerful credentials.&lt;/p&gt;

&lt;p&gt;Most credential and secrets leaks do not happen because of negligence. They happen because CI configuration evolves quietly over time. Debug settings remain enabled. Permissions grow. Old secrets are never rotated. Eventually, something sensitive leaks through logs, artifacts, or misconfigured workflows.&lt;/p&gt;

&lt;p&gt;Understanding how these failures occur is the first step toward preventing them.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why CI Pipelines Are High Risk&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;CI systems commonly have access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud provider credentials&lt;/li&gt;
&lt;li&gt;Deployment keys&lt;/li&gt;
&lt;li&gt;Package registry tokens&lt;/li&gt;
&lt;li&gt;Internal service credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike application code, CI configuration is rarely reviewed as security critical. YAML files are edited under delivery pressure and rarely revisited. This makes CI a high-value target and a frequent source of accidental leaks.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Common CI Misconfigurations That Leak Credentials&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Secrets Printed in Logs&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This is the most common and most underestimated issue.&lt;/p&gt;

&lt;p&gt;It usually happens during debugging. A variable is echoed to confirm it exists. Verbose logging is enabled for a CLI. A shell script runs with debug output enabled.&lt;/p&gt;

&lt;p&gt;Common examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Environment variables printed directly&lt;/li&gt;
&lt;li&gt;CLI tools logging request headers&lt;/li&gt;
&lt;li&gt;Debug flags left enabled in CI jobs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once secrets appear in logs, they spread quickly. Logs are stored, indexed, exported, and sometimes shared externally.&lt;/p&gt;

&lt;p&gt;How do we reduce risk?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Treat CI logs as public artifacts&lt;/li&gt;
&lt;li&gt;Mask secrets at the CI platform level&lt;/li&gt;
&lt;li&gt;Disable shell debug output by default&lt;/li&gt;
&lt;li&gt;Use tools that redact sensitive output automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A clear example of what not to do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export API_KEY="12345EXAMPLEKEY"
echo "Starting deployment with API_KEY=$API_KEY"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this script, the &lt;code&gt;API_KEY&lt;/code&gt; is printed directly to the logs, exposing sensitive information. If these logs are stored or shared, the secret is compromised.&lt;/p&gt;

&lt;p&gt;A better approach is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export API_KEY="12345EXAMPLEKEY"
echo "Starting deployment"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, use secret masking tools provided by your CI platform to ensure sensitive data is never logged.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2. Long-Lived CI Credentials&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Many pipelines still rely on static credentials that never expire.&lt;/p&gt;

&lt;p&gt;Common examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud access keys created years ago&lt;/li&gt;
&lt;li&gt;Registry tokens shared across projects&lt;/li&gt;
&lt;li&gt;Deployment secrets reused across environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These credentials often outlive the services and teams that created them.&lt;/p&gt;

&lt;p&gt;How to reduce risk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use short-lived credentials wherever possible&lt;/li&gt;
&lt;li&gt;Rotate CI secrets automatically&lt;/li&gt;
&lt;li&gt;Scope credentials per pipeline and per environment&lt;/li&gt;
&lt;li&gt;Remove human owned credentials from CI&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3. Over Privileged CI Runners&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;CI runners frequently have more permissions than necessary.&lt;/p&gt;

&lt;p&gt;A single pipeline may be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy to production&lt;/li&gt;
&lt;li&gt;Read all environment secrets&lt;/li&gt;
&lt;li&gt;Modify infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a large blast radius if a pipeline is compromised.&lt;/p&gt;

&lt;p&gt;How to reduce risk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apply least-privilege to CI identities&lt;/li&gt;
&lt;li&gt;Separate build, test, and deploy permissions&lt;/li&gt;
&lt;li&gt;Isolate production credentials from non production workflows&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;4. Secrets Baked Into Build Artifacts&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Injecting secrets at build time is a subtle but serious mistake.&lt;/p&gt;

&lt;p&gt;This can lead to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secrets embedded in container layers&lt;/li&gt;
&lt;li&gt;Credentials stored in build caches&lt;/li&gt;
&lt;li&gt;Tokens copied into compiled artifacts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once baked in, secrets are difficult to revoke cleanly.&lt;/p&gt;

&lt;p&gt;How to reduce risk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inject secrets only at runtime&lt;/li&gt;
&lt;li&gt;Keep build artifacts completely secret free&lt;/li&gt;
&lt;li&gt;Audit container images regularly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's take a look at a case of what not to do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM node:16

ENV API_KEY=12345EXAMPLEKEY
ENV API_SECRET=abcdeEXAMPLESECRET

COPY . /app
WORKDIR /app
RUN npm install
CMD ["npm", "start"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this Dockerfile, the &lt;code&gt;API_KEY&lt;/code&gt; and &lt;code&gt;API_SECRET&lt;/code&gt; are embedded directly into the container image. If the image is shared or pushed to a public registry, these secrets are exposed.&lt;/p&gt;

&lt;p&gt;Instead, we use runtime injection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM node:16

COPY . /app
WORKDIR /app
RUN npm install
CMD ["npm", "start"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now at runtime, inject secrets using environment variables or a secret management tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -e API_KEY=12345EXAMPLEKEY -e API_SECRET=abcdeEXAMPLESECRET my-secure-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach ensures secrets are never baked into the image and remain secure by leveraging dynamic injection tools like Keyshade.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;5. Shared CI Configuration Across Repositories&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Shared CI templates improve consistency but can introduce risk.&lt;/p&gt;

&lt;p&gt;A template with powerful secrets may be reused in places that do not require them. Internal tools can accidentally inherit production access.&lt;/p&gt;

&lt;p&gt;How to reduce risk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid global secrets in shared templates&lt;/li&gt;
&lt;li&gt;Require explicit opt in for sensitive credentials&lt;/li&gt;
&lt;li&gt;Review inherited permissions regularly&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;6. Fork and Pull Request Exposure&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Public repositories often run CI on pull requests.&lt;/p&gt;

&lt;p&gt;If secrets are exposed to untrusted forks, attackers can exfiltrate them with trivial changes.&lt;/p&gt;

&lt;p&gt;How to reduce risk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Never expose secrets to forked builds&lt;/li&gt;
&lt;li&gt;Use separate workflows for untrusted code&lt;/li&gt;
&lt;li&gt;Disable secret access on pull request pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An example of what can go wrong:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: CI Pipeline

on:

  pull_request:

    branches:

      - main

jobs:

  build:

    runs-on: ubuntu-latest

    steps:

      - name: Checkout code

        uses: actions/checkout@v2

      - name: Use secret

        run: echo ${{ secrets.PROD_API_KEY }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this configuration, the &lt;code&gt;PROD_API_KEY&lt;/code&gt; secret is accessible during pull request builds. If an attacker forks the repository and modifies the &lt;code&gt;run&lt;/code&gt; step to &lt;code&gt;echo&lt;/code&gt; the secret, they can easily capture it.&lt;/p&gt;

&lt;p&gt;To fix this, you can restrict secret access:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: CI Pipeline

on:

  pull_request:

    branches:

      - main

jobs:

  build:

    if: github.event.pull_request.head.repo.full_name == github.repository

    runs-on: ubuntu-latest

    steps:

      - name: Checkout code

        uses: actions/checkout@v2

      - name: Use secret

        run: echo ${{ secrets.PROD_API_KEY }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures secrets are only accessible for pull requests originating from the &lt;span&gt;same repository&lt;/span&gt;, not from forks.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;7. Forgotten Pipelines and Environments&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Old pipelines rarely get deleted.&lt;/p&gt;

&lt;p&gt;Staging jobs, preview environments, and deprecated services often retain valid credentials long after they stop being used.&lt;/p&gt;

&lt;p&gt;How to reduce risk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audit CI pipelines regularly&lt;/li&gt;
&lt;li&gt;Expire secrets for inactive projects automatically&lt;/li&gt;
&lt;li&gt;Track ownership for every pipeline&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;8. Hardcoded CI Secrets&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Hardcoding secrets in CI pipelines is a common yet a very risky shortcut. This happens when sensitive info like API keys or passwords is directly written into CI scripts or YAML files. It might seem quick and easy to us developers, but it opens the door to serious security issues.&lt;/p&gt;

&lt;p&gt;Why It’s Risky:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accidental Leaks:** **Hardcoded secrets can end up in version control (like Git). If the repo is public or shared, anyone can see them.&lt;/li&gt;
&lt;li&gt;Hard to Rotate: Changing secrets means editing code or configs, which can be messy and error-prone.&lt;/li&gt;
&lt;li&gt;Overexposure: Hardcoded secrets are often reused across multiple pipelines or environments, making a single leak much worse.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s a bad practice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;env:

  AWS_ACCESS_KEY_ID: AKIAEXAMPLE123

  AWS_SECRET_ACCESS_KEY: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If this file gets pushed to a public repo, those credentials are compromised instantly.&lt;/p&gt;

&lt;p&gt;How&lt;a href="http://keyshade.io" rel="noopener noreferrer"&gt;Keyshade.io&lt;/a&gt; can help: Keyshade injects secrets dynamically at runtime, so they’re never hardcoded or stored in your CI configs. This means no accidental leaks in your repos and no manual secret rotation headaches. It keeps your pipelines secure by default.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Tools and Platforms Commonly Involved&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Credential leaks frequently involve CI systems and tooling such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;GitLab CI&lt;/li&gt;
&lt;li&gt;Jenkins&lt;/li&gt;
&lt;li&gt;CircleCI&lt;/li&gt;
&lt;li&gt;Cloud CLIs and deployment tools&lt;/li&gt;
&lt;li&gt;Container build systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The risk usually comes from how these tools are configured, not from the tools themselves.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;How Better Secret Management Helps&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Many CI issues persist because secrets are spread across dashboards, variables, scripts, and templates.&lt;/p&gt;

&lt;p&gt;Platforms like&lt;a href="https://keyshade.io" rel="noopener noreferrer"&gt;Keyshade&lt;/a&gt; reduce this surface area by injecting secrets dynamically at runtime, scoped to the exact job and environment that needs them. This limits blast radius, removes static credentials, and reduces manual handling by engineers.&lt;/p&gt;

&lt;p&gt;Good tooling makes secure behavior the default, instead of an extra step.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;FAQs&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Are CI credential leaks common&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Yes. Many leaks are discovered internally during audits or incident response and never become public. CI logs and pipelines are frequent sources.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Should CI pipelines access production secrets&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Only when required and only at runtime. Build and test stages should never need production credentials.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is masking secrets in logs enough&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;No. Masking helps reduce accidental exposure but does not prevent misuse or secrets being baked into artifacts.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How often should CI secrets be rotated&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As frequently as possible and ideally automatically. Manual rotation does not scale reliably.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;CI pipelines deserve the same security attention as production services.&lt;/p&gt;

&lt;p&gt;Most credential leaks are not the result of sophisticated attacks. They come from defaults, convenience, and forgotten configuration. Strong CI security is not about adding friction. It is about designing systems where leaking secrets is difficult by default.&lt;/p&gt;

&lt;p&gt;That is what mature DevOps looks like.&lt;/p&gt;

</description>
      <category>secretmanagement</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>How keyshade employs the use of sockets in distributed environment</title>
      <dc:creator>Rajdip Bhattacharya</dc:creator>
      <pubDate>Mon, 06 May 2024 17:30:21 +0000</pubDate>
      <link>https://dev.to/keyshade/how-keyshade-employs-the-use-of-sockets-in-distributed-environment-2b0l</link>
      <guid>https://dev.to/keyshade/how-keyshade-employs-the-use-of-sockets-in-distributed-environment-2b0l</guid>
      <description>&lt;p&gt;Any web application that wants to integrate real-time responsiveness into their operations, will surely use web sockets in some way or the other. Socket programming is, nonetheless, difficult to implement, hence a library of softwares exist to ease our life a little bit.&lt;/p&gt;

&lt;p&gt;But there are scenarios when you can't use these tools due to the lack of flexibility, and you need to manually write your socket code. &lt;/p&gt;

&lt;p&gt;We were challenged with a similar problem at keyshade!&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;At the very core of our project, we have real-time notifications to client applications. This means, if your application is configured with keyshade, it will receive live updates regarding changes that happen in your configurations. This implies that your application will need to maintain a socket connection to our servers, which, by no means, is feasible (even if possible) to externalize our sockets. And so, our sockets are home baked.&lt;/p&gt;

&lt;p&gt;But, the plot thickens further!&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding to the problem
&lt;/h2&gt;

&lt;p&gt;But before we could implement this, we were met by yet another (major) blocker. Consider this scenario:&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%2Fe1429maa08jgr2k3debz.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%2Fe1429maa08jgr2k3debz.png" alt="websocket-flow-1" width="800" height="925"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are having an API cluster that has 3 instances. This cluster sits behind a load balancer, through which all connections are multiplexed (which I have dropped deliberately to reduce complexity). &lt;/p&gt;

&lt;p&gt;In this case, your client application (where you want to get live configuration updates) has connected to &lt;code&gt;Server A&lt;/code&gt;. But, when you are making changes, they are sent to &lt;code&gt;Server C&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;This raises the concern about the scalability of web sockets in a distributed environment. As you can infer, sockets that are connected to &lt;code&gt;Server A&lt;/code&gt; won't receive any updates from &lt;code&gt;Server C&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;This brings us to our next section: the solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution
&lt;/h2&gt;

&lt;p&gt;After spending an entire day searching for the correct solution, I found none. There was not a single way on that I could "share" socket connections among various servers. So, we brought &lt;strong&gt;Redis' PubSub&lt;/strong&gt; into the picture.&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%2Fiha7ev973yfjt5bvnefs.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%2Fiha7ev973yfjt5bvnefs.png" alt="redis pubsub" width="800" height="980"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The very fundamental of this approach was this: whenever a server started up, we would make it register to the &lt;code&gt;change-notifier&lt;/code&gt; topic of Redis.&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;async&lt;/span&gt; &lt;span class="nf"&gt;afterInit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&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;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;Initialized change notifier socket gateway&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;redisSubscriber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;change-notifier&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;notifyConfigurationUpdate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&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;Next up, whenever a configuration's (secret or variable) value was changed, we would push an even to this channel:&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;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;change-notifier&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;environmentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;variable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environmentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;variable&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="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;dto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;isSecret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&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;This flow allowed us to achieve an architecture that is both scalable and ensures high availability!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>systemdesign</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
