<?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: Yury Kosyakov</title>
    <description>The latest articles on DEV Community by Yury Kosyakov (@ykosyakov).</description>
    <link>https://dev.to/ykosyakov</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%2F3170309%2F6cdd8c9c-9f2d-43b8-90fe-652bd79c299c.jpg</url>
      <title>DEV Community: Yury Kosyakov</title>
      <link>https://dev.to/ykosyakov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ykosyakov"/>
    <language>en</language>
    <item>
      <title>I built a desktop app to replace my 15 terminal tabs and janky startup scripts</title>
      <dc:creator>Yury Kosyakov</dc:creator>
      <pubDate>Fri, 13 Feb 2026 20:33:16 +0000</pubDate>
      <link>https://dev.to/ykosyakov/i-built-a-desktop-app-to-replace-my-15-terminal-tabs-and-janky-startup-scripts-5614</link>
      <guid>https://dev.to/ykosyakov/i-built-a-desktop-app-to-replace-my-15-terminal-tabs-and-janky-startup-scripts-5614</guid>
      <description>&lt;p&gt;Every project I work on has 5-10 services. Backend, frontend, workers, databases, webhooks. The "getting started" &lt;br&gt;
  routine looks something like:                                                                                     &lt;/p&gt;
&lt;h2&gt;
  
  
  Terminal 1
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cd backend &amp;amp;&amp;amp; npm run dev&lt;/code&gt;                                                                                        &lt;/p&gt;
&lt;h2&gt;
  
  
  Terminal 2
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cd frontend &amp;amp;&amp;amp; npm run dev&lt;/code&gt;                                                                                        &lt;/p&gt;
&lt;h2&gt;
  
  
  Terminal 3
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cd worker &amp;amp;&amp;amp; npm run dev&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Terminal 4
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;docker run -p 5432:5432 postgres&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Terminal 5
&lt;/h2&gt;
&lt;h2&gt;
  
  
  ...you get the idea
&lt;/h2&gt;

&lt;p&gt;Then someone on the team uses the same port, or you switch between projects and everything collides, or you forget&lt;br&gt;
   to start the worker and spend 20 minutes debugging why jobs aren't processing.&lt;/p&gt;

&lt;p&gt;I got tired of this. So I built &lt;a href="https://github.com/ykosyakov/simple-local" rel="noopener noreferrer"&gt;https://github.com/ykosyakov/simple-local&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Point it at a project folder. AI analyzes your codebase and discovers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Services and their start commands&lt;/li&gt;
&lt;li&gt;Ports (including hardcoded ones that will cause conflicts)&lt;/li&gt;
&lt;li&gt;Dependencies between services&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Required runtimes and tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then you get a single dashboard to manage everything.&lt;/p&gt;
&lt;h2&gt;
  
  
  The features that actually matter
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No more port conflicts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every service gets a unique port allocated automatically. If your backend and your colleague's backend both&lt;br&gt;
  default to :3000 — doesn't matter. Simple Local remaps them and updates the environment variables so services can&lt;br&gt;
  still find each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Native or container — per service&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the big one. Docker Compose forces everything into containers. But sometimes you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend running natively (faster hot reload)&lt;/li&gt;
&lt;li&gt;Database in a container (no local install needed)&lt;/li&gt;
&lt;li&gt;Backend natively (easier to attach a debugger)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simple Local lets you toggle each service independently. When you switch to container mode, it auto-generates a&lt;br&gt;
  devcontainer.json with the right base image, port forwarding, and source mounts. No Dockerfile writing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP server for AI agents&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the feature I didn't know I needed until I had it. Simple Local exposes an MCP server, so AI coding agents&lt;br&gt;
   (Claude Code, Cursor, Windsurf) can:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Start the backend and check if it's healthy"&lt;br&gt;
"Restart the API server and show me the last 20 log lines"&lt;br&gt;
"What services are running?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Setup is one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;claude mcp add --transport http simple-local http://localhost:19275/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your AI agent has full visibility into your local infrastructure.&lt;/p&gt;

&lt;p&gt;Manual config when you want control&lt;/p&gt;

&lt;p&gt;AI discovery handles most setups, but you can also write the config yourself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; {
    "name": "my-project",
    "services": [
      {
        "id": "backend",
        "name": "Backend API",
        "path": "./packages/backend",
        "command": "npm run dev",
        "port": 3000,
        "env": {
          "DATABASE_URL": "postgresql://localhost:5432/mydb"
        },
        "active": true,
        "mode": "native"
      },
      {
        "id": "frontend",
        "name": "Frontend App",
        "path": "./packages/frontend",
        "command": "npm run dev",
        "port": 3001,
        "env": {
          "API_URL": "http://localhost:${services.backend.port}"
        },
        "dependsOn": ["backend"],
        "active": true,
        "mode": "native"
      }
    ]
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice &lt;code&gt;${services.backend.port}&lt;/code&gt; — environment variables can reference other services' ports, so everything stays&lt;br&gt;
  wired up even when ports get remapped.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Here's a 1-minute video showing the full flow:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/aeqMkra2n4E" rel="noopener noreferrer"&gt;https://youtu.be/aeqMkra2n4E&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try it&lt;/p&gt;

&lt;p&gt;It's free, open source, and runs 100% locally. No cloud, no accounts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/ykosyakov/simple-local" rel="noopener noreferrer"&gt;https://github.com/ykosyakov/simple-local&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Download: &lt;a href="https://github.com/ykosyakov/simple-local/releases" rel="noopener noreferrer"&gt;https://github.com/ykosyakov/simple-local/releases&lt;/a&gt; (macOS, Windows, Linux)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Would love to hear what you think — what would make this useful for your setup?&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>devtools</category>
      <category>ai</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
