<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>La Vita Nouva</title><link>https://lr0.org/</link><description>Recent content on La Vita Nouva</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>lr0</managingEditor><atom:link href="https://lr0.org/index.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Sun, 05 Apr 2026 00:00:00 +0000</lastBuildDate><item><title>Pic - April 05, 2026</title><link>https://lr0.org/pic-log/2026-04-05/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/pic-log/2026-04-05/</guid><description/></item><item><title>Pic - April 4, 2026 (#10)</title><link>https://lr0.org/pic-log/2026-04-04-10/</link><pubDate>Sat, 04 Apr 2026 16:10:00 +0000</pubDate><guid>https://lr0.org/pic-log/2026-04-04-10/</guid><description/></item><item><title>Pic - April 4, 2026 (#9)</title><link>https://lr0.org/pic-log/2026-04-04-09/</link><pubDate>Sat, 04 Apr 2026 16:09:00 +0000</pubDate><guid>https://lr0.org/pic-log/2026-04-04-09/</guid><description/></item><item><title>Pic - April 4, 2026 (#8)</title><link>https://lr0.org/pic-log/2026-04-04-08/</link><pubDate>Sat, 04 Apr 2026 16:08:00 +0000</pubDate><guid>https://lr0.org/pic-log/2026-04-04-08/</guid><description/></item><item><title>Pic - April 4, 2026 (#7)</title><link>https://lr0.org/pic-log/2026-04-04-07/</link><pubDate>Sat, 04 Apr 2026 16:07:00 +0000</pubDate><guid>https://lr0.org/pic-log/2026-04-04-07/</guid><description/></item><item><title>Pic - April 4, 2026 (#6)</title><link>https://lr0.org/pic-log/2026-04-04-06/</link><pubDate>Sat, 04 Apr 2026 16:06:00 +0000</pubDate><guid>https://lr0.org/pic-log/2026-04-04-06/</guid><description/></item><item><title>Pic - April 4, 2026 (#5)</title><link>https://lr0.org/pic-log/2026-04-04-05/</link><pubDate>Sat, 04 Apr 2026 16:05:00 +0000</pubDate><guid>https://lr0.org/pic-log/2026-04-04-05/</guid><description/></item><item><title>Pic - April 4, 2026 (#4)</title><link>https://lr0.org/pic-log/2026-04-04-04/</link><pubDate>Sat, 04 Apr 2026 16:04:00 +0000</pubDate><guid>https://lr0.org/pic-log/2026-04-04-04/</guid><description/></item><item><title>Pic - April 4, 2026 (#3)</title><link>https://lr0.org/pic-log/2026-04-04-03/</link><pubDate>Sat, 04 Apr 2026 16:03:00 +0000</pubDate><guid>https://lr0.org/pic-log/2026-04-04-03/</guid><description/></item><item><title>Pic - April 4, 2026 (#2)</title><link>https://lr0.org/pic-log/2026-04-04-02/</link><pubDate>Sat, 04 Apr 2026 16:02:00 +0000</pubDate><guid>https://lr0.org/pic-log/2026-04-04-02/</guid><description/></item><item><title>Pic - April 4, 2026 (#1)</title><link>https://lr0.org/pic-log/2026-04-04-01/</link><pubDate>Sat, 04 Apr 2026 16:01:00 +0000</pubDate><guid>https://lr0.org/pic-log/2026-04-04-01/</guid><description/></item><item><title>Pic - April 03, 2026</title><link>https://lr0.org/pic-log/2026-04-03/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/pic-log/2026-04-03/</guid><description/></item><item><title>al-Jabri</title><link>https://lr0.org/microblog/2026-04-03-2/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/microblog/2026-04-03-2/</guid><description>
&lt;h1 class="title"&gt;al-Jabri&lt;/h1&gt;
&lt;p&gt;
I had some questions about al-Jabri and I missed having connection to people who I might share with them my questions.&lt;/p&gt;</description></item><item><title>Reading leaked Claude Code source code</title><link>https://lr0.org/blog/p/claude-code-source/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/blog/p/claude-code-source/</guid><description>
&lt;h1 class="title"&gt;Reading leaked Claude Code source code&lt;/h1&gt;
&lt;div class="preview-block"&gt;
&lt;p&gt;This post was discussed in &lt;a href="https://lobste.rs/s/6c8cwq/reading_leaked_claude_code_source_code"&gt;Lobsters&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="preview-block"&gt;
&lt;p&gt;Interesting findings from reading 132,000 lines of TypeScript that power Claude Code. The post uses the repo at &lt;a href="https://github.com/chatgptprojects/claude-code"&gt;&lt;a href="https://github.com/chatgptprojects/claude-code"&gt;https://github.com/chatgptprojects/claude-code&lt;/a&gt;&lt;/a&gt; to reference code, note that it might go down by the time you are reading this.&lt;/p&gt;
&lt;p&gt;
[2026-04-01 Wed 00:53]: after writing this, I found another interesting read by &lt;a href="https://alex000kim.com/posts/2026-03-31-claude-code-source-leak/"&gt;Alex Kim&amp;#39;s blog&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
Anthropic accidentally leaked a source map file (&lt;code class="verbatim"&gt;cli.js.map&lt;/code&gt;) containing the full, unobfuscated TypeScript source code. 1,897 files around 132,000 LOC. What I found is a piece of software that is surprisingly more opinionated and more paranoid than I expected. Here are some of things that I found worth talking about.&lt;/p&gt;
&lt;div id="outline-container-headline-1" class="outline-2"&gt;
&lt;h2 id="headline-1"&gt;
The codename canary problem
&lt;/h2&gt;
&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;
&lt;p&gt;
In &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/types.ts#L10-L18"&gt;src/buddy/types.ts&lt;/a&gt;, all the species names are hex-encoded:&lt;/p&gt;
&lt;div class="src src-typescript"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fromCharCode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;duck&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x63&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x6b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;duck&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;goose&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x67&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x6f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x6f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x73&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x65&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;goose&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
All 18 species, spelled out character by character in hexadecimal. The &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/types.ts#L10-L13"&gt;comment&lt;/a&gt; explains a funny reason:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;One species name collides with a model-codename canary in excluded-strings.txt. The check greps build output (not source), so runtime-constructing the value keeps the literal out of the bundle while the check stays armed for the actual codename.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
So somewhere in Anthropic&amp;#39;s build pipeline there&amp;#39;s a file called &lt;code&gt;excluded-strings.txt&lt;/code&gt; that contains codenames for unreleased models, and a build check that greps the output to make sure none of them leaked into the public build. One of the companion species names happens to match one of these internal codenames. Rather than rename the species, they encoded all of them uniformly in hex so the literal string never appears in the compiled output.&lt;/p&gt;
&lt;p&gt;
I find this hilarious. Somewhere inside Anthropic, a model is codenamed after an animal that&amp;#39;s also a companion species in Claude Code, and the solution is to write &amp;#34;duck&amp;#34; as &lt;code&gt;0x64,0x75,0x63,0x6b&lt;/code&gt;. For the record I don&amp;#39;t think the conflicting species is actually &amp;#34;duck&amp;#34; (that would be too simple), but the comment says they encoded all of them uniformly so you can&amp;#39;t tell which one it is. Clever. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-2" class="outline-2"&gt;
&lt;h2 id="headline-2"&gt;
&lt;code class="verbatim"&gt;goodClaude&lt;/code&gt;, &lt;code class="verbatim"&gt;bughunter&lt;/code&gt; and other internal commands
&lt;/h2&gt;
&lt;div id="outline-text-headline-2" class="outline-text-2"&gt;
&lt;p&gt;
The &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/commands.ts"&gt;commands file&lt;/a&gt; has a section of internal-only commands that are hidden in external builds: &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/commands.ts#L228"&gt;bughunter&lt;/a&gt;, &lt;code&gt;commitPushPr&lt;/code&gt;, &lt;code&gt;ctx_viz&lt;/code&gt;, &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/commands.ts#L232"&gt;goodClaude&lt;/a&gt; (which is disabled and hidden, we will never know what it did), &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/commands.ts#L104-L105"&gt;ultraplan&lt;/a&gt;, &lt;code&gt;ultrareview&lt;/code&gt;, &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/commands.ts#L246"&gt;teleport&lt;/a&gt;, and &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/commands.ts#L147"&gt;ant-trace&lt;/a&gt;. These exist only in Anthropic&amp;#39;s internal build.&lt;/p&gt;
&lt;p&gt;
There&amp;#39;s also a rich set of feature flags for experimental modes: &lt;code&gt;PROACTIVE&lt;/code&gt; (autonomous agent), &lt;code&gt;KAIROS&lt;/code&gt; (an assistant/brief mode), &lt;code&gt;COORDINATOR_MODE&lt;/code&gt; (multi-agent orchestration where Claude spawns worker agents), &lt;code&gt;AGENT_TRIGGERS&lt;/code&gt; (cron job scheduling for agents), &lt;code&gt;VOICE_MODE&lt;/code&gt;, and &lt;code&gt;BUDDY&lt;/code&gt; (the companion pets). The coordinator mode is particularly interesting because it &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/coordinator/coordinatorMode.ts#L259"&gt;explicitly tells the orchestrating agent&lt;/a&gt;: &amp;#34;Never write &amp;#39;based on your findings&amp;#39; or &amp;#39;based on the research.&amp;#39; These phrases delegate understanding to the worker instead of doing it yourself.&amp;#34; Whoever wrote that has seen too many LLM responses that start with &amp;#34;Based on my findings…&amp;#34;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-3" class="outline-2"&gt;
&lt;h2 id="headline-3"&gt;
&lt;code class="verbatim"&gt;import I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS&lt;/code&gt;
&lt;/h2&gt;
&lt;div id="outline-text-headline-3" class="outline-text-2"&gt;
&lt;p&gt;In &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/query.ts#L24"&gt;src/query.ts, line 24&lt;/a&gt;, there&amp;#39;s this import:&lt;/p&gt;
&lt;div class="src src-typescript"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;logEvent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;src/services/analytics/index.js&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
This is a TypeScript type and its name is a sentence. Every developer who uses it must type out &amp;#34;&lt;code class="verbatim"&gt;I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS&lt;/code&gt;&amp;#34; as part of their code. It&amp;#39;s a forcing function as you can&amp;#39;t accidentally send file paths or code content to analytics without literally typing &amp;#34;I verified this is not code or filepaths.&amp;#34;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-4" class="outline-2"&gt;
&lt;h2 id="headline-4"&gt;
Multi-Clauding analytics
&lt;/h2&gt;
&lt;div id="outline-text-headline-4" class="outline-text-2"&gt;
&lt;p&gt;
The &lt;code&gt;/insights&lt;/code&gt; command includes a section called &amp;#34;&lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/commands/insights.ts#L2555"&gt;Multi-Clauding (Parallel Sessions)&lt;/a&gt;.&amp;#34; The function &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/commands/insights.ts#L1057-L1062"&gt;&lt;code&gt;detectMultiClauding()&lt;/code&gt;&lt;/a&gt; uses a sliding window algorithm to find the pattern: session1 -&amp;gt; session2 -&amp;gt; session1 within a 30-minute window. It counts and reports these as &amp;#34;overlap events.&amp;#34;&lt;/p&gt;
&lt;p&gt;
I think they&amp;#39;re tracking when you&amp;#39;re running multiple Claude sessions simultaneously and reporting it as a usage metric. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-5" class="outline-2"&gt;
&lt;h2 id="headline-5"&gt;
2,600 lines of preventing rm -rf
&lt;/h2&gt;
&lt;div id="outline-text-headline-5" class="outline-text-2"&gt;
&lt;p&gt;
The bash security system (&lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/tools/BashTool/bashSecurity.ts"&gt;bashSecurity.ts&lt;/a&gt;, 2,592 lines) is pure paranoia, and it&amp;#39;s fascinating. It validates every shell command against a checklist of attack patterns.&lt;/p&gt;
&lt;p&gt;
Some highlights of what it checks for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zsh&amp;#39;s &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/tools/BashTool/bashSecurity.ts#L21-L25"&gt;&lt;code&gt;=cmd&lt;/code&gt; expansion&lt;/a&gt;, where &lt;code&gt;=curl evil.com&lt;/code&gt; expands to &lt;code&gt;/usr/bin/curl evil.com&lt;/code&gt;, bypassing permission rules because the parser sees &amp;#34;=curl&amp;#34; as the command name, not &amp;#34;curl&amp;#34;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/tools/BashTool/bashSecurity.ts#L46-L52"&gt;&lt;code&gt;zmodload&lt;/code&gt;&lt;/a&gt; (gateway to &lt;code&gt;zsh/mapfile&lt;/code&gt; which enables invisible file I/O)&lt;/li&gt;
&lt;li&gt;Heredoc injection, with a full line-by-line matching algorithm that replicates bash&amp;#39;s heredoc-closing behavior&lt;/li&gt;
&lt;li&gt;Shell ANSI-C quoting (&lt;code&gt;$&amp;#39;\x41&amp;#39;&lt;/code&gt;) because it can encode arbitrary characters&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/tools/BashTool/bashSecurity.ts#L16-L18"&gt;Process substitution&lt;/a&gt; in both directions (&lt;code&gt;&amp;lt;()&lt;/code&gt; and &lt;code&gt;&amp;gt;()&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;emulate&lt;/code&gt; (eval-equivalent arbitrary code execution in zsh)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ztcp&lt;/code&gt; (TCP exfiltration through Zsh builtins)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&amp;#39;s a separate file for &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/tools/BashTool/destructiveCommandWarning.ts"&gt;destructive command warnings&lt;/a&gt; that pattern-matches things like &lt;code&gt;git reset --hard&lt;/code&gt; (&amp;#34;&lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/tools/BashTool/destructiveCommandWarning.ts#L16"&gt;may discard uncommitted changes&lt;/a&gt;&amp;#34;), &lt;code&gt;rm -rf&lt;/code&gt; (&amp;#34;&lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/tools/BashTool/destructiveCommandWarning.ts#L59"&gt;may recursively force-remove files&lt;/a&gt;&amp;#34;), &lt;code&gt;DROP TABLE&lt;/code&gt;, and &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/tools/BashTool/destructiveCommandWarning.ts#L82-L83"&gt;&lt;code&gt;kubectl delete&lt;/code&gt;&lt;/a&gt; (&amp;#34;may delete Kubernetes resources&amp;#34;), each with a human-readable warning explaining what you&amp;#39;re about to lose. And all of this is replicated for PowerShell in a separate file that tracks alias hijacking, module loading, and script block cmdlets.&lt;/p&gt;
&lt;p&gt;
There&amp;#39;s a comment &amp;#34;&lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/services/mcp/mcpStringUtils.ts#L89"&gt;This is really ugly but our current Tool type doesn&amp;#39;t make it easy&lt;/a&gt;&amp;#34; in the MCP utility code, which feels honest, however I would say the security code is obsessive and thorough in a way that suggests real incidents behind every check, rather than ugly (code is generally ugly, arguably).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-6" class="outline-2"&gt;
&lt;h2 id="headline-6"&gt;
YOLO
&lt;/h2&gt;
&lt;div id="outline-text-headline-6" class="outline-text-2"&gt;
&lt;p&gt;
Claude Code has a &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/types/permissions.ts#L15-L22"&gt;permission system&lt;/a&gt; with five modes: &lt;code&gt;default&lt;/code&gt; (asks for permission), &lt;code&gt;acceptEdits&lt;/code&gt; (auto-allows file editing), &lt;code&gt;dontAsk&lt;/code&gt; (blocks everything), &lt;code&gt;bypassPermissions&lt;/code&gt; (allows everything), and &lt;code&gt;auto&lt;/code&gt;. The auto mode uses an ML-based classifier to decide whether a tool call is safe to run without asking the user, and internally, the file that implements this classifier is called &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/utils/permissions/yoloClassifier.ts"&gt;yoloClassifier.ts&lt;/a&gt; (1,495 lines), I find this funny because; the classifier performs a two-stage evaluation: a fast initial decision, then an extended reasoning step if needed. It tracks which stage made the decision, cache metrics, token usage, and whether the decision was overridden. Now, the fact that they built an actual thoughtful safety system and named it &amp;#34;yolo&amp;#34; is so hilarious to me.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-7" class="outline-2"&gt;
&lt;h2 id="headline-7"&gt;
A complete Vim implementation, from scratch
&lt;/h2&gt;
&lt;div id="outline-text-headline-7" class="outline-text-2"&gt;
&lt;p&gt;
&lt;a href="https://github.com/chatgptprojects/claude-code/tree/main/src/vim"&gt;src/vim/&lt;/a&gt; contains a full Vim keybinding implementation as a &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/vim/types.ts#L49-L51"&gt;state machine&lt;/a&gt;. Not a wrapper around a library. A hand-rolled state machine with INSERT and NORMAL modes, &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/vim/operators.ts"&gt;operators&lt;/a&gt; (delete, change, yank; 556 lines), &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/vim/motions.ts"&gt;motions&lt;/a&gt; (h/j/k/l, w/b/e, W/B/E, 0/^/$, G), &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/vim/textObjects.ts"&gt;text objects&lt;/a&gt; (words, quotes, brackets, braces), find motions (f/F/t/T with repeat via ;/,), indent/outdent, join lines, replace, toggle case, and dot-repeat. The &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/vim/transitions.ts"&gt;transitions file&lt;/a&gt; (490 lines) handles the full state machine logic.&lt;/p&gt;
&lt;p&gt;
The motions are pure functions and operators handle smart newline logic. There&amp;#39;s a register system with linewise detection. Having went through many Vim (and &amp;#34;evil&amp;#34;, in case of Emacs) plugins myself, honestly this is a more complete Vim implementation than most &amp;#34;Vim mode/evil packages&amp;#34; plugins I&amp;#39;ve used, and it&amp;#39;s very impressive.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-8" class="outline-2"&gt;
&lt;h2 id="headline-8"&gt;
If ye does not heed
&lt;/h2&gt;
&lt;div id="outline-text-headline-8" class="outline-text-2"&gt;
&lt;p&gt;
The query orchestration loop (&lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/query.ts"&gt;src/query.ts&lt;/a&gt;, 1,729 lines) contains this comment at &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/query.ts#L151-L163"&gt;line 151&lt;/a&gt;:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * The rules of thinking are lengthy and fortuitous. They require plenty
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * of thinking of most long duration and deep meditation for a wizard to
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * wrap one&amp;#39;s noggin around.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; *
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * The rules follow:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * 1. A message that contains a thinking or redacted_thinking block must
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * be part of a query whose max_thinking_length &amp;gt; 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * 2. A thinking block may not be the last message in a block
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * 3. Thinking blocks must be preserved for the duration of an assistant
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * trajectory
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; *
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * Heed these rules well, young wizard. For they are the rules of
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * thinking, and the rules of thinking are the rules of the universe.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * If ye does not heed these rules, ye will be punished with an entire
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * day of debugging and hair pulling.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; */&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
There are three rules about how thinking blocks must be handled in the API, and apparently they caused so much suffering that someone chose to document them in medieval English as a warning to future developers. &amp;#34;If ye does not heed these rules, ye will be punished with an entire day of debugging and hair pulling&amp;#34;, and the &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/query.ts#L164"&gt;line directly below this comment&lt;/a&gt; is ironically &lt;code&gt;const MAX_OUTPUT_TOKENS_RECOVERY_LIMIT = 3&lt;/code&gt;. I imagine this constant was born from exactly such a day.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-9" class="outline-2"&gt;
&lt;h2 id="headline-9"&gt;
You have a pet
&lt;/h2&gt;
&lt;div id="outline-text-headline-9" class="outline-text-2"&gt;
&lt;p&gt;There&amp;#39;s a directory called &lt;a href="https://github.com/chatgptprojects/claude-code/tree/main/src/buddy"&gt;src/buddy/&lt;/a&gt;. It implements a companion pet system, complete with species, rarity tiers, stats, ASCII art sprites with idle animations, hats, and eye styles. &lt;/p&gt;
&lt;p&gt;
Your user ID is hashed (using Mulberry32, a tiny PRNG that has the beautiful comment &amp;#34;&lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/companion.ts#L15"&gt;good enough for picking ducks&lt;/a&gt;&amp;#34;) and deterministically rolled into a companion. The species list includes duck, goose, blob, cat, dragon, octopus, owl, penguin, turtle, snail, ghost, axolotl, capybara, cactus, robot, rabbit, mushroom, and &amp;#34;chonk&amp;#34; (see &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/types.ts#L54-L73"&gt;the full species array&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;
Each companion has a rarity (&lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/types.ts#L126-L132"&gt;common 60%, uncommon 25%, rare 10%, epic 4%, legendary 1%&lt;/a&gt;), and rarity determines whether your buddy can get a hat. Common buddies always go hatless. Uncommon and above &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/companion.ts#L97"&gt;roll from the HATS array&lt;/a&gt;, which includes crown, tophat, propeller, halo, wizard hat, beanie, or a &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/types.ts#L79-L89"&gt;&amp;#34;tinyduck&amp;#34;&lt;/a&gt;, which is apparently a tiny duck sitting on top of your ASCII animal. The array also includes &amp;#34;none&amp;#34; though, so your epic companion might still go bald.&lt;/p&gt;
&lt;p&gt;
Each companion has five stats: &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/types.ts#L91-L98"&gt;DEBUGGING, PATIENCE, CHAOS, WISDOM, and SNARK&lt;/a&gt;. There&amp;#39;s always one peak stat and one dump stat, just like D&amp;amp;D character generation. Legendary companions have a &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/companion.ts#L53-L59"&gt;floor of 50&lt;/a&gt; in all stats while common ones start at 5.&lt;/p&gt;
&lt;p&gt;
The architecture is split into &amp;#34;bones&amp;#34; and &amp;#34;soul&amp;#34;. Bones (species, rarity, stats, eyes, hat, shininess) are deterministic from your user ID and regenerated every time, so you &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/companion.ts#L124-L133"&gt;cannot edit your config file to fake a legendary rarity&lt;/a&gt;. The soul (name and personality) is generated once by the model and stored. There&amp;#39;s even a &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/types.ts#L106"&gt;&lt;code&gt;shiny&lt;/code&gt; boolean&lt;/a&gt; with a &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/companion.ts#L99"&gt;1% chance&lt;/a&gt;, like shiny Pokémon.&lt;/p&gt;
&lt;p&gt;
The &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/sprites.ts#L23-L26"&gt;sprites&lt;/a&gt; themselves are defined as 5x12 ASCII art grids with 3 frames of animation each. The &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/sprites.ts#L96-L118"&gt;cat&lt;/a&gt; goes:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /\_/\
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ( · · )
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ( ω )
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (&amp;#34;)_(&amp;#34;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
And in frame 2 it wiggles its tail: &lt;code&gt;(&amp;#34;)_(&amp;#34;)~&lt;/code&gt;. The &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/sprites.ts#L119-L141"&gt;dragon&lt;/a&gt; breathes little tildes (&lt;code&gt;) in its third frame. The [[https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/sprites.ts#L142-L164][octopus]] alternates between ~/\/\/\/\&lt;/code&gt; and &lt;code&gt;\/\/\/\/&lt;/code&gt; tentacle positions. It&amp;#39;s the kind of detail that makes you realize someone on the team was having a genuinely good time.&lt;/p&gt;
&lt;p&gt;
The companion sits beside the input box and &amp;#34;occasionally comments in a speech bubble.&amp;#34; The &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/buddy/prompt.ts#L7-L13"&gt;system prompt&lt;/a&gt; instructs Claude not to pretend to be the companion or narrate what it might say, because the companion is handled separately. When the user addresses the companion by name, Claude is told to &amp;#34;stay out of the way: respond in ONE line or less.&amp;#34;&lt;/p&gt;
&lt;p&gt;
The whole thing is behind a feature flag called &lt;code&gt;BUDDY&lt;/code&gt; and almost nobody knows it exists. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-10" class="outline-2"&gt;
&lt;h2 id="headline-10"&gt;
Other things worth mentioning
&lt;/h2&gt;
&lt;div id="outline-text-headline-10" class="outline-text-2"&gt;
&lt;p&gt;
Some things that I didn&amp;#39;t cover in detail but are still worth knowing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The loading spinner randomly selects from &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/constants/spinnerVerbs.ts#L16-L203"&gt;186 verbs&lt;/a&gt; including &amp;#34;&lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/constants/spinnerVerbs.ts#L45"&gt;Clauding&lt;/a&gt;&amp;#34;, &amp;#34;Flibbertigibbeting&amp;#34;, &amp;#34;Boondoggling&amp;#34;, &amp;#34;Prestidigitating&amp;#34;, &amp;#34;Photosynthesizing&amp;#34;, &amp;#34;Shenaniganing&amp;#34;, &amp;#34;Whatchamacalliting&amp;#34;, and &amp;#34;Tomfoolering&amp;#34;. When it finishes, it uses &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/constants/turnCompletionVerbs.ts"&gt;past tense verbs&lt;/a&gt; (many cooking-themed, like &amp;#34;Sautéed&amp;#34; and &amp;#34;Baked&amp;#34;, plus some like &amp;#34;Cogitated&amp;#34; and &amp;#34;Crunched&amp;#34;), so you might see &amp;#34;Sautéed for 12s&amp;#34;. You can extend or replace the spinner list in your settings.&lt;/li&gt;
&lt;li&gt;There&amp;#39;s a &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/commands/stickers/stickers.ts#L5"&gt;/stickers command&lt;/a&gt; that opens your browser to &lt;code&gt;stickermule.com/claudecode&lt;/code&gt;. That&amp;#39;s the whole command.&lt;/li&gt;
&lt;li&gt;The team memory sync system describes its conflict resolution strategy as &amp;#34;&lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/services/teamMemorySync/index.ts#L884"&gt;the lesser evil&lt;/a&gt;&amp;#34; because local edits overwrite the server version, but the alternative (silently discarding local work) is worse.&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://github.com/chatgptprojects/claude-code/blob/main/src/ink/parse-keypress.ts"&gt;keyboard parser&lt;/a&gt; handles both Kitty and XTerm extended key protocols and has special code paths for SSH tunnels where &lt;code&gt;TERM_PROGRAM&lt;/code&gt; isn&amp;#39;t forwarded. #&lt;a href="https://lr0.org/blog/t/programming/"&gt;Programming&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Repeat Emacs</title><link>https://lr0.org/microblog/2026-03-31-1/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/microblog/2026-03-31-1/</guid><description>
&lt;h1 class="title"&gt;Repeat Emacs&lt;/h1&gt;
&lt;p&gt;
It&amp;#39;s been said that every editor is destined to repeat Emacs. I extend that to, every computer software is destined to repeat Emacs. #&lt;a href="https://lr0.org/blog/t/emacs/"&gt;Emacs&lt;/a&gt; #&lt;a href="https://lr0.org/blog/t/programming/"&gt;Programming&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Doctors in Gaza.</title><link>https://lr0.org/microblog/2026-03-31-2/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/microblog/2026-03-31-2/</guid><description>
&lt;h1 class="title"&gt;Doctors in Gaza.&lt;/h1&gt;
&lt;p&gt;
&lt;a href="https://theintercept.com/2026/03/13/israel-blockade-gaza-iran-war-doctors/"&gt;Israel’s Deadly Blockade Traps 7 Doctors in Gaza&lt;/a&gt;. I think a lot about doctors who are in Gaza, their story, oh what story they have to tell. #&lt;a href="https://lr0.org/blog/t/israel/"&gt;Israel&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Adaptation. (2002)</title><link>https://lr0.org/films/adaptation/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/films/adaptation/</guid><description>
&lt;h1 class="title"&gt;Adaptation. (2002)&lt;/h1&gt;
&lt;p&gt;
Charlie Kaufman writes a film about failing to write a film about a book about orchids. He put his actual neuroses on screen; the self-loathing and the conviction that anything authentic must also be uncommercial. Then he invented a twin brother who is everything he wishes he could be. Confident, productive, happy.&lt;/p&gt;
&lt;p&gt;
The third act surrenders to every convention Charlie spent the whole film refusing. Car chases, drug dealers, death. You can feel his horror at his own script. But that&amp;#39;s the adaptation. Not of the book. Of himself. Purity is a prison and the refusal to compromise is its own cowardice. Donald dies and Charlie finishes the screenplay, and the film you&amp;#39;re watching is the proof. #&lt;a href="https://lr0.org/blog/t/fcinema/"&gt;Cinema&lt;/a&gt;&lt;/p&gt;</description></item><item><title>I'm Thinking of Ending Things (2020)</title><link>https://lr0.org/films/im-thinking-of-ending-things/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/films/im-thinking-of-ending-things/</guid><description>
&lt;h1 class="title"&gt;I&amp;#39;m Thinking of Ending Things (2020)&lt;/h1&gt;
&lt;p&gt;
Everything in this film is a construction: the girlfriend, the drive, the parents, the farmhouse. All of it is memory being revised by someone who has already given up. The &amp;#34;young woman&amp;#34; keeps changing because she was never real. She&amp;#39;s every version of a life the janitor never lived: the physicist, the poet, the painter. All the people he could have spoken to but didn&amp;#39;t.&lt;/p&gt;
&lt;p&gt;
The old man watching the young couple through frosted glass. The parents aging and de-aging. The empty school. It amounts to one long, quiet accounting of what was lost by being too afraid. The title is not a metaphor. #&lt;a href="https://lr0.org/blog/t/fcinema/"&gt;Cinema&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Magnolia (1999)</title><link>https://lr0.org/films/magnolia/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/films/magnolia/</guid><description>
&lt;h1 class="title"&gt;Magnolia (1999)&lt;/h1&gt;
&lt;p&gt;
Three hours of people drowning and none of them know how to ask for help. Earl Partridge dying and unable to undo decades of absence. Frank Mackey performing masculinity so aggressively it takes a while to realize it&amp;#39;s grief. Claudia can&amp;#39;t stop destroying herself. All of them connected by threads they can&amp;#39;t see.&lt;/p&gt;
&lt;p&gt;
Then it rains frogs. Which is either absurd or honest, because sometimes the world is so stuck that nothing short of something biblical can interrupt it. The frogs don&amp;#39;t explain anything. They just make everyone stop. And in that pause, some of them find enough to start again. #&lt;a href="https://lr0.org/blog/t/fcinema/"&gt;Cinema&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Make macOS 26 consistently bad (unironically)</title><link>https://lr0.org/blog/p/macos/</link><pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/blog/p/macos/</guid><description>
&lt;h1 class="title"&gt;Make macOS 26 consistently bad (unironically)&lt;/h1&gt;
&lt;div class="preview-block"&gt;
&lt;p&gt;This post was discussed in &lt;a href="https://news.ycombinator.com/item?id=47547009"&gt;HackerNews&lt;/a&gt; &lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
Alongside the various bugs you get, one of the issues of upgrading to MacOS 26 is that it has one of the most notorious inconsistency issues in window corners. I&amp;#39;m not sure what exactly pushes product designers to like the excessive roundness&lt;sup class="footnote-reference"&gt;&lt;a id="footnote-reference-1" href="#footnote-1"&gt;1&lt;/a&gt;&lt;/sup&gt;. I believe that UI design is the most influencive&lt;sup class="footnote-reference"&gt;&lt;a id="footnote-reference-2" href="#footnote-2"&gt;2&lt;/a&gt;&lt;/sup&gt; field ever since designers just try to follow whatever big companies do (in fact I see this a lot in my work, when two designers are having an argument, one of them would resolve it to, let&amp;#39;s see how Apple draw that button), which means that we are probably going to see this ugly effect elsewhere very soon.&lt;/p&gt;
&lt;p&gt;&lt;img class="inline-img-left" src="https://lr0.org/i/2026-03-27_19-51-20_screenshot.png" alt="../i/2026-03-27_19-51-20_screenshot.png" title="../i/2026-03-27_19-51-20_screenshot.png" /&gt; Anyway, recently I had to upgrade to macOS 26. And I found the edges ugly, like everyone else did. However, what&amp;#39;s even uglier, is the inconsistency. Many people try to resolve this by disabling MacOS system integrity protection, which results in making them possibly vulnerable&lt;sup class="footnote-reference"&gt;&lt;a id="footnote-reference-3" href="#footnote-3"&gt;3&lt;/a&gt;&lt;/sup&gt;. The reason why you need to disable SIP, is that to edit the dynamic libraries that system apps like Safari (which has crazy bad corners) use, you need to edit system libraries that exist the root. To me though, I don&amp;#39;t find the corners so bad, but I find the inconsistency very annoying. So I think a better solution to this is; instead of making everything roundless, make everything more rounded, which requires you to edit only user apps (i.e. no SIP disabling needed). I forked a solution that makes things roundless to modify it to have my approach. It&amp;#39;s simply as follows:&lt;/p&gt;
&lt;div class="src src-c"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#import &amp;lt;AppKit/AppKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#import &amp;lt;objc/runtime.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;CGFloat&lt;/span&gt; &lt;span class="n"&gt;kDesiredCornerRadius&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;23.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;swizzled_cornerRadius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SEL&lt;/span&gt; &lt;span class="n"&gt;_cmd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kDesiredCornerRadius&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;swizzled_getCachedCornerRadius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SEL&lt;/span&gt; &lt;span class="n"&gt;_cmd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kDesiredCornerRadius&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;CGSize&lt;/span&gt; &lt;span class="nf"&gt;swizzled_topCornerSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SEL&lt;/span&gt; &lt;span class="n"&gt;_cmd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;CGSizeMake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kDesiredCornerRadius&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kDesiredCornerRadius&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;CGSize&lt;/span&gt; &lt;span class="nf"&gt;swizzled_bottomCornerSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SEL&lt;/span&gt; &lt;span class="n"&gt;_cmd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;CGSizeMake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kDesiredCornerRadius&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kDesiredCornerRadius&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;__attribute__&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Only apply to third-party GUI apps; skip CLI tools, daemons, and Apple system apps
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;bid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;NSBundle&lt;/span&gt; &lt;span class="n"&gt;mainBundle&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;bundleIdentifier&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;bid&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bid&lt;/span&gt; &lt;span class="nl"&gt;hasPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;com.apple.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Class&lt;/span&gt; &lt;span class="n"&gt;cls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;NSClassFromString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;NSThemeFrame&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Method&lt;/span&gt; &lt;span class="n"&gt;m1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;class_getInstanceMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_cornerRadius&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;method_setImplementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IMP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;swizzled_cornerRadius&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Method&lt;/span&gt; &lt;span class="n"&gt;m2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;class_getInstanceMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_getCachedWindowCornerRadius&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;method_setImplementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IMP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;swizzled_getCachedCornerRadius&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Method&lt;/span&gt; &lt;span class="n"&gt;m3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;class_getInstanceMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_topCornerSize&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;method_setImplementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IMP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;swizzled_topCornerSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Method&lt;/span&gt; &lt;span class="n"&gt;m4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;class_getInstanceMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_bottomCornerSize&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;method_setImplementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IMP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;swizzled_bottomCornerSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Then compile, sign, and store:&lt;/p&gt;
&lt;div class="src src-bash"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;clang -arch arm64e -arch x86_64 -dynamiclib -framework AppKit &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; -o SafariCornerTweak.dylib &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; SafariCornerTweak.m
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p /usr/local/lib/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cp SafariCornerTweak.dylib /usr/local/lib/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo codesign -f -s - /usr/local/lib/SafariCornerTweak.dylib
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp com.local.dyld-inject.plist ~/Library/LaunchAgents/com.local.dyld-inject.plist&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
You can have this plist too to load it in once your computer loads:&lt;/p&gt;
&lt;div class="src src-xml"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE plist PUBLIC &amp;#34;-//Apple//DTD PLIST 1.0//EN&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt; &amp;#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;#34;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;plist&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Label&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;com.local.dyld-inject&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;ProgramArguments&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;launchctl&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;setenv&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;DYLD_INSERT_LIBRARIES&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/usr/local/lib/SafariCornerTweak.dylib&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;RunAtLoad&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;true/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/plist&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Load it:&lt;/p&gt;
&lt;div class="src src-bash"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;launchctl load ~/Library/LaunchAgents/com.local.dyld-inject.plist&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Now at least everything is consistently bad. #&lt;a href="https://lr0.org/blog/t/programming/"&gt;Programming&lt;/a&gt;&lt;/p&gt;
&lt;div id="outline-container-headline-1" class="outline-2"&gt;
&lt;h2 id="headline-1"&gt;
Footnotes
&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="footnotes"&gt;
&lt;hr class="footnotes-separatator"/&gt;
&lt;div class="footnote-definitions"&gt;
&lt;div class="footnote-definition"&gt;
&lt;sup id="footnote-1"&gt;&lt;a href="#footnote-reference-1"&gt;1&lt;/a&gt;&lt;/sup&gt;
&lt;div class="footnote-body"&gt;
&lt;p&gt;One of the ugliest roundness examples I&amp;#39;ve ever seen is the current one in the YouTube UI design&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="footnote-definition"&gt;
&lt;sup id="footnote-2"&gt;&lt;a href="#footnote-reference-2"&gt;2&lt;/a&gt;&lt;/sup&gt;
&lt;div class="footnote-body"&gt;
&lt;p&gt;that&amp;#39;s to say, contagious form inwards &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="footnote-definition"&gt;
&lt;sup id="footnote-3"&gt;&lt;a href="#footnote-reference-3"&gt;3&lt;/a&gt;&lt;/sup&gt;
&lt;div class="footnote-body"&gt;
&lt;p&gt;Arguable, since you just lose security over /root, which is not a big deal if someone already gained access to your machine, at least for me. Edit: I learnt that this is not the case from comments, however, I still believe that if you&amp;#39;re already pwned, SIP can&amp;#39;t do much there.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>arpeggios in circle of fifths</title><link>https://lr0.org/microblog/2026-03-24-1/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/microblog/2026-03-24-1/</guid><description>
&lt;h1 class="title"&gt;arpeggios in circle of fifths&lt;/h1&gt;
&lt;p&gt;
Today I found a tiktoker playing arpeggios in circle of fifths, and claiming that she composed it by herself.&lt;/p&gt;</description></item><item><title>How camera works</title><link>https://lr0.org/microblog/2026-03-23-1/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/microblog/2026-03-23-1/</guid><description>
&lt;h1 class="title"&gt;How camera works&lt;/h1&gt;
&lt;p&gt;
TIL how a camera works &lt;a href="https://www.youtube.com/watch?v=jhBC39xZVnw&amp;amp;list=TLPQMjMwMzIwMjYAI1Jc4rC_oQ&amp;amp;index=3"&gt;What is a pinhole camera?&lt;/a&gt; #&lt;a href="https://lr0.org/blog/t/science/"&gt;Science&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Little Known Development Methods (2009)</title><link>https://lr0.org/blog/p/lkdm/</link><pubDate>Sun, 22 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/blog/p/lkdm/</guid><description>
&lt;h1 class="title"&gt;Little Known Development Methods (2009)&lt;/h1&gt;
&lt;div class="preview-block"&gt;
&lt;p&gt;Following post is by programmer and once-active HN contributor Ed Weissman (&lt;a href="https://news.ycombinator.com/user?id=edw519"&gt;Profile: edw519&lt;/a&gt;), I found it while going through his &amp;#34;&lt;a href="https://web.archive.org/web/20110522160314/http://edweissman.com/53640595"&gt;The Best of edw519&lt;/a&gt;&amp;#34;, it dates to 2009, and I thought it will be worth looking at again. Comments are mine and were not included in the original post.&lt;/p&gt;
&lt;/div&gt;
&lt;style&gt;
/* page-scoped: annotated compendium */
.lkdm .sidenote { display: none !important; }
.lkdm + .footnotes,
.lkdm ~ .footnotes { display: none !important; }
.lkdm ~ .sidenotes-active { display: none !important; }
.lkdm p { text-align: justify; }
.lkdm-def {
margin-bottom: 0;
}
.lkdm-note {
position: relative;
margin: 0.55em 0 0 1.5em;
padding-left: 0;
border-left: none;
font-style: normal !important;
font-size: 0.92em;
opacity: 0.7;
}
.lkdm-note::before {
position: absolute;
left: -1.4em;
top: 0.08em;
font-style: normal;
font-size: 0.85em;
opacity: 0.28;
}
.lkdm-note p { margin: 0.4em 0; }
.lkdm-note p:first-child { margin-top: 0; }
.lkdm-note p:last-child { margin-bottom: 0; }
.lkdm-note a { color: var(--darkbrown); }
.lkdm-sep {
text-align: center;
margin: 2em 0;
font-size: 0.85em;
opacity: 0.25;
letter-spacing: 0.5em;
}
.lkdm-coda {
margin-top: 2.5em;
padding-top: 1.2em;
border-top: 1px dotted var(--darkbrown);
font-style: italic;
}
&lt;/style&gt;
&lt;div class="lkdm"&gt;
&lt;p class="lkdm-def"&gt;&lt;strong&gt;Garbage Perpetuation Development (GPD)&lt;/strong&gt; &amp;#8212; You can&amp;#8217;t believe how bad the existing code base is, but you&amp;#8217;re afraid to open a can of worms, so everything you add to it is written in the same style. For the rest of your life, you can say, &amp;#8220;It was like that when I got here.&amp;#8221;&lt;/p&gt;
&lt;blockquote class="lkdm-note"&gt;
&lt;p&gt;Eighteen years later and this is somehow more relevant, not less. what nobody saw coming is that now we have LLMs-based coding assistants trained on the entire internet, which means they&amp;#8217;ve ingested billions of lines of GPD-produced code and will cheerfully suggest the same patterns right back at you. I remember reading a darkly funny thread on this from Simon Willison, or someone on Twitter, where they note that Copilot and friends are essentially the world&amp;#8217;s most confident GPD practitioner, i.e. they&amp;#8217;ll mirror whatever style surrounds them without judgment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="lkdm-sep"&gt;&amp;#183; &amp;#183; &amp;#183;&lt;/div&gt;
&lt;p class="lkdm-def"&gt;&lt;strong&gt;Mansion in the Quicksand Development (MQD)&lt;/strong&gt; &amp;#8212; The opposite of Garbage Perpetuation Development, you are so shocked by the poor quality of the existing code that you vow that you&amp;#8217;d rather swallow razor blades that code the same way. So you write a tight beautiful refactored masterpiece that will crash as soon as the underlying database loses its integrity (later tonight).&lt;/p&gt;
&lt;blockquote class="lkdm-note"&gt;
&lt;p&gt;Joel Spolsky&amp;#8217;s 2000 post &amp;#8220;&lt;a href="https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/"&gt;Things You Should Never Do, Part&amp;#160;I&lt;/a&gt;&amp;#8221; was already making this point about Netscape&amp;#8217;s catastrophic rewrite, and yet we keep doing it. I believe the reason this pattern persists is that the beautiful new code feels like progress (I personally still like how the git blame shows my name next to clean principled work) and the rotten foundation is invisible until it isn&amp;#8217;t. The 2022-era wave of &amp;#8220;we&amp;#8217;re migrating from our monolith to microservices&amp;#8221; produced a fresh epidemic of this, stunning new service boundaries built on top of a PostgreSQL schema that hadn&amp;#8217;t been touched since 2009 and was quietly on fire.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="lkdm-sep"&gt;&amp;#183; &amp;#183; &amp;#183;&lt;/div&gt;
&lt;p class="lkdm-def"&gt;&lt;strong&gt;Defer to the Framework Development (DFD)&lt;/strong&gt; &amp;#8212; You&amp;#8217;re not sure how to tackle quite a few critical design/architecture issues, so you convince your boss to adopt the framework du jour and decide to &amp;#8220;let it handle it&amp;#8221;. As soon as someone needs something that the framework doesn&amp;#8217;t handle, you blame management for making such a myopic technology decision and say that it can&amp;#8217;t be done. You keep your job and get a new boss every two years.&lt;/p&gt;
&lt;blockquote class="lkdm-note"&gt;
&lt;p&gt;This post was written in 2009, which means the Rails hype cycle was at absolute peak. Looking back, the framework-du-jour carousel has spun so many times since then; Backbone &amp;#8594; Angular &amp;#8594; Ember &amp;#8594; React &amp;#8594; Vue &amp;#8594; Svelte &amp;#8594; htmx, that &amp;#8220;DFD&amp;#8221; is now practically a job title. The irony is that React, which became the dominant &amp;#8220;let it handle it&amp;#8221; choice for the better part of a decade, is now itself the thing people are fleeing. Addy Osmani has written about the cost of JS framework churn and how each migration has tended to &lt;a href="https://medium.com/@addyosmani/the-cost-of-javascript-in-2018-7d8950fbb5d4"&gt;cost far more than the original adoption&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="lkdm-sep"&gt;&amp;#183; &amp;#183; &amp;#183;&lt;/div&gt;
&lt;p class="lkdm-def"&gt;&lt;strong&gt;Not Invented Here Development (NIHD)&lt;/strong&gt; &amp;#8212; The opposite of Defer to the Framework Development, as soon as you discover something the current framework can&amp;#8217;t handle, you abandon it and write all your own routines. Everything now works exactly as you want it, but with all the additional code to maintain, your backlog has just grown from 6 months to 2 years.&lt;/p&gt;
&lt;blockquote class="lkdm-note"&gt;
&lt;p&gt;Some of the most NIH-afflicted organizations (early Amazon, early Google) turned their internal reinventions into products (AWS, Bigtable/BigQuery) and ended up winning. The rest just quietly accrued two-year backlogs as described. The honest version of NIHD&amp;#8217;s calculus is that owning your stack gives you deep understanding but the cost compounds ruthlessly over time (Kellan Elliott-McCrea &lt;a href="https://techcrunch.com/2015/04/27/etsy-cto-on-its-conservatively-crafty-tech-philosophy/"&gt;wrote&lt;/a&gt; about this during his time at Etsy).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="lkdm-sep"&gt;&amp;#183; &amp;#183; &amp;#183;&lt;/div&gt;
&lt;p class="lkdm-def"&gt;&lt;strong&gt;Whoever Screams Loudest Development (WSLD)&lt;/strong&gt; &amp;#8212; Just as the name implies, you work for the customer who screams the loudest. If anyone screams louder, you drop everything and work on their project.&lt;/p&gt;
&lt;div class="lkdm-sep"&gt;&amp;#183; &amp;#183; &amp;#183;&lt;/div&gt;
&lt;p class="lkdm-def"&gt;&lt;strong&gt;F-Bomb Development (FBD)&lt;/strong&gt; &amp;#8212; Whenever everyone is screaming so loud you can&amp;#8217;t hear anything, you work on the project of the customer who drops the most F-bombs.&lt;/p&gt;
&lt;blockquote class="lkdm-note"&gt;
&lt;p&gt;This one is timeless.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="lkdm-sep"&gt;&amp;#183; &amp;#183; &amp;#183;&lt;/div&gt;
&lt;p class="lkdm-def"&gt;&lt;strong&gt;Start Over Development (SOD)&lt;/strong&gt; &amp;#8212; A critical requirement cannot be supported by the current architecture, so you decide to rewrite it. You spend 3 months designing the new architecture and then 6 months writing the new code. You never finish because you&amp;#8217;re out of business. Now you know what &amp;#8220;critical&amp;#8221; means.&lt;/p&gt;
&lt;blockquote class="lkdm-note"&gt;
&lt;p&gt;The autopsy for this pattern remains Spolsky&amp;#8217;s Netscape post, but the case study that really drove it home for a generation of developers was the Friendster-to-Facebook transition and, more painfully, the Digg v4 rewrite in 2010, which effectively killed the company. The 3-month architecture phase feels like real progress and generates real excitement, and again, it&amp;#8217;s the most enjoyable part of software development for a lot of people.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="lkdm-sep"&gt;&amp;#183; &amp;#183; &amp;#183;&lt;/div&gt;
&lt;p class="lkdm-def"&gt;&lt;strong&gt;Workaround Development (WAD)&lt;/strong&gt; &amp;#8212; The opposite of Start Over Development, you can make the current system do anything. You are so clever with your extra algorithms, functions, and databases. Even with all your great variable naming and comments, six months later, you have no idea how anything works.&lt;/p&gt;
&lt;blockquote class="lkdm-note"&gt;
&lt;p&gt;Foote and Yoder named this the &amp;#8220;&lt;a href="https://www.laputan.org/mud/mud.html"&gt;Big Ball of Mud&lt;/a&gt;&amp;#8221; in their 1999 paper of the same name, and their observation that it&amp;#8217;s actually the dominant architecture in production systems worldwide remains one of the most quietly devastating things ever written about software. It often produces genuinely working software for longer than any of the cleaner approaches (arguably) the system is alive, users are happy (arguably), and it&amp;#8217;s only the next developer (or future you) who pays the price. Ward Cunningham&amp;#8217;s original framing of &amp;#8220;technical debt&amp;#8221; was meant to describe exactly this tradeoff: &lt;a href="https://martinfowler.com/bliki/TechnicalDebt.html"&gt;borrowing against future&lt;/a&gt; understanding to ship today.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="lkdm-sep"&gt;&amp;#183; &amp;#183; &amp;#183;&lt;/div&gt;
&lt;p class="lkdm-def"&gt;&lt;strong&gt;Code Generation Development (CGD)&lt;/strong&gt; &amp;#8212; You&amp;#8217;re so tired of writing the same code over and over, that you write a code generator to do it for you. What used to take a week only takes a few hours with the new tool. But you&amp;#8217;re no further ahead because 80% of your time is needed to enhance and maintain the code generator.&lt;/p&gt;
&lt;blockquote class="lkdm-note"&gt;
&lt;p&gt;This one did not age the way the author expected. The code generation problem got absorbed by an industry: first by scaffolding tools, then by platform engineering teams, and eventually by LLMs. The new version of this is that you spend 80% of your time writing and maintaining prompts instead of a generator, which is arguably the same trap with a different texture.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="lkdm-sep"&gt;&amp;#183; &amp;#183; &amp;#183;&lt;/div&gt;
&lt;p class="lkdm-def"&gt;&lt;strong&gt;Infinite Prototyping Development (IPD)&lt;/strong&gt; &amp;#8212; Your customers and users are unable to describe or document their requirements. So you spend lots of time with them understanding their business and when you&amp;#8217;re ready, you throw together a prototype. They love it, but it needs just a few changes. You keep making changes, but it always needs more. It stays a prototype forever. When the app crashes because of security or scaling issues, you&amp;#8217;re off the hook because, &amp;#8220;It&amp;#8217;s only a prototype.&amp;#8221;&lt;/p&gt;
&lt;blockquote class="lkdm-note"&gt;
&lt;p&gt;&lt;a href="https://theleanstartup.com"&gt;The Lean Startup movement&lt;/a&gt; (Ries, 2011) tried to rehabilitate the prototype by renaming it the MVP and giving it a lifecycle, so the &amp;#8220;forever prototype&amp;#8221; is a failure of process, not of the artifact itself. It helped somewhat. What it didn&amp;#8217;t fix is the social contract problem at IPD&amp;#8217;s core because once stakeholders have seen something running, they shift from &amp;#8220;requirements document&amp;#8221; to &amp;#8220;change request,&amp;#8221; and you can never get them back. Many people do not know this but React was originally an internal Facebook prototype that just&amp;#8230; never stopped (React is still referenced ironically in the &lt;a href="https://0ver.org"&gt;0ver&lt;/a&gt; satire).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="lkdm-sep"&gt;&amp;#183; &amp;#183; &amp;#183;&lt;/div&gt;
&lt;p class="lkdm-def"&gt;&lt;strong&gt;Infinite Analysis Development (IAD)&lt;/strong&gt; &amp;#8212; You never have to do anything because you never have specs. Woo hoo!&lt;/p&gt;
&lt;blockquote class="lkdm-note"&gt;
&lt;p&gt;The Agile Manifesto was signed in 2001, eight years before this post, specifically because this had become the dominant mode of enterprise software development through the 1990s. And yet here we are in 2009 still writing about it, and here it is in 2026 still happening in every organization large enough to have a dedicated &amp;#8220;architecture review board.&amp;#8221; If the thing you&amp;#8217;d build is going to be wrong, not building it yet has real value. The problem is that the people practicing it rarely know which situation they&amp;#8217;re in.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;p&gt;These were already old in 2009 and they still hold up seventeen years later because, IMHO, most of them aren’t software problems but people problems wearing software clothes.&lt;/p&gt;
&lt;p&gt;
Read it again: every pattern has a destructive opposite. GPD and MQD. DFD and NIHD. SOD and WAD. The narrow, uncomfortable space between each pair is where actual engineering happens, but nobody writes a blog post about it because it doesn’t have a funny acronym (yet?). #&lt;a href="https://lr0.org/blog/t/programming/"&gt;Programming&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Why English has silent letters</title><link>https://lr0.org/microblog/2026-03-22-2/</link><pubDate>Sun, 22 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/microblog/2026-03-22-2/</guid><description>
&lt;h1 class="title"&gt;Why English has silent letters&lt;/h1&gt;
&lt;p&gt;
TIL that silent letters in English were the results of men &lt;a href="https://www.youtube.com/watch?v=NXVqZpHY5R8"&gt;trying to &amp;#34;fix English&amp;#34;&lt;/a&gt; across history #&lt;a href="https://lr0.org/blog/t/lingustics/#dok4phy0p9k0"&gt;linguist&lt;/a&gt;&lt;/p&gt;</description></item><item><title>quality of HN comments</title><link>https://lr0.org/microblog/2026-03-22-3/</link><pubDate>Sun, 22 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/microblog/2026-03-22-3/</guid><description>
&lt;h1 class="title"&gt;quality of HN comments&lt;/h1&gt;
&lt;p&gt;
&lt;a href="http://static.v25media.com/edw519_mod.html#chapter_252"&gt;quality of HN comments&lt;/a&gt;. I don&amp;#39;t get what ed meant there, my best interpretation is that it was a playful moment on the keyboard, which I find joyful and nice.&lt;/p&gt;</description></item><item><title>Kyoshi Island</title><link>https://lr0.org/microblog/2026-03-21-1/</link><pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/microblog/2026-03-21-1/</guid><description>
&lt;h1 class="title"&gt;Kyoshi Island&lt;/h1&gt;
&lt;p&gt;
&amp;#34;I created Kyoshi Island so my people can be safe from invasions&amp;#34;, does not this contradict with her responsibilities? What about other people? &lt;/p&gt;</description></item><item><title>the true mind</title><link>https://lr0.org/microblog/2026-03-21-2/</link><pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/microblog/2026-03-21-2/</guid><description>
&lt;h1 class="title"&gt;the true mind&lt;/h1&gt;
&lt;p&gt;
The true mind can weather all the lies and illusions without being lost. The true heart can touch the poison of hatred without being harmed. &lt;/p&gt;</description></item><item><title>Alexandre Charles Guillemot, Art</title><link>https://lr0.org/microblog/2026-03-20-1/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/microblog/2026-03-20-1/</guid><description>
&lt;h1 class="title"&gt;Alexandre Charles Guillemot, Art&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://lr0.org/blog/h/art_paintings_media/#926iu0t0wvk0"&gt;Alexandre Charles Guillemot&lt;/a&gt; looks interesting and mysterious, he only had 3 paintings, but they&amp;#39;re all so beautiful. &lt;/p&gt;</description></item><item><title>2026/03/19</title><link>https://lr0.org/diary/2026-03-19/</link><pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/diary/2026-03-19/</guid><description>
&lt;h1 class="title"&gt;2026/03/19&lt;/h1&gt;
&lt;div id="outline-container-headline-1" class="outline-2"&gt;
&lt;h2 id="headline-1"&gt;
09:59
&lt;/h2&gt;
&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;
&lt;p&gt;
&amp;gt;&lt;a href="https://politics.stackexchange.com/a/6392/47421"&gt;https://politics.stackexchange.com/a/6392/47421&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nobel Peace prize tends to go to people who identify with hard left wing in general, and VERY often are Marxist (and even more often take Marxist-friendly, anti-capitalist positions without admitting to being Marxist).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Wow, such a stupid take, I&amp;#39;m surprised that it comes from a top user of the politics SE community, I wonder what else stupid things this user might have posted as answers.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-2" class="outline-2"&gt;
&lt;h2 id="headline-2"&gt;
10:20 Me and who
&lt;/h2&gt;
&lt;div id="outline-text-headline-2" class="outline-text-2"&gt;
&lt;p&gt;
&amp;gt;&lt;a href="https://en.wikipedia.org/wiki/Robert_Tappan_Morris"&gt;https://en.wikipedia.org/wiki/Robert_Tappan_Morris&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;He is a longtime friend and collaborator of Paul Graham. Along with cofounding two companies with him, Graham dedicated his book ANSI Common Lisp to Morris and named the programming language that generates the online stores&amp;#39; web pages RTML (Robert T. Morris Language) in his honor. Graham lists Morris as one of his personal heroes, saying that Morris is &amp;#34;never wrong.&amp;#34;[21]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>bottom-posting</title><link>https://lr0.org/microblog/2026-03-19-1/</link><pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate><guid>https://lr0.org/microblog/2026-03-19-1/</guid><description>
&lt;h1 class="title"&gt;bottom-posting&lt;/h1&gt;
&lt;p&gt;
I never thought of a good use to bottom-posting (including all the conversation when replying in emails). Now I can see how useful it is when forwarding emails. &lt;/p&gt;</description></item></channel></rss>