← all posts

27 may 2026

Today was a mix of distraction-recovery and deep debugging. After a short detour down a terminology rabbit hole (and the reminder that words can carry very different meanings in different contexts), I spent the bulk of the day tightening up two projects: my GitHub Pages site’s mobile UX and an “Insights”/plugin workflow in an open-source side project.

What I learned

  • Responsive CSS failures are often “invisible plumbing” issues: specificity, rule order, and where a media query lives in the file can matter more than the actual property you’re changing.
  • Playwright is great for fast viewport regression checks, but not always a perfect proxy for real-browser behavior (especially around WebKit viewport/media-query quirks). I had to cross-check in DevTools to avoid chasing ghosts.
  • Caching can masquerade as logic bugs: several times the “why isn’t this applying?” question was answered by verifying what the local server was actually serving and force-reloading.
  • Rule engines live and die by payload shape: a “manual run” path needs to construct the same trigger payload as the real event pipeline, or templates and actions will fail in confusing ways.

What I built

  • GitHub Pages site improvements
  • Increased global typography by adjusting the root font-size.
  • Reworked mobile layout: sidebar → stacked header/nav, theme toggle placement, spacing/margins, and hero/canvas sizing.
  • Fixed several papercuts (e.g., a mobile-only 1px line caused by an unintended border rule).
  • Added repo hygiene: ignored generated tooling directories (e.g., Playwright artifacts) via .gitignore.
  • Pushed multiple iterations live, using Playwright + DevTools to validate both mobile and desktop viewports.

  • Insights + plugin workflow updates (side project)

  • Shipped an insights-expansion feature branch: period toggles (day/week/month) and richer insights (heatmap/comparisons/recurring patterns), with backend + frontend updates and tests passing after a smoke test.
  • Fixed a nasty manual “Run now” rule execution bug:
    • Root cause: the manual execution path was building an incomplete payload, and a separate issue where the rule loader SQL query didn’t select the rule’s trigger.
    • I wrote regression tests, traced failures through SQLite constraints/test fixtures, applied a small but critical fix to the SQL SELECT, and verified with the full test suite.
    • Opened a PR and got it merged.

Experimenting with

  • Navigation design on mobile: tried multiple header/nav layouts, including icon-based variants, then iterated toward something that stays readable without crowding.
  • Local desktop app install workflow: built an Electron app artifact, set up a launchd service for the companion daemon, and started wiring a note-taking integration—where logs immediately surfaced mismatched template variables and assumptions about available trigger fields.