Field Notes

Notes from real work. Every page here came out of a client build, an automation we run in production, or a mistake that cost us a day. Nothing is written to fill a calendar.

Technical noteBy Bodie Grundel

Treat your n8n workflows like code

An AI agent's whole brain lived as code strings inside n8n nodes, edited live, tested never. The repo-file, sync, and drift-detector pattern that made it honest.

Technical noteBy Bodie Grundel

The script worked by hand and died on the timer

A nightly job failed silently for days because launchd runs scripts with a bare PATH. The absolute-path rule, and the plist reload trap waiting behind it.

Technical noteBy Bodie Grundel

Docker mounts the file, not the filename

We deployed a new version of a bind-mounted tool and the container ran the old one for a day. Single-file bind mounts pin the inode, and most deploy methods swap it.

Technical noteBy Bodie Grundel

Frosted glass traps your fixed overlays

A settings sheet, a chat drawer, and a tab bar each pinned themselves inside the header instead of the viewport. The CSS containing-block rule behind it, and the portal habit that ended it.

Technical noteBy Bodie Grundel

Simulate the burst before you arm the timer

Our posting scheduler passed every single-run test and still burned 4 posts in 2 hours. On a timer, a wrong state guard does not fail once. It fails every tick until the runway is gone.

Field noteBy Bodie Grundel

Automations that spend money turn in receipts

An API balance dropped $1.10 mid-run and we could not say what we bought. Now every automation that spends credits logs its own cost, its call count, and its worst-case daily cap.

Technical noteBy Bodie Grundel

Flip the flag before you hand-build critical CSS

A Next.js 16 marketing site stuck at 80 on mobile Lighthouse jumped to 99 with 3 lines of config. What experimental.inlineCss does, how to verify it, and when to skip it.

Technical noteBy Bodie Grundel

Your grep can't see the text your framework rendered

On a launch day our greps swore the published pages were missing copy the browser rendered fine. React server rendering splits text across comment markers. Verify rendered text, not raw HTML.

Technical noteBy Bodie Grundel

We removed backdrop-filter and scrolling got worse

The blur looked guilty for our scroll jank, so we deleted it and the page got stickier. What backdrop-filter quietly does for you, and the two-part fix that worked.

Technical noteBy Bodie Grundel

The dead band in your iOS web app is not your CSS

A fixed bottom bar floating above the physical edge of an installed iOS web app. Two wrong theories, one debug page, and a status bar meta tag that only takes effect on reinstall.

Field noteBy Bodie Grundel

Your company should own what its AI learns

AI tools are becoming the institutional memory of small businesses, one chat at a time, inside accounts the company does not control. The case for owning that layer, from a shop that switched AI providers twice this year and lost nothing.

Technical noteBy Bodie Grundel

Grep the cascade before you write the override

We wrote a correct CSS override that did nothing, because a rule 46 lines later won the tie. The 30-second grep habit that keeps a stylesheet from arguing with itself.

Technical noteBy Bodie Grundel

The accessibility setting that breaks React hydration

framer-motion's useReducedMotion() always answers wrong on the server. Branch your markup on it and every visitor with Reduce Motion enabled gets a hydration mismatch. The fix is a small mounted gate.

Field noteBy Bodie Grundel

How to tell if your website is costing you customers

We score local business websites using public signals, including phone load speed, mobile usability, listing mismatches, and dead links. Here is the method, and how to run it on your own site in 10 minutes.

Technical noteBy Bodie Grundel

A marquee that loops clean is two math problems

Logo marquees jump or run out of content for exactly two reasons, and both are arithmetic. The translate distance, the copy count, and how to tell which one you broke.

Field noteBy Bodie Grundel

Never collect Social Security numbers over email

We found a rental application that emailed applicants' Social Security numbers to an office inbox. Why email is the wrong container, and the one question to ask your web person.

Security noteBy Bodie Grundel

What a hacked WordPress site actually looks like

A client's site was quietly redirecting visitors to gambling spam. The anatomy of the infection, and why a hack you can no longer see is not a hack that is gone.