oharu tech blog

Articles

  • Two green GitHub pull requests broke main — require branches to be up to date before merging

    I merge a pull request once every check on it is green. So it was a surprise when one of my pull requests failed CI on a test file it never touched. The failure was not mine at all. Main itself had gone red right after another pull request merged with every check passing, so every open pull request was now red for a reason outside it. The broken main was also hiding a real bug that no test had run against yet. The checks on the merged pull request were not wrong, only old. They had run before a…

    Read more
  • Cutting Vercel deployment storage from 13.96 GB to 20.27 MB — previews off, retention down

    Vercel's usage page put a red ring next to Deployment Storage: 13.96 GB against a 10 GB allowance, on an account where nothing else was above 20% of its limit. My first question was whether the live site was at risk. It was not, but staying over the line still costs something: Vercel stops honouring the 30-day retention window and deletes eligible deployments immediately, and it can refuse new ones until the account is back under. The instinct was to blame the repository, since every article…

    Read more
  • WebKit zoomed this blog out below 100% on an iPhone — overflow-wrap and a table scroll box fixed it

    Pinching to zoom out on one of my own articles on my phone shrank it below its normal size, which felt wrong enough to look into. The home page would not do it: pinch to zoom out there and the page stays where it is. Both are served with the same <meta name="viewport">, so I doubted the tag was the difference at all. WebKit takes its minimum zoom-out scale from the document's real content width, and it has ignored minimum-scale since iOS 10, so there was nothing to cap. The real problem is that…

    Read more
  • Trend Micro rated this blog a Disease Vector — reclassifying the URL fixed it

    I run Trend Micro myself, so when this blog's own listing turned up greyed out in search results (a plain question mark instead of the usual safety badge), it caught my eye. I wanted the green checkmark instead, so I submitted the domain to Trend Micro's Site Safety Center for reclassification. The result came back worse than before: a Dangerous rating, categorized as a Disease Vector. This article is the investigation that followed, and the one change that turned it into a Safe rating instead.

    Read more
  • CommonMark flanking rules print ** on Japanese and Chinese pages

    I published an article in three languages, opened the Japanese page to read it, and found asterisks printed around a sentence that was meant to be bold. The cause is in CommonMark. A run closes emphasis only when it is right-flanking**, and a run sitting between a 。 and a letter is neither left- nor right-flanking. English never meets the condition, because a space follows every full stop. CJK has no such space.

    Read more
  • A Chrome profile per project for chrome-devtools MCP — one gitignored .mcp.json each

    Two of my projects drive Chrome through chrome-devtools-mcp: this blog, and a football-data app. A browser was already open for the blog when I switched to the other repo and asked for a page, and what came back was not a screenshot. Chrome allows one browser process per profile directory, and the official plugin hands every project on the machine the same directory. The fix is a .mcp.json in each repo passing its own --userDataDir, gitignored because that path is absolute and the repository is…

    Read more
  • Markdown as the source of truth in Git — PDF on demand built with WeasyPrint

    I kept losing track of which specification version I was implementing against. The documents lived in Google Drive, so git had no copy of them, and someone else's edits landed without my working tree changing. When I diffed two exports a day apart, edits I had never seen had changed what the code had to do. Committing the export would not have helped. A PDF is a binary git stores whole at every revision, and an HTML export re-wraps its own lines, so a one-word edit arrives as a rewritten…

    Read more
  • An Expressive Code plugin that labels command output — the gutter API and the copy payload

    Claude Code labels a command IN and its result OUT in its own transcript, and I wanted the same in this blog's code blocks. Bash output here was written as a # comment in the same block. It reads fine but brings two problems: A reader cannot tell an instruction from printed output. Both are spelled #. Neither can the copy button. It was shipping the printed line inside the command you paste. The fix is an Expressive Code plugin that adds an out={…} option to a fence: It uses three extension…

    Read more
Load more