From the Blogs

Latest Posts

Deep dives for engineers who work with Linux, AWS, Kubernetes, and CI/CD.

Base64 Encoding Explained: What It Actually Does in Kubernetes Secrets, JWTs, and Basic Auth
Security

Base64 Encoding Explained: What It Actually Does in Kubernetes Secrets, JWTs, and Basic Auth

Base64 shows up everywhere in DevOps, including Kubernetes Secrets, JWT tokens, Basic Auth headers, and SSH keys, but it's encoding, not encryption. Here's what it actually does.

Read post →
Why Your Logs Show Epoch Timestamps Instead of Dates
Linux

Why Your Logs Show Epoch Timestamps Instead of Dates

Logging libraries record raw Unix epoch numbers instead of formatted dates on purpose. Here's why, and how to convert them back to a human-readable date.

How to Compare Two Terraform State Files Using JSON Diff
Development

How to Compare Two Terraform State Files Using JSON Diff

Terraform state files are JSON. Here's how to semantically diff them to understand exactly what changed between two states.

Kubernetes Secrets Are Base64, Not Encrypted: Here's What That Means
Kubernetes

Kubernetes Secrets Are Base64, Not Encrypted: Here's What That Means

Kubernetes Secret values are base64 encoded, not encrypted. Here's how that encoding works, why it isn't security, and how to decode and create Secrets safely.

Why You Should Never Paste Raw Logs Into ChatGPT or Claude
Security

Why You Should Never Paste Raw Logs Into ChatGPT or Claude

Pasting raw application logs into an AI chatbot can leak passwords, API keys, and PII. Here's how to sanitise logs before sharing them for debugging help.

AWS EventBridge Cron Isn't Unix Cron: Here's Where It Breaks
AWS

AWS EventBridge Cron Isn't Unix Cron: Here's Where It Breaks

EventBridge cron expressions look like Unix cron but use 6 fields, different day of week numbering, and ? wildcards. Here's every place that breaks and how to fix it.

Why Your /24 Subnet Only Has 251 Usable IPs (Not 254)
AWS

Why Your /24 Subnet Only Has 251 Usable IPs (Not 254)

AWS reserves 5 IPs per subnet, not 2. Here's the math everyone learned wrong, why it matters for EKS, and a full prefix to usable IP reference table.

Decoding a JWT Is Not Verifying It, and That Distinction Has Caused Real Breaches
Security

Decoding a JWT Is Not Verifying It, and That Distinction Has Caused Real Breaches

jwt.decode() and jwt.verify() are not the same function. The alg none attack has caused real authentication bypasses for a decade, including in 2026. Here's how it works and how to audit for it.

The .gitignore Patterns That Don't Do What You Think (Negation, Wildcards, and Directory Slashes)
Git

The .gitignore Patterns That Don't Do What You Think (Negation, Wildcards, and Directory Slashes)

Why an exception for one file inside an ignored folder doesn't work, what the leading and trailing slash actually mean, and how a double asterisk differs from a single one.

Why chmod 777 in Your Dockerfile Is a Code Smell (And What to Do Instead)
Docker

Why chmod 777 in Your Dockerfile Is a Code Smell (And What to Do Instead)

chmod 777 fixes Docker permission errors because it disables permissions entirely. Here's the actual cause, UID and GID mismatches, and the fix that doesn't open every file to every process.

The YAML Norway Problem and Other Implicit Type Coercions That Break Kubernetes Manifests
YAML

The YAML Norway Problem and Other Implicit Type Coercions That Break Kubernetes Manifests

YAML 1.1 turns NO into false, 1.10 into a float, and 0123 into octal, all without a syntax error. Here's every implicit type coercion that silently breaks Helm values and ConfigMaps.

Why Your docker run Command Works But the Equivalent Compose File Doesn't
Docker

Why Your docker run Command Works But the Equivalent Compose File Doesn't

Translating docker run flags to docker-compose.yml line by line misses the network topology itself. Here's why service discovery breaks and how to translate it correctly.