{"count":26,"posts":[{"slug":"claude-haiku-5-5-pricing-effort-migration","title":"Claude Haiku 5.5: pricing, effort levels and migration","summary":"Claude Haiku 5.5 is Anthropic's cheap, fast model with a 1M context and adjustable effort. What it costs, how effort works and what breaks when you migrate.","date":"2026-10-15","tags":["AI","LLMs","Anthropic","APIs"],"readingMinutes":7,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/claude-haiku-5-5-pricing-effort-migration.webp"},{"slug":"javascript-text-modules-import-with-type-text","title":"JavaScript text modules: import files as strings with type text","summary":"JavaScript text modules let you import a .txt, .sql or shader file as a plain string with type: \"text\". Here is how they work and where they run.","date":"2026-10-14","tags":["JavaScript","Web Platform","Node.js"],"readingMinutes":6,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/javascript-text-modules-import-with-type-text.webp"},{"slug":"exponential-backoff-with-jitter-retry-strategy","title":"Exponential backoff with jitter: retries that don't cause outages","summary":"Exponential backoff with jitter spreads out retries so failed clients don't hammer a recovering service. How it works, which jitter to use, and what to retry.","date":"2026-10-13","tags":["Scaling","Reliability","Architecture"],"readingMinutes":7,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/exponential-backoff-with-jitter-retry-strategy.webp"},{"slug":"embeddinggemma-2-open-multimodal-embedding-model","title":"EmbeddingGemma 2: Google's open multimodal embedding model","summary":"EmbeddingGemma 2 embeds text, code, images, audio and video in one space and runs on-device. How it works, task prefixes, and Matryoshka sizes.","date":"2026-10-12","tags":["AI","Embeddings","RAG","Open Models"],"readingMinutes":6,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/embeddinggemma-2-open-multimodal-embedding-model.webp"},{"slug":"javascript-fetch-does-not-reject-on-404-500","title":"Why fetch() doesn't reject on 404 or 500, and how to fix it","summary":"JavaScript fetch() resolves on 404 and 500 errors, so your catch block never runs. Here's why, and a small wrapper that checks response.ok properly.","date":"2026-10-11","tags":["JavaScript","Node.js","Debugging"],"readingMinutes":6,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/javascript-fetch-does-not-reject-on-404-500.webp"},{"slug":"arianotify-screen-reader-announcements-without-live-regions","title":"ariaNotify(): screen reader announcements without live regions","summary":"ariaNotify() lets you make screen readers speak from JavaScript with one call, no hidden live region needed. Here is how it works and when to use it.","date":"2026-10-10","tags":["Accessibility","Web Platform","JavaScript"],"readingMinutes":6,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/arianotify-screen-reader-announcements-without-live-regions.webp"},{"slug":"consistent-hashing-how-it-works-virtual-nodes","title":"Consistent hashing: how it works and why virtual nodes matter","summary":"Consistent hashing lets you add or remove cache servers while moving only a small share of keys. Here is how the ring, virtual nodes and hash slots work.","date":"2026-10-09","tags":["Scaling","Caching","Architecture"],"readingMinutes":6,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/consistent-hashing-how-it-works-virtual-nodes.webp"},{"slug":"openai-ultrafast-mode-gpt-6-astra-service-tier","title":"OpenAI Ultrafast mode: how the GPT-6 Astra tier works","summary":"OpenAI Ultrafast mode makes GPT-6 Astra stream output up to several times faster at six times the price. How it works, what it costs and when to use it.","date":"2026-10-08","tags":["AI","LLMs","OpenAI","Performance"],"readingMinutes":6,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/openai-ultrafast-mode-gpt-6-astra-service-tier.webp"},{"slug":"javascript-using-declaration-explicit-resource-management","title":"JavaScript using: automatic resource cleanup with Symbol.dispose","summary":"JavaScript's using declaration runs cleanup automatically when a scope ends. How Symbol.dispose, await using and DisposableStack work, and where it runs.","date":"2026-10-07","tags":["JavaScript","Node.js","Web Platform"],"readingMinutes":6,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/javascript-using-declaration-explicit-resource-management.webp"},{"slug":"rate-limiting-algorithms-token-bucket-vs-sliding-window","title":"Rate limiting algorithms: token bucket vs sliding window","summary":"How rate limiting algorithms work: fixed window, sliding window and token bucket, where each one leaks bursts, and which to pick for your API.","date":"2026-10-06","tags":["Scaling","Architecture","APIs"],"readingMinutes":7,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/rate-limiting-algorithms-token-bucket-vs-sliding-window.webp"},{"slug":"cloudflare-clef-decision-models-workers-ai","title":"Cloudflare Clef: decision models for AI agents on Workers AI","summary":"Cloudflare Clef is an open-weight decision model that returns calibrated probabilities instead of text. How it works and when to use it over an LLM.","date":"2026-10-05","tags":["AI","LLMs","Cloudflare","Agents"],"readingMinutes":6,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/cloudflare-clef-decision-models-workers-ai.webp"},{"slug":"javascript-array-sort-numbers-wrong-order","title":"Why JavaScript sort() puts 10 before 9, and how to fix it","summary":"JavaScript's array sort() orders numbers as strings, so 10 lands before 9. Here's why, the comparator fix, and the a > b trap that sorts nothing.","date":"2026-10-04","tags":["JavaScript","Arrays","Debugging"],"readingMinutes":6,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/javascript-array-sort-numbers-wrong-order.webp"},{"slug":"html-invoker-commands-command-commandfor","title":"HTML invoker commands: open dialogs without JavaScript","summary":"HTML invoker commands let a button open dialogs and toggle popovers with commandfor and command. How they work, custom commands, and the form gotcha.","date":"2026-10-03","tags":["HTML","Web Platform","Accessibility"],"readingMinutes":5,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/html-invoker-commands-command-commandfor.webp"},{"slug":"cache-stampede-how-to-prevent-thundering-herd","title":"Cache stampede: how to prevent the thundering herd","summary":"A cache stampede hits your database when a hot key expires. How request coalescing, locks, early refresh and stale-while-revalidate stop it.","date":"2026-10-02","tags":["Caching","Scaling","Architecture"],"readingMinutes":7,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/cache-stampede-how-to-prevent-thundering-herd.webp"},{"slug":"gpt-6-prompt-caching-explicit-breakpoints","title":"GPT-6 prompt caching: breakpoints, pricing and cache misses","summary":"How GPT-6 prompt caching works: explicit breakpoints, the 30-minute TTL, 1.25x writes vs 0.1x reads, and how to change tools or effort without a cache miss.","date":"2026-10-01","tags":["AI","LLMs","OpenAI","Performance"],"readingMinutes":6,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/gpt-6-prompt-caching-explicit-breakpoints.webp"},{"slug":"sql-not-in-subquery-null-returns-no-rows","title":"SQL NOT IN returns no rows when the subquery has a NULL","summary":"One NULL in the subquery and SQL NOT IN returns no rows at all. No error, no warning. Here is why, and why NOT EXISTS is the fix.","date":"2026-09-29","tags":["PostgreSQL","SQL","Debugging"],"readingMinutes":5,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/sql-not-in-subquery-null-returns-no-rows.webp"},{"slug":"javascript-new-date-string-off-by-one-day","title":"Why new Date('2026-09-30') shows the wrong day in JavaScript","summary":"A date-only string is parsed as UTC midnight, a date-time string as local time. Half the world sees yesterday, and India never notices.","date":"2026-09-28","tags":["JavaScript","Dates","Debugging"],"readingMinutes":4,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/javascript-new-date-string-off-by-one-day.webp"},{"slug":"javascript-temporal-api-how-to-use-it-now","title":"The JavaScript Temporal API: what it is and how to use it now","summary":"The JavaScript Temporal API reached Stage 4 and ships in Chrome, Firefox and Node 26. Here are its types, the DST rules, and how to migrate from Date.","date":"2026-09-26","tags":["JavaScript","Dates","Web Platform"],"readingMinutes":6,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/javascript-temporal-api-how-to-use-it-now.webp"},{"slug":"matter-js-preventdefault-traps-page-scroll","title":"Matter.js calls preventDefault on every touch, and traps your page","summary":"A physics toy on a phone stopped the page scrolling. Not when you touched an object — when you touched anywhere near it.","date":"2026-08-06","tags":["JavaScript","Mobile","Canvas"],"readingMinutes":2,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/matter-js-preventdefault-traps-page-scroll.webp"},{"slug":"a-portalled-dialog-does-not-fire-reacts-onclose","title":"A portalled <dialog> does not fire React's onClose","summary":"Closing the modal left the app permanently frozen. The event was firing. React just was not listening for it.","date":"2026-07-30","tags":["React","Accessibility","Debugging"],"readingMinutes":2,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/a-portalled-dialog-does-not-fire-reacts-onclose.webp"},{"slug":"multi-tenant-isolation-belongs-in-the-data-layer","title":"Multi-tenant isolation belongs in the data layer, not in every query","summary":"One endpoint missing a WHERE clause shows one customer another customer's drafts. You find out from the customer.","date":"2026-07-23","tags":["SaaS","PostgreSQL","Architecture"],"readingMinutes":2,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/multi-tenant-isolation-belongs-in-the-data-layer.webp"},{"slug":"designing-for-a-spike-not-an-average","title":"Designing for the spike, not the average","summary":"A platform that is quiet for days and then serves an entire region inside two minutes. The load shape decided the architecture before any feature did.","date":"2026-07-16","tags":["Architecture","AWS","Scaling"],"readingMinutes":2,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/designing-for-a-spike-not-an-average.webp"},{"slug":"cloudflare-workers-assets-caching-default","title":"Cloudflare was revalidating every hashed asset on every page load","summary":"Workers Assets ships a default cache header that is correct for hand-written files and wrong for every file a bundler emits.","date":"2026-07-09","tags":["Cloudflare","Performance","Deployment"],"readingMinutes":2,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/cloudflare-workers-assets-caching-default.webp"},{"slug":"setpointercapture-on-pointerdown-kills-your-click","title":"setPointerCapture on pointerdown silently kills every click","summary":"A draggable marquee where none of the cards were clickable. The drag code was correct. It was one line, in the wrong handler.","date":"2026-07-02","tags":["JavaScript","UI","Debugging"],"readingMinutes":2,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/setpointercapture-on-pointerdown-kills-your-click.webp"},{"slug":"never-trust-the-delta-your-frame-loop-hands-you","title":"Never trust the delta your frame loop hands you","summary":"An unclamped frame delta made a WebGL hero teleport instead of resume, and pushed an interpolation past its target into negative values.","date":"2026-06-25","tags":["Animation","Performance","WebGL"],"readingMinutes":2,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/never-trust-the-delta-your-frame-loop-hands-you.webp"},{"slug":"overflow-x-auto-makes-a-vertical-scroll-container","title":"overflow-x: auto quietly makes a vertical scroll container too","summary":"Three full-bleed carousels on a phone ate every upward swipe. The cause was one line of CSS that does something the property name does not say.","date":"2026-06-18","tags":["CSS","Mobile","Debugging"],"readingMinutes":2,"coverUrl":"https://cdn.syedtasavour.com/covers/v2/overflow-x-auto-makes-a-vertical-scroll-container.webp"}]}