Recent

Recently published, across every category

Latest posts

  • Diagram: a build, a gate and a screenshot all reporting green, next to the same file failing the moment it was actually downloaded and opened.

    09/13/2026

    Every Check Passed but One

    A free browser tool that draws this site's own post covers, and the single quoting bug that got through a build, a gate and a screenshot before anyone actually opened the file it produced.

  • 09/10/2026

    Grep Exits Zero When It Finds the Word FAILED

    A CI gate piped test output through grep for readability, and a red build passed anyway -- because grep succeeds when it finds a match, even the word FAILED.

  • Diagram: five Lighthouse categories with Agentic Browsing highlighted, beside an llms.txt file marked as failing silently.

    09/02/2026

    Lighthouse now grades your site for AI agents

    Lighthouse has a fifth category, Agentic Browsing, and one of its audits reads your llms.txt. Three sites failed it for the same undocumented reason, and the API will not give you the category unless you ask for it by a name that is not in the docs.

  • Diagram: four labeled failure cards -- a matched filename, dev server timing, an invented test fact, and a plausible-sounding wrong answer.

    09/02/2026

    Four ways an AI agent was confidently wrong on a migration

    Each of these looked right. A filename match that paired the wrong screenshot with the wrong article, a dev server that made correct code look broken, and a test that wrote down facts it did not own.

  • Diagram: two passing gates beside a held gate branching to a missing image and thirty dead redirects.

    09/02/2026

    What the build caught that nobody was looking for

    Automated gates on a 150-page migration found a dropped screenshot, thirty redirects pointing at nothing, and an orphan hidden by a regex wildcard. None of it would have been found by reading pages.

  • Diagram: three pairs of reported-versus-observed numbers, each a mismatch between a claimed measurement and what was actually true.

    09/02/2026

    Measure it in a real browser

    A simulated 2,061ms render delay that did not exist, an image library silently ignoring the font it was given, and a contrast failure that was a misread value. Three cases for checking directly.

  • Diagram: HttpClient through authInterceptorFn, which adds an Authorization header before the request reaches the server, with the 401 response looping back to the interceptor.

    09/02/2026

    An Angular auth interceptor, the functional way

    Attach a token to every outgoing request and handle a 401 in one place, using the functional HttpInterceptorFn rather than the class-based interceptor most search results still show.

  • Diagram: a ten-line for-loop on the left replaced by a two-line Collectors.groupingBy stream on the right, with the record it groups into shown beneath.

    09/02/2026

    Grouping and summarizing a list in modern Java

    Collectors.groupingBy with a downstream collector replaces most of the loop-and-map code people still write - plus records, which remove the class that loop needed.

  • Diagram: readFileSync crashing on a 2GB file, compared against createInterface reading the same file in constant kilobytes.

    09/02/2026

    Reading a huge file line by line in Node, without loading it

    readFileSync on a 2GB log is how a Node process dies. Streaming it line by line uses a constant few kilobytes instead, and is barely more code.

  • Diagram: fgetcsv reading one row at a time, beside file() hitting the memory limit on the same file.

    09/02/2026

    Reading a huge CSV in PHP without exhausting memory

    file() and str_getcsv on a large export will hit the memory limit. Streaming it with fgetcsv uses a few kilobytes regardless of file size, and handles quoted newlines correctly.

  • Diagram: three retry attempts at growing intervals, beside a note that 429 and 5xx are retried while 4xx is not.

    09/02/2026

    Retrying an HTTP request in Python, properly

    A retry with exponential backoff and jitter that only retries what is worth retrying - and does not hammer a service that is already struggling.

  • Diagram: a role hierarchy showing ROLE_ADMIN above ROLE_USER, beside three IS_AUTHENTICATED variants marked with which ones a plain visitor passes.

    09/02/2026

    is_granted in Twig: roles and IS_AUTHENTICATED

    is_granted takes more than roles, and picking the wrong one gives you a check that quietly passes when it should not. What each attribute tests, why role hierarchy makes ROLE_USER true for your admins, and where the check belongs.

  • Diagram: a crossed-out FOSUserBundle block opening into four replacement components -- Security, MakerBundle, ResetPasswordBundle and VerifyEmailBundle.

    09/02/2026

    Leaving FOSUserBundle: what replaces each piece

    The bundle is maintained only enough for existing projects to migrate off it. Every piece it provided now has a replacement in Symfony itself or in two small bundles - and the migration is mostly deletion.

  • Diagram: individually labeled form_row fields inside a form_start/form_end frame, with a form_rest chip carrying the CSRF token at the bottom.

    09/02/2026

    Rendering a Symfony form field by field in Twig

    One call renders the whole form and gives you no say in the markup. Splitting it up is four functions, and the one that matters most is form_rest - the safety net that stops a forgotten field from silently disappearing.

  • Diagram: autoescape on, punctured by |raw, with three contexts named where that filter is the wrong answer -- attribute, URL, inline JS and CSS.

    09/02/2026

    Twig autoescaping and the raw filter

    Autoescaping makes Twig safe by default and makes |raw the fastest way to undo that. The catch is that HTML escaping is only correct in HTML - inside a script tag or an unquoted attribute, the default is the wrong answer.

  • Diagram: a loop firing fifty queries at a database, compared against the same loop firing one query after addSelect().

    09/02/2026

    The N+1 you wrote in a Twig loop, and its fix

    The query looks fine and the template looks fine. Together they issue one query per row, because a lazy association is loaded the moment a template touches it - and templates touch things the controller never did.

  • Diagram: five ng CLI commands worth memorizing, with one flag flagged as having moved in Angular 19.

    08/23/2025

    Angular 19 CLI commands worth memorizing

    Here are the top Angular 19 CLI commands every developer should know since you will likely use them every day. Click here to get your free Angular 19 Cheat Sheet & Study Guide!

  • Converting PNG and JPG Images to WebP

    08/23/2025

    Convert PNG and JPEG to WebP with a PHP script

    A short GD script that converts a folder to WebP, preserves PNG transparency, and - the part usually missing - keeps the original whenever the WebP comes out larger, which happens more than you would think.

  • Diagram: two columns, judgment and communication skills that still belong to a person, against boilerplate and first drafts that are increasingly automated.

    08/17/2025

    Tech careers for students, with AI in the room

    So many young adults and high-schoolers seem to be disheartened with the rise of AI in tech. Those young minds who LOVE to write code are being dissuaded to even bother studying the art of software development and…

  • Two teachers standing in the rain entering car pickup numbers on cell phones

    08/17/2025

    Why is school car-line pickup still typed in by hand?

    Here’s a practical application that can help schools with parent pickup and reduce unpleasant tasks and time burdening school staff.