DevIdiot!
Build a Daily Habit Tracker with JavaScript
A daily habit tracker is a small app that helps you do the things you said you would do — read, exercise, practise, study — and building one is one of the best JavaScript projects for a beginner. It teaches you the skills every real app needs: storing data, rendering a list, handling dates, and saving state so your progress survives a page refresh. If you know basic JavaScript and want a project that actually improves your life, this is the one to build.How does it work? You keep your habits in
Build a Stock Portfolio Tracker with JavaScript
A stock portfolio tracker is a small app that shows you what you own, what it is worth, and how it is doing — and building one is one of the best JavaScript projects for a beginner. It teaches you the skills every real app needs: storing data, doing calculations, rendering a list, and saving state so your work survives a page refresh. If you know basic JavaScript and want a project that is both useful and impressive, this is the one to build.How does it work? You keep your holdings in an array o
How sales teams close faster with booking pages and AI recaps
Speed-to-demo and clean follow-up still win deals. Enaviya Meet connects a public booking page to browser meetings and AI summaries so reps spend less time coordinating and more time selling. The scheduling taxEmail ping-pong burns pipeline. A public booking page lets prospects pick an open slot that already respects your hours and existing bookings. Taken times disappear from the list for the next visitor, so you avoid double-booking. A demo flow that stays in the browserShare your bo
13,352 Websites Already Let AI Agents Use Their Forms. Here's How WebMCP Works (With Code)
AI agents that browse the web on someone's behalf have a hard job. They look at a page, guess which box is the email field, guess which button submits, and hope nothing moved.WebMCP is Chrome's answer to that. Instead of guessing, an agent can ask the page: what can you do? The page answers with a list of tools, each with a name, a description and a schema for its inputs.It's still experimental, but it's already in use on more sites than I expected. How many sites already use itBrowser Use
How to compute US banking days in JavaScript
I shipped a settlement-date bug that only appeared on a Friday in July. The date was 3 July 2026, the day before Independence Day, which falls on a Saturday that year. My function marked that Friday as a bank holiday because that's what most "US federal holiday" libraries do. Federal offices are closed. Federal Reserve Banks are not.If you calculate ACH or Fedwire settlement dates, you need the Reserve Bank calendar, not the Office of Personnel Management calendar. They diverge whenever a holida
Free CBT Anxiety Tools for Developers — Built in Vanilla JS
8 Free CBT Anxiety Tools I Built in Vanilla JS (No Signup, No Backend)As a developer who struggled with anxiety, I built these tools for myself. They're free, privacy-first, and run entirely in your browser — no signup, no backend, no data collection. Why Vanilla JS?I chose vanilla JavaScript because:Privacy: Your data never leaves your browserSpeed: No API calls, no loading spinnersSimplicity: View source, understand everythingPortable: Works offline, save as HTML The 8 Tools
8 Free CBT Anxiety Tools I Built in Vanilla JS — No Signup, No Backend
8 Free CBT Anxiety Tools I Built in Vanilla JS (No Signup, No Backend)As a developer who struggled with anxiety, I built these tools for myself. They're free, privacy-first, and run entirely in your browser — no signup, no backend, no data collection. Why Vanilla JS?I chose vanilla JavaScript because:Privacy: Your data never leaves your browserSpeed: No API calls, no loading spinnersSimplicity: View source, understand everythingPortable: Works offline, save as HTML The 8 Tools
8 Free CBT Anxiety Tools I Built in Vanilla JS (No Signup, No Backend)
8 Free CBT Anxiety Tools I Built in Vanilla JS (No Signup, No Backend)As a developer who struggled with anxiety, I built these tools for myself. They're free, privacy-first, and run entirely in your browser — no signup, no backend, no data collection. Why Vanilla JS?I chose vanilla JavaScript because:Privacy: Your data never leaves your browserSpeed: No API calls, no loading spinnersSimplicity: View source, understand everythingPortable: Works offline, save as HTML The 8 Tools
The Same Tags Block a WebVTT and Pass an SRT: Our Subtitle Workbench Validates the Format, Not the Markup
I work on OnePassApps, so this is our own app and our own build, and every number below was measured in it today, signed out, in one browser, in the visible Chrome on display :1: Subtitle Workbench.The Subtitle Workbench takes subtitle files you already have and tells you what is wrong with them before you export. Its own guide promises the check is about information: unsupported markup can block conversion, and converting positioning-bearing WebVTT to SRT is refused when it would lose informati
Stop hand-writing JSON Schemas: infer them from your sample payloads, in the browser
Hand-writing a JSON Schema from an API response is tedious, error-prone work. The more fields a payload has, the easier it is to forget a required entry or mistype a field. And the schema you write by hand is only as good as the sample you stared at while writing it.There is a faster first draft: paste sample payloads into an inference tool and let it generate the schema. I tried ToolsByUs's JSON Schema Generator — it infers a Draft 2020-12 schema from your samples and validates documents agains
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'