<?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: Binary Journal</title>
    <description>The latest articles on DEV Community by Binary Journal (@binaryjournal).</description>
    <link>https://dev.to/binaryjournal</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4027458%2F716a08b8-d1ec-4da5-b190-3371ca9f56e2.png</url>
      <title>DEV Community: Binary Journal</title>
      <link>https://dev.to/binaryjournal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/binaryjournal"/>
    <language>en</language>
    <item>
      <title>Environment Variables the Safe Way</title>
      <dc:creator>Binary Journal</dc:creator>
      <pubDate>Wed, 05 Aug 2026 00:00:29 +0000</pubDate>
      <link>https://dev.to/binaryjournal/environment-variables-the-safe-way-25eh</link>
      <guid>https://dev.to/binaryjournal/environment-variables-the-safe-way-25eh</guid>
      <description>&lt;h2&gt;
  
  
  Environment Variables the Safe Way
&lt;/h2&gt;

&lt;p&gt;Environment variables are the standard way to configure applications without hardcoding secrets or environment-specific details. But they're easy to misuse. I've seen API keys committed to repos, configs that crash when a variable is missing, and defaults that silently override production settings. Here's how I handle them safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Never Commit Secrets
&lt;/h2&gt;

&lt;p&gt;The most important rule: never put real secrets in your code or commit them to version control. That includes &lt;code&gt;.env&lt;/code&gt; files. Add &lt;code&gt;.env&lt;/code&gt; to your &lt;code&gt;.gitignore&lt;/code&gt; immediately. If you're using a framework like Laravel or a tool like Vite, the default &lt;code&gt;.env.example&lt;/code&gt; is your friend. Commit that, but never the real one.&lt;/p&gt;

&lt;p&gt;For local development, you can generate a &lt;code&gt;.env&lt;/code&gt; from the example and fill in your own values. For production, set variables through your hosting provider's dashboard or a secrets manager like AWS Secrets Manager or HashiCorp Vault.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read Variables Explicitly
&lt;/h2&gt;

&lt;p&gt;Don't access &lt;code&gt;process.env&lt;/code&gt; directly all over your codebase. Instead, centralize your configuration. Create a &lt;code&gt;config.js&lt;/code&gt; (or &lt;code&gt;config.ts&lt;/code&gt;) that reads and validates all the variables you need.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;required&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;JWT_SECRET&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PORT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;missing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;required&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;missing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Missing required environment variables: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;missing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;databaseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;jwtSecret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;JWT_SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your app imports &lt;code&gt;config&lt;/code&gt; and uses &lt;code&gt;config.port&lt;/code&gt;. This has several benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fail fast: if a required variable is missing, the app crashes at startup, not later when you try to use it.&lt;/li&gt;
&lt;li&gt;Type safety: you can parse and validate values once.&lt;/li&gt;
&lt;li&gt;Easy to mock in tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use Defaults Carefully
&lt;/h2&gt;

&lt;p&gt;Defaults are convenient, but they can hide problems. For example, if you default &lt;code&gt;PORT&lt;/code&gt; to &lt;code&gt;3000&lt;/code&gt; in production, you might accidentally run on the wrong port without noticing. I prefer to have no defaults for critical variables, and only provide defaults for non-critical ones like log levels or feature flags.&lt;/p&gt;

&lt;p&gt;In the config above, I used &lt;code&gt;|| 3000&lt;/code&gt; for port. That's fine for development, but consider whether you want that in production. If you're not sure, make it required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parse and Validate Types
&lt;/h2&gt;

&lt;p&gt;Environment variables are always strings. If you need a number, boolean, or array, parse them explicitly. I've seen bugs from &lt;code&gt;if (process.env.DEBUG === 'true')&lt;/code&gt; vs &lt;code&gt;if (process.env.DEBUG)&lt;/code&gt; where the latter is true even when the variable is &lt;code&gt;'false'&lt;/code&gt;. Use a small helper:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;true&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isNaN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Invalid integer: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then in config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DEBUG&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;false&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;maxRetries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MAX_RETRIES&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Avoid Naming Collisions
&lt;/h2&gt;

&lt;p&gt;Prefix your variables with your app name, like &lt;code&gt;MYAPP_DB_HOST&lt;/code&gt; instead of just &lt;code&gt;DB_HOST&lt;/code&gt;. This prevents conflicts when multiple apps run in the same shell or CI environment. It also makes it clear which variables belong to your app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't Log Secrets
&lt;/h2&gt;

&lt;p&gt;It's tempting to log the config at startup for debugging. Don't log secrets. If you must, mask them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Config loaded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;databaseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;databaseUrl&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;jwtSecret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;jwtSecret&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This shows enough to verify it's set, but not enough to leak.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use a Library for Complex Config
&lt;/h2&gt;

&lt;p&gt;If you need nested config, defaults, and validation, consider a library like &lt;code&gt;dotenv&lt;/code&gt; for loading &lt;code&gt;.env&lt;/code&gt; files, and &lt;code&gt;envalid&lt;/code&gt; or &lt;code&gt;convict&lt;/code&gt; for validation. These tools handle parsing, required checks, and error messages for you.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// With envalid&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;cleanEnv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;str&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="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;envalid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cleanEnv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;port&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="na"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;JWT_SECRET&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It throws a clear error listing all missing variables, which is much nicer than debugging a &lt;code&gt;undefined&lt;/code&gt; later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep .env Out of Docker Images
&lt;/h2&gt;

&lt;p&gt;If you use Docker, don't bake environment variables into the image. That's a security risk and makes the image less portable. Instead, pass them at runtime with &lt;code&gt;-e&lt;/code&gt; or use a &lt;code&gt;.env&lt;/code&gt; file with &lt;code&gt;--env-file&lt;/code&gt;. In &lt;code&gt;docker-compose&lt;/code&gt;, use &lt;code&gt;environment&lt;/code&gt; or &lt;code&gt;env_file&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  CI/CD Considerations
&lt;/h2&gt;

&lt;p&gt;In CI, set variables in the pipeline settings, not in the code. Most CI systems have a way to store secrets encrypted. Use those. In GitHub Actions, you can use secrets in your workflow file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run tests&lt;/span&gt;
  &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.DATABASE_URL }}&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;The goal is to make configuration explicit, fail fast, and keep secrets out of code. Start with a simple config module, add validation, and never commit real values. Your future self will thank you when you don't wake up to a security breach or a mysterious production bug.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>security</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Terminal Productivity Tips That Actually Save Time</title>
      <dc:creator>Binary Journal</dc:creator>
      <pubDate>Fri, 31 Jul 2026 08:01:01 +0000</pubDate>
      <link>https://dev.to/binaryjournal/terminal-productivity-tips-that-actually-save-time-438n</link>
      <guid>https://dev.to/binaryjournal/terminal-productivity-tips-that-actually-save-time-438n</guid>
      <description>&lt;h2&gt;
  
  
  Stop Typing the Same Commands
&lt;/h2&gt;

&lt;p&gt;If you're still typing &lt;code&gt;cd&lt;/code&gt; into deeply nested folders, you're wasting time. Use &lt;code&gt;cd -&lt;/code&gt; to go back to the previous directory, and &lt;code&gt;cd ~&lt;/code&gt; to jump home. For frequent destinations, set up aliases in your shell config:&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="c"&gt;# ~/.bashrc or ~/.zshrc&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;proj&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"cd ~/work/projects/current"&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"cd ~/Documents &amp;amp;&amp;amp; ls"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aliases aren't just for &lt;code&gt;cd&lt;/code&gt;. Shorten everyday commands like &lt;code&gt;git status&lt;/code&gt; to &lt;code&gt;gs&lt;/code&gt; or &lt;code&gt;docker compose up&lt;/code&gt; to &lt;code&gt;dcu&lt;/code&gt;. But don't overdo it; too many cryptic aliases become a burden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use History Like a Pro
&lt;/h2&gt;

&lt;p&gt;Your shell remembers everything, but most people only use the up arrow. That's slow. Press &lt;code&gt;Ctrl+R&lt;/code&gt; to search backward through history. Type a fragment and hit &lt;code&gt;Ctrl+R&lt;/code&gt; again to cycle through matches.&lt;/p&gt;

&lt;p&gt;For more power, install &lt;code&gt;fzf&lt;/code&gt; (fuzzy finder). It gives you an interactive filter for history, files, and more. With &lt;code&gt;fzf&lt;/code&gt;, you can bind &lt;code&gt;Ctrl+R&lt;/code&gt; to a fuzzy search over your entire command history. It's a game changer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Navigate Faster with &lt;code&gt;z&lt;/code&gt; or &lt;code&gt;autojump&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Instead of remembering full paths, use &lt;code&gt;z&lt;/code&gt; (or &lt;code&gt;autojump&lt;/code&gt;). It learns the directories you visit most and lets you jump with a fuzzy match:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;z proj   &lt;span class="c"&gt;# goes to ~/work/projects/current if that's your most frequent match&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install it once, and you'll never type long &lt;code&gt;cd&lt;/code&gt; paths again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Master Your Editor Shortcuts
&lt;/h2&gt;

&lt;p&gt;If you use Vim or a Vim-mode in your IDE, learn a few essential motions. For example, &lt;code&gt;ci"&lt;/code&gt; (change inside quotes) deletes the content inside double quotes and puts you in insert mode. &lt;code&gt;dd&lt;/code&gt; deletes a line, &lt;code&gt;yy&lt;/code&gt; copies it, and &lt;code&gt;p&lt;/code&gt; pastes. These small moves add up over a day.&lt;/p&gt;

&lt;p&gt;In a regular terminal, you can also enable Vim mode in Bash or Zsh with &lt;code&gt;set -o vi&lt;/code&gt;. This lets you use &lt;code&gt;Esc&lt;/code&gt; to enter normal mode and navigate with &lt;code&gt;h&lt;/code&gt;, &lt;code&gt;j&lt;/code&gt;, &lt;code&gt;k&lt;/code&gt;, &lt;code&gt;l&lt;/code&gt;, and use &lt;code&gt;b&lt;/code&gt;, &lt;code&gt;w&lt;/code&gt;, &lt;code&gt;e&lt;/code&gt; to move between words. It takes a week to get used to, but then your editing speed doubles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run Long Commands in the Background
&lt;/h2&gt;

&lt;p&gt;When a command takes forever, don't block your terminal. Append &lt;code&gt;&amp;amp;&lt;/code&gt; to run it in the background, but then you lose the output. Better: use &lt;code&gt;nohup&lt;/code&gt; and redirect output to a file:&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="nb"&gt;nohup &lt;/span&gt;long-running-task &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; output.log 2&amp;gt;&amp;amp;1 &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can keep working and check the log later. Or use &lt;code&gt;tmux&lt;/code&gt; or &lt;code&gt;screen&lt;/code&gt; to keep sessions alive even if you close the terminal. &lt;code&gt;tmux&lt;/code&gt; is more modern and allows splitting panes, which is great for running a dev server and a shell side by side.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Shell Shortcuts for Editing
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Ctrl+A&lt;/code&gt; moves to the beginning of the line, &lt;code&gt;Ctrl+E&lt;/code&gt; to the end. &lt;code&gt;Alt+F&lt;/code&gt; moves forward a word, &lt;code&gt;Alt+B&lt;/code&gt; backward. &lt;code&gt;Ctrl+W&lt;/code&gt; deletes the previous word. &lt;code&gt;Ctrl+U&lt;/code&gt; deletes from the cursor to the beginning. These shortcuts work in Bash and Zsh and save you from holding down the arrow key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Batch Rename with &lt;code&gt;rename&lt;/code&gt; or &lt;code&gt;mmv&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Instead of writing a loop, use &lt;code&gt;rename&lt;/code&gt; (Perl version) or &lt;code&gt;mmv&lt;/code&gt; for bulk renames:&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="c"&gt;# rename all .txt to .md&lt;/span&gt;
rename &lt;span class="s1"&gt;'s/\.txt$/\.md/'&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.txt

&lt;span class="c"&gt;# mmv example: move files with pattern&lt;/span&gt;
mmv &lt;span class="s1"&gt;'*.jpeg'&lt;/span&gt; &lt;span class="s1"&gt;'#1.jpg'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These tools are safer than a hand-rolled &lt;code&gt;for&lt;/code&gt; loop and handle edge cases better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pipe with &lt;code&gt;xargs&lt;/code&gt; for Parallelism
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;xargs&lt;/code&gt; can run commands in parallel with &lt;code&gt;-P&lt;/code&gt;. For example, to compress all images in a folder with multiple processes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.png"&lt;/span&gt; &lt;span class="nt"&gt;-print0&lt;/span&gt; | xargs &lt;span class="nt"&gt;-0&lt;/span&gt; &lt;span class="nt"&gt;-P&lt;/span&gt; 4 &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; convert &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Be careful with quoting and spaces; use &lt;code&gt;-0&lt;/code&gt; with &lt;code&gt;find -print0&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make Your Prompt Minimal
&lt;/h2&gt;

&lt;p&gt;A long prompt with &lt;code&gt;user@host: /full/path&lt;/code&gt; wastes horizontal space. Shorten it to just the current directory name or a tiny symbol. In Zsh, you can do:&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;PROMPT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'%1~ %# '&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This shows only the last component of the path. You'll gain space and reduce clutter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn One New Tool at a Time
&lt;/h2&gt;

&lt;p&gt;Don't try to install everything at once. Pick one tip, use it for a week until it becomes muscle memory, then add the next. The goal isn't to have a fancy setup; it's to save time every day without thinking.&lt;/p&gt;

&lt;p&gt;Start with &lt;code&gt;Ctrl+R&lt;/code&gt; and aliases. Those two alone will make you noticeably faster. Then move to &lt;code&gt;z&lt;/code&gt; and &lt;code&gt;fzf&lt;/code&gt;. Your terminal will feel like an extension of your hands.&lt;/p&gt;

</description>
      <category>terminal</category>
      <category>productivity</category>
      <category>bash</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Boost Your Terminal Productivity: Tips I Use Every Day</title>
      <dc:creator>Binary Journal</dc:creator>
      <pubDate>Wed, 29 Jul 2026 16:02:15 +0000</pubDate>
      <link>https://dev.to/binaryjournal/boost-your-terminal-productivity-tips-i-use-every-day-27pi</link>
      <guid>https://dev.to/binaryjournal/boost-your-terminal-productivity-tips-i-use-every-day-27pi</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I spend a lot of time in the terminal. Over the years, I've picked up habits and tools that make me faster and less error-prone. Here are the tips I actually use daily.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Master Keyboard Shortcuts
&lt;/h2&gt;

&lt;p&gt;Most terminals support Emacs-style shortcuts by default. Learn these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + A&lt;/code&gt; / &lt;code&gt;Ctrl + E&lt;/code&gt; - jump to start/end of line&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + U&lt;/code&gt; - delete from cursor to start&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + K&lt;/code&gt; - delete from cursor to end&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + W&lt;/code&gt; - delete word backward&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + R&lt;/code&gt; - reverse search through history&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Practice until they're muscle memory. It saves seconds on every command.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Use History Expansion
&lt;/h2&gt;

&lt;p&gt;Bash and Zsh let you reuse previous commands quickly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;!!&lt;/code&gt; - repeat last command (add &lt;code&gt;sudo !!&lt;/code&gt; to rerun with sudo)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;!$&lt;/code&gt; - last argument of previous command&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;!^&lt;/code&gt; - first argument of previous command&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;!npm&lt;/code&gt; - run the most recent command that starts with "npm"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&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;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;project
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Fuzzy Find Everything
&lt;/h2&gt;

&lt;p&gt;Install &lt;code&gt;fzf&lt;/code&gt; - a fuzzy finder that works with files, history, processes, and more.&lt;/p&gt;

&lt;p&gt;Key bindings after install:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + T&lt;/code&gt; - paste selected file/directory path&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + R&lt;/code&gt; - fuzzy search command history (better than default)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Alt + C&lt;/code&gt; - fuzzy cd into subdirectories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can combine with &lt;code&gt;**&lt;/code&gt; in Zsh for tab completion:&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;$ &lt;/span&gt;vim &lt;span class="k"&gt;**&lt;/span&gt;&amp;lt;TAB&amp;gt;   &lt;span class="c"&gt;# fuzzy find file&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="k"&gt;**&lt;/span&gt;&amp;lt;TAB&amp;gt;    &lt;span class="c"&gt;# fuzzy find directory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Navigate with Autojump or Zoxide
&lt;/h2&gt;

&lt;p&gt;Stop typing &lt;code&gt;cd ../../..&lt;/code&gt;. Use &lt;code&gt;z&lt;/code&gt; (via &lt;code&gt;zoxide&lt;/code&gt;) to jump to directories by name:&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;$ &lt;/span&gt;z projects   &lt;span class="c"&gt;# jumps to /home/user/work/projects&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;z mydoc      &lt;span class="c"&gt;# jumps to /home/user/Documents/mydoc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It learns your most used directories. Install &lt;code&gt;zoxide&lt;/code&gt; once, add &lt;code&gt;eval "$(zoxide init zsh)"&lt;/code&gt; to your &lt;code&gt;.zshrc&lt;/code&gt;, and you're set.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Simplify Git with Aliases
&lt;/h2&gt;

&lt;p&gt;Add these to your &lt;code&gt;.gitconfig&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[alias]&lt;/span&gt;
    &lt;span class="py"&gt;co&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;checkout&lt;/span&gt;
    &lt;span class="py"&gt;br&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;branch&lt;/span&gt;
    &lt;span class="py"&gt;ci&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;commit&lt;/span&gt;
    &lt;span class="py"&gt;st&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;status&lt;/span&gt;
    &lt;span class="py"&gt;unstage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;reset HEAD --&lt;/span&gt;
    &lt;span class="py"&gt;last&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;log -1 HEAD&lt;/span&gt;
    &lt;span class="py"&gt;lg&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;log --oneline --graph --all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then use &lt;code&gt;git co&lt;/code&gt; instead of &lt;code&gt;git checkout&lt;/code&gt;. Saves a lot of keystrokes.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Batch Rename with &lt;code&gt;rename&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Instead of writing loops, use the Perl &lt;code&gt;rename&lt;/code&gt; command (install via &lt;code&gt;brew install rename&lt;/code&gt; or &lt;code&gt;apt install rename&lt;/code&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="c"&gt;# Rename all .jpeg to .jpg&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;rename &lt;span class="s1"&gt;'s/\.jpeg$/.jpg/'&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.jpeg

&lt;span class="c"&gt;# Add prefix to all files&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;rename &lt;span class="s1"&gt;'s/^/backup_/'&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Use &lt;code&gt;bat&lt;/code&gt; Instead of &lt;code&gt;cat&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;bat&lt;/code&gt; is &lt;code&gt;cat&lt;/code&gt; with syntax highlighting and line numbers. It also integrates with &lt;code&gt;less&lt;/code&gt; for paging.&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;$ &lt;/span&gt;bat script.py   &lt;span class="c"&gt;# shows file with colors&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set &lt;code&gt;export BAT_THEME="Dracula"&lt;/code&gt; in your shell config.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Quick File Creation with &lt;code&gt;touch&lt;/code&gt; and &lt;code&gt;mkdir -p&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Create nested directories and files in one go:&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;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; project/src/components &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch &lt;/span&gt;project/src/components/Header.jsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or use a one-liner with brace expansion:&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;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;src,test&lt;span class="o"&gt;}&lt;/span&gt;/&lt;span class="o"&gt;{&lt;/span&gt;components,utils&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  9. Pipe to Clipboard
&lt;/h2&gt;

&lt;p&gt;Copy command output directly to clipboard:&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;$ &lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;file.txt | pbcopy   &lt;span class="c"&gt;# macOS&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;file.txt | xclip &lt;span class="nt"&gt;-selection&lt;/span&gt; clipboard   &lt;span class="c"&gt;# Linux&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I alias &lt;code&gt;clip&lt;/code&gt; to the appropriate command for my OS.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Use Tmux for Session Management
&lt;/h2&gt;

&lt;p&gt;Tmux lets you keep terminals running even after you close your window. Basic commands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tmux new -s mysession&lt;/code&gt; - create named session&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + B d&lt;/code&gt; - detach&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tmux attach -t mysession&lt;/code&gt; - reattach&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + B c&lt;/code&gt; - new window&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + B %&lt;/code&gt; - split vertically&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + B "&lt;/code&gt; - split horizontally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I never lose my work when my SSH connection drops.&lt;/p&gt;

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

&lt;p&gt;Start with one or two tips. Install &lt;code&gt;fzf&lt;/code&gt; and &lt;code&gt;zoxide&lt;/code&gt; first - they give the biggest productivity boost. Then gradually add aliases and shortcuts. Your future self will thank you.&lt;/p&gt;

</description>
      <category>terminal</category>
      <category>productivity</category>
      <category>bash</category>
      <category>zsh</category>
    </item>
    <item>
      <title>Markdown Tricks for Cleaner Docs</title>
      <dc:creator>Binary Journal</dc:creator>
      <pubDate>Tue, 28 Jul 2026 16:01:44 +0000</pubDate>
      <link>https://dev.to/binaryjournal/markdown-tricks-for-cleaner-docs-1dgb</link>
      <guid>https://dev.to/binaryjournal/markdown-tricks-for-cleaner-docs-1dgb</guid>
      <description>&lt;h2&gt;
  
  
  Markdown Tricks for Cleaner Docs
&lt;/h2&gt;

&lt;p&gt;I write a lot of documentation. Over the years, I've picked up a handful of Markdown tricks that make my docs cleaner, more readable, and easier to maintain. Here are my favorites.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Strikethrough for Deprecation
&lt;/h3&gt;

&lt;p&gt;When you need to mark something as outdated without removing it, use strikethrough:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;~~This feature is deprecated.~~ Use the new API instead.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;del&gt;This feature is deprecated.&lt;/del&gt; Use the new API instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Task Lists for Checklists
&lt;/h3&gt;

&lt;p&gt;Task lists are great for progress tracking or step-by-step instructions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; [x] Implement login
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Add error handling
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Write tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;[x] Implement login&lt;/li&gt;
&lt;li&gt;[ ] Add error handling&lt;/li&gt;
&lt;li&gt;[ ] Write tests&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Collapsible Sections for Long Content
&lt;/h3&gt;

&lt;p&gt;In GitHub Flavored Markdown, you can use &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; to hide verbose details:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;details&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;Click to expand&lt;span class="nt"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;

This is hidden until you click.

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

&lt;/div&gt;



&lt;p&gt;Click to expand&lt;/p&gt;

&lt;p&gt;This is hidden until you click.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;
&lt;span class="gu"&gt;### 4. Tables with Alignment&lt;/span&gt;

Align columns using colons in the separator row:

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

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
markdown&lt;br&gt;
| Left | Center | Right |&lt;br&gt;
| :--- | :----: | ----: |&lt;br&gt;
| A    |   B    |     C |&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
| Left | Center | Right |
| :--- | :----: | ----: |
| A    |   B    |     C |

### 5. Code Blocks with Language Tags

Always specify the language for syntax highlighting:

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

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
markdown&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, world!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;
&lt;span class="gu"&gt;### 6. Footnotes for References&lt;/span&gt;

Some Markdown processors support footnotes (like Pandoc or GitHub? Actually, GitHub doesn't. But if your platform does, use them):

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

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
markdown&lt;br&gt;
Here's a statement with a footnote&lt;sup id="fnref1"&gt;1&lt;/sup&gt;.&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
(Check your platform's support.)

### 7. Emoji Shortcodes

Emojis add personality: `:smile:` becomes :smile:, `:warning:` becomes :warning:. Use sparingly.

### 8. Horizontal Rules for Section Breaks

Three dashes create a clean separation:

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

&lt;/div&gt;

&lt;h2&gt;
  
  
  markdown
&lt;/h2&gt;


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

### 9. Inline HTML for Custom Styling

Sometimes Markdown isn't enough. Drop in HTML for inline spans or divs:

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

&lt;/div&gt;
&lt;p&gt;&lt;br&gt;
html&lt;br&gt;
&lt;span&gt;Important&lt;/span&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
But keep it minimal.

### 10. Relative Links for Repo Navigation

In GitHub, use relative links to jump between docs:

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

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
markdown&lt;br&gt;
&lt;a href="//../INSTALL.md"&gt;Installation Guide&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
### 11. Escaping Special Characters

To display literal Markdown characters, use backslash:

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

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
markdown&lt;br&gt;
*This is not italic*&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
\*This is not italic\*

### 12. Nested Lists with Indentation

Indent four spaces for nested lists:

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

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
markdown&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First item

&lt;ul&gt;
&lt;li&gt;Subitem&lt;/li&gt;
&lt;li&gt;Another subitem&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Second item
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
1. First item
    - Subitem
    - Another subitem
2. Second item

### 13. Definition Lists (Some Processors)

Some Markdown flavors support definition lists:

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

&lt;/div&gt;
&lt;p&gt;&lt;br&gt;
markdown&lt;br&gt;
Term&lt;br&gt;
: Definition&lt;br&gt;
&lt;/p&gt;

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

(Check if your platform supports it.)

### 14. Automatic Links

Wrap URLs in angle brackets to make them clickable:

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

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
markdown&lt;br&gt;
&lt;a href="https://example.com" rel="noopener noreferrer"&gt;https://example.com&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&amp;lt;https://example.com&amp;gt;

### 15. Comments for Documentation Notes

Use HTML comments to leave notes for yourself or other writers:

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

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
html&lt;/p&gt;



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


These aren't rendered in the output.

---

These tricks have saved me time and made my documentation much cleaner. Try them out in your next project!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;This is the footnote.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>markdown</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Boost Your Terminal Productivity: 10 Essential Tips</title>
      <dc:creator>Binary Journal</dc:creator>
      <pubDate>Fri, 24 Jul 2026 08:00:21 +0000</pubDate>
      <link>https://dev.to/binaryjournal/boost-your-terminal-productivity-10-essential-tips-3j6k</link>
      <guid>https://dev.to/binaryjournal/boost-your-terminal-productivity-10-essential-tips-3j6k</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;If you spend a significant amount of time in the terminal, even small productivity gains compound into hours saved each week. I've curated 10 practical tips that have transformed my workflow. No fluff, just actionable advice.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Master Keyboard Shortcuts
&lt;/h2&gt;

&lt;p&gt;Learn these core shortcuts for bash/zsh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + a&lt;/code&gt; / &lt;code&gt;Ctrl + e&lt;/code&gt;: Jump to beginning/end of line.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + u&lt;/code&gt; / &lt;code&gt;Ctrl + k&lt;/code&gt;: Delete from cursor to start/end of line.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + w&lt;/code&gt;: Delete word backward.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + r&lt;/code&gt;: Reverse search through command history.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + l&lt;/code&gt;: Clear screen (instead of typing &lt;code&gt;clear&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Practice until they become muscle memory. This alone will save you minutes daily.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Use Aliases for Frequent Commands
&lt;/h2&gt;

&lt;p&gt;Aliases turn long commands into short ones. Add these to your &lt;code&gt;~/.bashrc&lt;/code&gt; or &lt;code&gt;~/.zshrc&lt;/code&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="c"&gt;# Common shortcuts&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;ll&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'ls -lah'&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'git status'&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'git commit'&lt;/span&gt;
&lt;span class="nb"&gt;alias&lt;/span&gt; ..&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'cd ..'&lt;/span&gt;
&lt;span class="nb"&gt;alias&lt;/span&gt; ...&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'cd ../..'&lt;/span&gt;

&lt;span class="c"&gt;# Safe file operations&lt;/span&gt;
&lt;span class="nb"&gt;alias rm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'rm -i'&lt;/span&gt;
&lt;span class="nb"&gt;alias cp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'cp -i'&lt;/span&gt;
&lt;span class="nb"&gt;alias mv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'mv -i'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reload with &lt;code&gt;source ~/.bashrc&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Leverage Tab Completion
&lt;/h2&gt;

&lt;p&gt;Most shells support tab completion for commands, files, and arguments. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type &lt;code&gt;cd Doc&lt;/code&gt; and press Tab to auto-complete to &lt;code&gt;cd Documents/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;With &lt;code&gt;git checkout&lt;/code&gt; press Tab twice to see branch names.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enable case-insensitive completion if needed:&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="nb"&gt;bind&lt;/span&gt; &lt;span class="s2"&gt;"set completion-ignore-case on"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Navigate with &lt;code&gt;cd&lt;/code&gt; and &lt;code&gt;pushd&lt;/code&gt;/&lt;code&gt;popd&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Stop typing long paths. Use &lt;code&gt;pushd&lt;/code&gt; and &lt;code&gt;popd&lt;/code&gt; to maintain a directory stack:&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="nb"&gt;pushd&lt;/span&gt; /var/log    &lt;span class="c"&gt;# save current dir and go to /var/log&lt;/span&gt;
&lt;span class="nb"&gt;popd&lt;/span&gt;              &lt;span class="c"&gt;# return to previous dir&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For quick jumps, use &lt;code&gt;cd -&lt;/code&gt; to toggle between two directories.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Search and Reuse Commands with History
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;history&lt;/code&gt; shows recent commands with numbers.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;!123&lt;/code&gt; re-runs command number 123.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;!!&lt;/code&gt; re-runs the last command (useful with &lt;code&gt;sudo !!&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + r&lt;/code&gt; triggers reverse search; type a keyword and press &lt;code&gt;Ctrl + r&lt;/code&gt; repeatedly to cycle through matches.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Process Management
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + z&lt;/code&gt;: Suspend the current foreground job.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fg&lt;/code&gt;: Resume the suspended job in the foreground.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bg&lt;/code&gt;: Resume it in the background.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;jobs&lt;/code&gt;: List all background jobs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: You start editing a file with vim, then press &lt;code&gt;Ctrl + z&lt;/code&gt;, run other commands, and type &lt;code&gt;fg&lt;/code&gt; to return to vim.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Use &lt;code&gt;grep&lt;/code&gt; and &lt;code&gt;find&lt;/code&gt; Efficiently
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;grep -r "pattern" .&lt;/code&gt; searches recursively in current directory.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;grep -rn "pattern" .&lt;/code&gt; adds line numbers.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;find . -name "*.py"&lt;/code&gt; finds Python files.&lt;/li&gt;
&lt;li&gt;Combine with &lt;code&gt;-exec&lt;/code&gt; to act on results: &lt;code&gt;find . -name "*.log" -exec rm {} \;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8. Pipe and Redirect Like a Pro
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;command1 | command2&lt;/code&gt;: Pipe output of command1 to command2.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;gt; file&lt;/code&gt; redirects stdout to file (overwrites).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;gt;&amp;gt; file&lt;/code&gt; appends stdout.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;2&amp;gt;&amp;amp;1&lt;/code&gt; merges stderr into stdout: &lt;code&gt;command &amp;gt; output.txt 2&amp;gt;&amp;amp;1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;amp;&amp;gt;&lt;/code&gt; is a bash shortcut: &lt;code&gt;command &amp;amp;&amp;gt; output.txt&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  9. Customize Your Prompt
&lt;/h2&gt;

&lt;p&gt;A useful prompt shows current directory, git branch, and exit status. Example for bash:&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;PS1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'\[\e[0;32m\]\u@\h \[\e[0;33m\]\w\[\e[0m\]$(__git_ps1 " (%s)") \$ '&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For zsh, use themes like &lt;code&gt;agnoster&lt;/code&gt; or &lt;code&gt;powerlevel10k&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Script Repetitive Tasks
&lt;/h2&gt;

&lt;p&gt;Instead of typing multiple commands, write a script. For example, a backup script:&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="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;backup_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/backups/&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y%m%d&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$backup_dir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; ~/Documents &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$backup_dir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Backup done to &lt;/span&gt;&lt;span class="nv"&gt;$backup_dir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save as &lt;code&gt;backup.sh&lt;/code&gt;, make executable with &lt;code&gt;chmod +x backup.sh&lt;/code&gt;, and run it whenever needed.&lt;/p&gt;

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

&lt;p&gt;These tips are easy to implement and will make you significantly faster in the terminal. Start with one or two, and gradually incorporate more. Happy hacking!&lt;/p&gt;

</description>
      <category>terminal</category>
      <category>productivity</category>
      <category>bash</category>
      <category>linux</category>
    </item>
    <item>
      <title>Markdown Tricks for Cleaner Docs</title>
      <dc:creator>Binary Journal</dc:creator>
      <pubDate>Wed, 22 Jul 2026 08:01:05 +0000</pubDate>
      <link>https://dev.to/binaryjournal/markdown-tricks-for-cleaner-docs-5gl5</link>
      <guid>https://dev.to/binaryjournal/markdown-tricks-for-cleaner-docs-5gl5</guid>
      <description>&lt;h2&gt;
  
  
  Markdown Tricks for Cleaner Docs
&lt;/h2&gt;

&lt;p&gt;I write a lot of documentation, and I've picked up some Markdown tricks that make my docs cleaner and more maintainable. Here are my top ones.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Use Definition Lists
&lt;/h3&gt;

&lt;p&gt;Instead of bullet points for key-value pairs, use a definition list. It's cleaner and more semantic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Term 1
: Definition 1

Term 2
: Definition 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Renders as:&lt;/p&gt;

&lt;p&gt;Term 1&lt;br&gt;
: Definition 1&lt;/p&gt;

&lt;p&gt;Term 2&lt;br&gt;
: Definition 2&lt;/p&gt;

&lt;p&gt;This is great for API parameters or configuration options.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Task Lists for Checklists
&lt;/h3&gt;

&lt;p&gt;Task lists are perfect for step-by-step guides or progress tracking.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; [x] Step 1: Install dependencies
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Step 2: Configure settings
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Step 3: Run the app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Renders as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[x] Step 1: Install dependencies&lt;/li&gt;
&lt;li&gt;[ ] Step 2: Configure settings&lt;/li&gt;
&lt;li&gt;[ ] Step 3: Run the app&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Collapsible Sections
&lt;/h3&gt;

&lt;p&gt;Long docs can be overwhelming. Use collapsible sections to hide details.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;details&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;Click to expand&lt;span class="nt"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;

Hidden content here.

&lt;span class="nt"&gt;&amp;lt;/details&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Renders as a clickable expand/collapse block.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Tables with Alignment
&lt;/h3&gt;

&lt;p&gt;Tables are great for structured data. Align columns for readability.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;| Left | Center | Right |
| :--- | :----: | ----: |
| 1    |   2    |     3 |
| 4    |   5    |     6 |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Renders as:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Left&lt;/th&gt;
&lt;th&gt;Center&lt;/th&gt;
&lt;th&gt;Right&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  5. Footnotes
&lt;/h3&gt;

&lt;p&gt;Footnotes keep the main text flowing while providing additional context.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Here is a statement that needs explanation[^1].

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;^1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="sx"&gt;This&lt;/span&gt; is the footnote content.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Renders with a superscript link and the footnote at the bottom.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Strikethrough for Deprecation
&lt;/h3&gt;

&lt;p&gt;When something is deprecated, use strikethrough to indicate it's outdated but keep the text visible.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;~~This feature is deprecated. Use the new API instead.~~
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Renders as: &lt;del&gt;This feature is deprecated. Use the new API instead.&lt;/del&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Inline HTML for Extra Control
&lt;/h3&gt;

&lt;p&gt;Sometimes Markdown isn't enough. Use inline HTML for custom styling or structure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color:red;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Warning:&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt; This is important.

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;align=&lt;/span&gt;&lt;span class="s"&gt;"center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Centered content
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works on most platforms, including GitHub and Dev.to.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Escape Characters
&lt;/h3&gt;

&lt;p&gt;If you need to display a Markdown character literally, escape it with a backslash.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="se"&gt;\*&lt;/span&gt;This is not italic&lt;span class="se"&gt;\*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Renders as: *This is not italic*&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Code Blocks with Titles
&lt;/h3&gt;

&lt;p&gt;Add a title to your code blocks for context.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
javascript:example.js&lt;br&gt;
console.log('Hello');&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
markdown&lt;/p&gt;

&lt;p&gt;On some platforms, this renders with a tab showing the filename.&lt;/p&gt;
&lt;h3&gt;
  
  
  10. Emoji Shortcodes
&lt;/h3&gt;

&lt;p&gt;Emojis add personality. Use shortcodes like &lt;code&gt;:smile:&lt;/code&gt; or &lt;code&gt;:warning:&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;:smile: This is a friendly note.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Renders as: 😄 This is a friendly note.&lt;/p&gt;

&lt;p&gt;These tricks have made my documentation cleaner and more user-friendly. Give them a try in your next project.&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>writing</category>
    </item>
    <item>
      <title>Mastering JSON: Tips for Confident Data Handling</title>
      <dc:creator>Binary Journal</dc:creator>
      <pubDate>Tue, 21 Jul 2026 00:01:18 +0000</pubDate>
      <link>https://dev.to/binaryjournal/mastering-json-tips-for-confident-data-handling-4ojo</link>
      <guid>https://dev.to/binaryjournal/mastering-json-tips-for-confident-data-handling-4ojo</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;JSON (JavaScript Object Notation) is everywhere. APIs, config files, databases, you name it. Yet many developers trip over the same basic pitfalls. Let's fix that with practical, no-nonsense advice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Know Your Types
&lt;/h2&gt;

&lt;p&gt;JSON supports only six types: string, number, boolean, null, object, and array. No dates, no undefined, no functions. If you need a date, use a string in ISO 8601 format (e.g., &lt;code&gt;"2025-03-15T10:30:00Z"&lt;/code&gt;). If you need a binary blob, use base64 encoding.&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isActive"&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;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tags"&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="s2"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"json"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"address"&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;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Berlin"&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;h2&gt;
  
  
  Validate Early, Validate Often
&lt;/h2&gt;

&lt;p&gt;Never trust external JSON. Always validate before use. In JavaScript, use &lt;code&gt;JSON.parse()&lt;/code&gt; inside a try-catch. In Python, use &lt;code&gt;json.loads()&lt;/code&gt; with proper error handling.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// JavaScript&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;safeParse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jsonString&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jsonString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid JSON:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;safe_parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json_string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json_string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSONDecodeError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid JSON: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Use Schema Validation for Complex Data
&lt;/h2&gt;

&lt;p&gt;For anything beyond a trivial structure, use a schema validator. JSON Schema is the standard. It catches missing fields, wrong types, and value constraints.&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;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://json-schema.org/draft-07/schema#"&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;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"properties"&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;"name"&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;"string"&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;"age"&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;"integer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"minimum"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&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;"email"&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;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"email"&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;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="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"email"&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;p&gt;In Python, use &lt;code&gt;jsonschema&lt;/code&gt; library. In JavaScript, use &lt;code&gt;ajv&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handle Missing Fields Gracefully
&lt;/h2&gt;

&lt;p&gt;Don't assume all fields exist. Use optional chaining (&lt;code&gt;?.&lt;/code&gt;) in JavaScript or &lt;code&gt;dict.get()&lt;/code&gt; in Python.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// JavaScript&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Unknown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python
&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;address&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;city&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Unknown&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pretty Print for Debugging
&lt;/h2&gt;

&lt;p&gt;When logging JSON, format it for readability. Both &lt;code&gt;JSON.stringify&lt;/code&gt; and &lt;code&gt;json.dumps&lt;/code&gt; support indentation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// JavaScript&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Avoid Common Pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trailing commas:&lt;/strong&gt; JSON does not allow them. Use a linter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single quotes:&lt;/strong&gt; JSON requires double quotes for strings and keys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comments:&lt;/strong&gt; JSON has no comments. Use a separate metadata field if needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nested depth:&lt;/strong&gt; Some parsers limit depth (e.g., 512 levels). Keep it shallow.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Serialize Custom Objects
&lt;/h2&gt;

&lt;p&gt;When converting custom objects to JSON, define a serialization method. In JavaScript, override &lt;code&gt;toJSON()&lt;/code&gt;. In Python, use a custom encoder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// JavaScript&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;toJSON&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserEncoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSONEncoder&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Use Streaming for Large Files
&lt;/h2&gt;

&lt;p&gt;For huge JSON files (gigabytes), don't load everything into memory. Use streaming parsers like &lt;code&gt;ijson&lt;/code&gt; (Python) or &lt;code&gt;stream-json&lt;/code&gt; (Node.js).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python with ijson
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ijson&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;large.json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ijson&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;item&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Working with JSON confidently means understanding its limitations, validating early, handling errors gracefully, and using the right tools for the job. These practices will save you hours of debugging and make your code more robust. Now go forth and parse with confidence!&lt;/p&gt;

</description>
      <category>json</category>
      <category>javascript</category>
      <category>python</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Day I Stopped Learning Frameworks (and Started Learning Engineering)</title>
      <dc:creator>Binary Journal</dc:creator>
      <pubDate>Mon, 13 Jul 2026 15:03:55 +0000</pubDate>
      <link>https://dev.to/binaryjournal/the-day-i-stopped-learning-frameworks-and-started-learning-engineering-fnf</link>
      <guid>https://dev.to/binaryjournal/the-day-i-stopped-learning-frameworks-and-started-learning-engineering-fnf</guid>
      <description>&lt;h1&gt;
  
  
  The More I Learn, the Less I Google Frameworks
&lt;/h1&gt;

&lt;p&gt;A few years ago, every new framework felt overwhelming.&lt;/p&gt;

&lt;p&gt;React.&lt;br&gt;
Vue.&lt;br&gt;
Svelte.&lt;br&gt;
Next.js.&lt;br&gt;
Nuxt.&lt;br&gt;
Remix...&lt;/p&gt;

&lt;p&gt;It never seemed to end.&lt;/p&gt;

&lt;p&gt;Then I realized something.&lt;/p&gt;

&lt;p&gt;The framework wasn't the hard part.&lt;/p&gt;

&lt;p&gt;The hard part was understanding the ideas behind it.&lt;/p&gt;

&lt;p&gt;Routing.&lt;br&gt;
State management.&lt;br&gt;
Rendering.&lt;br&gt;
HTTP.&lt;br&gt;
Caching.&lt;br&gt;
Databases.&lt;br&gt;
Concurrency.&lt;/p&gt;

&lt;p&gt;Once those concepts clicked, learning a new framework became surprisingly fast.&lt;/p&gt;

&lt;p&gt;Frameworks are different.&lt;/p&gt;

&lt;p&gt;The problems they solve usually aren't.&lt;/p&gt;

&lt;p&gt;That's why I spend less time asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which framework should I learn next?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And more time asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What problem is this framework trying to solve?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question has saved me hundreds of hours.&lt;/p&gt;

&lt;p&gt;Has there been one programming concept that suddenly made everything else easier?&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
    </item>
  </channel>
</rss>
