<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>caillou.ch</title><description>Blog of caillou.ch</description><link>https://caillou.ch/</link><item><title>mdx kitchen sink</title><link>https://caillou.ch/blog/2026-02-22-mdx-kitchen-sink/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-02-22-mdx-kitchen-sink/</guid><description>every MDX formatting option this site supports, in one place.</description><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate></item><item><title>cli tool: worktrunk</title><link>https://caillou.ch/blog/2026-03-20-cli-tool-worktrunk/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-03-20-cli-tool-worktrunk/</guid><description>git worktree management for humans.</description><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate></item><item><title>responsive font-weight with tailwind</title><link>https://caillou.ch/blog/2026-03-22-responsive-font-weight-tailwind/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-03-22-responsive-font-weight-tailwind/</guid><description>lighter font weights on HiDPI screens using Tailwind v4 theme variables.</description><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate></item><item><title>pointer events replace touch + mouse in drag and drop</title><link>https://caillou.ch/blog/2026-03-24-pointer-events-dnd/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-03-24-pointer-events-dnd/</guid><description>pointerdown/up/move handles both touch and mouse. no more duplicate listeners.</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate></item><item><title>iTerm: unlimited scrollback</title><link>https://caillou.ch/blog/2026-05-16-iterm-unlimited-scrollback/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-05-16-iterm-unlimited-scrollback/</guid><description>iTerm&apos;s default scrollback is 1000 lines. you can turn that off.</description><pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate></item><item><title>a fish-style prompt for PowerShell</title><link>https://caillou.ch/blog/2026-06-03-starship-prompt-powershell/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-06-03-starship-prompt-powershell/</guid><description>starship gives PowerShell a prompt i can live with.</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate></item><item><title>fish-style abbreviations for PowerShell</title><link>https://caillou.ch/blog/2026-06-05-fish-abbreviations-powershell/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-06-05-fish-abbreviations-powershell/</guid><description>abbreviations expand inline before they run. here&apos;s how in PowerShell.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate></item><item><title>reproduce a flaky test with stress-ng</title><link>https://caillou.ch/blog/2026-06-09-reproduce-flaky-test-stress-ng/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-06-09-reproduce-flaky-test-stress-ng/</guid><description>it passed locally and failed on CI. stress-ng made it fail locally too.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate></item><item><title>serialize TanStack Query mutations</title><link>https://caillou.ch/blog/2026-06-11-serialize-tanstack-query-mutations/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-06-11-serialize-tanstack-query-mutations/</guid><description>my optimistic drag and drop raced itself. one scope id fixed it.</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate></item><item><title>TIL the &lt;a&gt; tag has a download attribute</title><link>https://caillou.ch/blog/2026-06-15-anchor-download-attribute/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-06-15-anchor-download-attribute/</guid><description>i spotted the download attribute on an anchor tag and assumed Content-Disposition already did the job. turns out it&apos;s for when you can&apos;t touch the server.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate></item><item><title>stop pnpm churning package.json line endings</title><link>https://caillou.ch/blog/2026-06-16-pnpm-package-json-line-endings/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-06-16-pnpm-package-json-line-endings/</guid><description>pnpm add rewrote package.json from CRLF to LF and git diffed the whole file. one line in gitattributes fixed it.</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate></item><item><title>fake a non-retina screen on Chrome</title><link>https://caillou.ch/blog/2026-06-17-chrome-fake-non-retina-screen/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-06-17-chrome-fake-non-retina-screen/</guid><description>a Chrome flag retired the old non-retina monitor I kept around just to test on.</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate></item><item><title>make shift+enter a newline in Claude Code on Windows</title><link>https://caillou.ch/blog/2026-06-18-claude-code-shift-enter-windows-terminal/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-06-18-claude-code-shift-enter-windows-terminal/</guid><description>shift+enter sent my half-written message instead of making a newline. ctrl+j fixes it in any terminal; a keybinding wins back the muscle memory.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate></item><item><title>keep an AVD session awake with f15</title><link>https://caillou.ch/blog/2026-06-19-keep-avd-awake-f15/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-06-19-keep-avd-awake-f15/</guid><description>AVD logged me out over lunch and killed a long job. f15 is a key that does nothing, so I send one every two minutes to look busy.</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate></item><item><title>reset Karabiner after sleep without a reboot</title><link>https://caillou.ch/blog/2026-06-20-reset-karabiner-after-sleep/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-06-20-reset-karabiner-after-sleep/</guid><description>Karabiner stopped remapping after my Mac woke. i finally found a way to reset it without a reboot.</description><pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate></item><item><title>lazygit: open a file straight from the diff</title><link>https://caillou.ch/blog/2026-06-24-lazygit-open-file-from-diff/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-06-24-lazygit-open-file-from-diff/</guid><description>to edit the file i&apos;m looking at, i&apos;d have to find it again in my editor. pressing `e` opens it directly, in whatever editor i configure.</description><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate></item><item><title>disable Chrome&apos;s AI features with a macOS config profile</title><link>https://caillou.ch/blog/2026-06-26-disable-chrome-ai-omnibox/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-06-26-disable-chrome-ai-omnibox/</guid><description>Chrome put AI in my address bar, and the flags I turned off came back after an update. a macOS config profile sets the enterprise policy that turns it off for good.</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate></item><item><title>finding what freezes VS Code: tsserver log and extension host profile</title><link>https://caillou.ch/blog/2026-07-02-vscode-tsserver-log-extension-host-profile/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-07-02-vscode-tsserver-log-extension-host-profile/</guid><description>cmd+click on a type froze VS Code, and the tsserver log looked healthy. an extension host profile found the culprit.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item><item><title>copy a Claude Code answer as markdown with /copy</title><link>https://caillou.ch/blog/2026-07-03-claude-code-copy-markdown/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-07-03-claude-code-copy-markdown/</guid><description>mouse-copying a Claude Code answer loses the code ticks and the links. /copy puts the raw markdown on the clipboard instead.</description><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate></item><item><title>save the Chrome console to a file</title><link>https://caillou.ch/blog/2026-07-04-chrome-devtools-console-save-as/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-07-04-chrome-devtools-console-save-as/</guid><description>a web app left open overnight showed errors in the morning. right-click the console, save as, and the whole session is a log file.</description><pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate></item><item><title>react: a render prop is called, a slot is mounted</title><link>https://caillou.ch/blog/2026-07-09-render-props-vs-slots/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-07-09-render-props-vs-slots/</guid><description>MUI render props always looked like remount traps to me. turns out my suspicion was exactly backwards: called functions never enter the tree, mounted components do.</description><pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate></item><item><title>hiding ::before decorations from screen readers</title><link>https://caillou.ch/blog/2026-07-10-css-content-alt-text/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-07-10-css-content-alt-text/</guid><description>this site fakes markdown syntax with css generated content, and screen readers read every marker aloud. the content property accepts empty alt text that mutes them.</description><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate></item><item><title>PowerShell 7 ships with fish-style autosuggestions</title><link>https://caillou.ch/blog/2026-07-17-powershell-7-autosuggestions/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-07-17-powershell-7-autosuggestions/</guid><description>a script refused to run on my shell. the new shell finishes my sentences.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>replacing ag with rg and fd</title><link>https://caillou.ch/blog/2026-07-19-replacing-ag-with-rg-and-fd/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-07-19-replacing-ag-with-rg-and-fd/</guid><description>the last ag release was in 2018. it took two tools and a fish abbr to replace it.</description><pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Claude Code&apos;s Bash tool runs zsh, not fish</title><link>https://caillou.ch/blog/2026-08-20-claude-code-bash-tool-runs-zsh/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-08-20-claude-code-bash-tool-runs-zsh/</guid><description>the system prompt said fish, so the LLM wrote fish. the tool ran zsh with an empty environment. a zprofile and four lines of CLAUDE.md fixed it.</description><pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate></item><item><title>fish-style autocd for PowerShell</title><link>https://caillou.ch/blog/2026-08-28-powershell-autocd-command-not-found-action/</link><guid isPermaLink="true">https://caillou.ch/blog/2026-08-28-powershell-autocd-command-not-found-action/</guid><description>typing .. in pwsh was not a recognized command. a CommandNotFoundAction hook makes any directory a command.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate></item></channel></rss>