<?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>DEV Community: Riccardo Cataldi</title>
    <description>The latest articles on DEV Community by Riccardo Cataldi (@riccardo_cataldi_871c2360).</description>
    <link>https://dev.to/riccardo_cataldi_871c2360</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3960058%2F4c586785-32e4-42e2-bbcd-af48d9caf927.png</url>
      <title>DEV Community: Riccardo Cataldi</title>
      <link>https://dev.to/riccardo_cataldi_871c2360</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/riccardo_cataldi_871c2360"/>
    <language>en</language>
    <item>
      <title>I could not point Claude Code at localhost, so I MITM Bedrock on loopback</title>
      <dc:creator>Riccardo Cataldi</dc:creator>
      <pubDate>Fri, 04 Sep 2026 14:36:21 +0000</pubDate>
      <link>https://dev.to/riccardo_cataldi_871c2360/i-could-not-point-claude-code-at-localhost-so-i-mitm-bedrock-on-loopback-5e1</link>
      <guid>https://dev.to/riccardo_cataldi_871c2360/i-could-not-point-claude-code-at-localhost-so-i-mitm-bedrock-on-loopback-5e1</guid>
      <description>&lt;p&gt;Claude Code on Amazon Bedrock does not send invokes to &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;. The client talks to &lt;code&gt;bedrock-runtime&lt;/code&gt; with SigV4. I wanted the JSON, the EU on-demand dollars, and a hold/edit step, so I built &lt;a href="https://github.com/RiccardoCataldi/claude_sniff" rel="noopener noreferrer"&gt;claude-sniff&lt;/a&gt;: one Python process, mitmproxy on &lt;code&gt;127.0.0.1:9090&lt;/code&gt;, UI on &lt;code&gt;8765&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I am the author. MIT. Python 3.12, &lt;code&gt;uv&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you actually run
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv &lt;span class="nb"&gt;sync
&lt;/span&gt;uv run python main.py &lt;span class="nt"&gt;--aws-profile&lt;/span&gt; your-profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, in the same shell as Claude Code:&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="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;HTTP_PROXY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:9090
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;HTTPS_PROXY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:9090
claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Proxy and Intercept start &lt;strong&gt;off&lt;/strong&gt;. Usage still reads &lt;code&gt;~/.claude/projects&lt;/code&gt;. Turn Proxy on only when you want decrypt; then export the mitmproxy CA and restart &lt;code&gt;claude&lt;/code&gt;. Intercept holds Bedrock &lt;code&gt;invoke&lt;/code&gt; / &lt;code&gt;invoke-with-response-stream&lt;/code&gt; that carry &lt;code&gt;x-claude-code-session-id&lt;/code&gt;. Untouched JSON is resumed as-is. Edited JSON is re-signed. Drop never calls Bedrock.&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuocrabkdrtdv1ajz3fqc.png" 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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuocrabkdrtdv1ajz3fqc.png" alt="Sessions" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not a reverse proxy
&lt;/h2&gt;

&lt;p&gt;I tried the Anthropic-API pattern first. It never fired. The interesting part of the code is not “run mitmproxy”; it is sniffing event streams, mapping three model families for EU list prices, and re-signing after an edit without copying static AWS keys into the repo. Inference-profile ids are account-scoped — you pass them in env; the repo ships none.&lt;/p&gt;

&lt;p&gt;Logs live in &lt;code&gt;logs/&lt;/code&gt; (gitignored). JSONL strips &lt;code&gt;Authorization&lt;/code&gt; and &lt;code&gt;x-amz-security-token&lt;/code&gt;. Bodies stay as-is, so treat that directory as toxic.&lt;/p&gt;

&lt;p&gt;If you only want cost, leave Proxy off. If you want to rewrite a system prompt for one request, turn Intercept on, edit the head, Forward.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/RiccardoCataldi/claude_sniff" rel="noopener noreferrer"&gt;https://github.com/RiccardoCataldi/claude_sniff&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>showdev</category>
      <category>aws</category>
    </item>
    <item>
      <title>I built a TUI dotfile browser in Go – here's why and how</title>
      <dc:creator>Riccardo Cataldi</dc:creator>
      <pubDate>Sat, 30 May 2026 14:11:17 +0000</pubDate>
      <link>https://dev.to/riccardo_cataldi_871c2360/i-built-a-tui-dotfile-browser-in-go-heres-why-and-how-4jp2</link>
      <guid>https://dev.to/riccardo_cataldi_871c2360/i-built-a-tui-dotfile-browser-in-go-heres-why-and-how-4jp2</guid>
      <description>&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/RiccardoCataldi" rel="noopener noreferrer"&gt;
        RiccardoCataldi
      &lt;/a&gt; / &lt;a href="https://github.com/RiccardoCataldi/dotty" rel="noopener noreferrer"&gt;
        dotty
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      TUI dashboard for browsing and previewing dotfiles in your home directory. Fuzzy search, tree view, zero config.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;dotty&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Terminal UI for browsing dotfiles under your home directory. Run it from anywhere — it always scans &lt;code&gt;~&lt;/code&gt;, shows an expandable tree on the left, file preview on the right, and a fuzzy finder to jump to any path quickly.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/RiccardoCataldi/dotty/docs/demo/screenshot-tree.png"&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%2FRiccardoCataldi%2Fdotty%2FHEAD%2Fdocs%2Fdemo%2Fscreenshot-tree.png" width="900" alt="dotty tree view and file preview"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/RiccardoCataldi/dotty/docs/demo/screenshot-fuzzy.png"&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%2FRiccardoCataldi%2Fdotty%2FHEAD%2Fdocs%2Fdemo%2Fscreenshot-fuzzy.png" width="900" alt="dotty fuzzy finder"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Run &lt;code&gt;dotty&lt;/code&gt; from any directory once the binary is on your &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Pre-built binary (recommended)&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;Download from &lt;a href="https://github.com/RiccardoCataldi/dotty/releases" rel="noopener noreferrer"&gt;Releases&lt;/a&gt;. Replace &lt;code&gt;VERSION&lt;/code&gt; with the latest tag (e.g. &lt;code&gt;v0.1.1&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;Platform&lt;/th&gt;

&lt;th&gt;Asset&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;Linux x86_64&lt;/td&gt;

&lt;td&gt;&lt;code&gt;dotty_Linux_x86_64.tar.gz&lt;/code&gt;&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;Linux ARM64&lt;/td&gt;

&lt;td&gt;&lt;code&gt;dotty_Linux_arm64.tar.gz&lt;/code&gt;&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;macOS Intel&lt;/td&gt;

&lt;td&gt;&lt;code&gt;dotty_Darwin_x86_64.tar.gz&lt;/code&gt;&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;macOS Apple Silicon&lt;/td&gt;

&lt;td&gt;&lt;code&gt;dotty_Darwin_arm64.tar.gz&lt;/code&gt;&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;VERSION=v0.1.1
curl -sL &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;https://github.com/RiccardoCataldi/dotty/releases/download/&lt;span class="pl-smi"&gt;${VERSION}&lt;/span&gt;/dotty_Linux_x86_64.tar.gz&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="pl-k"&gt;|&lt;/span&gt; tar xz
install -m 755 dotty &lt;span class="pl-k"&gt;~&lt;/span&gt;/bin/   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; or: sudo install -m 755 dotty /usr/local/bin/&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Ensure &lt;code&gt;~/bin&lt;/code&gt; or &lt;code&gt;/usr/local/bin&lt;/code&gt; is on your &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;From source&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Requires Go 1.22+.&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/RiccardoCataldi/dotty.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; dotty
go install ./cmd/dotty&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The binary is installed to &lt;code&gt;$(go env GOPATH)/bin/dotty&lt;/code&gt; (usually &lt;code&gt;~/go/bin/dotty&lt;/code&gt;). Add that directory to your…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/RiccardoCataldi/dotty" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
My home directory has 140+ hidden files and folders.&lt;br&gt;&lt;br&gt;
.aws/credentials, .ssh/config, .cursor/rules, .config/nvim/, .gitconfig, Claude's JSON config somewhere in .config... Every time I needed to tweak something I had to remember where it lived, cd there, find the right file, open it. Then repeat the next time I forgot.&lt;br&gt;&lt;br&gt;
I looked for a tool that would solve this. chezmoi and stow are great but they solve a different problem — syncing dotfiles across machines. File managers like yazi are generic and don't give you a unified view of just your config files. Nothing gave me what I wanted: a single command that aggregates all my dotfiles in one searchable view, from wherever I am in the terminal.&lt;br&gt;&lt;br&gt;
So I built dotty.&lt;/p&gt;

&lt;p&gt;What it does&lt;br&gt;
Run dotty from any directory. It scans ~ and gives you:&lt;/p&gt;

&lt;p&gt;An expandable tree of every dotfile and dot-directory&lt;br&gt;
Live file preview on the right panel&lt;br&gt;
Fuzzy finder (/) to jump to any config in seconds&lt;br&gt;
e to open in $EDITOR&lt;br&gt;
y to copy the path to clipboard&lt;/p&gt;

&lt;p&gt;Single static binary, zero config, works over SSH and inside tmux.&lt;/p&gt;

&lt;p&gt;Why Go&lt;br&gt;
This was my first real Go project shipped end to end. I chose Go for two reasons:&lt;br&gt;
Single static binary. No runtime dependencies, no Python virtualenv, no Node modules. go build → one file → move it to /usr/local/bin/ → done. This matters for a tool you want to install and forget about.&lt;br&gt;
Bubble Tea. Charmbracelet's TUI framework for Go is exactly what I needed. It follows the Elm architecture (Model, Update, View) which makes TUI state management surprisingly clean. Tools like lazygit, lazydocker, and k9s are all built on similar patterns — I wanted that same feel.&lt;/p&gt;

&lt;p&gt;The stack&lt;/p&gt;

&lt;p&gt;Bubble Tea — TUI framework, Elm architecture&lt;br&gt;
Bubbles — pre-built TUI components (viewport, textinput)&lt;br&gt;
Lipgloss — CSS-like terminal styling&lt;br&gt;
GoReleaser + GitHub Actions — multi-platform releases (Linux + macOS, x86 + ARM)&lt;/p&gt;

&lt;p&gt;What I learned&lt;br&gt;
Bubble Tea's model is great once it clicks. The idea is that your entire application state lives in one struct, and every keypress goes through a pure Update function that returns a new state. Coming from imperative code it feels weird at first, then it feels obvious.&lt;br&gt;
Terminal layout is harder than it looks. Getting two panels to resize correctly when the terminal window changes, keeping scroll state in sync with the selected file, handling edge cases like empty directories or binary files — there's more surface area than I expected.&lt;br&gt;
GoReleaser is worth learning. Setting up multi-platform builds with checksums, a proper install script, and GitHub Release assets took maybe two hours but now releases are one git tag away. Should have done this from day one.&lt;/p&gt;

&lt;p&gt;What's next&lt;br&gt;
The current version covers navigation and preview. What's missing for a complete workflow:&lt;/p&gt;

&lt;p&gt;Rename and delete directly from the TUI&lt;br&gt;
Grep across all dotfile content&lt;br&gt;
Syntax highlighting in the preview panel&lt;/p&gt;

&lt;p&gt;If you work a lot in the terminal and have the same dotfile chaos problem, give it a try:&lt;br&gt;
bashgo install github.com/RiccardoCataldi/dotty/cmd/dotty@latest&lt;br&gt;
Or grab a pre-built binary from the releases page.&lt;br&gt;
Feedback welcome — especially on the Go code itself, since this is my first shipped Go project.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>opensource</category>
      <category>learning</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
