{"id":4507,"date":"2026-10-04T04:52:43","date_gmt":"2026-10-04T02:52:43","guid":{"rendered":"https:\/\/nguenkam.com\/blog\/?p=4507"},"modified":"2026-10-04T04:56:38","modified_gmt":"2026-10-04T02:56:38","slug":"environment-variables-the-complete-beginners-guide","status":"publish","type":"post","link":"https:\/\/nguenkam.com\/blog\/index.php\/2026\/10\/04\/environment-variables-the-complete-beginners-guide\/","title":{"rendered":"Environment Variables \u2014 The Complete Beginner&#8217;s Guide"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote\"><p><em>No more hardcoded passwords. No more leaked API keys. Just clean, secure, professional code.<\/em><\/p><\/blockquote>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4>What is an Environment Variable?<\/h4>\n\n\n\n<p>Imagine you have a <strong>secret notebook<\/strong> that only your computer can read.<br>You write your passwords, API keys, and configuration values in it.<br>Your apps can look up those values anytime \u2014 without you writing them directly in your code.<\/p>\n\n\n\n<p>That notebook is your <strong>environment variables store<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"835\" height=\"344\" src=\"https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/10\/image.png\" alt=\"\" class=\"wp-image-4508\" srcset=\"https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/10\/image.png 835w, https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/10\/image-300x124.png 300w, https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/10\/image-768x316.png 768w\" sizes=\"(max-width: 835px) 100vw, 835px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4>How to Name Your Variables<\/h4>\n\n\n\n<h4>The standard convention: <code>SCREAMING_SNAKE_CASE<\/code><\/h4>\n\n\n\n<ul><li>All <strong>UPPERCASE<\/strong><\/li><li>Words separated by <strong>underscores<\/strong> <code>_<\/code><\/li><li>No spaces, no hyphens<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"836\" height=\"253\" src=\"https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/10\/image-1.png\" alt=\"\" class=\"wp-image-4509\" srcset=\"https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/10\/image-1.png 836w, https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/10\/image-1-300x91.png 300w, https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/10\/image-1-768x232.png 768w\" sizes=\"(max-width: 836px) 100vw, 836px\" \/><\/figure>\n\n\n\n<h3>The naming pattern: <code>SERVICE_CATEGORY_DETAIL<\/code><\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"820\" height=\"454\" src=\"https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/10\/image-2.png\" alt=\"\" class=\"wp-image-4510\" srcset=\"https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/10\/image-2.png 820w, https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/10\/image-2-300x166.png 300w, https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/10\/image-2-768x425.png 768w\" sizes=\"(max-width: 820px) 100vw, 820px\" \/><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><img loading=\"lazy\" width=\"29\" height=\"30\" class=\"wp-image-4352\" style=\"width: 29px;\" src=\"https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/04\/image-11.png\" alt=\"\" srcset=\"https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/04\/image-11.png 29w, https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/04\/image-11-24x24.png 24w\" sizes=\"(max-width: 29px) 100vw, 29px\" \/> <strong>Rule of thumb:<\/strong> Read it left to right \u2014 it should tell a story.<br><code>OPENAI_API_KEY<\/code> = <em>&#8220;The API key for OpenAI&#8221;<\/em> ?<\/p><\/blockquote>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4>How to Create an Environment Variable<\/h4>\n\n\n\n<h4>On Windows \u2014 CMD (Permanent)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><span class=\"has-inline-color has-vivid-red-color\"># setx = permanent, survives reboot<\/span>\nsetx OPENAI_API_KEY \"sk-proj-your-key-here\"\n\n# Success message:\n# ERFOLGREICH: Angegebener Wert wurde gespeichert.<\/code><\/pre>\n\n\n\n<h4>On Windows \u2014 CMD (Temporary, current session only)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><span class=\"has-inline-color has-vivid-red-color\"># set = temporary, lost when terminal closes<\/span>\nset OPENAI_API_KEY=sk-proj-your-key-here<\/code><\/pre>\n\n\n\n<h4>On macOS \/ Linux (Permanent)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Add to your shell profile (~\/.bashrc or ~\/.zshrc)\necho 'export OPENAI_API_KEY=\"sk-proj-your-key-here\"' &gt;&gt; ~\/.zshrc\n\n# Reload the profile\nsource ~\/.zshrc<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><img loading=\"lazy\" width=\"33\" height=\"36\" class=\"wp-image-4297\" style=\"width: 33px;\" src=\"https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/04\/image.png\" alt=\"\"> <strong>Important on Windows with <code>setx<\/code>:<\/strong><br>The variable is saved, but <strong>NOT available in the current terminal<\/strong>.<br>You must <strong>close and reopen<\/strong> a new terminal to use it.<\/p><\/blockquote>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4>How to Read \/ Verify a Variable<\/h4>\n\n\n\n<h4>In CMD (Windows)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Read one specific variable\necho %OPENAI_API_KEY%\n# -> sk-proj-abc123...\n\n# Search all variables starting with \"OPENAI\"\nset OPENAI\n# -> OPENAI_API_KEY=sk-proj-abc123...\n\n# List ALL environment variables\nset<\/code><\/pre>\n\n\n\n<h4>In PowerShell<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Read one variable\n$env:OPENAI_API_KEY\n# -> sk-proj-abc123...\n\n# List all variables\nGet-ChildItem Env:\n\n# Filter by name\nGet-ChildItem Env: | Where-Object { $_.Name -like \"OPENAI*\" }<\/code><\/pre>\n\n\n\n<h4>In Git Bash \/ Linux \/ macOS<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Read one variable\necho $OPENAI_API_KEY\n# -> sk-proj-abc123...\n\n# List all variables\nenv\n\n# Filter with grep\nenv | grep OPENAI<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4>How to Use a Variable in Your Code<\/h4>\n\n\n\n<h4>Java (Spring Boot)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Read directly from the system\nString apiKey = System.getenv(\"OPENAI_API_KEY\");<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Or inject via Spring @Value\n@Value(\"${OPENAI_API_KEY}\")\nprivate String apiKey;<\/code><\/pre>\n\n\n\n<h4>TypeScript \/ JavaScript (Node.js)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Read from environment\nconst apiKey = process.env.OPENAI_API_KEY;\n\n\/\/ With a fallback default value\nconst apiKey = process.env.OPENAI_API_KEY ?? 'default-key';<\/code><\/pre>\n\n\n\n<h4>Python<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>import os\n\napi_key = os.getenv(\"OPENAI_API_KEY\")\n# or\napi_key = os.environ&#91;\"OPENAI_API_KEY\"]<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4>How to Use Variables in Config Files<\/h4>\n\n\n\n<h4>In a <code>.env<\/code> file (most common approach)<\/h4>\n\n\n\n<p>Create a <code>.env<\/code> file at the root of your project:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># .env\nOPENAI_API_KEY=sk-proj-your-key-here\nDATABASE_URL=postgres:\/\/user:password@localhost:5432\/mydb\nJWT_SECRET=my-super-secret-token\nPORT=3000<\/code><\/pre>\n\n\n\n<p><img loading=\"lazy\" width=\"33\" height=\"36\" class=\"wp-image-4297\" style=\"width: 33px;\" src=\"https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/04\/image.png\" alt=\"\"> <strong>NEVER commit <code>.env<\/code> to Git!<\/strong><br>Always add it to <code>.gitignore<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \".env\" &gt;&gt; .gitignore<\/code><\/pre>\n\n\n\n<h4>In VSCode <code>settings.json<\/code><\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"chatgpt.gpt3.apiKey\": \"${env:OPENAI_API_KEY}\"\n}<\/code><\/pre>\n\n\n\n<h4>In a Spring Boot <code>application.yml<\/code><\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>openai:\n  api-key: ${OPENAI_API_KEY}\n\nspring:\n  datasource:\n    url: ${DATABASE_URL}\n    password: ${DATABASE_PASSWORD}<\/code><\/pre>\n\n\n\n<h4>In a Docker <code>docker-compose.yml<\/code><\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>services:\n  app:\n    image: my-app\n    environment:\n      - OPENAI_API_KEY=${OPENAI_API_KEY}\n      - DATABASE_URL=${DATABASE_URL}<\/code><\/pre>\n\n\n\n<h4>In a Kubernetes \/ OpenShift Secret<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: v1\nkind: Secret\nmetadata:\n  name: app-secrets\ntype: Opaque\nstringData:\n  OPENAI_API_KEY: \"sk-proj-your-key-here\"<\/code><\/pre>\n\n\n\n<p>Then reference it in your deployment:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>env:\n  - name: OPENAI_API_KEY\n    valueFrom:\n      secretKeyRef:\n        name: app-secrets\n        key: OPENAI_API_KEY<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4><span class=\"has-inline-color has-vivid-cyan-blue-color\"><strong>The Full Workflow \u2014 From Creation to Usage<\/strong><\/span><\/h4>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"831\" height=\"455\" src=\"https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/10\/image-4.png\" alt=\"\" class=\"wp-image-4514\" srcset=\"https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/10\/image-4.png 831w, https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/10\/image-4-300x164.png 300w, https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/10\/image-4-768x421.png 768w\" sizes=\"(max-width: 831px) 100vw, 831px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4><span class=\"has-inline-color has-vivid-cyan-blue-color\"><strong>Security Best Practices<\/strong><\/span><\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><img loading=\"lazy\" width=\"37\" height=\"31\" class=\"wp-image-4066\" style=\"width: 37px;\" src=\"https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2025\/10\/image-4.png\" alt=\"\"> DO<\/th><th><img loading=\"lazy\" width=\"28\" height=\"26\" class=\"wp-image-4300\" style=\"width: 28px;\" src=\"https:\/\/nguenkam.com\/blog\/wp-content\/uploads\/2026\/04\/cancel.png\" alt=\"\"> DON&#8217;T<\/th><\/tr><\/thead><tbody><tr><td>Store secrets in env variables<\/td><td>Hardcode secrets in source code<\/td><\/tr><tr><td>Add <code>.env<\/code> to <code>.gitignore<\/code><\/td><td>Commit <code>.env<\/code> to Git<\/td><\/tr><tr><td>Use Vault or K8s Secrets in production<\/td><td>Use <code>setx<\/code> in production servers<\/td><\/tr><tr><td>Rotate keys regularly<\/td><td>Share keys in Slack \/ email<\/td><\/tr><tr><td>Use different keys per environment<\/td><td>Use the same key in dev &amp; prod<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4>Real-World Examples<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Variable Name<\/th><th>What it stores<\/th><\/tr><\/thead><tbody><tr><td><code>OPENAI_API_KEY<\/code><\/td><td>OpenAI API secret key<\/td><\/tr><tr><td><code>DATABASE_URL<\/code><\/td><td>PostgreSQL full connection string<\/td><\/tr><tr><td><code>DATABASE_PASSWORD<\/code><\/td><td>Database password only<\/td><\/tr><tr><td><code>VAULT_TOKEN<\/code><\/td><td>HashiCorp Vault auth token<\/td><\/tr><tr><td><code>ARGOCD_AUTH_TOKEN<\/code><\/td><td>ArgoCD API token<\/td><\/tr><tr><td><code>JWT_SECRET<\/code><\/td><td>JWT signing secret<\/td><\/tr><tr><td><code>AWS_ACCESS_KEY_ID<\/code><\/td><td>AWS access key<\/td><\/tr><tr><td><code>SPRING_PROFILES_ACTIVE<\/code><\/td><td>Active Spring Boot profile (dev\/prod)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4>Key Takeaways<\/h4>\n\n\n\n<ol><li><strong>Environment variables = your app&#8217;s secret notebook<\/strong><\/li><li><strong><code>setx<\/code><\/strong> = permanent on Windows \/ <strong><code>export<\/code><\/strong> = permanent on Linux\/Mac<\/li><li><strong>Always close and reopen<\/strong> your terminal after <code>setx<\/code><\/li><li><strong><code>set OPENAI<\/code><\/strong> is just a search filter \u2014 the real name is <code>OPENAI_API_KEY<\/code><\/li><li><strong>Never hardcode secrets<\/strong> \u2014 if it&#8217;s sensitive, it belongs in an env variable<\/li><\/ol>\n","protected":false},"excerpt":{"rendered":"<p>No more hardcoded passwords. No more leaked API keys. Just clean, secure, professional code. What is an Environment Variable? Imagine you have a secret notebook that only your computer can read.You write your passwords, API keys, and configuration values in it.Your apps can look up those values anytime \u2014 without you writing them directly in [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4512,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1038,953,221],"tags":[172,1175,1174,93,238,1172,1171,527,1173,927,1176],"_links":{"self":[{"href":"https:\/\/nguenkam.com\/blog\/index.php\/wp-json\/wp\/v2\/posts\/4507"}],"collection":[{"href":"https:\/\/nguenkam.com\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nguenkam.com\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nguenkam.com\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nguenkam.com\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=4507"}],"version-history":[{"count":5,"href":"https:\/\/nguenkam.com\/blog\/index.php\/wp-json\/wp\/v2\/posts\/4507\/revisions"}],"predecessor-version":[{"id":4518,"href":"https:\/\/nguenkam.com\/blog\/index.php\/wp-json\/wp\/v2\/posts\/4507\/revisions\/4518"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nguenkam.com\/blog\/index.php\/wp-json\/wp\/v2\/media\/4512"}],"wp:attachment":[{"href":"https:\/\/nguenkam.com\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=4507"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nguenkam.com\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=4507"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nguenkam.com\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=4507"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}