<?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: Lorenzo Vicino</title>
    <description>The latest articles on DEV Community by Lorenzo Vicino (@lorenzovicino).</description>
    <link>https://dev.to/lorenzovicino</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%2F1017003%2Ff043af04-003f-47a3-a38c-fbe87b454ec9.jpeg</url>
      <title>DEV Community: Lorenzo Vicino</title>
      <link>https://dev.to/lorenzovicino</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lorenzovicino"/>
    <language>en</language>
    <item>
      <title>One tab for every repo, container and AI session on my machine</title>
      <dc:creator>Lorenzo Vicino</dc:creator>
      <pubDate>Thu, 03 Sep 2026 15:14:20 +0000</pubDate>
      <link>https://dev.to/lorenzovicino/one-tab-for-every-repo-container-and-ai-session-on-my-machine-2gk2</link>
      <guid>https://dev.to/lorenzovicino/one-tab-for-every-repo-container-and-ai-session-on-my-machine-2gk2</guid>
      <description>&lt;p&gt;My working day spans about ten Git repositories. Here is where their state actually lived:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which trees are dirty → forty terminal tabs&lt;/li&gt;
&lt;li&gt;which branches are behind → a Git client, pointed at one repo at a time&lt;/li&gt;
&lt;li&gt;which containers are up → &lt;code&gt;docker ps&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;the AI conversation I had yesterday about the retry policy → somewhere under
&lt;code&gt;~/.claude/projects&lt;/code&gt;, in a folder named after a path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built &lt;strong&gt;repo-control&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx repo-control ~/projects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;It scans that folder for Git repositories and serves a dashboard on &lt;code&gt;127.0.0.1&lt;/code&gt;.&lt;br&gt;
No account, no cloud, no telemetry.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwg6htaknu26e2chedf8g.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwg6htaknu26e2chedf8g.gif" alt=" " width="560" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Four things it puts in one tab:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What needs you&lt;/strong&gt; — one queue, worst first: unhealthy containers, automations that failed,
repositories to pull, commit or push. Click a row, land in that repo already scoped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every repo as a workspace&lt;/strong&gt; — inline diffs, staging, commit, fetch/pull/push, branches with
divergence and safe checkout, a terminal scoped to that folder that survives navigation,
Compose state when there is a Compose file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your AI sessions&lt;/strong&gt; — it reads the histories Claude Code, Codex and Gemini CLI already write
to disk, keeps only the ones belonging to your workspace, and resumes any of them in a real
terminal, in the right folder, with the right CLI. Nothing is copied anywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automations&lt;/strong&gt; — drag Git, Docker and terminal nodes into a workflow: fetch everything,
rebuild a stack, run one command across a selection. A dry run prints the exact commands first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One decision I will not budge on: &lt;strong&gt;the browser never sends a path.&lt;/strong&gt; It sends a repository ID,&lt;br&gt;
the server resolves it against the root it scanned, and refuses anything outside. That is the&lt;br&gt;
whole difference between "a web page that runs shell commands on my machine" and something I&lt;br&gt;
leave open all day.&lt;/p&gt;

&lt;p&gt;What it is not: a team tool, and not where you do rebases or conflict resolution — that stays in&lt;br&gt;
your editor. It never calls the GitHub API. Everything it knows comes from &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;docker&lt;/code&gt; and&lt;br&gt;
the files on disk.&lt;/p&gt;

&lt;p&gt;MIT, TypeScript end to end: &lt;strong&gt;github.com/LorenzoVicino/repo-control&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Now the part I actually want from you. I have built this against exactly one workflow: mine.&lt;br&gt;
Three questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Across your repos, what state do you lose track of most?&lt;/li&gt;
&lt;li&gt;Is "one queue of what needs you" the right front page, or would you want something else there?&lt;/li&gt;
&lt;li&gt;What would make you close the tab in the first minute?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you already have a system for keeping ten-plus repositories straight, I would rather hear that than a star.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>git</category>
    </item>
  </channel>
</rss>
