<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>micromux</title><link>https://romnn.github.io/micromux/</link><description>Recent content on micromux</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://romnn.github.io/micromux/index.xml" rel="self" type="application/rss+xml"/><item><title>Introduction</title><link>https://romnn.github.io/micromux/docs/introduction/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/micromux/docs/introduction/</guid><description>&lt;h1 id="introduction"&gt;Introduction&lt;a class="anchor" href="#introduction"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;micromux&lt;/code&gt; is a &lt;strong&gt;local process supervisor with a terminal UI&lt;/strong&gt;. You describe your dev services in a &lt;code&gt;micromux.yaml&lt;/code&gt;, run &lt;code&gt;micromux&lt;/code&gt;, and it starts them, tracks their state, and gives you one place to watch logs and restart, enable, or disable them.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The problem&lt;a class="anchor" href="#the-problem"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A local dev stack is several long-lived commands at once — an API, a background worker, a database, a frontend dev server. Two ways people usually run them both fall short:&lt;/p&gt;</description></item><item><title>Services</title><link>https://romnn.github.io/micromux/docs/configuration/services/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/micromux/docs/configuration/services/</guid><description>&lt;h1 id="services"&gt;Services&lt;a class="anchor" href="#services"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Every entry under &lt;code&gt;services:&lt;/code&gt; is one supervised process. Its key (&lt;code&gt;api&lt;/code&gt;, &lt;code&gt;worker&lt;/code&gt;, …) is the service &lt;strong&gt;id&lt;/strong&gt; used everywhere else — in &lt;code&gt;depends_on&lt;/code&gt;, in the TUI, and in &lt;code&gt;micromux ctl&lt;/code&gt;. Only &lt;code&gt;command&lt;/code&gt; is required.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;api&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;API server &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# optional display name for the TUI&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;sh&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./run-api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;working_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./services/api&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;APP_ENV&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;development&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;8080&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;.env&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="command"&gt;Command&lt;a class="anchor" href="#command"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;command&lt;/code&gt; is either a shell-like string or an argv-style array:&lt;/p&gt;</description></item><item><title>The control plane</title><link>https://romnn.github.io/micromux/docs/agent-control/control-plane/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/micromux/docs/agent-control/control-plane/</guid><description>&lt;h1 id="the-control-plane"&gt;The control plane&lt;a class="anchor" href="#the-control-plane"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The control plane is the local endpoint every running &lt;code&gt;micromux&lt;/code&gt; opens. The TUI, the MCP server, and the &lt;code&gt;micromux ctl&lt;/code&gt; client all speak to it, so any of them can inspect and steer a session with identical semantics.&lt;/p&gt;
&lt;h2 id="micromux-ctl"&gt;&lt;code&gt;micromux ctl&lt;/code&gt;&lt;a class="anchor" href="#micromux-ctl"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ctl&lt;/code&gt; is the shell client — the same control plane an agent uses, dogfooded from your terminal. It targets the session for the config resolved from the current directory (or one you name with &lt;code&gt;--session&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>Dependencies &amp; startup order</title><link>https://romnn.github.io/micromux/docs/configuration/dependencies/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/micromux/docs/configuration/dependencies/</guid><description>&lt;h1 id="dependencies--startup-order"&gt;Dependencies &amp;amp; startup order&lt;a class="anchor" href="#dependencies--startup-order"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;depends_on&lt;/code&gt; gates a service&amp;rsquo;s startup on the state of other services. This is the difference between a wall of panes that all launch at once and a stack that comes up in the right order.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;api&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./run-api&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;postgres&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;healthy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;migrate&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;completed&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postgres&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;postgres -D ./pgdata&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;healthcheck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CMD-SHELL&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pg_isready -q&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;migrate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./migrate&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;no&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here &lt;code&gt;api&lt;/code&gt; starts only once &lt;code&gt;postgres&lt;/code&gt; is &lt;strong&gt;healthy&lt;/strong&gt; and &lt;code&gt;migrate&lt;/code&gt; has &lt;strong&gt;completed&lt;/strong&gt; successfully.&lt;/p&gt;</description></item><item><title>Dynamic services</title><link>https://romnn.github.io/micromux/docs/agent-control/dynamic-services/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/micromux/docs/agent-control/dynamic-services/</guid><description>&lt;h1 id="dynamic-services"&gt;Dynamic services&lt;a class="anchor" href="#dynamic-services"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Beyond the services declared in &lt;code&gt;micromux.yaml&lt;/code&gt;, the control plane can create &lt;strong&gt;runtime (dynamic) services&lt;/strong&gt; — processes an agent starts on the fly, for example to run a one-off script or bring up a helper alongside your stack. They are &lt;strong&gt;disabled by default&lt;/strong&gt; and bounded by an explicit policy, because a runtime service is a same-user command with real blast radius.&lt;/p&gt;
&lt;h2 id="enabling-them"&gt;Enabling them&lt;a class="anchor" href="#enabling-them"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Runtime services are off until you opt in, in the target session&amp;rsquo;s config. The policy is &lt;strong&gt;latched when the session starts&lt;/strong&gt;, so changing it requires a session restart:&lt;/p&gt;</description></item><item><title>Installation</title><link>https://romnn.github.io/micromux/docs/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/micromux/docs/installation/</guid><description>&lt;h1 id="installation"&gt;Installation&lt;a class="anchor" href="#installation"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;micromux ships a single binary, &lt;code&gt;micromux&lt;/code&gt;. It is developed and fully supported on &lt;strong&gt;Linux and macOS&lt;/strong&gt;; on Windows the TUI runs but the control plane does not (see &lt;a href="#platform-support"&gt;platform support&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id="homebrew"&gt;Homebrew&lt;a class="anchor" href="#homebrew"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The quickest way on macOS or Linux:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install --cask romnn/tap/micromux&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="from-source"&gt;From source&lt;a class="anchor" href="#from-source"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;With a &lt;a href="https://rustup.rs"&gt;Rust toolchain&lt;/a&gt; installed:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo install --locked micromux-cli&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This builds the full binary, including the MCP server. For a lean, TUI-only build with the MCP server compiled out:&lt;/p&gt;</description></item><item><title>Healthchecks</title><link>https://romnn.github.io/micromux/docs/configuration/healthchecks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/micromux/docs/configuration/healthchecks/</guid><description>&lt;h1 id="healthchecks"&gt;Healthchecks&lt;a class="anchor" href="#healthchecks"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A healthcheck is a command micromux runs periodically to decide whether a service is &lt;strong&gt;healthy&lt;/strong&gt;. Health drives two things: how the service is shown in the UI, and whether &lt;code&gt;depends_on … condition: healthy&lt;/code&gt; gates are satisfied.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;api&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./run-api&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;healthcheck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CMD-SHELL&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;curl -fsS http://localhost:8080/health || exit 1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;start_delay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2s&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;10s&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2s&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="the-probe"&gt;The probe&lt;a class="anchor" href="#the-probe"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;test&lt;/code&gt; is the command to run, in the same string-or-array form as a service &lt;a href="https://romnn.github.io/micromux/docs/configuration/services/"&gt;&lt;code&gt;command&lt;/code&gt;&lt;/a&gt;. The Compose-style &lt;code&gt;CMD-SHELL&lt;/code&gt; prefix runs the rest through a shell:&lt;/p&gt;</description></item><item><title>Quick start</title><link>https://romnn.github.io/micromux/docs/quick-start/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/micromux/docs/quick-start/</guid><description>&lt;h1 id="quick-start"&gt;Quick start&lt;a class="anchor" href="#quick-start"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This walks through a first config, a first run, and how to read the UI. It assumes &lt;code&gt;micromux&lt;/code&gt; is &lt;a href="https://romnn.github.io/micromux/docs/installation/"&gt;installed&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="1-write-a-config"&gt;1. Write a config&lt;a class="anchor" href="#1-write-a-config"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;micromux looks for one of &lt;code&gt;micromux.yaml&lt;/code&gt;, &lt;code&gt;.micromux.yaml&lt;/code&gt;, &lt;code&gt;micromux.yml&lt;/code&gt;, or &lt;code&gt;.micromux.yml&lt;/code&gt; in the current directory. Create one describing your services:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# yaml-language-server: $schema=https://github.com/romnn/micromux/raw/main/micromux.schema.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;api&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;sh&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./run-api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;.env&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;healthcheck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CMD-SHELL&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;curl -fsS http://localhost:8080/health || exit 1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./run-worker&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;api&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;healthy&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;$schema&lt;/code&gt; comment turns on completion and validation in editors with the YAML language server. Each service needs a &lt;code&gt;command&lt;/code&gt;; everything else is optional. See &lt;a href="https://romnn.github.io/micromux/docs/configuration/"&gt;Configuration&lt;/a&gt; for the full set of fields.&lt;/p&gt;</description></item><item><title>Restart policies</title><link>https://romnn.github.io/micromux/docs/configuration/restart-policies/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/micromux/docs/configuration/restart-policies/</guid><description>&lt;h1 id="restart-policies"&gt;Restart policies&lt;a class="anchor" href="#restart-policies"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A restart policy decides what micromux does when a service&amp;rsquo;s process exits. Set it globally, per service, or both — a service inherits the top-level default and overrides it if it sets its own.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# default for all services&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;api&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./run-api&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# inherits unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;migrate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./migrate&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;no&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# one-shot&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;flaky&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./flaky&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;on&lt;/span&gt;-&lt;span class="l"&gt;failure:5 &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# up to 5 retries on non-zero exit&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="policies"&gt;Policies&lt;a class="anchor" href="#policies"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Policy&lt;/th&gt;
					&lt;th&gt;Behavior&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;always&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Restart whenever the process exits, whatever the exit status.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;unless-stopped&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Restart on exit, &lt;strong&gt;unless&lt;/strong&gt; you disabled/stopped the service yourself.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;on-failure&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Restart only on a non-zero exit. Add a cap with &lt;code&gt;on-failure:N&lt;/code&gt; (e.g. &lt;code&gt;on-failure:5&lt;/code&gt;).&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;no&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Never restart. Use for one-shot jobs like migrations. (&lt;code&gt;never&lt;/code&gt; is accepted as a synonym.)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;on-failure&lt;/code&gt; may be written with a count as &lt;code&gt;on-failure:3&lt;/code&gt; or &lt;code&gt;on-failure=3&lt;/code&gt;. Policy names are case-insensitive and accept &lt;code&gt;-&lt;/code&gt; or &lt;code&gt;_&lt;/code&gt; (&lt;code&gt;unless-stopped&lt;/code&gt; or &lt;code&gt;unless_stopped&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>Logs</title><link>https://romnn.github.io/micromux/docs/configuration/logs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/micromux/docs/configuration/logs/</guid><description>&lt;h1 id="logs"&gt;Logs&lt;a class="anchor" href="#logs"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;micromux captures each service&amp;rsquo;s output two ways at once:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;an &lt;strong&gt;in-memory tail&lt;/strong&gt; — bounded and fast, backing the TUI and the default log stream;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;disk-backed run logs&lt;/strong&gt; — the full output of recent runs, retained so you can inspect crash output &lt;em&gt;after&lt;/em&gt; a restart.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retained_runs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# full disk-backed runs kept, including the current one&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;max_lines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;max_bytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;67108864&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 64 MiB&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;api&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./run-api&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retained_runs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# overrides the global default for this service&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="retained-runs"&gt;Retained runs&lt;a class="anchor" href="#retained-runs"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;retained_runs&lt;/code&gt; (aliases: &lt;code&gt;runs&lt;/code&gt;, &lt;code&gt;history&lt;/code&gt;; default &lt;code&gt;5&lt;/code&gt;) is how many full service &lt;strong&gt;runs&lt;/strong&gt; are kept on disk, counting the current run. Each restart starts a new run; when the count is exceeded the oldest run is dropped. This is what lets an agent read the logs of the run that crashed even though the service has since restarted. Disk run logs hold the full output and rotate only by run count.&lt;/p&gt;</description></item><item><title>The terminal UI</title><link>https://romnn.github.io/micromux/docs/tui/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/micromux/docs/tui/</guid><description>&lt;h1 id="the-terminal-ui"&gt;The terminal UI&lt;a class="anchor" href="#the-terminal-ui"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Running &lt;code&gt;micromux&lt;/code&gt; with no subcommand opens the TUI for the current project. It&amp;rsquo;s the primary way to watch and steer a stack.&lt;/p&gt;
&lt;figure class="mm-figure"&gt;
 &lt;img src="https://romnn.github.io/micromux/images/overview.png" alt="The micromux TUI: a service sidebar beside a log pane" loading="lazy" /&gt;&lt;figcaption&gt;The service sidebar (left) and the selected service&amp;rsquo;s live logs (right).&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="layout"&gt;Layout&lt;a class="anchor" href="#layout"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sidebar&lt;/strong&gt; — every service, one row each, showing its lifecycle state: pending, starting, running, healthy, unhealthy, exited, or disabled. The selected row drives the panes on the right.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log pane&lt;/strong&gt; — the selected service&amp;rsquo;s live output. ANSI color and interactive/redrawing output are supported.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Healthcheck pane&lt;/strong&gt; — toggled with &lt;code&gt;H&lt;/code&gt;, it shows the selected service&amp;rsquo;s latest probe: the command, its exit status, and its output.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="keybindings"&gt;Keybindings&lt;a class="anchor" href="#keybindings"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Key&lt;/th&gt;
					&lt;th&gt;Action&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;j&lt;/code&gt; / &lt;code&gt;k&lt;/code&gt;, &lt;code&gt;↓&lt;/code&gt; / &lt;code&gt;↑&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Move the selection&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;r&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Restart the selected service&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;R&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Restart all services&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;d&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Disable / enable the selected service&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;a&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Enter PTY &lt;strong&gt;input mode&lt;/strong&gt; — send keystrokes to the service (exit with &lt;code&gt;Alt+Esc&lt;/code&gt;)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Tab&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Move focus between panes&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;H&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Toggle the healthcheck pane&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;w&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Toggle log wrapping&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;t&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Toggle follow-tail (stick to the newest logs)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;q&lt;/code&gt; / &lt;code&gt;Esc&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Quit&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Restart, disable, and enable all go through the &lt;a href="https://romnn.github.io/micromux/docs/agent-control/control-plane/"&gt;control plane&lt;/a&gt;, so they respect dependency gating and restart policy.&lt;/p&gt;</description></item><item><title>Configuration reference</title><link>https://romnn.github.io/micromux/docs/configuration/reference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/micromux/docs/configuration/reference/</guid><description>&lt;h1 id="configuration-reference"&gt;Configuration reference&lt;a class="anchor" href="#configuration-reference"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Every key in &lt;code&gt;micromux.yaml&lt;/code&gt;. The machine-readable source of truth is &lt;a href="https://github.com/romnn/micromux/blob/main/micromux.schema.json"&gt;&lt;code&gt;micromux.schema.json&lt;/code&gt;&lt;/a&gt;; reference it from your config for editor completion and validation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# yaml-language-server: $schema=https://github.com/romnn/micromux/raw/main/micromux.schema.json&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="top-level"&gt;Top level&lt;a class="anchor" href="#top-level"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Key&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;version&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string / number&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;Config format version. Use &lt;code&gt;&amp;quot;1&amp;quot;&lt;/code&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;directory name&lt;/td&gt;
					&lt;td&gt;Session name surfaced to agents via the control plane.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Treat config warnings as errors.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;services&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;map&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;Service definitions, keyed by id.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;restart&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;Default &lt;a href="https://romnn.github.io/micromux/docs/configuration/restart-policies/"&gt;restart policy&lt;/a&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;healthcheck&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;object&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;Default &lt;a href="https://romnn.github.io/micromux/docs/configuration/healthchecks/"&gt;healthcheck timing&lt;/a&gt; (no &lt;code&gt;test&lt;/code&gt;).&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;logs&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;object&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;Default &lt;a href="https://romnn.github.io/micromux/docs/configuration/logs/"&gt;log retention&lt;/a&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ui&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;object&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;Terminal-UI options.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;control&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;object&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;&lt;a href="https://romnn.github.io/micromux/docs/agent-control/"&gt;Control plane&lt;/a&gt; and dynamic-service policy.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="servicesid"&gt;&lt;code&gt;services.&amp;lt;id&amp;gt;&lt;/code&gt;&lt;a class="anchor" href="#servicesid"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Key&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;command&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string / array&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Required.&lt;/strong&gt; Shell-like string or argv array.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;Display name for the TUI.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;disabled&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;Leave the service disabled when the session starts.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;working_dir&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;Working directory, relative to the config. Aliases: &lt;code&gt;cwd&lt;/code&gt;, &lt;code&gt;directory&lt;/code&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;environment&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;map&lt;/td&gt;
					&lt;td&gt;Inline environment variables.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;env_file&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string / object / array&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;.env&lt;/code&gt; file(s) to load. Long form is &lt;code&gt;{ path: … }&lt;/code&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;depends_on&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;array&lt;/td&gt;
					&lt;td&gt;&lt;a href="https://romnn.github.io/micromux/docs/configuration/dependencies/"&gt;Dependencies&lt;/a&gt;; each a service id or &lt;code&gt;{ name, condition }&lt;/code&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;healthcheck&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;object&lt;/td&gt;
					&lt;td&gt;A &lt;a href="https://romnn.github.io/micromux/docs/configuration/healthchecks/"&gt;probe&lt;/a&gt; with &lt;code&gt;test&lt;/code&gt; plus timing.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ports&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;array&lt;/td&gt;
					&lt;td&gt;Ports the service uses (metadata; not bound by micromux).&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;restart&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;a href="https://romnn.github.io/micromux/docs/configuration/restart-policies/"&gt;Restart policy&lt;/a&gt; for this service.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;logs&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;object&lt;/td&gt;
					&lt;td&gt;&lt;a href="https://romnn.github.io/micromux/docs/configuration/logs/"&gt;Log retention&lt;/a&gt; for this service.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;color&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;Force color handling for this service.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="depends_on"&gt;&lt;code&gt;depends_on[]&lt;/code&gt;&lt;a class="anchor" href="#depends_on"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A bare string (the &lt;code&gt;started&lt;/code&gt; condition) or an object:&lt;/p&gt;</description></item><item><title>How it compares</title><link>https://romnn.github.io/micromux/docs/comparisons/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/micromux/docs/comparisons/</guid><description>&lt;h1 id="how-it-compares"&gt;How it compares&lt;a class="anchor" href="#how-it-compares"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;micromux sits between two familiar tools. Knowing where it differs makes it clear when to reach for it.&lt;/p&gt;
&lt;h2 id="versus-docker-compose"&gt;versus Docker Compose&lt;a class="anchor" href="#versus-docker-compose"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;micromux borrows Compose&amp;rsquo;s config shape — &lt;code&gt;services&lt;/code&gt;, &lt;code&gt;depends_on&lt;/code&gt; with conditions, &lt;code&gt;healthcheck&lt;/code&gt;, &lt;code&gt;restart&lt;/code&gt;, &lt;code&gt;ports&lt;/code&gt;, &lt;code&gt;environment&lt;/code&gt;, &lt;code&gt;env_file&lt;/code&gt; — but it is &lt;strong&gt;not a container orchestrator&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Runs host processes.&lt;/strong&gt; No images, builds, networks, volumes, or container isolation. Your services are the scripts and binaries already on your machine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fast local workflow.&lt;/strong&gt; Start, stop, and restart your existing commands with a UI, no build step in the loop.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependency + health gating.&lt;/strong&gt; Delay a service until its dependencies are started, healthy, or completed — the part a plain process runner lacks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you need reproducible environments, networking, volumes, or cross-machine parity, use Docker Compose. If you want to run the processes you already have, quickly and with service awareness, use micromux.&lt;/p&gt;</description></item></channel></rss>