<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
  <title>Golang on blog.yarwood.me.uk</title>
  <link>https://blog.yarwood.me.uk/tags/golang/</link>
  <description>Recent content in Golang on blog.yarwood.me.uk</description>
  <generator>Hugo -- gohugo.io</generator>
  <language>en</language>
  <lastBuildDate>Sat, 18 Apr 2026 08:00:00 +0000</lastBuildDate>
  
    <atom:link href="https://blog.yarwood.me.uk/tags/golang/index.xml" rel="self" type="application/rss+xml" />
  
  
    <item>
      <title>cctv - A TUI for browsing Claude Code conversations</title>
      <link>https://blog.yarwood.me.uk/2026/04/18/cctv/</link>
      <pubDate>Sat, 18 Apr 2026 08:00:00 +0000</pubDate>
      
      <guid>https://blog.yarwood.me.uk/2026/04/18/cctv/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been using &lt;a href=&#34;https://docs.anthropic.com/en/docs/claude-code&#34;&gt;Claude Code&lt;/a&gt; heavily over the past few months and one thing that kept bugging me was how hard it is to find and resume old conversations. The built-in &lt;code&gt;--resume&lt;/code&gt; picker works but it&amp;rsquo;s minimal — no filtering, no metadata at a glance, and no way to search across projects.&lt;/p&gt;
&lt;p&gt;So I built &lt;a href=&#34;https://github.com/lyarwood/cctv&#34;&gt;cctv&lt;/a&gt; — a terminal UI for browsing and resuming Claude Code conversations from the local filesystem.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.yarwood.me.uk/img/cctv-demo.gif&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;why-bother-resuming&#34;&gt;Why bother resuming?&lt;/h2&gt;
&lt;p&gt;Claude Code conversations accumulate context as you work — files discussed, decisions made, bugs investigated. Starting fresh throws all of that away. Resuming a session means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No re-explaining&lt;/strong&gt; — Claude already knows your codebase, what you tried, and what&amp;rsquo;s left&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cheaper&lt;/strong&gt; — resumed sessions carry their prompt cache forward, so Claude doesn&amp;rsquo;t re-read everything from scratch&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better coherence&lt;/strong&gt; — pick up hours or days later and the conversation still knows what was agreed&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-it-does&#34;&gt;What it does&lt;/h2&gt;
&lt;p&gt;cctv reads Claude Code&amp;rsquo;s local storage (&lt;code&gt;~/.claude/&lt;/code&gt;) and presents all your sessions in a searchable, filterable list. Each session shows its summary, project, git branch, linked PRs, message count, and when it was last active. Running sessions are highlighted.&lt;/p&gt;
&lt;p&gt;Pressing Enter on a session launches &lt;code&gt;claude --resume&lt;/code&gt; — cctv suspends, Claude takes over the terminal, and when you&amp;rsquo;re done cctv comes back. You can also pop open a stats view showing token usage and cache hit rates, or drill into the detail view for prompt history and model info.&lt;/p&gt;
&lt;h2 id=&#34;filtering&#34;&gt;Filtering&lt;/h2&gt;
&lt;p&gt;The filter bar supports regex and field-specific prefixes:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;project:kubevirt$        # exact project name
branch:^feature/         # branches starting with feature/
pr:enhancements#242      # by PR repo or number
project:backend branch:main  # multiple terms ANDed
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There&amp;rsquo;s also a non-interactive &lt;code&gt;cctv list&lt;/code&gt; command with &lt;code&gt;--json&lt;/code&gt; output for scripting, and all the same filter flags (&lt;code&gt;--project&lt;/code&gt;, &lt;code&gt;--branch&lt;/code&gt;, &lt;code&gt;--pr&lt;/code&gt;, &lt;code&gt;--cwd&lt;/code&gt;, &lt;code&gt;--pwd&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&#34;stack&#34;&gt;Stack&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s written in Go using the &lt;a href=&#34;https://charm.sh/&#34;&gt;Charm&lt;/a&gt; libraries — &lt;a href=&#34;https://github.com/charmbracelet/bubbletea&#34;&gt;Bubble Tea&lt;/a&gt; for the TUI, &lt;a href=&#34;https://github.com/charmbracelet/lipgloss&#34;&gt;Lip Gloss&lt;/a&gt; for styling, and &lt;a href=&#34;https://github.com/spf13/cobra&#34;&gt;Cobra&lt;/a&gt; for the CLI. Tests use &lt;a href=&#34;https://github.com/onsi/ginkgo&#34;&gt;Ginkgo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Source and installation instructions at &lt;a href=&#34;https://github.com/lyarwood/cctv&#34;&gt;github.com/lyarwood/cctv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This was built around my own workflow so I&amp;rsquo;ve almost certainly missed use cases. If you have ideas for new filters, views, or features — or if you spot something that doesn&amp;rsquo;t work with your Claude Code setup — &lt;a href=&#34;https://github.com/lyarwood/cctv/issues&#34;&gt;issues&lt;/a&gt; and PRs are very welcome.&lt;/p&gt;
</description>
    </item>
  
  </channel>
</rss>
