<?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.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 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;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;thead&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Asset&lt;/th&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/thead&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;Linux x86_64&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;&lt;code&gt;dotty_Linux_x86_64.tar.gz&lt;/code&gt;&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;Linux ARM64&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;&lt;code&gt;dotty_Linux_arm64.tar.gz&lt;/code&gt;&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;macOS Intel&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;&lt;code&gt;dotty_Darwin_x86_64.tar.gz&lt;/code&gt;&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;macOS Apple Silicon&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;&lt;code&gt;dotty_Darwin_arm64.tar.gz&lt;/code&gt;&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&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>
