Developer

Build better.
Debug smarter.

Deep technical articles on APIs, security, debugging, and developer tooling.

✦ 130 Articles ✦ Updated Weekly ✦ Free to Read
✦ AI

✦ AI-powered — understands natural language

Cron Explainer Sep 5, 2026 Latest ✦

Why 0 0 1 * 1 Runs 63 Times a Year: The Cron OR Trap

Cron ORs the day-of-month and day-of-week fields, so 0 0 1 * 1 runs 63 times a year instead of once. That plus step-value gaps explains most cron scheduling bugs.

Read article
Bcrypt Generator Jun 22, 2026

bcrypt Work Factors Double With Each Increment — Here's How to Choose the Right One and Upgrade Existing Hashes

bcrypt's work factor doubles hashing time for every increment — work factor 10 is ~100ms, work factor 12 is ~400ms, work factor 14 is ~1.6 seconds. This exponential relationship is the design feature, not a side effect: when hardware gets faster, incrementing the work factor by 1 restores the original time cost. Here's how to choose the right factor, the opportunistic re-hash strategy for upgrading existing hashes without forcing logout, and how to read the work factor from a stored bcrypt hash string.

HTML Entities Jun 22, 2026

In UTF-8, Most HTML Entities Are Unnecessary — But These Five Still Are

HTML entities were invented to survive character encoding translation before UTF-8 was universal. In today's UTF-8 world, é and é are identical — but five entities (&, <, >, ", ') remain essential because they escape characters that have structural meaning in HTML, not encoding meaning. Here's which entities are legacy, which remain necessary, and why   is a special case that's about rendering behavior rather than encoding.

Timestamp Converter Jun 22, 2026

Unix Timestamps: Why 1970, What Happens Before It, and Why 2038 Still Matters for Some Systems

Unix timestamp 0 is January 1, 1970 — chosen somewhat arbitrarily by early Unix developers and now inherited by virtually every language, database, and API. Here's why negative timestamps (pre-1970) work in some systems and break in others, the Y2K38 problem's detailed mechanics (which embedded systems are still at risk), and why JavaScript's 13-digit millisecond timestamps cause a constant source of "date showing as 1970" bugs.

Hash Generator Jun 21, 2026

SHA-3 Exists Alongside SHA-2, Not Instead of It — The Architecture, Length Extension Vulnerability, and 2024 Usage Guide

SHA-3 was developed alongside SHA-2 — not because SHA-2 was broken, but as a precautionary hedge using a completely different design. SHA-2 uses Merkle-Damgård construction; SHA-3 uses a sponge construction. Here's the architectural difference, why Merkle-Damgård is vulnerable to length extension attacks (and how HMAC fixes it), why SHA-3 is immune to this by design, and a 2024 guide to which hash function to use for what purpose.

Random String Generator Jun 21, 2026

Random Strings for Test Data vs Security Tokens: The Difference That's Invisible in the Output

Generating a random string and generating a *secure* random string can look identical — but only one is safe as a session token or API key. Here's how CSPRNGs differ from standard PRNGs (Mersenne Twister can be fully reconstructed from 624 outputs), how alphabet choice affects entropy per character, why test data often needs structured fake data rather than random strings, and why "always use a CSPRNG" is often the simplest safe policy.

Cron Explainer Jun 19, 2026

Cron Doesn't Know What Timezone You Mean — The Server Timezone, Database Desync, and Kubernetes TimeZone Fix

A cron job at "0 9 * * *" doesn't run at 9 AM — it runs at 9 AM in whatever timezone the server is configured for, which may not match the timezone you're thinking in, your users' timezone, or your database's timestamp timezone. Here's the server timezone hidden dependency, why "send at 8 AM" is ambiguous without specifying a timezone, the database timestamp desync pattern, and the Kubernetes timeZone field that finally makes cron timezone-aware.

JSON Diff Jun 19, 2026

JSON Structural Diff Fundamentals: Why Key Order Doesn't Matter, Null Isn't "Missing," and Arrays Can Cascade

{"a":1,"b":2} and {"b":2,"a":1} represent identical data per the JSON spec — but a text-based diff would show them as completely different. Here's how structural diffing handles key-order (unordered per spec), numeric representation differences (1 vs 1.0), the genuine structural difference between null and a missing key, and why array reordering can cascade into multiple "changes" under positional comparison.

Color Converter Jun 18, 2026

Why the Same Color Looks Different on a MacBook vs a Standard Monitor — Color Spaces, P3, and oklch

P3 displays (iPhone, MacBook Pro) can show colors that are impossible to display on standard sRGB monitors — and designers working on P3 screens routinely create colors that look different (less vivid) for much of their audience. Here's what "color space" actually means (gamut + encoding), why the same RGB value looks different on sRGB vs P3 displays, how CSS Color Level 4's color() function handles wide gamut, and why oklch is replacing HSL for building perceptually consistent color systems.

JSON Diff Jun 18, 2026

Snapshot Testing Is Just JSON Diffing With Extra Steps — Here's Why That Explains Both Its Strengths and Its Noise

Snapshot testing is, underneath, just "save a JSON diff result and fail the test if it's not empty next time" — and seeing it this way explains both why snapshot tests catch bugs that assertion-based tests miss, and why they're notorious for generating noisy, rubber-stamped diffs. Here's how the snapshot-compare-update cycle works, why "everything changed" diffs from one intentional change lead to rubber-stamping, and why a genuine bug can hide among repetitive, expected diff entries.

HTML Entities Jun 17, 2026

Double Encoding: Why "&" Shows Up, and Why the "Quick Fix" Can Be Dangerous

"&" appearing on a webpage instead of "&" is one of the most common HTML-entity bugs — an ampersand encoded twice, because encoding got applied at multiple uncoordinated points in a pipeline. Here's why this happens, why "encode once, at output, as late as possible" is the fix, and why "fixing" double-encoding by removing encoding from the wrong stage can quietly turn a cosmetic bug into an XSS vulnerability.

Password Generator Jun 16, 2026

Why a Strong Password Isn't Enough: Credential Stuffing and the Case for Unique Passwords Everywhere

A password can be long, random, and never appear in any breach — and still get your account compromised, because the attack that actually breaks most accounts isn't guessing your password, it's trying a password that worked on a completely different site you used years ago. Here's how credential stuffing works, why password "strength" is irrelevant to this specific attack, and why a generator-plus-manager combination — making unique-per-site passwords practically achievable — directly closes this vector.

REST API Checker Jun 16, 2026

API Versioning: URL Paths, Headers, Query Strings, and Why "Just Change the Endpoint" Always Comes Back to Haunt You

The moment you release a public API, you've made an implicit promise to every client that depends on it: "this won't break." Versioning is how you keep that promise while still being able to evolve. Here's how URL path, Accept-header, and query-string versioning actually differ in practice, when each fits, and why the deprecation plan matters more than the versioning scheme itself.