DevIdiot!
Building a Cricket Trivia Game Was Easy. Normalising 7,000+ Players Was Hard.
When I started building Stumped!, a cricketer guessing game, I thought the hard part would be coming up with clever clues.I was wrong.The real hard part was turning thousands of raw, ball-by-ball cricket scorecards into clean, human-readable player profiles.Here is how a simple trivia game helped me learn more about normalising data. The Dream vs. The RealityI wanted to generate rich, dynamic clues for players, like:"This batter scored 573 runs in the death overs at a strike rate of 135.8."
What I learned refactoring a codebase with a 7,558-line constants file"
If you've ever opened a file to fix a bug and spent forty minutes just figuring out where the bug lives, this post is for you.Not because the bug was hard. Because the code had no home.I've been the sole frontend developer on a sports data platform serving 5+ professional sports clubs. I've worked on this codebase for a few years now, across everything on the frontend β auth flows, build configuration, product features, UI design implementation. When I joined, there were other developers on the
Clean UTM links with Cyrillic transliteration (and a zero-dep marketing-metrics lib)
If you run ads in CIS markets, you have seen this in your analytics reports:utm_campaign=%D0%90%D0%BA%D1%86%D0%B8%D1%8FThat is a Cyrillic UTM value (ΠΠΊΡΠΈΡ) percent-encoded into garbage. It splits one campaign into unreadable duplicates and makes grouping impossible. I kept solving this β and a few other small marketing-math problems β over and over, so I extracted the logic into two tiny, zero-dependency packages. 1. utm-translit β clean UTM buildernpm: utm-translit Β· also on pub.dev as utm
Reverse once, run forever: designing client-side defenses that assume the attacker has already read every line
There's a sentence every engineer in this field eventually says out loud, usually with a sigh:"But the code is right there in their browser."It is. That's the whole problem, and pretending otherwise is how most bot defenses quietly fail. Anything we ship to detect automation runs inside an environment the attacker owns completely: their CPU, their debugger, their clock, their unlimited patience. They can set a breakpoint anywhere. They can run our logic ten thousand times and diff the outputs. T
Client-Side Databases Are Underrated
For the last five years, I've worked on web apps that follow the same pattern: build a backend, set up Postgres, wire up REST endpoints, fetch data on the client, cache it in React state or Redux.Somewhere along the way, I realized a lot of the data I was sending to the server never needed to go there.Form drafts. UI preferences. Search indexes. Cached API responses. Offline queues. All of it lives on the client already β it just takes a detour through the network for no real reason. The la
I built a Chrome tab manager that cannot make a network request
In 2021 the Great Suspender β a beloved tab-suspending extension with millions of users β was quietly sold to a new owner, who shipped an update that turned it into adware/malware. Google eventually pulled it and force-disabled it for everyone. The unsettling part wasn't that one extension went bad. It was the realization that "it's just a tab manager" was never actually safe: the thing had the permissions to read every page you visited, and one ownership change was all it took to use them.So wh
RxJS in Angular β Chapter 7 | Combining Observables β `forkJoin`, `combineLatest`, `zip` & More
"Combining Observables β forkJoin, combineLatest, zip & More" π Welcome to Chapter 7!Real apps rarely get data from just one place. A product page might need:The product details (from /api/products/5)The user's wishlist (from /api/wishlist)The store's discount config (from /api/config)How do you handle multiple Observables at the same time?That's what today's combination operators are for! π½οΈ The Restaurant Kitchen AnalogyImagine a chef π¨βπ³ preparing a 3-course meal:forkJoin
π The ultimate polymorphism: PureScript as a universal language (Node's V8, Erlang's BEAM, Chez Scheme...)
Just as PureScript has expanded into the backend after having long been assigned to the frontend (in people's minds), it is now spreading to all areas of programming. Itβs a polymorphic language that can target Erlang for concurrency, Chez Scheme for raw speed, etc. Here is why it works.A few months ago, I wrote an article about how PureScript serves as a "quiet rewrite of the Web", allowing developers to build robust, mathematically sound applications on the rooftops of JavaScriptβs chaotic emp
Building a Real-Time Task Manager with Next.js and Firebase - Lessons from the Trenches
Building a Real-Time Task Manager with Next.js and Firebase - Lessons from the TrenchesI recently built a task management app to learn Firebase properly. Not by watching tutorials, but by actually building something.This article shares what I learned, the mistakes I made, and the solutions I found. What We're BuildingA task manager where users can:Sign up and log in securelyCreate, edit, and delete tasksSee real-time updates across devicesFilter tasks by statusSort by due dateAccess o
Building Real-Time Dashboards in Angular with WebSockets β A Complete Guide
Most dashboards are built the same way: the user lands on the page, data loads, and then... it sits there. Stale. Until the user hits refresh or you set up an awkward polling interval that hammers your server every few seconds.There's a better way. WebSockets give you a persistent, two-way connection between your Angular app and your server β meaning your dashboard updates the moment new data exists, with zero wasted requests.In this article we'll build a complete real-time dashboard in Angular
π New React Challenge: Simple Pagination
In a time where AI writes most of our boilerplate, manually wiring a fetch with loading, error, and pagination states is exactly the kind of thing that slips through the cracks β and exactly what keeps coming up in job interviews. π§© OverviewA plain fetch with pagination and manual loading and error handling. No libraries, no abstractions β just useState, useEffect, and a mock API that delays, paginates, and randomly fails. The kind of challenge that keeps your fundamentals sharp.π https://w
CTOs Agree: Cognitive Debt Is the New Technical Debt
<a href="https://news.ycombinator.com/item?id=48617323">Comments</a>
The question that actually decides your state stack (it's not 'Redux or React Query')
This is not a "Redux is dead" post. Redux is excellent at what it's for. So is React Query. So is Zustand.The problem was never the tools. It was that I spent years comparing tools that answer completely different questions β and never noticed."Redux or React Query?" "Zustand or RTK?" These read like real choices. They're not. It's like asking "hammer or screwdriver?" before you know what you're building.The decision that actually matters comes from one question almost nobody asks correctly:Who
Introducing Curiohole: Free Relaxing Browser Games You Can Play Instantly
Hi DEV community,I recently launched a small browser game site called Curiohole.Curiohole is a collection of free relaxing browser games you can play instantly with no download, no login, and no app install.Live site: https://curiohole.com/ Why I built itI wanted to create a lightweight place for simple games that people can open quickly during a short break.Many casual games require app downloads, accounts, or too many distractions before you can start playing. Curiohole is designed to be
Modern Web Development in 2026: Essential Tools and Practices
If you are getting started with web development in 2026, the ecosystem can feel overwhelming. New frameworks, build tools, and best practices emerge constantly. But the fundamentals remain the same, and knowing which tools matter most will save you months of wasted effort. The Rise of TypeScript as the DefaultTypeScript has become the standard for professional web development. In 2026, most major frameworks either require it or offer first-class support. If you are still writing plain JavaS
I Built a Week Number Calculator with 18000+ Static Pages and a Free API ββ Here's How
A few months ago I realized something every time I needed to know what week it was I had to Google it. The results were cluttered with ads and outdated information. So I decided to build weeknumber.cc ββ a clean fast free week number calculator. What does it doIt tells you the current week number. But it does a LOT moreDate Week conversion ββ Any date to week number any week number to datesFull year calendars ββ 2015 through 2035 every year visualized15 languages ββ Chinese English Japanes
Mastering Focus Management in React 19: Solving the Single-Page Application Routing Gap for WCAG 2.1 and EN 301 549 Compliance
Mastering Focus Management in React 19: Solving the Single-Page Application Routing Gap for WCAG 2.1 and EN 301 549 ComplianceMeta: Stop losing your users on page transitions. Learn how to manage focus in React 19 to meet WCAG 2.1 standards and provide a seamless screen reader experience.When you click a link in a traditional multi-page website, the browser does something vital: it refreshes the page, resets the focus to the top of the document, and announces the new page title. For a sigh
I Built a Privacy-First Calculator Platform Used in 100+ Countries β Here's the Stack
I Built a Privacy-First Calculator Platform Used in 100+ Countries β Here's the StackEvery major calculator website tracks you. Calculator.net, Omni Calculator, NerdWallet β they all use session recording, behavioral profiling, and third-party cookies.I built the opposite: calciq.app β 18 calculators across finance, lifestyle, and utility categories. Zero tracking. Zero data collection. Works offline. Used in 100+ countries.Here's the technical breakdown. The ArchitectureNo backend. N
Building a Dark Mode System in Next.js App Router β Without Layout Flash
Dark mode sounds simple until you implement it. Then you discover the flash.On first load, before JavaScript runs, your page renders with the default theme. Then the theme switcher kicks in. For a fraction of a second β sometimes longer on slow connections β users see the wrong theme before it corrects itself.This is the flash of unstyled content (FOUC) applied to theming, and it's one of the more annoying UX problems to solve correctly in Next.js App Router.Here's the approach that works, which
A 3D voxel game engine written in APL
<a href="https://news.ycombinator.com/item?id=48616713">Comments</a>