All posts
17 posts, newest first. Back to the blog
2026
- The 3 Basic Web Attacks: How SQL Injection, XSS, and CSRF Work and How to Stop Them
- Designing API Error Responses: Unifying Inconsistent Errors with RFC 9457 Problem Details
- CORS Errors Explained: Why Requests Get Blocked and How to Fix Preflight and Credentials Correctly
- A Practical Guide to the CSS :has() Selector: Selecting Parents Without JavaScript
- Things HTML Can Do Without JavaScript: Stop Building Everything Out of divs
- Using HTTP Caching Correctly: Cache-Control, ETag, and no-cache vs no-store
- Using HTTP Status Codes Correctly: 400 vs 422, 401 vs 403, and 200 vs 201 vs 204
- Handling Async Errors in JavaScript Correctly: From What try/catch Misses to Promise.all vs allSettled
- The JavaScript Event Loop Explained: How Microtasks and Macrotasks Are Ordered
- JavaScript Higher-Order Functions Explained: From map, filter, and reduce to Building once and memoize
- JavaScript ?? vs ||: How to Handle null, undefined, 0, and Empty Strings Correctly
- JWT vs Session Authentication: Which Should You Use? Storage, Logout, and Security Compared
- Graceful Shutdown in Node.js: Why Requests Drop Every Time You Deploy
- Writing Meaningful HTML: 7 Semantic HTML Mistakes Almost Everyone Makes
- Nuxt Content v3 queryCollection() Returns Empty on Vercel (But Works Locally)
- Nuxt 3 useAsyncData Caching Bug: Why Every Post Shows the Same Content
- Why Your Vue Query Data Doesn't Show Up in Nuxt 3 (the ref unwrapping trap)