<?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: Ran Cohen</title>
    <description>The latest articles on DEV Community by Ran Cohen (@rannn505).</description>
    <link>https://dev.to/rannn505</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F791199%2F830fe8be-7090-4f15-9014-fa17e03e02ab.jpeg</url>
      <title>DEV Community: Ran Cohen</title>
      <link>https://dev.to/rannn505</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rannn505"/>
    <language>en</language>
    <item>
      <title>Config Confessions: Horror Stories from the Trenches</title>
      <dc:creator>Ran Cohen</dc:creator>
      <pubDate>Thu, 07 Mar 2024 14:20:00 +0000</pubDate>
      <link>https://dev.to/rannn505/config-confessions-horror-stories-from-the-trenches-29ll</link>
      <guid>https://dev.to/rannn505/config-confessions-horror-stories-from-the-trenches-29ll</guid>
      <description>&lt;p&gt;In the shadowy corners of the development world, where the lines of code whisper secrets, there lie tales of terror that chill the very soul of even the most seasoned developers. These are the stories of configurations gone wrong, of nights turned into days by the glow of the monitor, and of deployments that turned into disasters. &lt;strong&gt;Welcome to "Config Confessions."&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Tale of the Vanishing Variables
&lt;/h3&gt;

&lt;p&gt;It was a dark and stormy night when Aang, a developer at a thriving startup, decided to push the latest features to production. The code was clean, the tests passed, and everything looked set for a smooth deployment. But as the new version went live, services started failing left and right. The culprit? Environment variables that mysteriously vanished into the void. In the rush to deploy, Aang had overlooked the critical step of updating the production environment variables, leading to a cascade of failures. The team spent the night battling the shadows, restoring order to their digital realm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Lesson Learned:&lt;/em&gt;&lt;/strong&gt; Always double-check your environment configurations before deployment. And maybe, just maybe, avoid deploying on a dark and stormy night.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Curse of the Hard-Coded Secrets
&lt;/h3&gt;

&lt;p&gt;Katara, a seasoned developer, had always championed best practices. Yet, under the pressure of a tight deadline, she committed the cardinal sin of hard-coding a third-party API key directly into the configuration file. "It's just temporary," she told herself. But as fate would have it, the temporary fix became permanent, forgotten until the day the application suddenly lost access to the critical third-party service. The key had been compromised, and with it, the security of their application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Lesson Learned:&lt;/em&gt;&lt;/strong&gt; Temporary solutions often have a way of becoming permanent. Always externalize your secrets and use secure vaults or environment variables.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Phantom Environment
&lt;/h3&gt;

&lt;p&gt;There was once an environment variable, set by a developer named Sokka, meant to guide an application gently through the stages of development and testing. But a misstep in configuration cursed the application, making it behave as if possessed. In production, the application veered wildly, connecting to test databases and sending debug logs into the void. It took the team days to uncover the phantom variable responsible, hidden deep within the deployment scripts, a silent specter of their oversight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Lesson Learned:&lt;/em&gt;&lt;/strong&gt; Even the smallest of spirits, like environment variables, can possess great power over the fate of your applications. Treat them with care, and always double-check their bindings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;These tales from the trenches serve as cautionary reminders of the pitfalls that await when we neglect the sacred art of configuration management. Each story, while a horror in its own right, offers a lesson to ward off future nightmares.&lt;/p&gt;

&lt;p&gt;We invite you to share your own stories of configuration challenges or successes. Your insights could be the guiding light for someone else's project. &lt;strong&gt;Drop your experiences in the comments below.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stay tuned for the next chapter in our series, where we'll unveil even more horror stories, continuing our collective lessons through the complex world of software configuration.&lt;/p&gt;

&lt;p&gt;So heed these confessions, dear reader, and may your deployments be smooth, and your configurations be ever in your favor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExbTlibnNlYzNmOXlzYmx3Y2h4ZW56ODYxd3A5bHhveXowY2xqMTgyZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/ph6ewybUlGbW8/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExbTlibnNlYzNmOXlzYmx3Y2h4ZW56ODYxd3A5bHhveXowY2xqMTgyZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/ph6ewybUlGbW8/giphy.gif" alt="horror" width="295" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>programming</category>
      <category>config</category>
      <category>configuration</category>
    </item>
    <item>
      <title>Decoding the Matrix: The Evolution of Environment Variables in Software</title>
      <dc:creator>Ran Cohen</dc:creator>
      <pubDate>Tue, 05 Mar 2024 14:20:00 +0000</pubDate>
      <link>https://dev.to/rannn505/decoding-the-matrix-the-evolution-of-environment-variables-in-software-31pm</link>
      <guid>https://dev.to/rannn505/decoding-the-matrix-the-evolution-of-environment-variables-in-software-31pm</guid>
      <description>&lt;p&gt;Dive deep into the heart of the software world's matrix, where a powerful yet often overlooked tool resides—&lt;strong&gt;environment variables&lt;/strong&gt;. These &lt;strong&gt;key-value pairs&lt;/strong&gt; do more than just configure software applications; they carry the secrets of the past, present, and future of software development. From their inception to becoming a cornerstone of modern coding practices, environment variables have shaped the way we build, deploy, and manage applications. Join us on a fascinating journey through time, exploring the origins and evolution of environment variables.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Dawn of Environment Variables
&lt;/h3&gt;

&lt;p&gt;The story begins in the early days of computing, long before the graphical user interfaces and sophisticated development environments we take for granted today. It was the era of mainframe computers and command-line interfaces, where the need for flexible, configurable software first became apparent. The concept of environment variables is believed to have originated with the &lt;strong&gt;Multics&lt;/strong&gt; operating system in the &lt;strong&gt;1960s&lt;/strong&gt;, a project that laid the groundwork for many aspects of modern computing.&lt;/p&gt;

&lt;p&gt;Multics introduced the idea of a "context" for each user session, allowing for personalized settings and configurations. This innovation paved the way for the &lt;strong&gt;UNIX&lt;/strong&gt; operating system, developed in the early &lt;strong&gt;1970s&lt;/strong&gt;, to adopt and expand the concept of environment variables. UNIX used these variables to store user preferences, system settings, and to control the behavior of shell scripts and applications, setting a standard that persists in operating systems to this day.&lt;/p&gt;

&lt;h3&gt;
  
  
  From UNIX to Ubiquity
&lt;/h3&gt;

&lt;p&gt;The adoption of environment variables in UNIX marked the beginning of their journey to becoming a ubiquitous tool in software development. As UNIX-inspired operating systems like &lt;strong&gt;Linux&lt;/strong&gt; took shape, and as the world gradually shifted from mainframe to personal computing, environment variables cemented their place in the software developer's toolkit.&lt;/p&gt;

&lt;p&gt;One of the most widely recognized environment variables, &lt;code&gt;PATH&lt;/code&gt;, illustrates the utility and enduring relevance of environment variables. &lt;code&gt;PATH&lt;/code&gt; tells the operating system where to look for the executables it needs to run commands and scripts. It's a prime example of how environment variables make software configuration dynamic and portable across different systems and setups.&lt;/p&gt;

&lt;h3&gt;
  
  
  Environment Variables Today
&lt;/h3&gt;

&lt;p&gt;Fast forward to the present, and environment variables are integral to the development, deployment, and operation of software across platforms and environments. They're instrumental in cloud computing, where services like AWS, Azure, and Google Cloud Platform rely on environment variables to manage configurations for scalable, distributed applications. Environment variables enable the secure management and &lt;strong&gt;injection&lt;/strong&gt; of sensitive information, such as database credentials (&lt;code&gt;DB_USERNAME&lt;/code&gt;, &lt;code&gt;DB_PASSWORD&lt;/code&gt;) and API keys (&lt;code&gt;API_KEY&lt;/code&gt;), into applications &lt;strong&gt;without hardcoding&lt;/strong&gt; them into source code, ensuring applications remain both agile and secure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Expanding the Toolbox: Tips and Strategies:
&lt;/h3&gt;

&lt;p&gt;Now, let's pivot to how we can apply this understanding to enhance our current work with environment variables, bridging historical insights with practical strategies for today's development challenges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security:&lt;/strong&gt;&lt;br&gt;
Leverage environment variables to store sensitive data like &lt;code&gt;DB_PASSWORD&lt;/code&gt; outside your codebase, enhancing security. Integrating with secret management tools like HashiCorp Vault or AWS Secrets Manager adds an extra layer of security, ensuring that secrets are encrypted and accessible only to authorized services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation:&lt;/strong&gt;&lt;br&gt;
Maintaining a comprehensive, up-to-date list of environment variables and their purposes aids in onboarding new developers and ensuring operational clarity. For instance, documenting the use and expected values for &lt;code&gt;DATABASE_URL&lt;/code&gt; or &lt;code&gt;REDIS_CACHE_ADDRESS&lt;/code&gt; can prevent configuration errors and streamline development processes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Portability:&lt;/strong&gt;&lt;br&gt;
Environment variables like &lt;code&gt;DATABASE_URL&lt;/code&gt; enable you to abstract environment-specific configurations from your application code, making your projects portable and adaptable across different environments. This practice allows for seamless transitions from development through to production without the need for code changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simplify Local Development:&lt;/strong&gt;&lt;br&gt;
Utilize environment variables to manage different configurations for local development, testing, and production. Tools like Docker and docker-compose can use &lt;code&gt;.env&lt;/code&gt; files to set up containers with the appropriate environment variables, making it easy to replicate settings locally or switch between different configurations without changing the application code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dynamic Configuration for Scalability:&lt;/strong&gt;&lt;br&gt;
In cloud-native architectures, environment variables can dynamically adjust application behavior based on the deployment context. For example, &lt;code&gt;MAX_WORKERS&lt;/code&gt; or &lt;code&gt;CACHE_TTL&lt;/code&gt; can be tweaked to optimize resource utilization and response times as the load varies. This dynamic configurability is essential for applications that need to scale up or down efficiently in response to real-time demand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Environment-Specific Feature Flags:&lt;/strong&gt;&lt;br&gt;
Use environment variables as feature flags to enable or disable features in different environments. This approach allows for safe testing of new features in development or staging environments before they are enabled in production. For instance, setting &lt;code&gt;FEATURE_X_ENABLED=true&lt;/code&gt; in a development environment variable can activate a new feature for testing, while the same feature remains inactive in production until ready for release.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consistency Across Services:&lt;/strong&gt;&lt;br&gt;
In microservices architectures, maintaining consistency in environment variable naming and usage across services can greatly simplify configuration management and debugging. Establishing a convention for naming environment variables (e.g., prefixing with &lt;code&gt;SERVICE_NAME_&lt;/code&gt;) ensures clarity and reduces the risk of conflicts or confusion when multiple services are configured together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fallback Strategies:&lt;/strong&gt;&lt;br&gt;
Design your applications to use fallback values for critical environment variables, ensuring that your application can function even if some configurations are missing. For example, defaulting to a standard logging level if &lt;code&gt;LOG_LEVEL&lt;/code&gt; is not set.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auditing and Rotation:&lt;/strong&gt;&lt;br&gt;
Regular audits of your environment variables help identify obsolete or unused variables, reducing clutter and potential security risks. Rotating sensitive values periodically minimizes the impact of potential exposure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your Turn:&lt;/strong&gt;&lt;br&gt;
Discovered a unique approach or handy tip with environment variables? The comments are your stage. Share your insights to inspire and contribute to our collective knowledge pool. Together, we can uncover new perspectives and elevate our practices. Join the conversation and let's grow smarter, together.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;The evolution of environment variables from a nascent concept in the Multics operating system to a fundamental part of modern software infrastructure is a testament to their versatility and enduring importance. They remind us that sometimes, the most influential tools in software development are those that quietly work behind the scenes, shaping our digital world without fanfare. By incorporating the strategies and insights shared, developers can fully leverage environment variables to build applications that are &lt;strong&gt;secure, portable, and maintainable&lt;/strong&gt;. As we look to the future, the role of environment variables is sure to evolve, but their legacy as a cornerstone of software configuration is undeniably secure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExMW9rYnd4enE0dmpmOWcxNnlyazN6Z3FjdDAxbTV6eTY2cXcxbmNwNCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/G6sJqVpD1U4jC/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExMW9rYnd4enE0dmpmOWcxNnlyazN6Z3FjdDAxbTV6eTY2cXcxbmNwNCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/G6sJqVpD1U4jC/giphy.gif" alt="matrix" width="720" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>programming</category>
      <category>learning</category>
      <category>env</category>
    </item>
    <item>
      <title>Exploring Pkl: Apple's Fresh Approach to Configuration Languages</title>
      <dc:creator>Ran Cohen</dc:creator>
      <pubDate>Thu, 29 Feb 2024 14:20:00 +0000</pubDate>
      <link>https://dev.to/rannn505/exploring-pkl-apples-fresh-approach-to-configuration-languages-1o3i</link>
      <guid>https://dev.to/rannn505/exploring-pkl-apples-fresh-approach-to-configuration-languages-1o3i</guid>
      <description>&lt;p&gt;In a digital epoch where the only constant is change, Apple introduces Pkl—pronounced "Pickle"-a new entrant in the dynamic landscape of software development. With an eye towards addressing some of the longstanding issues in configuration management, Pkl trying to bring forward concepts of programmability, scalability, and safety. But beyond the initial buzz, what does Pkl truly offer to the modern developer?&lt;/p&gt;

&lt;h3&gt;
  
  
  Pkl at a Glance
&lt;/h3&gt;

&lt;p&gt;Born from the need to transcend the limitations of static configuration files, Pkl stands as Apple’s innovative foray into programmable configuration management. It's not just another language; it's a paradigm shift towards &lt;strong&gt;configuration-as-code (CaC)&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/rannn505" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F791199%2F830fe8be-7090-4f15-9014-fa17e03e02ab.jpeg" alt="rannn505"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/rannn505/configuration-as-code-automating-application-configuration-45k6" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Configuration-as-Code: Automating Application Configuration&lt;/h2&gt;
      &lt;h3&gt;Ran Cohen ・ Jun 14 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#devops&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#configuration&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Programmability:&lt;/strong&gt; Pkl introduces conditions, loops, and functions within configuration files, transforming them from static documents into dynamic scripts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability:&lt;/strong&gt; Tailored for projects of any size, Pkl's design ensures configurations remain manageable, regardless of the project's complexity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced IDE Support:&lt;/strong&gt; With auto-complete, error highlighting, and inline documentation, Pkl is designed to make configuration management a more integrated and less error-prone part of the development process.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A Simple Pkl Example
&lt;/h3&gt;

&lt;p&gt;Let's dive into a simple yet illustrative example of Pkl in action. Imagine you're setting up the configuration for a web application. With Pkl, you can easily define your application's settings, including environment-specific variables and even incorporate logic to dynamically adjust settings based on the deployment context.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// Define a basic web application configuration&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="nx"&gt;WebAppConfig&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;hostname&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"development"&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="s2"&gt;"staging"&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="s2"&gt;"production"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="c1"&gt;// Dynamically adjust debug mode based on the environment&lt;/span&gt;
  &lt;span class="nx"&gt;debugMode&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Bool&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"development"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Application instance for development&lt;/span&gt;
&lt;span class="nx"&gt;instance&lt;/span&gt; &lt;span class="nx"&gt;devConfig&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;WebAppConfig&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;hostname&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"localhost"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;environment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"development"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This snippet demonstrates Pkl’s capability to elegantly tailor configurations to different environments, a testament to its programmable nature and practical utility.&lt;/p&gt;

&lt;h3&gt;
  
  
  Community Reception and Comparisons
&lt;/h3&gt;

&lt;p&gt;Since its unveiling, Pkl has stirred a mix of excitement and skepticism within the developer community. Platforms like &lt;a href="https://news.ycombinator.com/item?id=39232976" rel="noopener noreferrer"&gt;Hacker News&lt;/a&gt; and &lt;a href="https://www.reddit.com/r/programming/comments/1ahbzfl/introducing_pkl_a_programming_language_for/" rel="noopener noreferrer"&gt;Reddit&lt;/a&gt; have become arenas of debate, weighing Pkl’s potential against the backdrop of existing solutions. While some applaud Pkl for its innovative approach, others question the necessity of introducing yet another player into the configuration language game. This discourse highlights the diverse needs and preferences within the software development community, underscoring the importance of choice in tools and methodologies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Looking Forward
&lt;/h3&gt;

&lt;p&gt;Pkl's debut is not just about a new tool; it's a conversation starter on the future of configuration management. Its adoption and the community's feedback will shape the role it plays in how we manage and deploy software in an increasingly complex world.&lt;/p&gt;

&lt;h3&gt;
  
  
  Useful Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pkl-lang.org/" rel="noopener noreferrer"&gt;Pkl Official Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/apple/pkl" rel="noopener noreferrer"&gt;Pkl GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pkl-lang.org/main/current/examples.html" rel="noopener noreferrer"&gt;Pkl Code Examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pkl-lang.org/blog/introducing-pkl.html" rel="noopener noreferrer"&gt;Pkl Introduction Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExbnFvbzRneWp6MGxhbnJnMnNqZTdxNjh6cjN5Y24yNHZ3NnZqdHo2aiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/QVhHtKMbPZAzoKLUG2/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExbnFvbzRneWp6MGxhbnJnMnNqZTdxNjh6cjN5Y24yNHZ3NnZqdHo2aiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/QVhHtKMbPZAzoKLUG2/giphy.gif" alt="pickle rick"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>programming</category>
      <category>opensource</category>
      <category>configuration</category>
    </item>
    <item>
      <title>Configu: Unleashing the Power of Configuration-as-Code</title>
      <dc:creator>Ran Cohen</dc:creator>
      <pubDate>Wed, 28 Jun 2023 19:17:54 +0000</pubDate>
      <link>https://dev.to/rannn505/configu-unleashing-the-power-of-configuration-as-code-2b6i</link>
      <guid>https://dev.to/rannn505/configu-unleashing-the-power-of-configuration-as-code-2b6i</guid>
      <description>&lt;p&gt;Welcome back, fellow tech enthusiasts! In this thrilling sequel, we embark on a captivating exploration of &lt;a href="https://configu.com/" rel="noopener noreferrer"&gt;Configu&lt;/a&gt;—an open-source implementation of Configuration as Code (CaC) for application configuration management. Prepare yourselves for a wild ride as we uncover how Configu tackles the challenges of handling complex configurations, revolutionizes development workflows, and becomes the superhero of configuration management. So hold on tight and brace yourself for another exciting tech adventure!&lt;/p&gt;

&lt;h2&gt;
  
  
  Background: Unveiling Application Configurations
&lt;/h2&gt;

&lt;p&gt;Before we delve into the magic of Configu, let's take a moment to revisit the importance of application configurations. In the software development lifecycle, configurations—those precious bits of metadata—are extracted from code and managed separately to customize application behavior across different deployments and environments. Configurations are the secret sauce that adds flavor and adaptability to our applications. Configu recognizes their significance and sets out to streamline their management and collaboration, putting the power back in the hands of developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Motivation behind Configu: Addressing the Configuration Struggle
&lt;/h2&gt;

&lt;p&gt;As our codebase grows, so does the complexity of our configuration needs. Yet, managing configurations in today's reality can be a formidable challenge. Configuration data is scattered across various systems, files, databases, and even third-party systems, often resembling a confounding labyrinth. This fragmented approach leads to bottlenecks, manual errors, and missed opportunities for automation and collaboration. Outdated or incorrect configurations can result in bugs, downtime, and even worse—an angry horde of users storming your virtual gates! Configu rides in on a mission to simplify configuration management, ensuring stability, reliability, and empowering development teams to conquer the configuration chaos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configu Main Concepts: Unraveling the Configuration Flow
&lt;/h2&gt;

&lt;p&gt;Now, let's unravel the inner workings of Configu and shed light on its key concepts, seamlessly intertwined to optimize the configuration flow:&lt;/p&gt;

&lt;h3&gt;
  
  
  Config: The Genetic Blueprint:
&lt;/h3&gt;

&lt;p&gt;At the core of Configu lies the Config—a fundamental data model that defines the essence of your application's behavior. It's like the DNA strand that shapes and guides your software. Each Config carries a unique identifier (key), a context (set), and the actual configuration value. Think of it as your application's genetic blueprint, ready to be brought to life.&lt;/p&gt;

&lt;h3&gt;
  
  
  ConfigStore: Versatile Storage Engine:
&lt;/h3&gt;

&lt;p&gt;Configs find their home in the ConfigStore—a dynamic storage engine that adapts to different systems and services. Whether it's a database, file, secret manager, or even a custom-made solution, the ConfigStore stands tall as the fortress that guards your configurations. It offers flexibility, scalability, and enough magic to make even the most eccentric configurations feel right at home.&lt;/p&gt;

&lt;h3&gt;
  
  
  ConfigSchema: Declaring the Genetic Code:
&lt;/h3&gt;

&lt;p&gt;The ConfigSchema plays a crucial role in Configu's configuration orchestration. This special file, adorned with the .cfgu extension, declares the genetic code of your application. It establishes the bindings between Config keys and their respective Cfgu declarations, specifying characteristics, and constraints for each value. With ConfigSchema, your configurations adhere to a predefined structure, ensuring harmony and consistency in the configuration universe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.cfgu.json&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"LOG_LEVEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RegEx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pattern"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^(debug|info|warn|error)$"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"info"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Represents the severity of the log events passed to the stdout"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Configu Interfaces: Orchestrating the Configuration Symphony:
&lt;/h3&gt;

&lt;p&gt;Configu interfaces are the maestros orchestrating the symphony of configurations. Through unified APIs like the Configu SDKs and the Configu CLI, developers wield the power to effortlessly interact with configuration data. Fetch, set, transform, and inject configurations with the grace of a seasoned conductor. These interfaces bridge the gap between developers and the ConfigStore, granting them full command over their application's behavior.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fu8svlrwr6i9gpk2qrio2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8svlrwr6i9gpk2qrio2.png" alt="Configu flow"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Storing Configs: Activating the ConfigStore:
&lt;/h3&gt;

&lt;p&gt;When Configs are stored, the Configu interfaces connect to the ConfigStore and unleash its mighty set method. Configs find solace in the ConfigStore's memory, snug and secure, awaiting their call to action. This meticulous process ensures your configurations are safely stored, ready to rise when the time is right.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;configu upsert &lt;span class="nt"&gt;--store&lt;/span&gt; &lt;span class="s1"&gt;'configu'&lt;/span&gt; &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="s1"&gt;'development'&lt;/span&gt; &lt;span class="nt"&gt;--schema&lt;/span&gt; &lt;span class="s1"&gt;'./.cfgu.json'&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'LOG_LEVEL=debug'&lt;/span&gt;
configu upsert &lt;span class="nt"&gt;--store&lt;/span&gt; &lt;span class="s1"&gt;'configu'&lt;/span&gt; &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="s1"&gt;'production'&lt;/span&gt; &lt;span class="nt"&gt;--schema&lt;/span&gt; &lt;span class="s1"&gt;'./.cfgu.json'&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'LOG_LEVEL=error'&lt;/span&gt;
configu upsert &lt;span class="nt"&gt;--store&lt;/span&gt; &lt;span class="s1"&gt;'configu'&lt;/span&gt; &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="s1"&gt;'production/tenant'&lt;/span&gt; &lt;span class="nt"&gt;--schema&lt;/span&gt; &lt;span class="s1"&gt;'./.cfgu.json'&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'LOG_LEVEL=warn'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Fetching Configs: Unleashing the Configuration Magic:
&lt;/h3&gt;

&lt;p&gt;During build, deployment, or runtime, Configu interfaces spring into action, summoning configurations from the ConfigStore. By activating the get method, relevant Configs are retrieved based on context and schema, like a magical conjuration tailored to your needs. These configurations can then be transformed into powerful artifacts or injected seamlessly into your software's processes. Behold the true magic of Configu—the ability to harness the perfect configuration spells at the right time and place.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;configu &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="nt"&gt;--store&lt;/span&gt; &lt;span class="s1"&gt;'configu'&lt;/span&gt; &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="s1"&gt;'development'&lt;/span&gt; &lt;span class="nt"&gt;--schema&lt;/span&gt; &lt;span class="s1"&gt;'./.cfgu.json'&lt;/span&gt; | configu &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nt"&gt;--run&lt;/span&gt; &lt;span class="s1"&gt;'node server.js'&lt;/span&gt;
configu &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="nt"&gt;--store&lt;/span&gt; &lt;span class="s1"&gt;'configu'&lt;/span&gt; &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="s1"&gt;'production'&lt;/span&gt; &lt;span class="nt"&gt;--schema&lt;/span&gt; &lt;span class="s1"&gt;'./.cfgu.json'&lt;/span&gt; | configu &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'HelmValues'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ./values.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Bulk Fetching: Streamlining the Configuration Flow:
&lt;/h3&gt;

&lt;p&gt;To streamline the process and make configuration retrieval a breeze, Configu offers the option of bulk fetching. It's like summoning an army of configurations to fulfill your application's needs, all with a flick of a wand. No more painstakingly fetching one configuration at a time. With bulk fetching, unleash the full power of Configu and let it rain configurations upon your software.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;configu &lt;span class="nb"&gt;eval&lt;/span&gt; ... | configu &lt;span class="nb"&gt;eval&lt;/span&gt; ... | configu &lt;span class="nb"&gt;export&lt;/span&gt; ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Configu's "How": Implementing the Features and Principles of CaC
&lt;/h2&gt;

&lt;p&gt;Now that we've untangled the configuration flow, let's witness how Configu embraces the core features and principles of Configuration as Code:&lt;/p&gt;
&lt;h3&gt;
  
  
  Consistency and Reproducibility:
&lt;/h3&gt;

&lt;p&gt;Configu ensures consistency and reproducibility by treating configurations as code. Configs, residing in the ConfigStore, retain their context and value, guaranteeing consistent behavior across different environments. Say goodbye to unpredictable configurations and hello to harmony and stability!&lt;/p&gt;
&lt;h3&gt;
  
  
  Versioning and Tracking:
&lt;/h3&gt;

&lt;p&gt;With Configu, bid farewell to configuration confusion. By including the ConfigSchema in your version control system alongside your code, changes to configurations are recorded and tracked. This historical record empowers you to roll back to previous versions with ease. It's like having a time machine for your configurations, traveling back to any desired state of your application.&lt;/p&gt;
&lt;h3&gt;
  
  
  Automation and Efficiency:
&lt;/h3&gt;

&lt;p&gt;Configu embraces automation and efficiency with open arms. Configu interfaces allow developers to automate configuration processes. Whether you're using the Configu CLI during build and deployment or the Configu SDK at runtime, fetching, transforming, and injecting configurations becomes a breeze. Say goodbye to manual effort and hello to automated brilliance. Let Configu handle the heavy lifting while you sit back and enjoy the show!&lt;/p&gt;
&lt;h3&gt;
  
  
  Scalability and Agility:
&lt;/h3&gt;

&lt;p&gt;Configu's flexible architecture and hierarchical ConfigSets empower you to scale and adapt effortlessly. No limits, no boundaries—organize your .cfgu files to suit your needs and workflow. Spread them across different codebases, subfolders, or even repositories. Fine-tune configurations for various contexts, environments, and customer needs. Configu bends and flexes like a nimble gymnast, adapting to your software's demands effortlessly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Collaboration and Teamwork:
&lt;/h3&gt;

&lt;p&gt;Configu fosters collaboration among developers, DevOps, and stakeholders. Through unified Configu APIs and ConfigSchema, everyone gains a shared understanding of configurations. Effective communication and teamwork become second nature. Configu becomes the conductor that brings harmony to your team's configuration symphony. Let the collaborative magic unfold!&lt;/p&gt;
&lt;h3&gt;
  
  
  Auditability and Security:
&lt;/h3&gt;

&lt;p&gt;Configu ensures auditability and security, standing guard over your configurations. Versioned records of configuration changes provide accountability and a sense of security. ConfigSchema acts as a vigilant guardian, enforcing compliance and maintaining the integrity of your configurations. Sleep well at night, knowing Configu has your back.&lt;/p&gt;
&lt;h3&gt;
  
  
  Simplifies Configuration Management:
&lt;/h3&gt;

&lt;p&gt;Configu simplifies configuration management by centralizing configurations in the ConfigStore. Modify, organize, and track configurations with ease, reducing complexity and improving maintainability. Configu is the organizational wizard that tames the wild configuration chaos, restoring order to the realm.&lt;/p&gt;
&lt;h3&gt;
  
  
  Eliminates Manual Errors:
&lt;/h3&gt;

&lt;p&gt;With Configu treating configurations as code, the risk of manual errors diminishes. Configuration values are specified and managed consistently, drastically reducing the chances of misconfigurations and boosting reliability. Say goodbye to those pesky manual errors and greet a world of stable configurations.&lt;/p&gt;
&lt;h3&gt;
  
  
  Enhances Efficiency and Productivity:
&lt;/h3&gt;

&lt;p&gt;Configu's automation capabilities unlock a new level of efficiency and productivity. By streamlining configuration processes, Configu frees up developers' time to focus on their true superpower—coding! Configu becomes your trusted sidekick on the path to success, empowering you to achieve more in less time.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/configu" rel="noopener noreferrer"&gt;
        configu
      &lt;/a&gt; / &lt;a href="https://github.com/configu/configu" rel="noopener noreferrer"&gt;
        configu
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Open-source ConfigOps infrastructure ⚙️
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/configu/configu/refs/heads/main/docs/images/banner/hacktoberfest-24-banner.svg"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fconfigu%2Fconfigu%2Frefs%2Fheads%2Fmain%2Fdocs%2Fimages%2Fbanner%2Fhacktoberfest-24-banner.svg" alt="Hacktoberfest 24 Banner"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;
  &lt;a href="https://configu.com" rel="nofollow noopener noreferrer"&gt;
    
      
      &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fconfigu%2Fconfigu%2Fmain%2Fdocs%2Fimages%2Flogo%2Fblack.svg" class="article-body-image-wrapper"&gt;&lt;img alt="Configu Logo" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fconfigu%2Fconfigu%2Fmain%2Fdocs%2Fimages%2Flogo%2Fblack.svg" width="280"&gt;&lt;/a&gt;
    
  &lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  &lt;a href="https://makeapullrequest.com" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/d88d8d77fa79e828eea397f75a1ebd114d13488aeec4747477ffbd2274de95ed/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d77656c636f6d652d627269676874677265656e2e737667" alt="PRs Welcome"&gt;
  &lt;/a&gt;
  &lt;a href="https://github.com/configu/configu/blob/main/LICENSE" rel="noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/5ce2e21e84680df1ab24807babebc3417d27d66e0826a350eb04ab57f4c8f3e5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4170616368655f322e302d626c75652e737667" alt="License"&gt;
  &lt;/a&gt;
  &lt;a href="https://discord.com/invite/cjSBxnB9z8" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/b1ab90c2a59ad771fdd0c29bdcfda4fa2eeae21eddeb5827e53397b24173d037/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3931393635393734363030333431303934343f6c6f676f3d646973636f7264266c6f676f436f6c6f723d7768697465266c6162656c3d4368617426636f6c6f723d373238396461" alt="Chat Discord"&gt;
  &lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  &lt;strong&gt;Open-source ConfigOps infrastructure&lt;/strong&gt; that empowers engineering teams to seamlessly manage and collaborate on &lt;strong&gt;software configuration data&lt;/strong&gt;—such as environment variables, secrets, and feature flags—&lt;strong&gt;across any system or environment.&lt;/strong&gt; ⚙️✨
&lt;/p&gt;
&lt;p&gt;
  &lt;a href="https://docs.configu.com/guides/hello-world" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Get Started 👋&lt;/strong&gt;&lt;/a&gt; ・ &lt;a href="https://docs.configu.com/" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Explore Docs 📚&lt;/strong&gt;&lt;/a&gt; ・ &lt;a href="https://discord.com/invite/cjSBxnB9z8" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Join Chat 💬&lt;/strong&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;⭐️ Configu?&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://configu.com" rel="nofollow noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fconfigu%2Fconfigu%2Fmain%2Fdocs%2Fimages%2Ficon%2Ficon.svg" width="128" alt="Configu Icon"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configu&lt;/strong&gt;&lt;sup&gt;&lt;a href="https://github.com/configu/configu#user-content-fn-origin-8e18c814d99631849cd5ca0bab40a0b1" id="user-content-fnref-origin-8e18c814d99631849cd5ca0bab40a0b1" rel="noopener noreferrer"&gt;1&lt;/a&gt;&lt;/sup&gt; is a &lt;em&gt;simple&lt;/em&gt;&lt;sup&gt;&lt;a href="https://github.com/configu/configu#user-content-fn-simple-8e18c814d99631849cd5ca0bab40a0b1" id="user-content-fnref-simple-8e18c814d99631849cd5ca0bab40a0b1" rel="noopener noreferrer"&gt;2&lt;/a&gt;&lt;/sup&gt;, &lt;em&gt;modern&lt;/em&gt;&lt;sup&gt;&lt;a href="https://github.com/configu/configu#user-content-fn-modern-8e18c814d99631849cd5ca0bab40a0b1" id="user-content-fnref-modern-8e18c814d99631849cd5ca0bab40a0b1" rel="noopener noreferrer"&gt;3&lt;/a&gt;&lt;/sup&gt;, and &lt;em&gt;secure&lt;/em&gt;&lt;sup&gt;&lt;a href="https://github.com/configu/configu#user-content-fn-secure-8e18c814d99631849cd5ca0bab40a0b1" id="user-content-fnref-secure-8e18c814d99631849cd5ca0bab40a0b1" rel="noopener noreferrer"&gt;4&lt;/a&gt;&lt;/sup&gt; standard for managing and collaborating on &lt;strong&gt;software configuration data&lt;/strong&gt;. It is built to provide a &lt;em&gt;common&lt;/em&gt;&lt;sup&gt;&lt;a href="https://github.com/configu/configu#user-content-fn-common-8e18c814d99631849cd5ca0bab40a0b1" id="user-content-fnref-common-8e18c814d99631849cd5ca0bab40a0b1" rel="noopener noreferrer"&gt;5&lt;/a&gt;&lt;/sup&gt;, &lt;em&gt;flexible&lt;/em&gt;&lt;sup&gt;&lt;a href="https://github.com/configu/configu#user-content-fn-flexible-8e18c814d99631849cd5ca0bab40a0b1" id="user-content-fnref-flexible-8e18c814d99631849cd5ca0bab40a0b1" rel="noopener noreferrer"&gt;6&lt;/a&gt;&lt;/sup&gt;, and &lt;em&gt;extensible&lt;/em&gt;&lt;sup&gt;&lt;a href="https://github.com/configu/configu#user-content-fn-extensible-8e18c814d99631849cd5ca0bab40a0b1" id="user-content-fnref-extensible-8e18c814d99631849cd5ca0bab40a0b1" rel="noopener noreferrer"&gt;7&lt;/a&gt;&lt;/sup&gt; process for storing, mutating, and orchestrating configuration data across any system or environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configu&lt;/strong&gt; is designed to be &lt;strong&gt;easy to integrate&lt;/strong&gt; into existing systems and workflows, and to be adaptable to the diverse needs of teams and projects. It can be used from the command line, integrated in a build pipeline, or embedded in a program. Configu &lt;strong&gt;scales&lt;/strong&gt; from small to large, simple to complex, ad-hoc to repetitive configuration…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/configu/configu" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  Conclusion: Configu's Mission to Simplify Configuration Management
&lt;/h2&gt;

&lt;p&gt;As we bid farewell to this enthralling sequel of our Configu adventure, we hope you've witnessed the true power of Configuration as Code through Configu's lens. Configu, with its unwavering focus on configuration consistency, automation, collaboration, and security, emerges as the game-changer in the realm of configuration management. Our mission at Configu is crystal clear—to revolutionize the way software configurations are managed and collaborated upon. By empowering developers to focus on coding rather than configuration struggles, Configu paves the way for a future where configurations are effortless, reliable, and secure.&lt;/p&gt;

&lt;p&gt;Thank you for joining us on this enlightening tech adventure. Stay tuned for more exciting journeys with &lt;a href="https://configu.com/" rel="noopener noreferrer"&gt;Configu&lt;/a&gt;, and until next time, happy coding!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/SYHz66JfYHbBtZXjHy/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/SYHz66JfYHbBtZXjHy/giphy.gif" alt="tech adventure"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>programming</category>
      <category>opensource</category>
      <category>configuration</category>
    </item>
    <item>
      <title>Configuration-as-Code: Automating Application Configuration</title>
      <dc:creator>Ran Cohen</dc:creator>
      <pubDate>Wed, 14 Jun 2023 14:42:40 +0000</pubDate>
      <link>https://dev.to/rannn505/configuration-as-code-automating-application-configuration-45k6</link>
      <guid>https://dev.to/rannn505/configuration-as-code-automating-application-configuration-45k6</guid>
      <description>&lt;p&gt;Welcome to the world of Configuration-as-Code (CaC), where automation reigns supreme, and even the most tedious tasks can be transformed into a coding extravaganza. In this post, we'll dive into the fascinating realm of "as-code" buzzwords, take a brief journey through the evolution of automation, and explore how CaC revolutionizes application configuration. So buckle up and get ready for a tech adventure!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Birth of "As-Code" Buzzwords
&lt;/h2&gt;

&lt;p&gt;Picture this: developers and IT operations/sysadmins joining forces, uniting their powers to conquer the land of automation. It all started with the DevOps movement and the emergence of &lt;a href="https://en.wikipedia.org/wiki/Infrastructure_as_code" rel="noopener noreferrer"&gt;"infrastructure-as-code"&lt;/a&gt;. Devs and sysadmins realized that reusable code and version control could automate environment modifications. While developers had already been automating their software delivery processes, sysadmins were catching up. It was like a race to the automation finish line, where developers cheered on the sysadmins to join the party and make everyone's lives easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everything-as-Code: Mapping the Automation Frontier
&lt;/h2&gt;

&lt;p&gt;Now let's take a moment to marvel at the wonders of automation in the software development lifecycle (SDLC). From development to production, there's a parade of "*-as-code" automation marching through the stages. It's like a grand carnival, where automation floats dazzle the onlookers with their charm and efficiency. But amidst this spectacle, we wonder: are there areas left unexplored? Are there opportunities for novel automation? Let's unravel the secrets and find out where "everything-as-code" resides.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For further exploration, I highly recommend diving into a fascinating &lt;a href="https://www.jedi.be/blog/2022/02/23/trends-and-inventory-of-50-as-code-concepts/" rel="noopener noreferrer"&gt;blog post by Patrick Debois&lt;/a&gt;, the visionary who coined the term "DevOps." In his blog, he delves into an in-depth analysis of trends across over 50 different "as code" concepts. Prepare to expand your knowledge and uncover valuable insights that will fuel your automation journey.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Unveiling Application Configuration
&lt;/h2&gt;

&lt;p&gt;Ah, application configuration! It's the chameleon of software deployment, adapting to various environments like a master of disguise. An app's configuration encompasses everything that varies between deployments: resource handles, credentials to external services, and per-deploy values. It's a crucial part of the software puzzle, ensuring the application behaves consistently across different settings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fyhy29ul51bqxk5bbc4xg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhy29ul51bqxk5bbc4xg.jpg" alt="CaC"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter Configuration-as-Code (CaC)
&lt;/h2&gt;

&lt;p&gt;Ladies and gentlemen, meet the concept of Configuration-as-Code (CaC), the star of our adventure! Building upon the success of Infrastructure-as-Code (IaC), CaC takes the stage, treating application configuration as code. But what does CaC bring to the table, you ask? Well, hold on tight, because we're about to embark on a whirlwind tour of its captivating features:&lt;/p&gt;

&lt;h3&gt;
  
  
  Consistency and Reproducibility:
&lt;/h3&gt;

&lt;p&gt;With CaC, application configurations are declared and managed using code, ensuring consistency and reproducibility across different environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Versioning and Tracking:
&lt;/h3&gt;

&lt;p&gt;CaC allows us to track changes made to application configurations over time. Just like in IaC, it can version, track, and even perform rollbacks if needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automation and Efficiency:
&lt;/h3&gt;

&lt;p&gt;Say goodbye to manual configuration headaches! CaC automates the process by replacing manual steps with code-based configurations. Faster and more efficient deployments are within reach!&lt;/p&gt;

&lt;h3&gt;
  
  
  Scalability and Agility:
&lt;/h3&gt;

&lt;p&gt;Like a master acrobat, CaC gracefully handles changing requirements. It offers the flexibility to adjust and scale configurations, ensuring the application keeps up with the ever-evolving demands of the audience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Collaboration and Teamwork:
&lt;/h3&gt;

&lt;p&gt;CaC fosters a harmonious symphony of collaboration among developers, operations teams, and stakeholders. With the power of code, they can work together, share knowledge, and align their efforts to create a breathtaking software masterpiece.&lt;/p&gt;

&lt;h3&gt;
  
  
  Auditability and Security:
&lt;/h3&gt;

&lt;p&gt;Just like IaC, CaC keeps security buffs satisfied. Changes made to configuration code can be reviewed, audited, and enforced. Compliance and security practices can rest easy knowing that the configurations are in good hands.&lt;/p&gt;

&lt;h3&gt;
  
  
  Simplifies Configuration Management:
&lt;/h3&gt;

&lt;p&gt;CaC brings order to the configuration chaos by treating configurations as code. It provides a structured approach, making it easier to understand, modify, and evolve configurations over time. Goodbye, tangled mess of manual configurations!&lt;/p&gt;

&lt;h3&gt;
  
  
  Eliminates Manual Errors:
&lt;/h3&gt;

&lt;p&gt;CaC is the superhero that swoops in to rescue us from the clutches of human error. Code-based configurations reduce manual mistakes, resulting in more reliable and consistent application setups.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enhances Efficiency and Productivity:
&lt;/h3&gt;

&lt;p&gt;With CaC in your toolkit, efficiency and productivity reach new heights. It automates configuration processes, reduces manual efforts, and frees up valuable time for teams to focus on delivering top-notch applications and achieving business goals.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing Configu: an OSS Implementation of CaC for Application Configuration
&lt;/h2&gt;

&lt;p&gt;Based on the incredible benefits of CaC, there's an open-source project that makes the implementation even smoother. Allow us to introduce &lt;a href="https://configu.com/" rel="noopener noreferrer"&gt;Configu&lt;/a&gt;! Configu is a simple, modern, and generic standard for managing and collaborating software configurations. It is built to provide a common, flexible, and extensible process for storing, mutating, and orchestrating configuration data across different environments and systems. With Configu, you can leverage the power of CaC and ensure streamlined and efficient configuration management for your applications. You can see how our team implemented it in this &lt;a href="https://github.com/configu/configu" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/configu" rel="noopener noreferrer"&gt;
        configu
      &lt;/a&gt; / &lt;a href="https://github.com/configu/configu" rel="noopener noreferrer"&gt;
        configu
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Open-source ConfigOps infrastructure ⚙️
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/configu/configu/refs/heads/main/docs/images/banner/hacktoberfest-24-banner.svg"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fconfigu%2Fconfigu%2Frefs%2Fheads%2Fmain%2Fdocs%2Fimages%2Fbanner%2Fhacktoberfest-24-banner.svg" alt="Hacktoberfest 24 Banner"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;
  &lt;a href="https://configu.com" rel="nofollow noopener noreferrer"&gt;
    
      
      &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fconfigu%2Fconfigu%2Fmain%2Fdocs%2Fimages%2Flogo%2Fblack.svg" class="article-body-image-wrapper"&gt;&lt;img alt="Configu Logo" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fconfigu%2Fconfigu%2Fmain%2Fdocs%2Fimages%2Flogo%2Fblack.svg" width="280"&gt;&lt;/a&gt;
    
  &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://makeapullrequest.com" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/d88d8d77fa79e828eea397f75a1ebd114d13488aeec4747477ffbd2274de95ed/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d77656c636f6d652d627269676874677265656e2e737667" alt="PRs Welcome"&gt;
  &lt;/a&gt;
  &lt;a href="https://github.com/configu/configu/blob/main/LICENSE" rel="noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/5ce2e21e84680df1ab24807babebc3417d27d66e0826a350eb04ab57f4c8f3e5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4170616368655f322e302d626c75652e737667" alt="License"&gt;
  &lt;/a&gt;
  &lt;a href="https://discord.com/invite/cjSBxnB9z8" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/b1ab90c2a59ad771fdd0c29bdcfda4fa2eeae21eddeb5827e53397b24173d037/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3931393635393734363030333431303934343f6c6f676f3d646973636f7264266c6f676f436f6c6f723d7768697465266c6162656c3d4368617426636f6c6f723d373238396461" alt="Chat Discord"&gt;
  &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;strong&gt;Open-source ConfigOps infrastructure&lt;/strong&gt; that empowers engineering teams to seamlessly manage and collaborate on &lt;strong&gt;software configuration data&lt;/strong&gt;—such as environment variables, secrets, and feature flags—&lt;strong&gt;across any system or environment.&lt;/strong&gt; ⚙️✨
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://docs.configu.com/guides/hello-world" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Get Started 👋&lt;/strong&gt;&lt;/a&gt; ・ &lt;a href="https://docs.configu.com/" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Explore Docs 📚&lt;/strong&gt;&lt;/a&gt; ・ &lt;a href="https://discord.com/invite/cjSBxnB9z8" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Join Chat 💬&lt;/strong&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;⭐️ Configu?&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://configu.com" rel="nofollow noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fconfigu%2Fconfigu%2Fmain%2Fdocs%2Fimages%2Ficon%2Ficon.svg" width="128" alt="Configu Icon"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configu&lt;/strong&gt;&lt;sup&gt;&lt;a href="https://github.com/configu/configu#user-content-fn-origin-8e18c814d99631849cd5ca0bab40a0b1" id="user-content-fnref-origin-8e18c814d99631849cd5ca0bab40a0b1" rel="noopener noreferrer"&gt;1&lt;/a&gt;&lt;/sup&gt; is a &lt;em&gt;simple&lt;/em&gt;&lt;sup&gt;&lt;a href="https://github.com/configu/configu#user-content-fn-simple-8e18c814d99631849cd5ca0bab40a0b1" id="user-content-fnref-simple-8e18c814d99631849cd5ca0bab40a0b1" rel="noopener noreferrer"&gt;2&lt;/a&gt;&lt;/sup&gt;, &lt;em&gt;modern&lt;/em&gt;&lt;sup&gt;&lt;a href="https://github.com/configu/configu#user-content-fn-modern-8e18c814d99631849cd5ca0bab40a0b1" id="user-content-fnref-modern-8e18c814d99631849cd5ca0bab40a0b1" rel="noopener noreferrer"&gt;3&lt;/a&gt;&lt;/sup&gt;, and &lt;em&gt;secure&lt;/em&gt;&lt;sup&gt;&lt;a href="https://github.com/configu/configu#user-content-fn-secure-8e18c814d99631849cd5ca0bab40a0b1" id="user-content-fnref-secure-8e18c814d99631849cd5ca0bab40a0b1" rel="noopener noreferrer"&gt;4&lt;/a&gt;&lt;/sup&gt; standard for managing and collaborating on &lt;strong&gt;software configuration data&lt;/strong&gt;. It is built to provide a &lt;em&gt;common&lt;/em&gt;&lt;sup&gt;&lt;a href="https://github.com/configu/configu#user-content-fn-common-8e18c814d99631849cd5ca0bab40a0b1" id="user-content-fnref-common-8e18c814d99631849cd5ca0bab40a0b1" rel="noopener noreferrer"&gt;5&lt;/a&gt;&lt;/sup&gt;, &lt;em&gt;flexible&lt;/em&gt;&lt;sup&gt;&lt;a href="https://github.com/configu/configu#user-content-fn-flexible-8e18c814d99631849cd5ca0bab40a0b1" id="user-content-fnref-flexible-8e18c814d99631849cd5ca0bab40a0b1" rel="noopener noreferrer"&gt;6&lt;/a&gt;&lt;/sup&gt;, and &lt;em&gt;extensible&lt;/em&gt;&lt;sup&gt;&lt;a href="https://github.com/configu/configu#user-content-fn-extensible-8e18c814d99631849cd5ca0bab40a0b1" id="user-content-fnref-extensible-8e18c814d99631849cd5ca0bab40a0b1" rel="noopener noreferrer"&gt;7&lt;/a&gt;&lt;/sup&gt; process for storing, mutating, and orchestrating configuration data across any system or environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configu&lt;/strong&gt; is designed to be &lt;strong&gt;easy to integrate&lt;/strong&gt; into existing systems and workflows, and to be adaptable to the diverse needs of teams and projects. It can be used from the command line, integrated in a build pipeline, or embedded in a program. Configu &lt;strong&gt;scales&lt;/strong&gt; from small to large, simple to complex, ad-hoc to repetitive configuration…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/configu/configu" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;And there you have it, folks! Configuration-as-Code (CaC) takes the stage, uniting the powers of automation and code to revolutionize application configuration. It brings consistency, scalability, collaboration, and security to the world of configurations. Say goodbye to manual headaches, configuration chaos, and tedious setups. Embrace CaC, along with the &lt;a href="https://github.com/configu/configu" rel="noopener noreferrer"&gt;Configu Orchestrator&lt;/a&gt;, and join the grand symphony of automation in the software development journey.&lt;/p&gt;

&lt;p&gt;So let the code be with you, and may your configurations always be harmonious and error-free!&lt;/p&gt;

&lt;p&gt;Thank you for joining us on this tech adventure. Until next time, happy coding!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/6ib6KPmkeAjDTxMxij/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/6ib6KPmkeAjDTxMxij/giphy.gif" alt="tech adventure"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>programming</category>
      <category>opensource</category>
      <category>configuration</category>
    </item>
    <item>
      <title>MongoDB composed</title>
      <dc:creator>Ran Cohen</dc:creator>
      <pubDate>Tue, 13 Jun 2023 00:53:11 +0000</pubDate>
      <link>https://dev.to/rannn505/mongodb-composed-156g</link>
      <guid>https://dev.to/rannn505/mongodb-composed-156g</guid>
      <description>&lt;h3&gt;
  
  
  Introduction:
&lt;/h3&gt;

&lt;p&gt;This post provides a ready-to-use &lt;code&gt;Docker Compose&lt;/code&gt; based configuration that allows you to effortlessly set up a &lt;code&gt;MongoDB single node replica set&lt;/code&gt; with a reliable &lt;code&gt;healthcheck&lt;/code&gt; and a &lt;code&gt;Web GUI&lt;/code&gt; of mongo-express.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/compose/" rel="noopener noreferrer"&gt;Basic knowledge of Docker Compose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/compose/install/" rel="noopener noreferrer"&gt;Install Docker Compose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/" rel="noopener noreferrer"&gt;Basic knowledge of MongoDB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Configuration
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;docker-compose.yml&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.9'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mongo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongo&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongo:${MONGO_VERSION}&lt;/span&gt; &lt;span class="c1"&gt;# https://hub.docker.com/_/mongo&lt;/span&gt;
    &lt;span class="na"&gt;entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;bash&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;-c&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;if [ ! -f ${MONGO_REPLICA_SET_KEY_FILE} ]; then&lt;/span&gt;
          &lt;span class="s"&gt;echo "generating replica set key file ..."&lt;/span&gt;
          &lt;span class="s"&gt;openssl rand -base64 756 &amp;gt; ${MONGO_REPLICA_SET_KEY_FILE}&lt;/span&gt;
          &lt;span class="s"&gt;chmod 600 ${MONGO_REPLICA_SET_KEY_FILE}&lt;/span&gt;
          &lt;span class="s"&gt;chown 999:999 ${MONGO_REPLICA_SET_KEY_FILE}&lt;/span&gt;
        &lt;span class="s"&gt;fi&lt;/span&gt;
        &lt;span class="s"&gt;exec docker-entrypoint.sh $$@&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--bind_ip_all&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--replSet&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;${MONGO_REPLICA_SET_NAME}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--keyFile&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;${MONGO_REPLICA_SET_KEY_FILE}"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MONGO_INITDB_ROOT_USERNAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MONGO_USERNAME}&lt;/span&gt;
      &lt;span class="na"&gt;MONGO_INITDB_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MONGO_PASSWORD}&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;27017:27017&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test $$(echo "rs.initiate().ok || rs.status().ok" | mongo -u $${MONGO_INITDB_ROOT_USERNAME} -p $${MONGO_INITDB_ROOT_PASSWORD} --quiet) -eq &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
      &lt;span class="na"&gt;start_period&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30s&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;

  &lt;span class="na"&gt;mongo-gui&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongo-gui&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongo-express:${MONGO_GUI_VERSION}&lt;/span&gt; &lt;span class="c1"&gt;# https://hub.docker.com/_/mongo-express&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;ME_CONFIG_MONGODB_ADMINUSERNAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MONGO_USERNAME}&lt;/span&gt;
      &lt;span class="na"&gt;ME_CONFIG_MONGODB_ADMINPASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MONGO_PASSWORD}&lt;/span&gt;
      &lt;span class="na"&gt;ME_CONFIG_MONGODB_SERVER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongo&lt;/span&gt;
      &lt;span class="na"&gt;ME_CONFIG_MONGODB_ENABLE_ADMIN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;8081:8081&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;mongo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_healthy&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;code&gt;.env&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;MONGO_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5.0.18 &lt;span class="c"&gt;# pick your version from https://hub.docker.com/_/mongo/tags&lt;/span&gt;
&lt;span class="nv"&gt;MONGO_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;root
&lt;span class="nv"&gt;MONGO_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;root
&lt;span class="nv"&gt;MONGO_REPLICA_SET_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rs0
&lt;span class="nv"&gt;MONGO_REPLICA_SET_KEY_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/opt/rs.key
&lt;span class="nv"&gt;MONGO_GUI_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.54.0 &lt;span class="c"&gt;# change to "latest" after a stable release, currently on 1.0.0-alpha.X&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  connection string
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# directConnection=true is a must for the local topology - see https://www.mongodb.com/docs/drivers/node/current/fundamentals/connection/connect/#direct-connection, https://jira.mongodb.org/browse/NODE-2966&lt;/span&gt;
&lt;span class="nv"&gt;MONGODB_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mongodb://root:root@localhost:27017?replicaSet&lt;span class="o"&gt;=&lt;/span&gt;rs0&amp;amp;directConnection&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  commands
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# start&lt;/span&gt;
docker compose &lt;span class="nt"&gt;--project-name&lt;/span&gt; composed-mongodb up &lt;span class="nt"&gt;--detach&lt;/span&gt;

&lt;span class="c"&gt;# stop&lt;/span&gt;
docker compose &lt;span class="nt"&gt;--project-name&lt;/span&gt; composed-mongodb stop

&lt;span class="c"&gt;# clean&lt;/span&gt;
docker compose &lt;span class="nt"&gt;--project-name&lt;/span&gt; composed-mongodb down &lt;span class="nt"&gt;--volumes&lt;/span&gt; &lt;span class="nt"&gt;--remove-orphans&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  verify
&lt;/h3&gt;

&lt;p&gt;Open the browser and navigate to &lt;a href="http://localhost:8081/" rel="noopener noreferrer"&gt;http://localhost:8081/&lt;/a&gt;, you should see the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fes980wnyfoc1jkvdnovt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fes980wnyfoc1jkvdnovt.jpg" alt="Mongo Express"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.fatalerrors.org/a/docker-compose-builds-mongodb-replica-set-records.html" rel="noopener noreferrer"&gt;https://www.fatalerrors.org/a/docker-compose-builds-mongodb-replica-set-records.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/61486024/mongo-container-with-a-replica-set-with-only-one-node-in-docker-compose" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/61486024/mongo-container-with-a-replica-set-with-only-one-node-in-docker-compose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zgadzaj.com/development/docker/docker-compose/turning-standalone-mongodb-server-into-a-replica-set-with-docker-compose" rel="noopener noreferrer"&gt;https://zgadzaj.com/development/docker/docker-compose/turning-standalone-mongodb-server-into-a-replica-set-with-docker-compose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.tericcabrel.com/mongodb-replica-set-docker-compose/" rel="noopener noreferrer"&gt;https://blog.tericcabrel.com/mongodb-replica-set-docker-compose/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flowygo.com/en/blog/mongodb-and-docker-how-to-create-and-configure-a-replica-set/" rel="noopener noreferrer"&gt;https://flowygo.com/en/blog/mongodb-and-docker-how-to-create-and-configure-a-replica-set/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/docker-library/mongo/issues/501" rel="noopener noreferrer"&gt;https://github.com/docker-library/mongo/issues/501&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/crapthings/71fb6156a8e9b31a2fa7946ebd7c4edc" rel="noopener noreferrer"&gt;https://gist.github.com/crapthings/71fb6156a8e9b31a2fa7946ebd7c4edc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/docker-library/mongo/issues/475" rel="noopener noreferrer"&gt;https://github.com/docker-library/mongo/issues/475&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>mongodb</category>
    </item>
    <item>
      <title>macOS awesome terminal</title>
      <dc:creator>Ran Cohen</dc:creator>
      <pubDate>Fri, 28 Jan 2022 16:20:14 +0000</pubDate>
      <link>https://dev.to/rannn505/macos-awesome-terminal-519n</link>
      <guid>https://dev.to/rannn505/macos-awesome-terminal-519n</guid>
      <description>&lt;p&gt;Hello &lt;strong&gt;developers&lt;/strong&gt; 🧑‍💻, &lt;strong&gt;thanks&lt;/strong&gt; for reading my post 🙏.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A shell&lt;/strong&gt; is a user interface for &lt;strong&gt;access to an operating system’s services&lt;/strong&gt;. Most often the user interacts with the shell using a command-line interface (CLI). The &lt;strong&gt;terminal&lt;/strong&gt; 💻 is a program that opens a graphical window and lets you &lt;strong&gt;interact with the shell&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As developers, one of the &lt;strong&gt;programs we use most&lt;/strong&gt; is our terminal, and as such it should allow us to &lt;strong&gt;be as productive and fast as possible&lt;/strong&gt; 🚀 as well as to show off its features and pretty look 😎.&lt;/p&gt;

&lt;p&gt;So let's embark on a journey 🧭 to make our &lt;strong&gt;terminal in macOS no less awesome&lt;/strong&gt; 🙌.&lt;/p&gt;




&lt;h3&gt;
  
  
  iTerm2
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fk72iwffq3nzw3phlp6ay.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk72iwffq3nzw3phlp6ay.png" alt="iTerm2 logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Initially, we will &lt;strong&gt;replace&lt;/strong&gt; the &lt;strong&gt;preinstalled terminal&lt;/strong&gt; for &lt;a href="https://iterm2.com/index.html" rel="noopener noreferrer"&gt;&lt;strong&gt;iTerm2&lt;/strong&gt;&lt;/a&gt;, which has &lt;a href="https://iterm2.com/features.html" rel="noopener noreferrer"&gt;tons of very useful features&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;a href="https://www.iterm2.com/downloads.html" rel="noopener noreferrer"&gt;iTerm2 download page&lt;/a&gt; and downloaded the stable release.&lt;/li&gt;
&lt;li&gt;After the download is complete, drag the file to the Applications folder.&lt;/li&gt;
&lt;li&gt;Bonus: Place iTerm2 in a convenient place in the dock (replace the original terminal if you already have it there).&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;iTerm2 &lt;strong&gt;has a standalone update mechanism&lt;/strong&gt; so I prefer to &lt;strong&gt;install it manually&lt;/strong&gt; rather than through a brew cask.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Oh My Zsh
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fv3q5qbh319pp5smupvgi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3q5qbh319pp5smupvgi.png" alt="Oh My Zsh logo"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Next, let's &lt;strong&gt;unleash our terminal&lt;/strong&gt; by &lt;a href="https://github.com/ohmyzsh/ohmyzsh/wiki" rel="noopener noreferrer"&gt;installing &lt;strong&gt;Oh My Zsh&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://ohmyz.sh/" rel="noopener noreferrer"&gt;Oh My Zsh&lt;/a&gt; is an open source, community-driven framework for managing your Zsh configuration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Oh My Zsh &lt;strong&gt;comes bundled&lt;/strong&gt; with &lt;a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins" rel="noopener noreferrer"&gt;&lt;strong&gt;plugins&lt;/strong&gt;&lt;/a&gt; that'll make your life as a developer easier and leave you &lt;strong&gt;feeling like a superhero&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To enable a plugin add its name to the plugins array in your &lt;code&gt;.zshrc&lt;/code&gt; file (found in the &lt;code&gt;$HOME&lt;/code&gt; directory).&lt;br&gt;
Here are some that &lt;strong&gt;I highly recommend&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;alias-finder brew common-aliases copypath copyfile docker encode64 git &lt;span class="nb"&gt;history &lt;/span&gt;jsontools macos web-search z&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;blockquote&gt;
&lt;p&gt;When &lt;strong&gt;installing&lt;/strong&gt; Zsh's theme and plugins, opt for &lt;a href="https://github.com/romkatv/powerlevel10k#oh-my-zsh" rel="noopener noreferrer"&gt;&lt;strong&gt;oh-my-zsh installation&lt;/strong&gt;&lt;/a&gt; (... which is actually a &lt;code&gt;git clone&lt;/code&gt; of the plugin's repo into the &lt;code&gt;$ZSH_CUSTOM&lt;/code&gt; folder and a setting change in &lt;code&gt;.zshrc&lt;/code&gt;). It will play best with the other settings in &lt;code&gt;.zshrc&lt;/code&gt;, and the &lt;strong&gt;autoupdate plugin&lt;/strong&gt; will keep them &lt;strong&gt;up-to-date&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Zsh Theme &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;My choice of theme&lt;/strong&gt; for Zsh is &lt;a href="https://github.com/romkatv/powerlevel10k" rel="noopener noreferrer"&gt;&lt;strong&gt;Powerlevel10k&lt;/strong&gt;&lt;/a&gt;. Beyond being fast and minimal, it has &lt;strong&gt;maintained its popularity&lt;/strong&gt; for many years and &lt;strong&gt;continues to improve&lt;/strong&gt; with each new version. Also, I'm totally in favor of &lt;strong&gt;installing&lt;/strong&gt; the &lt;a href="https://github.com/romkatv/powerlevel10k#fonts" rel="noopener noreferrer"&gt;&lt;strong&gt;recommended font&lt;/strong&gt;&lt;/a&gt; that comes with it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Zsh plugins &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/TamCore/autoupdate-oh-my-zsh-plugins" rel="noopener noreferrer"&gt;&lt;strong&gt;autoupdate-zsh-plugin&lt;/strong&gt;&lt;/a&gt;: Auto update git-repositories in $ZSH_CUSTOM folder. This plugin &lt;strong&gt;is crucial&lt;/strong&gt; because it &lt;strong&gt;keeps the rest&lt;/strong&gt; of the plugins &lt;strong&gt;up-to-date&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/zsh-users/zsh-syntax-highlighting" rel="noopener noreferrer"&gt;&lt;strong&gt;zsh-syntax-highlighting&lt;/strong&gt;&lt;/a&gt;: It enables highlighting of commands while they’re typed. This helps in reviewing commands before running them, particularly in catching syntax errors.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/zsh-users/zsh-autosuggestions" rel="noopener noreferrer"&gt;&lt;strong&gt;zsh-autosuggestions&lt;/strong&gt;&lt;/a&gt;: It suggests commands as you type based on your history and completions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/zsh-users/zsh-history-substring-search" rel="noopener noreferrer"&gt;&lt;strong&gt;zsh-history-substring-search&lt;/strong&gt;&lt;/a&gt;: Type in any part of any command from your history, and then press chosen keys, such as the UP and DOWN arrows, to cycle through matches.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/lukechilds/zsh-nvm" rel="noopener noreferrer"&gt;&lt;strong&gt;zsh-nvm&lt;/strong&gt;&lt;/a&gt;: Zsh plugin for installing, updating and loading nvm. &lt;a href="https://github.com/nvm-sh/nvm" rel="noopener noreferrer"&gt;nvm&lt;/a&gt; installation is relevant for developers working with &lt;a href="https://nodejs.org/" rel="noopener noreferrer"&gt;node.js&lt;/a&gt;. This plugin is recommended since &lt;a href="https://github.com/nvm-sh/nvm#important-notes" rel="noopener noreferrer"&gt;nvm via brew isn't supported&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  iTerm2 Elevation
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;To &lt;strong&gt;open the preferences&lt;/strong&gt; at any stage, Open iTerm2 → Press &lt;code&gt;(command) ⌘ + , (comma)&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  Shell Integration
&lt;/h4&gt;

&lt;p&gt;Enabling the shell integration feature &lt;strong&gt;enables many useful features&lt;/strong&gt; by itself.&lt;br&gt;
&lt;a href="https://iterm2.com/documentation-shell-integration.html" rel="noopener noreferrer"&gt;Follow the &lt;strong&gt;official documentation&lt;/strong&gt; instructions&lt;/a&gt;.&lt;br&gt;
In practice the steps should look something like this: &lt;a href="https://media.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%2Fxy08ggzb5z8jmdg71lzm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxy08ggzb5z8jmdg71lzm.png" alt="install-shell-integration-1"&gt;&lt;/a&gt; &lt;a href="https://media.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%2Fuygkloi4ihkonxa28no7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuygkloi4ihkonxa28no7.png" alt="install-shell-integration-2"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Key Mappings
&lt;/h4&gt;

&lt;p&gt;Setting these &lt;a href="https://iterm2.com/documentation-preferences-profiles-keys.html" rel="noopener noreferrer"&gt;&lt;strong&gt;key mappings&lt;/strong&gt;&lt;/a&gt; allows us to &lt;strong&gt;use common keyboard shortcuts&lt;/strong&gt; in our terminal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/rannn505/0496cf92e65c69c12a8e38181dd98e6d?permalink_comment_id=4043484#gistcomment-4043484" rel="noopener noreferrer"&gt;Follow the &lt;strong&gt;instructions in the gist&lt;/strong&gt;&lt;/a&gt; I made for this purpose, and if you found it helpful, I'd appreciate you giving it a star as well.&lt;/p&gt;
&lt;h4&gt;
  
  
  Hotkey
&lt;/h4&gt;

&lt;p&gt;Setting a &lt;a href="https://iterm2.com/documentation-hotkey.html" rel="noopener noreferrer"&gt;&lt;strong&gt;hotkey&lt;/strong&gt;&lt;/a&gt; allows us to &lt;strong&gt;show or hide iterm window&lt;/strong&gt; even if another application is active.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preferences → Keys → Hotkey → ☑️ Show/hide all windows with a system-wide hotkey &lt;/li&gt;
&lt;li&gt;Click on the rectangle that appears right to "Hotkey:" → Set your preferred key sequence
&lt;img src="https://media.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%2Fymqxucctes24vmn9z55e.png" alt="hotkey-setting"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Status Bar
&lt;/h4&gt;

&lt;p&gt;Setting up the &lt;a href="https://iterm2.com/documentation-status-bar.html" rel="noopener noreferrer"&gt;&lt;strong&gt;status bar&lt;/strong&gt;&lt;/a&gt; allows us to &lt;strong&gt;get up-to-date information&lt;/strong&gt; about the environment we're working in.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preferences → Profiles → Session → ☑️ Status bar enabled&lt;/li&gt;
&lt;li&gt;Click Configure Status Bar button to begin setting up your status bar configuration.
My active components are: CPU Utilization, Memory Utilization and Network Throughput
&lt;img src="https://media.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%2F0hrcoo7nlg5zsn75f80n.png" alt="my-status-bar"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Remove the &lt;code&gt;last login: ...&lt;/code&gt; line on top of each new window
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;touch&lt;/span&gt; .hushlogin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Allow iTerm to access administrative files
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;System Preferences → Security &amp;amp; Privacy → Full Disk Access → ☑️ iTerm.app&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Use TouchID for sudo execution
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Open &lt;code&gt;/etc/pam.d/sudo&lt;/code&gt; with a text editor as admin
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;vim /etc/pam.d/sudo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;add &lt;code&gt;auth sufficient pam_tid.so&lt;/code&gt; line &lt;strong&gt;on top&lt;/strong&gt; and save
&lt;img src="https://media.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%2Fhsvty9vhr0gbsxcylj9r.png" alt="/etc/pam.d/sudo"&gt;
&lt;/li&gt;
&lt;li&gt;Preferences → Advanced → Allow sessions to survive logging out and back → Select "No"&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Set some "nice to have" preferences
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;General → Closing → ☑️ Quit when all windows are closed&lt;/li&gt;
&lt;li&gt;General → Selection → ☑️ Double-click performs smart selection&lt;/li&gt;
&lt;li&gt;General → Window → ☑️ Smart window placement&lt;/li&gt;
&lt;li&gt;Appearance → General → Theme → Select "Minimal"&lt;/li&gt;
&lt;li&gt;Appearance → Tabs → ☑️ Show tab bar even when there is only one tab&lt;/li&gt;
&lt;li&gt;Profiles → General → Icon (Basics) → Select "Built-in Icon for Current App"&lt;/li&gt;
&lt;li&gt;Profiles → General → Working Directory → 🔘 Advanced Configuration → Edit... → Working Directory for New Split Panes → 🔘 Reuse previous session's directory&lt;/li&gt;
&lt;li&gt;Profiles → Text → Cursor → 🔘 Vertical bar + ☑️ Blinking cursor&lt;/li&gt;
&lt;li&gt;Profiles → Text → Font → Increase size (I use &lt;code&gt;16&lt;/code&gt; as in my IDE)&lt;/li&gt;
&lt;li&gt;Profiles → Terminal → Shell Integration → ☐ Show mark indicators&lt;/li&gt;
&lt;li&gt;Keys → Navigation Shortcuts → Shortcut to choose a split pane → Select your preferred option (I use &lt;code&gt;⌥ Number&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Pointer → General → ☑️ Focus follows mouse&lt;/li&gt;
&lt;li&gt;Advanced → Mouse → Scroll wheel sends arrow keys when in alternate screen mode → Select "Yes"&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Add a screensaver
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/abishekvashok/cmatrix" rel="noopener noreferrer"&gt;CMatrix&lt;/a&gt; shows text flying in and out in a terminal like as seen in "The Matrix" movie.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;cmatrix
cmatrix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/pipeseroni/pipes.sh" rel="noopener noreferrer"&gt;pipes.sh&lt;/a&gt; shows animated pipes.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;pipes-sh
pipes-sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Install useful command-line tools
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/agarrharr" rel="noopener noreferrer"&gt;
        agarrharr
      &lt;/a&gt; / &lt;a href="https://github.com/agarrharr/awesome-cli-apps" rel="noopener noreferrer"&gt;
        awesome-cli-apps
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🖥 📊 🕹 🛠 A curated list of command line apps
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/rannn505" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F791199%2F830fe8be-7090-4f15-9014-fa17e03e02ab.jpeg" alt="rannn505"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/rannn505/macos-developer-n4n" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;macOS developer&lt;/h2&gt;
      &lt;h3&gt;Ran Cohen ・ Jan 28 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#macos&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#developer&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;






&lt;h3&gt;
  
  
  The Result ✨
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/rannn505/b02ad6e465d02b155646f2b1eb88ae72" rel="noopener noreferrer"&gt;&lt;strong&gt;configuration files (.zshrc, iterm-profile.json etc..) as a gist&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F25cogqf592kj2yo802ir.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F25cogqf592kj2yo802ir.png" alt="result"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>productivity</category>
      <category>macos</category>
      <category>terminal</category>
    </item>
    <item>
      <title>macOS developer</title>
      <dc:creator>Ran Cohen</dc:creator>
      <pubDate>Fri, 28 Jan 2022 16:18:01 +0000</pubDate>
      <link>https://dev.to/rannn505/macos-developer-n4n</link>
      <guid>https://dev.to/rannn505/macos-developer-n4n</guid>
      <description>&lt;p&gt;Hello &lt;strong&gt;developers&lt;/strong&gt; 🧑‍💻, &lt;strong&gt;thanks&lt;/strong&gt; for reading my post 🙏.&lt;/p&gt;

&lt;p&gt;Recently I got to spend quite a bit of time finding settings, tools and apps that &lt;strong&gt;boost my productivity 🚀&lt;/strong&gt; and make my &lt;strong&gt;development routine easier ✨&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Note that all of the following are &lt;strong&gt;just my personal warm recommendations&lt;/strong&gt;, and I'd like to hear about any &lt;strong&gt;additional tools&lt;/strong&gt; I may have missed in the &lt;strong&gt;discussion section 🎤&lt;/strong&gt;.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;The following &lt;strong&gt;preferences ⚙️&lt;/strong&gt; allow me to &lt;strong&gt;utilize macOS more effectively&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  System Preferences 💻
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dock &amp;amp; Menu Bar → ☑️ Automatically hide and show the Dock&lt;/li&gt;
&lt;li&gt;Dock &amp;amp; Menu Bar → Other Modules → Battery → ☑️ Show Percentage&lt;/li&gt;
&lt;li&gt;Accessibility → Pointer Control → Mouse &amp;amp; Trackpad → Trackpad Options… → ️️☑️ Enable dragging&lt;/li&gt;
&lt;li&gt;Trackpad → Point &amp;amp; Click → ☑️ Tap to click&lt;/li&gt;
&lt;li&gt;Trackpad → Point &amp;amp; Click → Increase Tracking speed&lt;/li&gt;
&lt;li&gt;Battery → Power Adapter → ☐ Wake for network access&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Finder Preferences 🗂
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Preferences → Advanced → ☑️ Show all filename extensions&lt;/li&gt;
&lt;li&gt;View → Show Path Bar&lt;/li&gt;
&lt;li&gt;View → Show Status Bar&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;shift ⇧ + command ⌘ + .&lt;/code&gt; (Show hidden files)&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;p&gt;The following tools and applications &lt;strong&gt;are free 🆓&lt;/strong&gt; and allow me to significantly &lt;strong&gt;shorten daily operations&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Command-line Tools 🛠 &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Xcode Command Line Tools&lt;/strong&gt; is a small self-contained package available for download separately from Xcode and that allows you to do command line development in macOS. &lt;br&gt;
Some of the &lt;strong&gt;tools below depend on it&lt;/strong&gt;, so it is important to &lt;strong&gt;install it first&lt;/strong&gt;.&lt;br&gt;
Press &lt;code&gt;command ⌘ + Space&lt;/code&gt; → Type &lt;code&gt;terminal&lt;/code&gt; → Run &lt;code&gt;xcode-select --install&lt;/code&gt; → Wait few minutes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Homebrew&lt;/strong&gt; is an open-source software package management system that simplifies the installation of software on macOS.&lt;br&gt;
Open &lt;a href="https://brew.sh/" rel="noopener noreferrer"&gt;Homebrew page&lt;/a&gt; in a new tab → Copy the snippet → Paste it in the terminal → Follow the instructions that the script will display&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;By &lt;strong&gt;installing&lt;/strong&gt; the rest of the &lt;strong&gt;command-line tools via&lt;/strong&gt; &lt;a href="https://formulae.brew.sh/" rel="noopener noreferrer"&gt;brew&lt;/a&gt;, you will be able to &lt;strong&gt;keep them up-to-date&lt;/strong&gt; by running &lt;code&gt;brew upgrade&lt;/code&gt; once in a while.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;git curl wget jq htop speedtest tldr thefuck fzf bat 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;git&lt;/a&gt; version control system&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://curl.se/" rel="noopener noreferrer"&gt;curl&lt;/a&gt; transferring data with URLs&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.gnu.org/software/wget/" rel="noopener noreferrer"&gt;wget&lt;/a&gt; retrieving files&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://stedolan.github.io/jq/" rel="noopener noreferrer"&gt;jq&lt;/a&gt; JSON processor&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://htop.dev/" rel="noopener noreferrer"&gt;htop&lt;/a&gt; process viewer&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.speedtest.net/apps/cli" rel="noopener noreferrer"&gt;speedtest&lt;/a&gt; internet connection measurement&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tldr.sh/" rel="noopener noreferrer"&gt;tldr&lt;/a&gt; commands cheatsheets&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nvbn/thefuck" rel="noopener noreferrer"&gt;thefuck&lt;/a&gt; corrects errors in previous commands&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/junegunn/fzf" rel="noopener noreferrer"&gt;fzf&lt;/a&gt; fuzzy finder&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/sharkdp/bat" rel="noopener noreferrer"&gt;bat&lt;/a&gt; cat with syntax highlighting and Git integration&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Applications 📱 &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Since most apps these days can update themselves automatically, I &lt;strong&gt;prefer to install&lt;/strong&gt; them &lt;strong&gt;via their native installer&lt;/strong&gt; (download then drag to application directory, and if needed remove with AppCleaner) &lt;strong&gt;rather than via brew casks&lt;/strong&gt;, but it is entirely &lt;strong&gt;up to you&lt;/strong&gt;. (see &lt;a href="https://stackoverflow.com/a/31994862" rel="noopener noreferrer"&gt;this issue&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://iterm2.com/index.html" rel="noopener noreferrer"&gt;iTerm2&lt;/a&gt; terminal emulator &lt;div class="ltag__link"&gt;
  &lt;a href="/rannn505" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F791199%2F830fe8be-7090-4f15-9014-fa17e03e02ab.jpeg" alt="rannn505"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/rannn505/macos-awesome-terminal-519n" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;macOS awesome terminal&lt;/h2&gt;
      &lt;h3&gt;Ran Cohen ・ Jan 28 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#macos&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#terminal&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt; code editor.&lt;/li&gt;

&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;To launch VS Code from the terminal, Open VS Code → Press &lt;code&gt;⌘ + ⇧ + P&lt;/code&gt; → Type &lt;code&gt;shell command&lt;/code&gt; → Select &lt;code&gt;Install code command in path&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://maccy.app/" rel="noopener noreferrer"&gt;Maccy&lt;/a&gt; clipboard manager&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://rectangleapp.com/" rel="noopener noreferrer"&gt;Rectangle&lt;/a&gt; keyboard windows manager &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://xnipapp.com/" rel="noopener noreferrer"&gt;Xnip&lt;/a&gt; screenshot app&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://getkap.co/" rel="noopener noreferrer"&gt;Kap&lt;/a&gt; screen recorder&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://keepingyouawake.app/" rel="noopener noreferrer"&gt;KeepingYouAwake&lt;/a&gt; prevents sleep&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ngrok.com/" rel="noopener noreferrer"&gt;Ngrok&lt;/a&gt; public URL to your localhost&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://bitwarden.com/" rel="noopener noreferrer"&gt;Bitwarden&lt;/a&gt; password manager&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://freemacsoft.net/appcleaner/" rel="noopener noreferrer"&gt;AppCleaner&lt;/a&gt; thoroughly uninstall apps&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Extra 🛸
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wangchujiang.com/awesome-mac/" rel="noopener noreferrer"&gt;Awesome Mac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://isapplesiliconready.com/" rel="noopener noreferrer"&gt;Is Apple Silicon ready?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Happy coding day 🍻&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.gifer.com%2F5eKX.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.gifer.com%2F5eKX.gif" alt="easy dev"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>productivity</category>
      <category>macos</category>
      <category>developer</category>
    </item>
  </channel>
</rss>
