Software development blog

It works on
my machine.
Let's ship it.

Guides, dev tools, and tutorials written by a working developer, for working developers.

12+
Years online
800+
Articles
1M+
Devs helped
// Latest
Why HTML-in-Canvas Is Big News How to Use Vite Environment Variables Without Leaking Secrets How to Use the Web Locks API to Stop Duplicate Browser Jobs How to Use Intl.DurationFormat How to Set Up Fathom Analytics in Your Web Apps Use Node's Built-In SQLite For Local App Features Build a Chrome Extension That Saves Text Snippets From Any Page How to Use UUIDv7 in PostgreSQL 18 How To Prepare Your Web App For Chrome’s Two-Week Release Cycle How To Try Node.js 26 Temporal Without Breaking Your Date Code IBM launches an AI platform called Bob GitHub Copilot's New Pricing Model Has Got Some Developers Worried Why AI-Assisted Development Needs Video Receipts What actually went down with Claude Mythos GitHub Copilot vs Claude Code: Which Is Right for You? The 3D Web That Never Happened Why HTML-in-Canvas Is Big News How to Use Vite Environment Variables Without Leaking Secrets How to Use the Web Locks API to Stop Duplicate Browser Jobs How to Use Intl.DurationFormat How to Set Up Fathom Analytics in Your Web Apps Use Node's Built-In SQLite For Local App Features Build a Chrome Extension That Saves Text Snippets From Any Page How to Use UUIDv7 in PostgreSQL 18 How To Prepare Your Web App For Chrome’s Two-Week Release Cycle How To Try Node.js 26 Temporal Without Breaking Your Date Code IBM launches an AI platform called Bob GitHub Copilot's New Pricing Model Has Got Some Developers Worried Why AI-Assisted Development Needs Video Receipts What actually went down with Claude Mythos GitHub Copilot vs Claude Code: Which Is Right for You? The 3D Web That Never Happened

Latest Articles

Browse all
HTML-in-Canvas is big news because it targets one of the worst tradeoffs in web development: canvas gives you powerful rendering, but once you draw your UI there, you lose a lot of normal browser behavior. Chrome's experimental origin trial points toward a better model where a canvas app can draw real HTML while keeping browser-managed text, controls, focus, accessibility, and interaction.
vite
In Vite, a variable that starts with `VITE_` is public browser configuration, not a secret. Vite exposes it through `import.meta.env` and bundles it into client-side code at build time, so use `VITE_` for values like API base URLs, keep real secrets on the server, and only use `loadEnv()` when `.env` values need to shape `vite.config.*`.
javascript
Use the Web Locks API when the same web app can be open in multiple tabs and only one tab or worker should run a browser-side job at a time. It is a clean fit for sync jobs, cache refreshes, IndexedDB maintenance, and polling loops that should not stampede just because the user opened your app twice.
javascript
Use `Intl.DurationFormat` when your app needs labels like `1 hr, 4 min`, `1:04:09`, or localized equivalents. Keep the duration math in your code, pass a plain duration object to `new Intl.DurationFormat(locale, options).format(duration)`, and stop maintaining English-only string helpers for timers, dashboards, media lengths, and elapsed-time UI.
analytics
Fathom Analytics can start with one script tag. That is part of its charm. But a useful analytics setup still needs engineering judgment: where the script loads, how client-side routes become pageviews, which actions deserve events, and how to keep your own staging traffic out of production reports.
sql
Not every database problem deserves a robust database server. Sometimes you just need a small, durable place to put local state: saved links, CLI cache rows, sync checkpoints, desktop app preferences, integration-test fixtures, or a tiny job queue that only one process owns.

Developer Tools

All tools

Browse by Topic

// Color Theme

Custom accent
Pick any color
for the accent