DevIdiot!
Advanced Server-Side Caching Patterns in Next.js: A Deep Dive into Data Cache, Full Route Cache, and Revalidation Strategies
Originally published on tamiz.pro.Next.js 15's App Router ships with four distinct caching layers, and confusing them is the single most common source of stale data, memory leaks, and mysterious 404s in production. This deep dive maps every layer — Request Memoization, the Data Cache, the Full Route Cache, and the Router Cache — then walks through the advanced patterns that actually work in production: tag-based invalidation, unstable_cache with custom keys, time-based revalidation (ISR), and ca
Your UI should tell you what's going on
I opened a budget app last month to check one number, how much I had left to spend, and I could not find it. The balance was on one screen, the spending was on another, and the budget was a third screen with a tiny progress bar I had to squint at. I knew the data was in there somewhere, the app had it, it just was not showing me. I closed it and did the math in my head instead, which is the exact moment a UI has failed at its job.I keep coming back to a line from Ben Halpern's post, ask more of
Why map() inside map() is how grouped lists work
The first version of the SeatFinder seating chart was one long flat list. Eighty guests, each row with a name and a table number in parentheses, sorted by table. It worked, technically. It also looked like a spreadsheet that had lost its will to live, and finding your own table meant scanning the whole page. A seating chart is not a list of guests. It is a list of tables, and each table has its own list of guests, and the page should look like that.The fix was a map inside a map. It felt weird t
GitHub's new PR overview puts the merge answer first
I merged three pull requests today. A data table post, a retitle, and another retitle, all on the portfolio repo. Every one of them followed the same little ritual. Open the PR, scroll past the description, scroll past the comments, keep scrolling, and somewhere near the bottom, find the merge box and check whether it is green. I do that over and over across four repos, and it always felt backwards, like checking whether the front door is locked by walking to the back of the house first.GitHub s
Meet Lenso UI.
<p>Meet Lenso UI.</p><p>Bringing the design language and interactions of iOS and iPadOS to the web.</p><p>Glass materials. Elastic feedback. Fluid menus.</p><p>Built with Base UI + StyleX.</p><p>Try it: <a href="https://ui.lenso.dev" rel="noopener noreferrer">https://ui.lenso.dev</a><br>Source: <a href="https://github.com/LioRael/lenso-ui" rel="noopener noreferrer">https://github.com/LioRael/lenso-ui</a></p>
Base64 Is Not Encryption: A Practical Guide for Text and Small Files
Base64 often appears in places that make it look more mysterious than it is: API payloads, email attachments, Data URLs, configuration files, and token segments.It is easy to mistake a long Base64 string for protected data. It is not protected. Base64 is an encoding that represents bytes with printable text characters. Anyone who has the value can decode it.That distinction matters when you are handling text, small files, or values that might contain secrets. What Base64 actually doesComput
Balloon Payments in TypeScript: How to Keep the Final Balance Correct
A balloon loan does not make part of the principal disappear. It moves it to the end of the schedule.That sounds obvious, but it leads to a surprisingly common implementation bug: code calculates a lower regular payment, then treats the balloon as if it were a separate expense that does not affect the amortization math. The result can be a schedule that looks plausible for 35 months and leaves the wrong balance in month 36.This article builds a monthly, fixed-rate balloon schedule in TypeScript.
Stripe webhook timed out? Return a 2xx first, then do the heavy work in a queue
A webhook handler often does everything inside the request: verify the event, update the database, send the email, call another API, and only then answer. On a quiet day that finishes in time. On a busy one, or when a downstream service is slow, the response arrives late and Stripe's delivery log shows a timeout.This post covers what that status means, what Stripe says the handler should do first, how to move the slow part into a queue, and how to catch up on events that failed in the meantime.
JSON-LD for Contractor Websites: Schema Markup That Makes Service Pages Machine-Readable
If you build or maintain websites for trades businesses, such as painters, roofers or flooring installers, you'll get asked to "do the SEO stuff," and these days to "make us show up in ChatGPT." Structured data is one of the few parts of that request that's concrete, testable and fully under your control.This post is a practical reference: which schema.org types fit contractors, a working JSON-LD pattern for a company with several service pages, what to do when the business doesn't publish a str
I built a dental clinic website template with Next.js 16 — 5 things that bit me
I spent the last couple of weeks building a website template for dental clinics, mostly to learn the Next.js 16 App Router properly: static rendering with next-intl, next/og, the new proxy.ts, Tailwind 4. The free version is MIT on GitHub, the full one has booking, a gallery and a second language.Free lite (MIT): https://github.com/aivnaov123/lumen-dental-liteLive demo of the full version: https://lumen-dental-demo-brown.vercel.appHere are the five things that cost me the most time, so they don'
Building Redaktix: A Zero-Server, Browser-Local PDF & Document Redaction Tool
Last tax season, I needed to redact sensitive details from a W-2 form and a bank statement before sending them to a landlord. I tried several "free online redaction tools," but every single one required uploading my sensitive documents to an external server. That felt completely backwards for documents whose whole point is privacy.So I built Redaktix—a browser-local document redaction tool where your files never touch a server. 🛡️ How It Works (Tech Stack)100% Client-Side: Everything runs l
I run 38 PDF tools with no server. Here is where the work went instead.
When you merge two PDFs on most websites, your files go to someone's server, get processed there, and come back. I built PDFRoll the other way around: 38 tools, static pages, and nothing that processes a file anywhere but in your own browser tab.That sounds like a privacy feature, and it is. But it is mostly an architecture decision, and it moved the hard problems to places I did not expect. This post is about those places. What "no server" means hereThe site is static HTML on a CDN. The PD
Benchmarking n8n Workflow Execution: Throughput, Memory Overhead, and p99 Latency Under Load
Benchmarking n8n Workflow Execution: Throughput, Memory Overhead, and p99 Latency Under LoadWhen evaluating n8n-io/n8n for production workflow automation, the critical question isn't feature count—it's whether the runtime can sustain concurrent executions without degrading response times or exhausting memory. We ran a three-phase load test against a self-hosted n8n instance (v1.23.0, Node.js 20.11, 4-core/8GB VPS) to establish baseline metrics for workflow throughput, memory stability, and
Exchange Rate API Unit Testing: Mocks, Fixtures and Contract Tests
Code that depends on live FX is awkward to test. The rate changes every minute, the network may be down in CI, and a test that asserts 0.9215 passes today and fails tomorrow. This guide shows how to test exchange rate API code properly: inject a rate provider, use fixtures with the real response shape, mock HTTP in Vitest or Jest with msw and in Python with responses, cover the 401 and 429 paths, and run one contract test against the real API every night. Rule one: never assert on live valu
Free Exchange Rate API Key: How to Hide It Behind a Proxy
You got a free exchange rate API key, pasted it into your React app, and it works. It also means the key is now public. Anyone who opens your site can copy it and spend your quota, and on a paid plan they spend your money. This guide shows why that happens and how to fix it with a small proxy: first on Cloudflare Workers, then as a Next.js route handler. Why a free exchange rate API key in frontend code is publicThere is no way to hide a secret in code that runs on someone else's device.Bro
FX Rates API Dashboard: Live Watchlist, 30-Day Chart and % Change
This tutorial builds a small FX rates dashboard on top of an FX rates API. It shows current rates for a watchlist of currencies, a 30-day line chart for the selected pair, and the percent change over one day and 30 days. You can start with a free FX rates API key for the live watchlist; the 30-day chart uses historical data, which is on the paid plans.The whole thing is two files: a small Node.js backend that holds the API key and refreshes rates every minute, and one HTML page with Chart.js tha
Exchange Rates API in Production: Fallbacks and Error Handling
An exchange rates API is a dependency your app calls on every price it shows. When it is slow, down or wrong, the problem lands on your checkout page. Most integrations handle the happy path and nothing else. This tutorial builds the production layer around an exchange rates API in JavaScript: timeouts, retries with backoff and jitter, a stale-while-revalidate cache, a staleness threshold, a fallback provider, a circuit breaker, monitoring of the time field, and sanity bounds on each new rate.Th
SonoJS Marketplace is live. Every template is free (for now)
I just shipped the SonoJS Marketplace: ready-made React templates you can preview and download.Dashboards, SaaS starters, heroes, ecommerce, and more. Browse, open the live demo, grab the source.Right now everything is free. That stays until we turn on paid plans.If you’re building with React / Tailwind and want a head start:https://sonojs.com/marketplaceWould love feedback on what you’d want next.
I built Aegis — a personal cyber defense platform that checks links, emails, files and passwords before they hurt you
Most people don't get hacked by nation-state attacks. They get hacked by a fake link in a text message, a convincing "verify your account" email, a malware attachment disguised as an invoice, or a password that already leaked in someone else's data breach.So I built Aegis — one place where a non-technical person can check each of those things before it hurts them, built to the same security standard it checks for.🔗 Live demo: https://aegis-cyber-defense-platform.onrender.com (free hosting — firs
I built a 30-second blind audio quiz web app to settle music debates
I wanted a fast way to test whether my friends actually recognize tracks quickly instead of guessing from lyrics or text questions. So I built SonicPulse, a mobile-first audio quiz you can play directly in the browser without creating an account. How it worksPick an artist or swipe through genre decksListen to a 30-second audio preview against a countdown clockPick the matching track from four choices across 10 roundsInstant guest mode by default, with optional Google sign-in for score hist