<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Vulcan Shen</title>
    <description>The latest articles on Forem by Vulcan Shen (@vulcan_shen_acdbffa0285d2).</description>
    <link>https://forem.com/vulcan_shen_acdbffa0285d2</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3874809%2F48989896-dd70-436a-bb13-2b5bd2739722.png</url>
      <title>Forem: Vulcan Shen</title>
      <link>https://forem.com/vulcan_shen_acdbffa0285d2</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/vulcan_shen_acdbffa0285d2"/>
    <language>en</language>
    <item>
      <title>clerk: Auto-Summarize Your Claude Code Sessions</title>
      <dc:creator>Vulcan Shen</dc:creator>
      <pubDate>Fri, 17 Apr 2026 06:24:08 +0000</pubDate>
      <link>https://forem.com/vulcan_shen_acdbffa0285d2/clerk-auto-summarize-your-claude-code-sessions-4m87</link>
      <guid>https://forem.com/vulcan_shen_acdbffa0285d2/clerk-auto-summarize-your-claude-code-sessions-4m87</guid>
      <description>&lt;h2&gt;
  
  
  The Friday Afternoon Problem
&lt;/h2&gt;

&lt;p&gt;It's 4 PM on Friday. Your manager asks for the weekly report. You stare at your terminal, trying to remember what you did on Monday. Was it the auth refactor or the API migration? Which project was that even in?&lt;/p&gt;

&lt;p&gt;You open &lt;code&gt;git log&lt;/code&gt;. Scroll. Scroll. Scroll. Piece together commit messages across 4 repositories. Thirty minutes later, you have a rough draft that still feels incomplete.&lt;/p&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Daily Problem
&lt;/h2&gt;

&lt;p&gt;But it's not just Fridays. Every morning, you open Claude Code and realize you forgot to use &lt;code&gt;--resume&lt;/code&gt;. Yesterday's session had all the context — the architecture decisions, the debugging steps, the half-finished plan. Now it's gone, buried in a pile of session IDs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What if your sessions just... remembered themselves?
&lt;/h2&gt;

&lt;p&gt;That's what &lt;strong&gt;clerk&lt;/strong&gt; does. Install once, forget about it. Every session is automatically summarized when it ends.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;vulcanshen/tap/clerk
clerk &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No configuration needed. No commands to remember. No habits to build.&lt;/p&gt;

&lt;p&gt;clerk runs entirely on your machine — no remote services, no accounts, no data leaving your laptop. All you need is Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Get
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Auto-generated daily summaries
&lt;/h3&gt;

&lt;p&gt;Every time a Claude Code session ends, clerk processes the transcript and saves a structured summary as a markdown file, organized by date and project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.clerk/
├── summary/
│   ├── 20260414/
│   │   ├── projects-my-api.md
│   │   └── work-frontend.md
│   └── 20260416/
│       ├── projects-my-api.md
│       └── work-frontend.md
├── tags/
│   ├── auth.md
│   ├── vue.md
│   └── refactor.md
└── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Context recovery
&lt;/h3&gt;

&lt;p&gt;Forgot &lt;code&gt;--resume&lt;/code&gt;? No problem. Just type &lt;code&gt;/clerk-resume&lt;/code&gt; in Claude Code:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Claude reads your past summaries and transcripts, rebuilds the context, and you're back where you left off.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Semantic search
&lt;/h3&gt;

&lt;p&gt;Need to find that session where you worked on authentication?&lt;/p&gt;

&lt;p&gt;Type &lt;code&gt;/clerk-search&lt;/code&gt; and say "auth". clerk uses AI-powered semantic matching — it doesn't just string-match tags, it understands that "auth" relates to "jwt", "oauth", "login".&lt;/p&gt;

&lt;h3&gt;
  
  
  Weekly reports
&lt;/h3&gt;

&lt;p&gt;This is the one that saves Friday afternoons:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clerk report &lt;span class="nt"&gt;--days&lt;/span&gt; 7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;clerk reads all summaries from the past 7 days, sends them to Claude, and outputs a structured report:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;### Summary (2026-04-14 ~ 2026-04-18)&lt;/span&gt;

&lt;span class="gu"&gt;#### my-api-server&lt;/span&gt;
Implemented JWT auth with refresh tokens, added rate limiting
middleware, fixed connection pool leak under high concurrency.

&lt;span class="gu"&gt;#### frontend-app&lt;/span&gt;
Migrated from Vue 2 to Vue 3, replaced Vuex with Pinia,
updated all unit tests.
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gu"&gt;### By Date&lt;/span&gt;

&lt;span class="gu"&gt;#### 2026-04-14&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**my-api-server**&lt;/span&gt;: JWT auth with refresh token rotation
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**frontend-app**&lt;/span&gt;: Started Vue 3 migration, updated build config

&lt;span class="gu"&gt;#### 2026-04-16&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**my-api-server**&lt;/span&gt;: Rate limiting middleware, connection pool fix
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**frontend-app**&lt;/span&gt;: Vuex → Pinia, 12 store modules migrated
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gu"&gt;### By Project&lt;/span&gt;

&lt;span class="gu"&gt;#### my-api-server&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**2026-04-14**&lt;/span&gt;: JWT auth with refresh token rotation
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**2026-04-16**&lt;/span&gt;: Rate limiting middleware, connection pool fix

&lt;span class="gu"&gt;#### frontend-app&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**2026-04-14**&lt;/span&gt;: Vue 3 migration kickoff, build config update
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**2026-04-16**&lt;/span&gt;: Vuex → Pinia, 12 store modules converted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save it, paste it into Slack, attach it to your standup — whatever works for you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clerk report &lt;span class="nt"&gt;--days&lt;/span&gt; 7 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; weekly-report.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Default is &lt;code&gt;--days 1&lt;/code&gt; — great for daily standup summaries.&lt;/p&gt;

&lt;p&gt;Need to include sessions that haven't ended yet? Add &lt;code&gt;--realtime&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clerk report &lt;span class="nt"&gt;--days&lt;/span&gt; 7 &lt;span class="nt"&gt;--realtime&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This processes active session transcripts on the spot. Note that it uses additional Claude API calls — without the flag, only completed sessions are included.&lt;/p&gt;

&lt;h2&gt;
  
  
  Obsidian Integration
&lt;/h2&gt;

&lt;p&gt;If you use Obsidian, clerk's output directory works as a vault out of the box. Summaries include YAML frontmatter tags, and tag files use standard markdown links. Open &lt;code&gt;~/.clerk/&lt;/code&gt; in Obsidian and you get a graph view connecting tags to summaries across all your projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  macOS / Linux
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;vulcanshen/tap/clerk
clerk &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Other options
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Quick install script&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/vulcanshen/clerk/main/install.sh | sh

&lt;span class="c"&gt;# Or build from source&lt;/span&gt;
go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/vulcanshen/clerk@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run &lt;code&gt;clerk install&lt;/code&gt; to set up hooks, MCP server, and slash commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works Under the Hood
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;clerk install&lt;/code&gt; registers SessionStart and SessionEnd hooks in Claude Code&lt;/li&gt;
&lt;li&gt;When a session ends, the hook triggers &lt;code&gt;clerk feed&lt;/code&gt; in the background&lt;/li&gt;
&lt;li&gt;Feed reads only new transcript lines since the last run (cursor tracking)&lt;/li&gt;
&lt;li&gt;It calls &lt;code&gt;claude -p&lt;/code&gt; to merge new activity into the existing daily summary&lt;/li&gt;
&lt;li&gt;Tags are extracted and indexed for search&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The whole thing is a single Go binary. No dependencies beyond Claude Code itself.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/vulcanshen/clerk" rel="noopener noreferrer"&gt;github.com/vulcanshen/clerk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have feedback or ideas, issues and PRs are welcome!&lt;/p&gt;

</description>
      <category>cli</category>
      <category>opensource</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I built a CLI to stop explaining what /etc/hosts is</title>
      <dc:creator>Vulcan Shen</dc:creator>
      <pubDate>Sun, 12 Apr 2026 11:49:16 +0000</pubDate>
      <link>https://forem.com/vulcan_shen_acdbffa0285d2/i-built-a-cli-to-stop-explaining-what-etchosts-is-4f0o</link>
      <guid>https://forem.com/vulcan_shen_acdbffa0285d2/i-built-a-cli-to-stop-explaining-what-etchosts-is-4f0o</guid>
      <description>&lt;p&gt;Last month, a PM asked me to point &lt;code&gt;api.staging.local&lt;/code&gt; to a new IP. I spent 15 minutes explaining what &lt;code&gt;/etc/hosts&lt;/code&gt; is. Then I did it for them anyway.&lt;/p&gt;

&lt;p&gt;This happens a lot. So I built &lt;a href="https://github.com/vulcanshen/hostfile" rel="noopener noreferrer"&gt;hostfile&lt;/a&gt; — a CLI that turns hosts file management into copy-pasteable one-liners.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fvulcanshen%2Fhostfile%2Fmain%2Fdocs%2Fdemo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fvulcanshen%2Fhostfile%2Fmain%2Fdocs%2Fdemo.gif" alt="demo" width="720" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's wrong with existing tools
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Manual editing&lt;/strong&gt; is risky. One wrong move and DNS resolution breaks. Non-technical users shouldn't be anywhere near &lt;code&gt;vim /etc/hosts&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GUI tools&lt;/strong&gt; like SwitchHosts exist, but they're overkill when you just need someone to run one command. You can't paste a GUI into Slack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Other CLIs&lt;/strong&gt; exist and work fine for developers who know what they're doing. But when you need a non-technical person to run one command without supervision, most fall apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  What hostfile does differently
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Managed block isolation.&lt;/strong&gt; hostfile only touches entries between its own markers. Your hand-written entries are never modified:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Your stuff — safe
&lt;/span&gt;&lt;span class="m"&gt;127&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;.&lt;span class="m"&gt;1&lt;/span&gt;  &lt;span class="n"&gt;localhost&lt;/span&gt;

&lt;span class="c"&gt;#### hostfile &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.&lt;span class="m"&gt;168&lt;/span&gt;.&lt;span class="m"&gt;1&lt;/span&gt;.&lt;span class="m"&gt;100&lt;/span&gt;  &lt;span class="n"&gt;web&lt;/span&gt;.&lt;span class="n"&gt;local&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;.&lt;span class="n"&gt;local&lt;/span&gt;
&lt;span class="c"&gt;#### hostfile &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Enable/disable without deleting.&lt;/strong&gt; Need to temporarily turn off an entry? &lt;code&gt;hostfile disable api.local&lt;/code&gt;. Turn it back on with &lt;code&gt;hostfile enable api.local&lt;/code&gt;. No re-typing IPs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JSON I/O and pipelines.&lt;/strong&gt; Export your config as JSON, pipe it to another machine, or feed it into scripts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Export&lt;/span&gt;
hostfile show &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;span class="c"&gt;# {"192.168.1.100": ["web.local", "api.local"]}&lt;/span&gt;

&lt;span class="c"&gt;# Import via pipeline&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"10.0.0.1":["db.local"]}'&lt;/span&gt; | hostfile merge -

&lt;span class="c"&gt;# Sync between machines&lt;/span&gt;
hostfile show &lt;span class="nt"&gt;--json&lt;/span&gt; | ssh prod hostfile apply -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Automatic privilege escalation.&lt;/strong&gt; hostfile handles &lt;code&gt;sudo&lt;/code&gt;, &lt;code&gt;doas&lt;/code&gt;, or &lt;code&gt;gsudo&lt;/code&gt; on Windows automatically. Users never need to remember.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Input validation.&lt;/strong&gt; Bad JSON, invalid IPs, or garbage text gets rejected before touching your hosts file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install (macOS/Linux)&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/vulcanshen/hostfile/main/install.sh | sh

&lt;span class="c"&gt;# Add entries&lt;/span&gt;
hostfile add 192.168.1.100 web.local api.local

&lt;span class="c"&gt;# Save a snapshot before making changes&lt;/span&gt;
hostfile save before-migration

&lt;span class="c"&gt;# Roll back if needed&lt;/span&gt;
hostfile load before-migration

&lt;span class="c"&gt;# Done with this setup&lt;/span&gt;
hostfile clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS / Linux&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;vulcanshen/tap/hostfile

&lt;span class="c"&gt;# Windows&lt;/span&gt;
irm https://raw.githubusercontent.com/vulcanshen/hostfile/main/install.ps1 | iex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also available as &lt;code&gt;.deb&lt;/code&gt;, &lt;code&gt;.rpm&lt;/code&gt;, and Scoop. See the &lt;a href="https://github.com/vulcanshen/hostfile" rel="noopener noreferrer"&gt;README&lt;/a&gt; for all options.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-world use case: Field engineers on customer sites
&lt;/h2&gt;

&lt;p&gt;The PM story is real, but here's an even more common scenario:&lt;br&gt;
field engineers (FAE) and consultants who work across multiple &lt;br&gt;
network environments.&lt;/p&gt;

&lt;p&gt;When you're on-site at a customer, you need their internal &lt;br&gt;
domains to resolve correctly. When you're back at the office, &lt;br&gt;
you need your company's internal domains. On Windows, this is &lt;br&gt;
painful — the network adapter DNS settings are buried deep in &lt;br&gt;
the UI, limited to two entries, and you have to redo everything &lt;br&gt;
every single time you switch environments.&lt;/p&gt;

&lt;p&gt;The hosts file is actually the most portable solution. With &lt;br&gt;
hostfile, the workflow becomes:&lt;/p&gt;

&lt;h1&gt;
  
  
  Leaving for customer site
&lt;/h1&gt;

&lt;p&gt;hostfile save company     # snapshot your current setup&lt;br&gt;
hostfile clean            # clear everything, use customer DNS&lt;/p&gt;

&lt;h1&gt;
  
  
  Back at the office
&lt;/h1&gt;

&lt;p&gt;hostfile load company     # restore in one command&lt;/p&gt;

&lt;p&gt;No more digging through network adapter settings. No more &lt;br&gt;
forgetting to reset DNS before connecting to company VPN.&lt;br&gt;
Just two commands.&lt;/p&gt;




&lt;p&gt;This isn't a revolutionary tool. It solves one specific problem: making hosts file changes safe and accessible to anyone who can copy-paste a command. If that's a problem you have, give it a try.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vulcanshen/hostfile" rel="noopener noreferrer"&gt;GitHub: vulcanshen/hostfile&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>cli</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
