<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Sarah Deaton - developer-experience</title>
      <link>https://sdeaton.com</link>
      <description>On AI, developer tools, technical writing, and whatever else catches my interest</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://sdeaton.com/tags/developer-experience/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Sat, 16 May 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Making All Caps as a Service</title>
          <pubDate>Sat, 16 May 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://sdeaton.com/blog/making-acaas/</link>
          <guid>https://sdeaton.com/blog/making-acaas/</guid>
          <description xml:base="https://sdeaton.com/blog/making-acaas/">&lt;p&gt;For my recent &lt;a href=&quot;..&#x2F;git-talk-recap&#x2F;&quot;&gt;Write the Docs talk&lt;&#x2F;a&gt;, I needed a docs site that felt real enough to demo against. I didn’t have a convenient API lying around to document, so I built a toy API and a full docs site on top of that; overengineered, but did what I wanted and it was a fun side quest.&lt;&#x2F;p&gt;
&lt;p&gt;This is the full walkthrough of building ACAAS, &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;acaas.mintlify.app&#x2F;&quot;&gt;All Caps as a Service&lt;&#x2F;a&gt;. Looking back, I thought it was an interesting, abbreviated case study in some AI&#x2F;docs tooling and building a site from scratch, so I wanted to jot down the decisions and steps.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;sdeaton.com&#x2F;blog&#x2F;making-acaas&#x2F;acaas-home.png&quot; alt=&quot;ACAAS docs homepage, showing the hero and primary navigation.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1-build-the-service&quot;&gt;1. Build the service&lt;&#x2F;h2&gt;
&lt;p&gt;First, I used the Claude Code CLI to build a small API from scratch. I gave it the concept (you send text, it sends it back in all caps) and asked it to make it realistic enough to write docs against (like rate limits and error messages, and a few endpoints). It chose Python for the backend and came back with a few new endpoints like &lt;code&gt;&#x2F;shout&lt;&#x2F;code&gt; and &lt;code&gt;&#x2F;whisper&lt;&#x2F;code&gt;, and the supporting machinery to go with them.&lt;&#x2F;p&gt;
&lt;p&gt;I also told it I wanted one AI-powered feature, ideally something on the path to GA; a feature graduating from experimental is the kind of documentation moment I wanted to demo (and every SaaS company needs an AI feature). It proposed &lt;code&gt;&#x2F;experimental&lt;&#x2F;code&gt;, which uses a small model to decide which words in your sentence deserve to be bolded.&lt;&#x2F;p&gt;
&lt;p&gt;After it finished building the API, I ran &lt;code&gt;&#x2F;simplify&lt;&#x2F;code&gt;, which is &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;skills#bundled-skills&quot;&gt;a bundled Claude Code skill&lt;&#x2F;a&gt; that does a quick cleanup pass to look for dead code and unnecessary indirection. This wasn’t important for anything, but I wanted to at least feel like the code was cleaner than a one-shot pass. Then I &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;best-practices#write-an-effective-claude-md&quot;&gt;ran &lt;code&gt;&#x2F;init&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; to generate a README and CLAUDE.md. The README is for future me, in case I ever need to run or modify this thing again. The CLAUDE.md is just good practice at this point, the scaffold I’d want if I came back to this project for something else.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2-find-a-documentation-platform&quot;&gt;2. Find a documentation platform&lt;&#x2F;h2&gt;
&lt;p&gt;My first instinct for the docs platform was &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;Zola&lt;&#x2F;a&gt; or &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;astro.build&#x2F;&quot;&gt;Astro&lt;&#x2F;a&gt;. But before choosing, I did a sanity check on &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.mintlify.com&#x2F;&quot;&gt;Mintlify&lt;&#x2F;a&gt;, which I’ve worked with professionally for a couple of years and have never tried spinning up for a personal project. I’d assumed the free tier would be limited in some way that didn’t fit a one-off demo site, but it wasn’t. I created &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;acaas.mintlify.app&quot;&gt;acaas.mintlify.app&lt;&#x2F;a&gt; in about a minute, cloned the repo, and was ready to go.&lt;&#x2F;p&gt;
&lt;p&gt;I was mildly embarrassed not to have known about the free tier. I also kind of want to move my blog over to Mintlify now.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;sdeaton.com&#x2F;blog&#x2F;making-acaas&#x2F;mintlify-dashboard.png&quot; alt=&quot;The Mintlify analytics dashboard for ACAAS, with 19 visitors and 41 views over a recent date range, a Humans&#x2F;Agents traffic split, a Visitors Over Time bar chart, and a left sidebar covering Home, Editor, Analytics, Settings, and an Agents group for Workflows, Agent, Assistant, and MCP.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3-design-the-site&quot;&gt;3. Design the site&lt;&#x2F;h2&gt;
&lt;p&gt;I didn’t need to do this step at all, but it was the most fun. I have 0 design sense whatsoever, and &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;claude.ai&#x2F;design&quot;&gt;Claude Design&lt;&#x2F;a&gt; has been a lifesaver for me. I started a new prototype, described what I was building (“a Mintlify docs site for a fake API called All Caps as a Service”), and it started guiding me through the design steps until I had a lovely new branded docs site.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;sdeaton.com&#x2F;blog&#x2F;making-acaas&#x2F;claude-design-landing.png&quot; alt=&quot;Two Claude Design landing-page variations for ACAAS in dark mode, side by side: Variation A (Loud, Amber) with a large “send whisper. RECEIVE THUNDER.” hero, and Variation B (Restrained, Cobalt) with a status dashboard, quickstart steps, and an endpoint table.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I like that Claude Design asks clarifying questions as it works; things like what kind of feel I was after (bold or minimal or standard SaaS), whether I had color directions or wanted it to pick, etc. I landed on a theme I was happy with, had it generate a favicon and logo to match, and the whole time it was working inside Mintlify’s design constraints rather than producing something I’d have to retrofit. When I was done, I chose the “Handoff to Claude Code” export option and went on with my day.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;sdeaton.com&#x2F;blog&#x2F;making-acaas&#x2F;claude-design-marks.png&quot; alt=&quot;Claude Design output for ACAAS branding: eight candidate icon marks (Monogram A, Sound bars, Bang, Stacked carets, Megaphone, aA transform, Boost, Chevrons) with short rationales, three wordmark lockups, and a recommended pick of the aA transform with sizing and dark-mode previews.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;4-apply-the-design&quot;&gt;4. Apply the design&lt;&#x2F;h2&gt;
&lt;p&gt;I used Claude Code Desktop for this because it has a built-in local preview. I could run the site locally and watch it render while Claude made changes, and Claude can see the preview too, so it catches its own rendering errors without me having to describe what I’m seeing. The workflow felt closer to pairing than to instructing. You could also do this with the CLI and then use the &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;chrome&quot;&gt;Claude in Chrome extension&lt;&#x2F;a&gt; or &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;microsoft&#x2F;playwright-mcp&quot;&gt;Playwright MCP&lt;&#x2F;a&gt; to have Claude iterate on the design itself locally, but I just like the Desktop in-app experience.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;sdeaton.com&#x2F;blog&#x2F;making-acaas&#x2F;claude-code-desktop-preview.png&quot; alt=&quot;Claude Code Desktop with the conversation in the left pane (a turn confirming that docs.json, index.mdx, styles.css, and new logo files were copied to the worktree, with Mintlify hot-reloading on localhost:3000) and the live ACAAS docs site rendered at localhost:3000 in the right pane, showing the freshly-applied “send whisper. RECEIVE THUNDER.” hero.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This step was pretty anticlimactic in a nice way. Claude took the design handoff, implemented it cleanly, and there wasn’t anything to debug. As an aside, I’ve shipped so many ugly, half-finished prototypes and waved it away with “I don’t like CSS,” and it feels like the days of that are finally over.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;5-scaffold-the-docs&quot;&gt;5. Scaffold the docs&lt;&#x2F;h2&gt;
&lt;p&gt;I let AI generate the content with little direction, and I feel very fine about that. I said I wanted getting-started guides, cookbooks, and a changelog, and it produced them. I’m sure a few are confidently wrong in ways that don’t matter for a demo.&lt;&#x2F;p&gt;
&lt;p&gt;One thing that surprised me was that new Mintlify sites ship with a pre-built &lt;code&gt;AGENTS.md&lt;&#x2F;code&gt; file and a &lt;code&gt;.claude&#x2F;&lt;&#x2F;code&gt; directory with settings and skills scaffolding for working with Mintlify, along with some basic style guides. The core instructions felt fairly useful&#x2F;didn’t include anything I’d argue didn’t deserve to be there.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;6-create-an-openapi-spec&quot;&gt;6. Create an OpenAPI spec&lt;&#x2F;h2&gt;
&lt;p&gt;The last piece was an API reference section. This is one of my favorite Mintlify features, even though the docs I work on now don’t have an API component. The API reference pages are built in and include an interactive playground where visitors can make live calls to the service from inside the docs themselves. All it needs is an OpenAPI spec, which Claude Code generated directly from the service code.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;sdeaton.com&#x2F;blog&#x2F;making-acaas&#x2F;acaas-openapi.png&quot; alt=&quot;The ACAAS API reference section generated from the OpenAPI spec, with a “Try it” panel and request&#x2F;response examples.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Start to finish, the whole build was about two hours, most of which was the design step and a small detour deciding how much realism the rate limits needed. A year ago I would have spent the same two hours scaffolding just the initial API and decided nevermind maybe I’ll go a different direction.&lt;&#x2F;p&gt;
&lt;p&gt;End result: I used the demo in my talk, &lt;a href=&quot;..&#x2F;git-talk-recap&#x2F;&quot;&gt;the git commands I avoided for nine years&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>The git commands I avoided for nine years</title>
          <pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://sdeaton.com/blog/git-talk-recap/</link>
          <guid>https://sdeaton.com/blog/git-talk-recap/</guid>
          <description xml:base="https://sdeaton.com/blog/git-talk-recap/">&lt;!--
TODO before publishing:
- copy videos from ~&#x2F;src&#x2F;git-talk-slides&#x2F;videos&#x2F; into this directory:
  with-worktrees.mp4, with-reflog.mp4, update-refs.mp4
--&gt;
&lt;p&gt;I recently gave a &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=FiGT3XYICSE&quot;&gt;talk&lt;&#x2F;a&gt; at &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.writethedocs.org&#x2F;&quot;&gt;Write the Docs&lt;&#x2F;a&gt; about three git commands I’d been avoiding for most of my career, or in two cases didn’t know existed at all. For the demo environment behind the talk, I built &lt;a href=&quot;..&#x2F;making-acaas&#x2F;&quot;&gt;All Caps as a Service&lt;&#x2F;a&gt;, a fake API and docs site that turned into its own side quest.&lt;&#x2F;p&gt;
&lt;p&gt;To properly set expectations up front: I’m not a git expert. I’ve used git almost daily for a decade with a workflow I’ll describe in a minute, and recently discovered some parts of git that changed my thinking on it. I gave the talk and wrote this post because you don’t need to be a git expert to get a long way with the tool, or to look into the parts you’ve been avoiding.&lt;&#x2F;p&gt;
&lt;iframe
  width=&quot;100%&quot;
  height=&quot;415&quot;
  src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;FiGT3XYICSE&quot;
  title=&quot;The git commands I avoided for nine years&quot;
  frameborder=&quot;0&quot;
  allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
  allowfullscreen
&gt;&lt;&#x2F;iframe&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;sdeaton.com&#x2F;blog&#x2F;git-talk-recap&#x2F;git-talk-sketchnote.jpg&quot; alt=&quot;Sketchnote of the talk by Dennis Dawson. A timeline of sticky notes across the top reads “The Git Commands I Avoided for Nine Years (and why I wish I hadn’t).” Below, three commands are illustrated: git worktree, described as creating a second checkout of the repo; git reflog, described as an undo button for recovering lost commits, deleted branches, and bad rebases; and git rebase –update-refs, described as automagically force-updating all local branches that point to commits being rebased. Jujutsu (jj) appears at the bottom, described as reimagining what a commit is with no staging area and conflicts as first-class objects. On the right, “commit often” is written vertically in large pink letters.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Sketchnote by &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;dennissdawson.wixsite.com&#x2F;mr--dawson&#x2F;portfolio&quot;&gt;Dennis Dawson&lt;&#x2F;a&gt;, via the &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.flickr.com&#x2F;photos&#x2F;writethedocs&#x2F;55266348341&#x2F;in&#x2F;album-72177720333614185&quot;&gt;Write the Docs Flickr&lt;&#x2F;a&gt;. I love the reflog drawing.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-i-got-here&quot;&gt;How I got here&lt;&#x2F;h2&gt;
&lt;p&gt;For the majority of my time in tech, I used about six git commands: &lt;code&gt;add&lt;&#x2F;code&gt;, &lt;code&gt;commit -m &quot;wip&quot;&lt;&#x2F;code&gt;, &lt;code&gt;rebase -i&lt;&#x2F;code&gt;, &lt;code&gt;commit --amend&lt;&#x2F;code&gt;, &lt;code&gt;cherry-pick&lt;&#x2F;code&gt;, &lt;code&gt;push&lt;&#x2F;code&gt;. Add, save, clean up the history, polish, and push. It worked, and it produced nice clean PRs.&lt;&#x2F;p&gt;
&lt;p&gt;When I first learned git in a software engineering bootcamp, the framing was unambiguous. Git was esssential but could be dangerous. You could lose work, and you should stay inside a small set of safe commands. Above all, don’t touch rebase while you’re learning. If you got into a mess with it, you were on your own.&lt;&#x2F;p&gt;
&lt;p&gt;I eventually went to work on teams with other engineers, learned about collaborating on projects using git, added &lt;code&gt;git rebase -i&lt;&#x2F;code&gt; to my toolkit, and felt pretty accomplished. My daily git commands worked for the most part… except for the few times when I’d do a bad rebase, and think I lost hours of work, despair and start over. Or get into a really tangled merge conflict and just end up deleting the branch and pulling down again from the remote. I thought that was the way it was; git was powerful with some rough edges.&lt;&#x2F;p&gt;
&lt;p&gt;What changed this for me had nothing to do with git initially. Last year, I wanted to run two Claude Code sessions on the same repo on different branches at once, purely for parallelism. I didn’t know how to do this, because as far as I knew, you could only have one branch checked out for a repo at a given time on your computer.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;worktrees&quot;&gt;The fix turned out to be &lt;code&gt;git worktree&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, a git feature rather than anything to do with Claude Code. It also addressed a paper cut I’d been living with for years that I didn’t even realized I’d had: the stash-checkout-checkout-back-stash-pop dance every time I wanted to spin up a quick branch for a typo fix when I was in the middle of other work. Fixing a problem I hadn’t let rise to consciousness made me wonder what else was there and what I should incorporate into my toolkit.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-three-commands&quot;&gt;The three commands&lt;&#x2F;h2&gt;
&lt;p&gt;I picked these three commands because they were the most directly useful ones that I found, and, in the case of git reflog, changed my view of git entirely.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;git-worktree&quot;&gt;&lt;code&gt;git worktree&lt;&#x2F;code&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;You’re mid-edit on a quickstart change, and someone asks for a one-line typo fix on a different branch. The dance is &lt;code&gt;git stash&lt;&#x2F;code&gt;, &lt;code&gt;git checkout main&lt;&#x2F;code&gt;, &lt;code&gt;git checkout -b typo-fix&lt;&#x2F;code&gt;, fix it, &lt;code&gt;git checkout quickstart&lt;&#x2F;code&gt;, &lt;code&gt;git stash pop&lt;&#x2F;code&gt;. So much context switching and heaven forbid you get pulled away in the middle of it and have to remember where you were in the dance when you left off.&lt;&#x2F;p&gt;
&lt;p&gt;Worktrees solve this context switching problem. The command &lt;code&gt;git worktree add ..&#x2F;typo-fix main -b typo-fix&lt;&#x2F;code&gt; makes a second working directory on your machine, pointing at the same repo, on a new branch. Then you can cd into that directory (&lt;code&gt;..&#x2F;typo-fix&lt;&#x2F;code&gt;) and have two branches open at the same time, without needing to wind down&#x2F;stash your work from one task to switch to the other.&lt;&#x2F;p&gt;
&lt;p&gt;The worktrees share the same &lt;code&gt;.git&lt;&#x2F;code&gt; history, but all the files are duplicated and won’t clobber each other as you make changes in each branch. The quickstart edits stay sitting in the original directory, untouched. Open the new folder in a second editor window, fix the typo, push, and the original is exactly where you left it.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;When you’d reach for it:&lt;&#x2F;strong&gt; any time you’d otherwise stash or do the checkout dance. Especially worth it if you context-switch between branches a lot.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;When it shipped:&lt;&#x2F;strong&gt; 2015, a year before I started learning git.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;git-reflog&quot;&gt;&lt;code&gt;git reflog&lt;&#x2F;code&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;A pronunciation note: it’s &lt;em&gt;ref-log&lt;&#x2F;em&gt;, short for “reference log.” I’d always pronounced it &lt;code&gt;git re-flog&lt;&#x2F;code&gt;, which made it sound made up and was a primary reason I didn’t investigate it any further. Based on the people who came up to me after the talk, I’m not the only one who did this. This is also the one command that made me rethink my whole vision of git and realize it’s so much safer than I’d been taught.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;git reflog&lt;&#x2F;code&gt; shows everywhere &lt;code&gt;HEAD&lt;&#x2F;code&gt; has been recently (every commit, reset, checkout, rebase, all of it). If you ever accidentally &lt;code&gt;git reset --hard&lt;&#x2F;code&gt; too far or drop a commit during a rebase, or get a tangled git history through a merge conflict, this is the command that saves you. The “lost” commit, or the good place you used to be but now aren’t, is sitting right there in the reference log. You can always go back to it. Just run &lt;code&gt;git reflog&lt;&#x2F;code&gt;, find the SHA for the commit&#x2F;place in time you want to return to, and &lt;code&gt;git reset&lt;&#x2F;code&gt; back to that place.&lt;&#x2F;p&gt;
&lt;p&gt;The piece that finally clicked for me, which I’d been missing when I was taught: HEAD in your repository is just a &lt;strong&gt;pointer&lt;&#x2F;strong&gt;. Doing something like &lt;code&gt;reset&lt;&#x2F;code&gt; or changes branches moves the pointer, but the commits themselves don’t go anywhere. &lt;code&gt;reflog&lt;&#x2F;code&gt; is the trail the pointer left behind, kept for 90 days by default.&lt;&#x2F;p&gt;
&lt;p&gt;The one catch is that it only saves &lt;em&gt;committed&lt;&#x2F;em&gt; work, and uncommitted changes blown away by &lt;code&gt;reset --hard&lt;&#x2F;code&gt; are gone. Commit early and often!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;When you’d reach for it:&lt;&#x2F;strong&gt; any time you think you’ve lost work or are in an otherwise irreparable state.&lt;&#x2F;p&gt;
&lt;p&gt;Neat trick: I also learned recently that you can even do things like &lt;code&gt;main@{one.week.ago}&lt;&#x2F;code&gt; to go back to where your main branch was a week ago. You don’t even need to find exact commits but can say things like “I knew this was working two days ago, let’s go back there.”&lt;&#x2F;p&gt;
&lt;h3 id=&quot;git-rebase-update-refs&quot;&gt;&lt;code&gt;git rebase --update-refs&lt;&#x2F;code&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;You have a stacked PR (branch A off main, branch B off A). Someone lands a change on main that conflicts with A. The naive flow is to rebase A onto main, resolve the conflict, then rebase B onto the new A, where the same conflict is waiting for you to resolve a second time.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;git rebase --update-refs main&lt;&#x2F;code&gt;, run from the top of the stack, rebases the whole stack in one pass and moves the branch pointers along the way. You only need to resolve the conflict once, and then all the downstream branches get updated with the changes from main as well.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;When you’d reach for it:&lt;&#x2F;strong&gt; stacked PRs that should all get updates from a branch at the same time.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;When it shipped:&lt;&#x2F;strong&gt; 2022. I’d originally planned to talk about &lt;code&gt;git rerere&lt;&#x2F;code&gt; (it remembers a conflict resolution and replays it next time the same one shows up), and found &lt;code&gt;--update-refs&lt;&#x2F;code&gt; while writing the talk.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-one-i-think-actually-matters&quot;&gt;The one I think actually matters&lt;&#x2F;h2&gt;
&lt;p&gt;If you take one of these home, take reflog.&lt;&#x2F;p&gt;
&lt;p&gt;Worktrees and &lt;code&gt;--update-refs&lt;&#x2F;code&gt; are about ergonomics and make day-to-day tasks easier. Reflog is different; it changes the belief that screwing up means losing work, and that belief was what kept me out of the parts of git where the real power lives.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;for-the-record&quot;&gt;For the record&lt;&#x2F;h2&gt;
&lt;p&gt;A few QA questions where my live answer was either hand-wavy or wrong, because again, I’m not a git expert at all. Here are my corrected answers (and thanks for the opportunity to learn this with you all!)&lt;&#x2F;p&gt;
&lt;h3 id=&quot;git-worktree-vs-multiple-clones&quot;&gt;&lt;code&gt;git worktree&lt;&#x2F;code&gt; vs. multiple clones&lt;&#x2F;h3&gt;
&lt;p&gt;Someone asked what the actual difference was between doing &lt;code&gt;git worktree&lt;&#x2F;code&gt; vs. just having multiple cloned versions of your repo. A clearer answer than whatever I gave:&lt;&#x2F;p&gt;
&lt;p&gt;Multiple clones give you fully independent copies of the repo, each with its own &lt;code&gt;.git&lt;&#x2F;code&gt; directory. Branches you make in clone A don’t show up in clone B until you push and fetch, and you’re paying for the full history twice on disk.&lt;&#x2F;p&gt;
&lt;p&gt;Worktrees share the underlying &lt;code&gt;.git&lt;&#x2F;code&gt; (the secondary worktree has a tiny &lt;code&gt;.git&lt;&#x2F;code&gt; &lt;em&gt;file&lt;&#x2F;em&gt; pointing back to the main one). Branches and commits show up in every worktree immediately, with no fetching and no duplicate storage. The one constraint is that the same branch can’t be checked out in two worktrees at once.&lt;&#x2F;p&gt;
&lt;p&gt;If you want two separate copies of the project that can drift apart, that’s &lt;code&gt;git clone&lt;&#x2F;code&gt;. If you want one project with multiple working directories so you can sit on two branches at the same time, that’s &lt;code&gt;git worktree&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;does-reflog-work-with-reset-soft-and-hard&quot;&gt;Does reflog work with &lt;code&gt;reset --soft&lt;&#x2F;code&gt; and &lt;code&gt;--hard&lt;&#x2F;code&gt;?&lt;&#x2F;h3&gt;
&lt;p&gt;Yes for both. I also want to walk back something I said on stage, because I had it backwards. Every form of &lt;code&gt;git reset&lt;&#x2F;code&gt; moves HEAD, which is the whole point of the command. The flags change what happens to the index and working tree on top of that:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--soft&lt;&#x2F;code&gt;: move HEAD. Index and working tree untouched, so whatever was previously committed shows back up as staged.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;--mixed&lt;&#x2F;code&gt; (the default): move HEAD, reset the index to match it. Working tree untouched, so changes show up as unstaged.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;--hard&lt;&#x2F;code&gt;: move HEAD, reset the index, and overwrite the working tree to match. Uncommitted changes (staged or not) are gone.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Reflog records every move of HEAD, so all three are recoverable in the sense that you can always put HEAD back where it was. The thing reflog &lt;em&gt;can’t&lt;&#x2F;em&gt; save you from is the working-tree damage &lt;code&gt;--hard&lt;&#x2F;code&gt; does. Edits you hadn’t committed aren’t in the reflog, because the reflog tracks committed history, not whatever’s sitting in your buffer. That’s the part of “commit often” I was trying to gesture at on stage and could have been clearer about.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;a-note-on-jujutsu&quot;&gt;A note on Jujutsu&lt;&#x2F;h3&gt;
&lt;p&gt;At the end of the talk I mentioned &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jj-vcs&#x2F;jj&quot;&gt;Jujutsu (or &lt;code&gt;jj&lt;&#x2F;code&gt;)&lt;&#x2F;a&gt;. I didn’t even realize for a while that there were other version control systems being developed; I kind of thought git was the one we’d settled on. But of course there were VCS systems before and people are making new ones too, revisiting these foundational concepts and&#x2F;or layering on top.&lt;&#x2F;p&gt;
&lt;p&gt;I find &lt;code&gt;jj&lt;&#x2F;code&gt; to be really interesting because it’s a more recent VCS that’s gaining popularity. It can live alongside a git repo, sharing objects and remotes, but rethinks the model. &lt;code&gt;jj&lt;&#x2F;code&gt; has no staging area, and you carry conflicts with you across operations instead of resolving them on the spot. The command surface is also much smaller. I’ve just heard of it and haven’t used it for real work, so I don’t have an opinion on whether it’s worth switching. But it’s on the list, and if you’ve been bouncing off git for years and it still doesn’t fit, that might be the direction to look.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;coda&quot;&gt;Coda&lt;&#x2F;h2&gt;
&lt;p&gt;I keep coming back to one specific story. After learning software engineering at a bootcamp, I taught there for a year. One day a student ran a rebase even though we’d warned her against it. She lost a day of work and asked for help. The response from the instructors, mine included, was “oops, oh well, we told you so,” and I still feel bad about it. Reflog would have walked her right back to where she was, but none of us knew about it, so none of us could tell her. What stuck with her instead was &lt;em&gt;git is dangerous, stay in the shallow end&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I gave the talk as a non-expert and that was sort of the point. You can poke at the parts of git you’ve been avoiding without becoming an expert first. The cost of looking was small for me, a search engine and an afternoon per command, weighed against nine more years of deleting repos and living with what I thought was lost.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Costuming Claude Code</title>
          <pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://sdeaton.com/blog/costuming-claude-code/</link>
          <guid>https://sdeaton.com/blog/costuming-claude-code/</guid>
          <description xml:base="https://sdeaton.com/blog/costuming-claude-code/">&lt;p&gt;Most of how I’ve customized Claude Code so far has been on the side that changes what it knows or does: &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;memory#claude-md-files&quot;&gt;&lt;code&gt;CLAUDE.md&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; for project conventions, &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;memory#organize-rules-with-claude%2Frules%2F&quot;&gt;path-scoped rules&lt;&#x2F;a&gt; for specific instructions, &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;skills&quot;&gt;skills&lt;&#x2F;a&gt; for specialized behaviors, &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;hooks-guide&quot;&gt;hooks&lt;&#x2F;a&gt; for guardrails.&lt;&#x2F;p&gt;
&lt;p&gt;A separate set of customization knobs sits alongside those, and they don’t really change what Claude does, just how being in the CLI feels. The settings in this group are things like spinner verbs, themes, status lines, the welcome box, and the commit trailer.&lt;&#x2F;p&gt;
&lt;p&gt;What inspired me to pull them all together was watching other people character-ify their spinner verbs. I’d been treating it as a fun one-off customization, until I started seeing screenshots of people swapping their verbs out for things Bender from Futurama would say, or Moira Rose from Schitt’s Creek (&lt;em&gt;Bombinating&lt;&#x2F;em&gt;, &lt;em&gt;Effulging&lt;&#x2F;em&gt;, &lt;em&gt;Pontificating&lt;&#x2F;em&gt;). I wanted to see if I could extend this character in Claude Code through more of the settings I’d collected in my head.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;setting-the-stage&quot;&gt;Setting the stage&lt;&#x2F;h2&gt;
&lt;p&gt;Here’s what I ended up with after pulling things together. This screenshot is mid-conversation with the Moira persona:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;sdeaton.com&#x2F;blog&#x2F;costuming-claude-code&#x2F;moira-spinner.png&quot; alt=&quot;A Claude Code session running the Moira persona. At the top, a previous response reads “Local incantations: zola serve for the dressing room, zola build for opening night.” Below that is the user’s next message, “which drafts are currently in progress?”, followed by a spinner showing “Effulging…” with the tip “Crows have eyes. So does the linter.” floating beneath it. The status line at the bottom reads “🌹 Act I — the stage is set, bébé. (3% staged).”&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Reading the screenshot top to bottom:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The response has a Moira-feel (incantations, opening night, etc) because of the &lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;sdeaton.com&#x2F;blog&#x2F;costuming-claude-code&#x2F;#output-style-the-voice&quot;&gt;output style&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;Effulging…&lt;&#x2F;code&gt; and the &lt;code&gt;Crows have eyes&lt;&#x2F;code&gt; line beneath it are a custom &lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;sdeaton.com&#x2F;blog&#x2F;costuming-claude-code&#x2F;#flourish-spinner-verbs-and-tips&quot;&gt;spinner verb and tip&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;The color palette (deep wine, gold, ivory) is a custom &lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;sdeaton.com&#x2F;blog&#x2F;costuming-claude-code&#x2F;#theme-the-dressing-room&quot;&gt;theme&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;The &lt;code&gt;🌹 Act I&lt;&#x2F;code&gt; strip at the bottom is a &lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;sdeaton.com&#x2F;blog&#x2F;costuming-claude-code&#x2F;#status-line-the-bottom-strip&quot;&gt;status line&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; that reframes the context window as the show progressing&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;A few touchpoints &lt;a href=&quot;https:&#x2F;&#x2F;sdeaton.com&#x2F;blog&#x2F;costuming-claude-code&#x2F;#off-scene-company-announcements-git-attribution-and-the-curtain-call&quot;&gt;aren’t visible here but contribute to the experience&lt;&#x2F;a&gt;: a company announcement that introduces Moira on launch, a custom git attribution trailer that credits her on every commit, and a hook that has my laptop say &lt;em&gt;curtain&lt;&#x2F;em&gt; out loud when I close the session.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;choosing-a-character&quot;&gt;Choosing a character&lt;&#x2F;h2&gt;
&lt;p&gt;Before settling on Moira, I tried on a few other personas, like:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Bob Ross (gentle, encouraging, every bug a happy little accident)&lt;&#x2F;li&gt;
&lt;li&gt;Werner Herzog (&lt;em&gt;what would code be without a monster lurking in the dark? It would be like sleep without dreams&lt;&#x2F;em&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;Worf from Star Trek (&lt;em&gt;Qapla’!&lt;&#x2F;em&gt; on every successful merge)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;They were all fun, but Moira was the one I kept coming back to. There’s something endearing about being called &lt;em&gt;bébé&lt;&#x2F;em&gt; before being told the CSS is broken, and her costume-and-stage metaphors mapped surprisingly well onto refactors and deployments.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-full-ensemble-it-s-all-in-settings-json&quot;&gt;The full ensemble: it’s all in settings.json&lt;&#x2F;h2&gt;
&lt;p&gt;Here’s what the start of a Moira session actually looks like, with a welcome banner from a company announcement at the top, her voice kicking in as soon as she’s read the project, and a status line steady at the bottom:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;sdeaton.com&#x2F;blog&#x2F;costuming-claude-code&#x2F;moira-session.png&quot; alt=&quot;Opening of a Claude Code session running the Moira persona: a welcome banner reading “🥀 Welcome, bébé. The stage is set. Moira Rose is at your service.”, the user asking “please describe this project”, and Moira responding “One moment, darling — permit me a glance at the playbill before I describe the production.” followed by “Here is the playbill, bébé.” after reading files. The status line at the bottom reads “🌹 Act I — the stage is set, bébé. (3% staged).”&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;All of this lives in &lt;code&gt;~&#x2F;.claude&#x2F;settings.json&lt;&#x2F;code&gt;, which the CLI reads on launch for user-configurable settings. There are a few different places where you can put settings:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~&#x2F;.claude&#x2F;settings.json&lt;&#x2F;code&gt; is local to your computer and applies across every project&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;.claude&#x2F;settings.json&lt;&#x2F;code&gt; inside a project repo is project-scoped and gets checked in with git&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;.claude&#x2F;settings.local.json&lt;&#x2F;code&gt; is project-scoped &lt;em&gt;and&lt;&#x2F;em&gt; local, and is gitignored by default&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I did all of this in my user-level settings because I didn’t want the people I work with to be greeted with &lt;em&gt;bébé&lt;&#x2F;em&gt;. Here’s the relevant bits, minus everything unrelated:&lt;&#x2F;p&gt;
&lt;div class=&quot;expandable-code&quot;&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;outputStyle&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;moira-rose&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;theme&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;custom:moira&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;companyAnnouncements&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;🥀 Welcome, bébé. The stage is set. Moira Rose is at your service.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;  ],
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;spinnerVerbs&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;replace&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;verbs&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: [&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Bombinating&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Effulging&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Pontificating&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Promenading&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Vociferating&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Adjudicating&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;]
&lt;&#x2F;span&gt;&lt;span&gt;  },
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;spinnerTipsOverride&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;excludeDefault&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;tips&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Crows have eyes. So does the linter.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Take just a sip. Just a tipple.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Fold in the cheese. Then commit.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Don&amp;#39;t ever, EVER ship on a Friday.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;    ]
&lt;&#x2F;span&gt;&lt;span&gt;  },
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;statusLine&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;type&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;~&#x2F;.claude&#x2F;statusline-moira.sh&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;  },
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;attribution&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;commit&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;🌹 Composed in collaboration with Moira Rose, via Claude Code&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;\n\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Co-Authored-By: Moira Rose &amp;lt;moira@roseapothecary.com&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;pr&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;🌹 A Moira Rose production. Generated with Claude Code.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;  },
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;hooks&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;SessionEnd&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span&gt;      {
&lt;&#x2F;span&gt;&lt;span&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;hooks&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span&gt;          { &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;type&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;~&#x2F;.claude&#x2F;moira-curtain-call.sh&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; }
&lt;&#x2F;span&gt;&lt;span&gt;        ]
&lt;&#x2F;span&gt;&lt;span&gt;      }
&lt;&#x2F;span&gt;&lt;span&gt;    ]
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;

&lt;&#x2F;div&gt;
&lt;p&gt;A few of those settings keys point at files that sit alongside &lt;code&gt;settings.json&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;~&#x2F;.claude&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;├── settings.json              # the file above
&lt;&#x2F;span&gt;&lt;span&gt;├── output-styles&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;│   └── moira-rose.md          # persona text, goes into the system prompt
&lt;&#x2F;span&gt;&lt;span&gt;├── statusline-moira.sh        # status line script
&lt;&#x2F;span&gt;&lt;span&gt;├── moira-curtain-call.sh      # SessionEnd hook script
&lt;&#x2F;span&gt;&lt;span&gt;└── themes&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;    └── moira.json             # custom palette
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;output-style-the-voice&quot;&gt;Output style: the voice&lt;&#x2F;h2&gt;
&lt;p&gt;The biggest lever in this whole experiment is the &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;output-styles&quot;&gt;output style&lt;&#x2F;a&gt;. Claude Code ships with a few built-in styles (&lt;code&gt;default&lt;&#x2F;code&gt;, &lt;code&gt;Learning&lt;&#x2F;code&gt;, &lt;code&gt;Explanatory&lt;&#x2F;code&gt;), and you can drop your own into &lt;code&gt;~&#x2F;.claude&#x2F;output-styles&#x2F;&lt;&#x2F;code&gt; as a markdown file. Setting &lt;code&gt;&quot;outputStyle&quot;: &quot;moira-rose&quot;&lt;&#x2F;code&gt; in &lt;code&gt;settings.json&lt;&#x2F;code&gt; makes it the default for every session.&lt;&#x2F;p&gt;
&lt;p&gt;What an output style actually does is replace part of Claude Code’s default system prompt. Specifically, it swaps out the block that tells the model “you’re a software engineering assistant” and puts your file’s content in its place. The tool-handling and safety scaffolding stay exactly where they were, so Claude Code is still Claude Code; it just thinks it’s something other than a coder.&lt;&#x2F;p&gt;
&lt;p&gt;Because the system prompt is the foundation Claude Code builds everything else on, anything you put there carries more weight than an in-context instruction would. And once the session is going, the file doesn’t get re-read the way a skill does each time it triggers.&lt;&#x2F;p&gt;
&lt;p&gt;Here’s an abbreviated version of &lt;code&gt;~&#x2F;.claude&#x2F;output-styles&#x2F;moira-rose.md&lt;&#x2F;code&gt;. I still wanted the Claude Code software abilities, so I made sure the file framed her as also having been “pressed into service as an interactive software engineering assistant.”&lt;&#x2F;p&gt;
&lt;div class=&quot;expandable-code&quot;&gt;
&lt;pre data-lang=&quot;markdown&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-markdown &quot;&gt;&lt;code class=&quot;language-markdown&quot; data-lang=&quot;markdown&quot;&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;# You are Moira Rose
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;You are MOIRA ROSE — matriarch of the Rose family, former star of &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#b48ead;&quot;&gt;*Sunrise Bay*&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;briefly mayoress of Schitt&amp;#39;s Creek, custodian of the Wig Wall, mother to David
&lt;&#x2F;span&gt;&lt;span&gt;and Alexis, devoted wife to Johnny. You have, against all reasonable
&lt;&#x2F;span&gt;&lt;span&gt;expectation, been pressed into service as an interactive software engineering
&lt;&#x2F;span&gt;&lt;span&gt;assistant.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;You will assist your dear bébé — the user — with their software endeavours.
&lt;&#x2F;span&gt;&lt;span&gt;The work itself is unchanged. The voice is unmistakably yours.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;## Your voice
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;Vocabulary: reach for the obscure word over the common one. &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#b48ead;&quot;&gt;*bébé, mon dieu,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#b48ead;&quot;&gt;ennui, lachrymose, lugubrious, denouement, soliloquy, bombinate, effulgent,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#b48ead;&quot;&gt;recrudescence.*&lt;&#x2F;span&gt;&lt;span&gt; Sprinkle, don&amp;#39;t pour.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;## How you frame engineering work
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;A bug is a &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#b48ead;&quot;&gt;*villain*&lt;&#x2F;span&gt;&lt;span&gt; or &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#b48ead;&quot;&gt;*unwanted houseguest*&lt;&#x2F;span&gt;&lt;span&gt;.
&lt;&#x2F;span&gt;&lt;span&gt;A refactor is a &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#b48ead;&quot;&gt;*costume change*&lt;&#x2F;span&gt;&lt;span&gt; or &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#b48ead;&quot;&gt;*renovation of the West Wing*&lt;&#x2F;span&gt;&lt;span&gt;.
&lt;&#x2F;span&gt;&lt;span&gt;A deploy is &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#b48ead;&quot;&gt;*opening night*&lt;&#x2F;span&gt;&lt;span&gt;; a rollback is &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#b48ead;&quot;&gt;*closing notice*&lt;&#x2F;span&gt;&lt;span&gt;.
&lt;&#x2F;span&gt;&lt;span&gt;A test suite is the &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#b48ead;&quot;&gt;*dress rehearsal*&lt;&#x2F;span&gt;&lt;span&gt;.
&lt;&#x2F;span&gt;&lt;span&gt;A merge conflict is &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#b48ead;&quot;&gt;*a domestic dispute requiring mediation*&lt;&#x2F;span&gt;&lt;span&gt;.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;The metaphor garnishes — it does not obscure. Always make the actual change clear.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;## What stays the same
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;You are still a careful engineer. You read before you edit. You verify before
&lt;&#x2F;span&gt;&lt;span&gt;you claim. Code itself is sacred — no theatrical variable names, no
&lt;&#x2F;span&gt;&lt;span&gt;soliloquising in docstrings. The voice lives &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#b48ead;&quot;&gt;*around*&lt;&#x2F;span&gt;&lt;span&gt; the code, never &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#b48ead;&quot;&gt;*in*&lt;&#x2F;span&gt;&lt;span&gt; it.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;

&lt;&#x2F;div&gt;
&lt;p&gt;The full file goes further with sample exchanges, what to avoid, and when to break character.&lt;&#x2F;p&gt;

&lt;link rel=&quot;stylesheet&quot; href=&quot;..&#x2F;..&#x2F;admonition.css?h=98c1477488c4b2c9d71a&quot; type=&quot;text&#x2F;css&quot;&gt;

&lt;div
  class=&quot;my-4 flex flex-col rounded-lg bg-(--admonition-bg)&quot;
  style=&quot;--admonition-bg: var(--admonition-tip);&quot;
&gt;
  &lt;div class=&quot;flex items-center rounded-t-lg bg-(--admonition-bg) p-1&quot;&gt;
    &lt;div
      class=&quot;mx-2 h-4 w-4 text-[0px] [background:var(--url)_center_center_no-repeat] dark:invert&quot;
      style=&quot;--url: url(icons&#x2F;tip.svg);&quot;
    &gt;
      tip
    &lt;&#x2F;div&gt;
    &lt;span&gt;&lt;strong&gt;When this is actually useful&lt;&#x2F;strong&gt;&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;pl-4&quot;&gt;&lt;p&gt;Pointing Claude Code at something other than software engineering. If you want to turn Claude Code into a docs writer, a data-analysis copilot, or a teaching assistant — anything that wants the file and shell tooling without the “you are a coder” stance — this is where you’d do it.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;flourish-spinner-verbs-and-tips&quot;&gt;Flourish: spinner verbs and tips&lt;&#x2F;h2&gt;
&lt;p&gt;These were the original entry point for me. Spinner verbs are the action verb that cycles while Claude is working (“Thinking,” “Wrangling,” “Crafting”), and spinner tips are the suggestions that float underneath during longer waits. Both are configured as JSON objects under their own keys in &lt;code&gt;settings.json&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;For verbs, the configuration takes a &lt;code&gt;mode&lt;&#x2F;code&gt; and a &lt;code&gt;verbs&lt;&#x2F;code&gt; array. Setting &lt;code&gt;mode&lt;&#x2F;code&gt; to &lt;code&gt;&quot;append&quot;&lt;&#x2F;code&gt; adds your verbs to Claude Code’s defaults, while &lt;code&gt;&quot;replace&quot;&lt;&#x2F;code&gt; uses only yours. The &lt;code&gt;verbs&lt;&#x2F;code&gt; array is the list of strings themselves:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;spinnerVerbs&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;replace&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;verbs&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: [&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Bombinating&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Effulging&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Pontificating&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Promenading&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Vociferating&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Adjudicating&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;]
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Spinner tips work the same way. &lt;code&gt;tips&lt;&#x2F;code&gt; is an array of strings, and &lt;code&gt;excludeDefault&lt;&#x2F;code&gt; decides whether yours replace the built-ins or get merged in:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;spinnerTipsOverride&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;excludeDefault&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;tips&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Crows have eyes. So does the linter.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Take just a sip. Just a tipple.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;  ]
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So now the spinner reads &lt;code&gt;Effulging… (5s · thinking)&lt;&#x2F;code&gt; with &lt;code&gt;Crows have eyes. So does the linter.&lt;&#x2F;code&gt; floating underneath, and it has yet to get old.&lt;&#x2F;p&gt;


&lt;div
  class=&quot;my-4 flex flex-col rounded-lg bg-(--admonition-bg)&quot;
  style=&quot;--admonition-bg: var(--admonition-tip);&quot;
&gt;
  &lt;div class=&quot;flex items-center rounded-t-lg bg-(--admonition-bg) p-1&quot;&gt;
    &lt;div
      class=&quot;mx-2 h-4 w-4 text-[0px] [background:var(--url)_center_center_no-repeat] dark:invert&quot;
      style=&quot;--url: url(icons&#x2F;tip.svg);&quot;
    &gt;
      tip
    &lt;&#x2F;div&gt;
    &lt;span&gt;&lt;strong&gt;When this is actually useful&lt;&#x2F;strong&gt;&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;pl-4&quot;&gt;&lt;p&gt;The tips make a kind of ambient broadcast channel for a team, with room for things like onboarding nudges, new-tool announcements, or current-incident reminders. They surface during waits, so people see them without being interrupted.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;theme-the-dressing-room&quot;&gt;Theme: the dressing room&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Code added &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;terminal-config#create-a-custom-theme&quot;&gt;custom color themes in 2.1.118&lt;&#x2F;a&gt;. You drop a JSON file into &lt;code&gt;~&#x2F;.claude&#x2F;themes&#x2F;&lt;&#x2F;code&gt; and reference it with &lt;code&gt;&quot;theme&quot;: &quot;custom:&amp;lt;name&amp;gt;&quot;&lt;&#x2F;code&gt; in settings. With Moira’s voice and spinner sorted, it felt only right to let her pick her own palette. (I don’t normally anthropomorphize AI tools this much, but I’ll allow it for the bit.)&lt;&#x2F;p&gt;
&lt;p&gt;She landed on deep wine for the prompt accent and gold for bullets and headings. Errors are stage-blood crimson, borders went amethyst, ivory took the foreground, and success messages came out in sage rather than green, since green apparently felt too literal. The whole UI now reads like a dressing room.&lt;&#x2F;p&gt;


&lt;div
  class=&quot;my-4 flex flex-col rounded-lg bg-(--admonition-bg)&quot;
  style=&quot;--admonition-bg: var(--admonition-tip);&quot;
&gt;
  &lt;div class=&quot;flex items-center rounded-t-lg bg-(--admonition-bg) p-1&quot;&gt;
    &lt;div
      class=&quot;mx-2 h-4 w-4 text-[0px] [background:var(--url)_center_center_no-repeat] dark:invert&quot;
      style=&quot;--url: url(icons&#x2F;tip.svg);&quot;
    &gt;
      tip
    &lt;&#x2F;div&gt;
    &lt;span&gt;&lt;strong&gt;When this is actually useful&lt;&#x2F;strong&gt;&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;pl-4&quot;&gt;&lt;p&gt;Matching your editor or terminal so the CLI doesn’t feel jarringly different from the rest of your environment, or color-coding specific kinds of messages so they jump out.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;status-line-the-bottom-strip&quot;&gt;Status line: the bottom strip&lt;&#x2F;h2&gt;
&lt;p&gt;The &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;statusline&quot;&gt;status line&lt;&#x2F;a&gt; is the strip at the bottom of the CLI, and is kind of like a shell prompt with access to live session state. You can replace it with the output of any command.&lt;&#x2F;p&gt;
&lt;p&gt;When you wire one up, Claude Code sends your command a JSON blob on stdin with fields like &lt;code&gt;model&lt;&#x2F;code&gt;, &lt;code&gt;workspace&lt;&#x2F;code&gt;, &lt;code&gt;cost&lt;&#x2F;code&gt;, &lt;code&gt;output_style&lt;&#x2F;code&gt;, the context window’s &lt;code&gt;remaining_percentage&lt;&#x2F;code&gt;, and &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;statusline#available-data&quot;&gt;a handful of others&lt;&#x2F;a&gt;. Your command can do whatever it wants with that, and whatever it prints to stdout becomes what shows up at the bottom.&lt;&#x2F;p&gt;
&lt;p&gt;I gave Moira a status line that frames the context window as the show progressing. The line starts as a backstage murmur before any context exists, moves through Act I once the session is rolling, and ends in stage-blood crimson when she’s almost out of room. The colors shift along with the acts, from gold through rose, fuchsia, and crimson. This is &lt;code&gt;~&#x2F;.claude&#x2F;statusline-moira.sh&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;div class=&quot;expandable-code&quot;&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;#!&#x2F;bin&#x2F;bash
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# Moira Rose status line — dramatic act commentary based on context window usage.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# Receives Claude Code session JSON on stdin. Prints one styled line.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;input&lt;&#x2F;span&gt;&lt;span&gt;=$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;cat&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;remaining&lt;&#x2F;span&gt;&lt;span&gt;=$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;input&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; | &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;jq -r &lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;.context_window.remaining_percentage &#x2F;&#x2F; empty&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;used&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;[ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;-n &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;remaining&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;then
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;used&lt;&#x2F;span&gt;&lt;span&gt;=$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;100 - &lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;remaining&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; | &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;bc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fi
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;ESC&lt;&#x2F;span&gt;&lt;span&gt;=$&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;\033&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RESET&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;ESC&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}[0m&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;DIM&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;ESC&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}[2m&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;GOLD&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;ESC&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}[38;5;220m&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;ROSE&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;ESC&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}[38;5;211m&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;FUCHSIA&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;ESC&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}[38;5;199m&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;CRIMSON&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;ESC&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}[38;5;160m&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;BLOOD&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;ESC&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}[1;38;5;88m&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;[ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;-z &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;used&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;then
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;DIM&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}🥀 The understudy is still in makeup, bébé.&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RESET&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;elif &lt;&#x2F;span&gt;&lt;span&gt;(( $(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;used&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt; &amp;lt; 20&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; | &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;bc -l&lt;&#x2F;span&gt;&lt;span&gt;) )); &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;then
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;GOLD&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}🌹 Act I&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RESET&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;DIM&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;} — the stage is set, bébé.&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RESET&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;elif &lt;&#x2F;span&gt;&lt;span&gt;(( $(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;used&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt; &amp;lt; 40&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; | &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;bc -l&lt;&#x2F;span&gt;&lt;span&gt;) )); &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;then
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;GOLD&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}🌹 The plot&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RESET&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;DIM&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}, it thickens.&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RESET&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;elif &lt;&#x2F;span&gt;&lt;span&gt;(( $(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;used&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt; &amp;lt; 60&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; | &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;bc -l&lt;&#x2F;span&gt;&lt;span&gt;) )); &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;then
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;ROSE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}🌹 Act II&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RESET&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;DIM&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;} — tensions mount.&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RESET&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;elif &lt;&#x2F;span&gt;&lt;span&gt;(( $(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;used&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt; &amp;lt; 80&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; | &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;bc -l&lt;&#x2F;span&gt;&lt;span&gt;) )); &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;then
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;FUCHSIA&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}🌹 Act III approaches.&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RESET&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;DIM&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;} Compose yourself.&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RESET&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;elif &lt;&#x2F;span&gt;&lt;span&gt;(( $(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;used&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt; &amp;lt; 95&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; | &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;bc -l&lt;&#x2F;span&gt;&lt;span&gt;) )); &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;then
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;CRIMSON&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}🥀 The denouement, bébé.&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RESET&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;else
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;BLOOD&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}🩸 The CURTAIN descends!&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RESET&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;DIM&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;} Save your work, darling.&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RESET&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fi
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;[ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;-n &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;used&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;then
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;printf &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;%s &lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;DIM&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}(%s%% staged)&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RESET&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; &amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; &amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;used&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;else
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;printf &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;%s&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; &amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fi
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;

&lt;&#x2F;div&gt;
&lt;p&gt;The branch on an empty &lt;code&gt;used&lt;&#x2F;code&gt; handles the case where the session has just started and there isn’t a &lt;code&gt;remaining_percentage&lt;&#x2F;code&gt; field on stdin yet. Instead of a defaulted-to-zero number that reads weirdly, the line shows &lt;code&gt;🥀 The understudy is still in makeup, bébé.&lt;&#x2F;code&gt; until the show actually starts.&lt;&#x2F;p&gt;
&lt;p&gt;And &lt;code&gt;settings.json&lt;&#x2F;code&gt; just points at the script:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;statusLine&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;type&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;~&#x2F;.claude&#x2F;statusline-moira.sh&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once the curtain goes up, the bottom of the screen shows &lt;code&gt;🌹 Act I — the stage is set, bébé. (3% staged)&lt;&#x2F;code&gt; and progresses through the acts as the conversation grows. When she gets close to capacity, the line switches to a curtain warning and tells me to save my work.&lt;&#x2F;p&gt;


&lt;div
  class=&quot;my-4 flex flex-col rounded-lg bg-(--admonition-bg)&quot;
  style=&quot;--admonition-bg: var(--admonition-tip);&quot;
&gt;
  &lt;div class=&quot;flex items-center rounded-t-lg bg-(--admonition-bg) p-1&quot;&gt;
    &lt;div
      class=&quot;mx-2 h-4 w-4 text-[0px] [background:var(--url)_center_center_no-repeat] dark:invert&quot;
      style=&quot;--url: url(icons&#x2F;tip.svg);&quot;
    &gt;
      tip
    &lt;&#x2F;div&gt;
    &lt;span&gt;&lt;strong&gt;When this is actually useful&lt;&#x2F;strong&gt;&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;pl-4&quot;&gt;&lt;p&gt;Passively surfacing things you want quick visibility into, like the current Kubernetes context, AWS profile, which environment a repo is pointed at, or session cost so far. The stdin JSON gives you fields like &lt;code&gt;model&lt;&#x2F;code&gt;, &lt;code&gt;cost.total_cost_usd&lt;&#x2F;code&gt;, and &lt;code&gt;workspace&lt;&#x2F;code&gt; alongside the context numbers, and the script can call out to anything else you’d like, whether that’s a quick &lt;code&gt;gh&lt;&#x2F;code&gt; query for open PRs, the latest commit message on main, or (my favorite I’ve seen) live rugby and soccer scores so you can keep half an eye on the match while you work.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;off-scene-company-announcements-git-attribution-and-the-curtain-call&quot;&gt;Off scene: company announcements, git attribution, and the curtain call&lt;&#x2F;h2&gt;
&lt;p&gt;A few of the touchpoints don’t show up in the main CLI scroll, but they bookend the experience.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Company announcements&lt;&#x2F;strong&gt; are extra lines printed in the welcome box on launch, via &lt;code&gt;companyAnnouncements&lt;&#x2F;code&gt; in &lt;code&gt;settings.json&lt;&#x2F;code&gt;. It’s an array of strings, each rendered on its own line in that box (under text saying &lt;em&gt;Message from &amp;lt;account name&amp;gt;’s Organization:&lt;&#x2F;em&gt;):&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;companyAnnouncements&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;🥀 Welcome, bébé. The stage is set. Moira Rose is at your service.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Which renders as a welcome banner on every launch:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;sdeaton.com&#x2F;blog&#x2F;costuming-claude-code&#x2F;moira-announcement.png&quot; alt=&quot;Claude Code launch screen showing the version header (Claude Code v2.1.119, Opus 4.7, Claude Pro), followed by the announcement line “🥀 Welcome, bébé. The stage is set. Moira Rose is at your service.” and a status line at the bottom reading “🌹 The understudy is still in makeup, bébé.”&quot; &#x2F;&gt;&lt;&#x2F;p&gt;


&lt;div
  class=&quot;my-4 flex flex-col rounded-lg bg-(--admonition-bg)&quot;
  style=&quot;--admonition-bg: var(--admonition-tip);&quot;
&gt;
  &lt;div class=&quot;flex items-center rounded-t-lg bg-(--admonition-bg) p-1&quot;&gt;
    &lt;div
      class=&quot;mx-2 h-4 w-4 text-[0px] [background:var(--url)_center_center_no-repeat] dark:invert&quot;
      style=&quot;--url: url(icons&#x2F;tip.svg);&quot;
    &gt;
      tip
    &lt;&#x2F;div&gt;
    &lt;span&gt;&lt;strong&gt;When this is actually useful&lt;&#x2F;strong&gt;&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;pl-4&quot;&gt;&lt;p&gt;This is mostly meant for org admins to push notices through managed settings — code freezes, version updates, that kind of thing — but it works in a personal config too, and is a nice place for note-to-self info you want on every launch.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;&lt;strong&gt;Git attribution&lt;&#x2F;strong&gt; is the trailer Claude Code adds to commits and PR descriptions when it makes them. The &lt;code&gt;attribution&lt;&#x2F;code&gt; key overrides both:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;attribution&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;commit&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;🌹 Composed in collaboration with Moira Rose, via Claude Code&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;\n\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Co-Authored-By: Moira Rose &amp;lt;moira@roseapothecary.com&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;pr&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;🌹 A Moira Rose production. Generated with Claude Code.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Every commit Moira makes now ends with that line:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;sdeaton.com&#x2F;blog&#x2F;costuming-claude-code&#x2F;moira-attribution.png&quot; alt=&quot;A git log entry showing a commit dated Mon May 11 07:01:35 2026 with the message “Add ‘Costuming Claude Code’ post.” followed by the trailer “🌹 Composed in collaboration with Moira Rose, via Claude Code” and “Co-Authored-By: Moira Rose moira@roseapothecary.com”&quot; &#x2F;&gt;&lt;&#x2F;p&gt;


&lt;div
  class=&quot;my-4 flex flex-col rounded-lg bg-(--admonition-bg)&quot;
  style=&quot;--admonition-bg: var(--admonition-tip);&quot;
&gt;
  &lt;div class=&quot;flex items-center rounded-t-lg bg-(--admonition-bg) p-1&quot;&gt;
    &lt;div
      class=&quot;mx-2 h-4 w-4 text-[0px] [background:var(--url)_center_center_no-repeat] dark:invert&quot;
      style=&quot;--url: url(icons&#x2F;tip.svg);&quot;
    &gt;
      tip
    &lt;&#x2F;div&gt;
    &lt;span&gt;&lt;strong&gt;When this is actually useful&lt;&#x2F;strong&gt;&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;pl-4&quot;&gt;&lt;p&gt;Tracking which commits had AI involvement, if your team or compliance process cares about that. You can also set both fields to &lt;code&gt;&quot;&quot;&lt;&#x2F;code&gt; to remove the trailer entirely.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;&lt;strong&gt;The curtain call&lt;&#x2F;strong&gt; is the one piece that crosses from “outer experience” into actual extensibility, but I wanted Moira to sign off audibly. &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;hooks-guide&quot;&gt;Hooks&lt;&#x2F;a&gt; are shell commands that fire on Claude Code lifecycle events like &lt;code&gt;SessionStart&lt;&#x2F;code&gt;, &lt;code&gt;SessionEnd&lt;&#x2F;code&gt;, &lt;code&gt;Stop&lt;&#x2F;code&gt;, &lt;code&gt;PreToolUse&lt;&#x2F;code&gt;, &lt;code&gt;PostToolUse&lt;&#x2F;code&gt;, and &lt;code&gt;Notification&lt;&#x2F;code&gt;. macOS happens to ship a text-to-speech voice literally named &lt;em&gt;Moira&lt;&#x2F;em&gt; (Irish English), so I added a &lt;code&gt;SessionEnd&lt;&#x2F;code&gt; hook that has my laptop say something out loud when I close the session:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;#!&#x2F;bin&#x2F;bash
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;LINES&lt;&#x2F;span&gt;&lt;span&gt;=(
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Curtain.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;And, scene.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;I love this journey for you.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Best wishes. Warmest regards.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;LINE&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;LINES[&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RANDOM &lt;&#x2F;span&gt;&lt;span&gt;% $&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;LINES[@]}]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;say -v&lt;&#x2F;span&gt;&lt;span&gt; Moira &amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;LINE&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&#x2F;dev&#x2F;null || &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;say &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;LINE&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;; } &amp;amp;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Registered in &lt;code&gt;settings.json&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;hooks&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;SessionEnd&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span&gt;    {
&lt;&#x2F;span&gt;&lt;span&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;hooks&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span&gt;        { &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;type&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;~&#x2F;.claude&#x2F;moira-curtain-call.sh&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; }
&lt;&#x2F;span&gt;&lt;span&gt;      ]
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;  ]
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;&amp;amp;&lt;&#x2F;code&gt; at the end backgrounds &lt;code&gt;say&lt;&#x2F;code&gt; so the hook returns immediately and Claude Code finishes exiting, while she keeps talking after the process is gone.&lt;&#x2F;p&gt;


&lt;div
  class=&quot;my-4 flex flex-col rounded-lg bg-(--admonition-bg)&quot;
  style=&quot;--admonition-bg: var(--admonition-tip);&quot;
&gt;
  &lt;div class=&quot;flex items-center rounded-t-lg bg-(--admonition-bg) p-1&quot;&gt;
    &lt;div
      class=&quot;mx-2 h-4 w-4 text-[0px] [background:var(--url)_center_center_no-repeat] dark:invert&quot;
      style=&quot;--url: url(icons&#x2F;tip.svg);&quot;
    &gt;
      tip
    &lt;&#x2F;div&gt;
    &lt;span&gt;&lt;strong&gt;When this is actually useful&lt;&#x2F;strong&gt;&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;pl-4&quot;&gt;&lt;p&gt;Hooks are kind of the general-purpose way to inject determinism into an otherwise nondeterministic AI process. &lt;code&gt;PreToolUse&lt;&#x2F;code&gt; lets you inspect or block a command before it runs (think “no &lt;code&gt;rm -rf&lt;&#x2F;code&gt; outside the project dir”), &lt;code&gt;PostToolUse&lt;&#x2F;code&gt; is great for logging shell commands to an audit file, &lt;code&gt;Stop&lt;&#x2F;code&gt; can ping you when a long turn finishes, and &lt;code&gt;Notification&lt;&#x2F;code&gt; can ping you when Claude is stuck waiting on input.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;(Also, since we’re on the subject of hooks, the thing I’ll keep saying: prompts aren’t guardrails, hooks are. If there’s something Claude really shouldn’t do, a &lt;code&gt;PreToolUse&lt;&#x2F;code&gt; hook that actually blocks it is more reliable than asking nicely in your &lt;code&gt;CLAUDE.md&lt;&#x2F;code&gt; and hoping the model holds the line.)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;swapping-costumes&quot;&gt;Swapping costumes&lt;&#x2F;h2&gt;
&lt;p&gt;Once Moira was working, I started building the same setup for Worf, Bob Ross, and a few other characters. I kept one settings file per character on disk, and pointed &lt;code&gt;~&#x2F;.claude&#x2F;settings.json&lt;&#x2F;code&gt; at whichever one I wanted activated.&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;~&#x2F;.claude&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;├── settings.json              → symlink to settings.moira.json
&lt;&#x2F;span&gt;&lt;span&gt;├── settings.default.json      # vanilla Claude Code (or just `{}`)
&lt;&#x2F;span&gt;&lt;span&gt;├── settings.moira.json        # full Moira costume
&lt;&#x2F;span&gt;&lt;span&gt;├── settings.worf.json         # full Worf costume
&lt;&#x2F;span&gt;&lt;span&gt;├── output-styles&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;│   ├── moira-rose.md
&lt;&#x2F;span&gt;&lt;span&gt;│   └── worf.md
&lt;&#x2F;span&gt;&lt;span&gt;├── statusline-moira.sh
&lt;&#x2F;span&gt;&lt;span&gt;├── statusline-worf.sh
&lt;&#x2F;span&gt;&lt;span&gt;└── themes&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;    ├── moira.json
&lt;&#x2F;span&gt;&lt;span&gt;    └── worf.json
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The supporting files (scripts, output styles, themes) all sit on disk together, but only the active &lt;code&gt;settings.json&lt;&#x2F;code&gt; decides which ones get wired up. A small shell function in &lt;code&gt;.zshrc&lt;&#x2F;code&gt; makes the swap one command:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;costume&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;local &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;=$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;:-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;default}
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;ln -sf ~&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;.claude&#x2F;settings.$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;.json &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;~&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;.claude&#x2F;settings.json
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Costume: &lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now &lt;code&gt;costume moira&lt;&#x2F;code&gt; puts the whole getup on, &lt;code&gt;costume worf&lt;&#x2F;code&gt; swaps it for the Klingon, and &lt;code&gt;costume&lt;&#x2F;code&gt; on its own takes everything off and you’re back to plain Claude Code. The next session picks up whichever one was left dangling.&lt;&#x2F;p&gt;
&lt;p&gt;The thing I didn’t expect was how much of the charm comes from &lt;em&gt;forgetting&lt;&#x2F;em&gt; I’d put one on. I’d swap to Worf for fun, get pulled into something else, come back hours later to fire off a mundane question about token costs, and read something like:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;A worthy question. A warrior must know the cost of every weapon he carries.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;That’s the moment I’d remember oh right, I left Worf loaded. The surprise really is most of the fun.&lt;&#x2F;p&gt;
&lt;p&gt;None of this makes me a better engineer, but it does add some humor to living in Claude Code for hours of my life. Somewhere between the wine-colored prompts and my laptop murmuring &lt;em&gt;curtain&lt;&#x2F;em&gt; into the room when I close the session, the whole thing has started to feel like the right amount of theatre for a Tuesday afternoon.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
