Repository navigation
Releases: ekrotov/swarmexec
Release list
swarmexec v1.23.2
swarmexec mcp. A Model Context Protocol server on stdio, so an AI
assistant can inspect the swarm: services, tasks, logs, stats, volumes,
networks, secrets and configs, and the diff between a stack file and what
runs. Register it with claude mcp add swarmexec -- swarmexec mcp.
Nothing is visible by default: a service opts in with the label
swarmexec.mcp.enable=true, and swarmexec.mcp.logs / swarmexec.mcp.exec
grant its logs and a non-interactive command. Nothing can be changed
through it, secrets are masked, a service that mounts the Docker socket is
never exec'd into, and only the context it starts with (plus --contexts)
exists for the assistant.
A port-forward dialog that knows the ports. p on a container used to
ask for a port with "8080" as the only hint. It is now a form like k9s's —
Container Port, Local Port, Address, Forward / Cancel — prefilled with the
container's ports: the service's target ports right away, and the image's
EXPOSE ports from updated agents (↓ lists them). Local Port follows the
container port until you change it. Address defaults to 127.0.0.1;
anything else is allowed and flagged as reachable from your network, in
the form, the Forwards tab and for port-forward --address.
Agents. The EXPOSE suggestions need the new agent image; use the image
update in the TUI — the agent service spec is unchanged, so init --force
is not needed. Older agents keep working; the form then suggests the
service's ports only.
swarmexec v1.23.1
Logs for a service with nothing running. A service that crash-loops,
fails its health check or exits on a bad config is the one whose logs you
need — and L in the TUI did nothing on it, while swarmexec logs stopped at
"no running task". Both now show the newest exited container of each
slot, headed by how it ended (failed: task: non-zero exit (1)), and keep
following, so the next attempt of a crash loop arrives as a reconnect.
When no task ever got a container — an image that cannot be pulled, no
node that fits the constraints — you get the task's error instead.
init and down respect DOCKER_HOST. With several Docker contexts,
swarmexec init and down ignored $DOCKER_HOST and acted on the active
context, unlike every other command and the docker CLI. They now use
DOCKER_HOST when it is set and say so; --context still wins.
Client update only; the agents need no update for this release.
swarmexec v1.23.0
No more leaving the TUI for ssh-add. A key with a passphrase used to
fail with "Permission denied (publickey)" over an ssh:// context, because
the ssh processes swarmexec starts have no terminal to ask on. With
OpenSSH 8.4 or newer swarmexec now asks for them: in the TUI as a dialog,
on the command line in the terminal. That covers a key's passphrase, a
password and the question whether to trust a host key seen for the first
time.
You answer once: connections asking the same thing at the same moment
share the answer, and then ride the shared ssh connection. Nothing you
type is stored. Esc cancels the sign-in for good; press r or switch
context to be asked again.
With older OpenSSH or on Windows, the TUI offers to run ssh-add for the
key ssh would use, hands you the terminal for its passphrase and tries
again; the command line names the exact ssh-add command.
SWARMEXEC_SSH_ASKPASS=0 switches asking off.
A clearer website. swarm-exec.cloud-surfers.net now says what
swarmexec does in its first line, shows the SSH-and-docker-exec routine
it replaces, and compares it with Portainer, d4s and swarmcli — including
where swarmexec is the wrong pick. The Docker Hub page describes the
whole tool.
Client update only; the agents need no update for this release.
Apache-2.0, self-hosted, no telemetry.
swarmexec v1.22.4
Security fix. Built with Go 1.27.3, which closes GO-2026-6809 in
crypto/x509 (compromised intermediate certificates were not distrusted).
The agent reaches it through its TLS connections, so update the agents:
in the TUI, update the image of the swarmexec agent service, or run
swarmexec init --force.
The TUI shows its own version. The status line now ends with the
client's version, and when the terminal is too narrow for the context
list, it shows the key that opens it ("c contexts") instead of hiding
that the list exists.
Easier to find. The README on GitHub is a short summary that links
into the full documentation at swarm-exec.cloud-surfers.net. Page titles
and descriptions name what people search for — swarm-exec, docker exec,
logs, port-forward, Docker Swarm — and the sitemap lists only pages meant
for search engines. The Docker Hub page links the website first.
Apache-2.0, self-hosted, no telemetry.
swarmexec v1.22.3
Downloads come from GitHub now. For the past days every download of a
swarmexec release returned "not found": the files had vanished from the GitLab
server that served them. Homebrew, Scoop, the install script and the download
buttons on the site were all affected. The binaries were safe all along in the
GitHub release, which holds the exact files of each build, and that is now the
one place every download points to. Release pages on GitLab link there too,
older releases included.
Eleven security fixes. Built with Go 1.27.2 and golang.org/x/net v0.60.0,
which close eleven vulnerabilities our code could reach — in the standard
library's HTTP/2, TLS and template code, and in x/net.
Releases check themselves more thoroughly. The final check of every
release now downloads each file from where users get it and compares it with
the build's own checksums, and it asks the website several times, so a site
update that reached only some of its servers no longer passes.
Agent update recommended for the security fixes: swarmexec init --force.
Apache-2.0, self-hosted, no telemetry.
swarmexec v1.22.2
The docs in the landing page's design. All five languages of the
documentation now share the look of the new landing page: the same fonts and
colours, light and dark mode (it was dark only), commands in terminal blocks, and
the same top bar with the language switch. The colours the docs use to show what
the TUI displays — a yellow "starting", a red "unhealthy" — were picked for a
dark page; they are now readable in both modes. The text itself is unchanged.
The docs are easy to find from the landing page: in the top bar next to
Install, on a phone too, and in the footer with the release notes. The install
section is headed "Setting it up".
Release logs say why a publish failed. When pushing the Homebrew formula or
the Scoop manifest fails, the release log now shows git's own reason — such as
GitHub answering "Internal Server Error" — with the token masked.
No agent update needed.
Apache-2.0, self-hosted, no telemetry.
swarmexec v1.22.1
g and G move the cursor in the service tree. In the Stacks/Services tab
they used to scroll the view to the top or bottom and leave the selection where
it was — out of sight, so the next j, Enter or i acted on a row you could no
longer see. Now the selection goes with them, to the first row or to the last
one along the expanded services. Tables and lists already did this.
A new landing page. swarm-exec.cloud-surfers.net shows the redesign: what
swarmexec does that the manager alone cannot, shown as small live scenes —
health, exec, port-forward, logs — next to stack diff, the pre-deploy check
and the terminal UI. It is in English; the docs, release notes and privacy page
stay in five languages, and the former translated landing pages redirect to it.
Its fonts are served from the site itself, so no visit sends a request to
Google.
Releases now check themselves. The last job of every release downloads
what was published — from GitLab and GitHub, through Homebrew, Scoop, Docker
Hub, install.sh and the site — and compares it with this build's checksums. A
release that did not arrive turns the pipeline red instead of looking green.
No agent update needed.
Apache-2.0, self-hosted, no telemetry.
swarmexec v1.22.0
On the new Docker SDK. swarmexec now builds on github.com/moby/moby, the
module line Docker continues in; github.com/docker/docker ended at v28. The
two Moby advisories our vulnerability check had to wave through for good are
gone with it — govulncheck reports none, and the exception list is empty.
Nothing changes in how you use it: same commands, same protocol between client
and agent, still Docker Engine 19.03 or newer. Checked live against the
previous release: stack export and diff produce byte-identical output, image
sizes match docker system df, CPU and memory match docker stats.
stack deploy takes stacks that bring their own secrets. A first deploy of a
file whose secrets or configs come from file: was refused with "secret not
found" — the check before the deploy looked for them before the deploy had
created them. It now counts them as present; a missing external secret is still
refused.
stack diff is empty right after a deploy. Diffing a file against the stack it
had just deployed reported the stack's own volume, secrets and configs as
renamed or external — exactly the case a pipeline gate asks about. An export
also keeps the volume's real name, so deploying it again mounts the same volume.
One safeguard. On a daemon older than Docker 25, an edit of a service that
still keeps its networks in the pre-API-1.44 field is refused with an
explanation instead of detaching them.
The docs now say why a port-forward container stays for two minutes after the
last connection: on purpose, so a reload does not pay the container start again.
Agent update optional: swarmexec init --force brings the agent onto the new
SDK as well; a v1.21 agent keeps working.
Apache-2.0, self-hosted, no telemetry.
swarmexec v1.21.0
The env editor is now a text editor. Inspect a service and press e: the
whole environment opens as text, one KEY=VALUE per line, multi-line values
as KEY<<EOF heredocs, # to comment a variable out. It works like vim —
Normal and Insert mode, dd, yy/p, u, / search, counts — and the
footer always shows the keys for the current mode; ? lists them all. :w
checks every line first (an error names the line and puts the cursor on it),
then shows which keys are added, changed and removed before the rolling
update. :q refuses while there are changes, :q! discards them, :list
goes to the list editor with the edits carried over.
Long values stay visible. Labels are edited as two fields, key and value,
so a long Traefik rule reads as a whole. The port prompt and the mount form's
host and container paths wrap onto further rows instead of scrolling a long
value out of sight.
Docs in five languages, reviewed. The German, Spanish, French and Polish
pages were checked against the English: missing passages restored, terms made
consistent, code left as code. An optional, manual CI job can re-translate
changed sections with the Claude API.
No agent update needed — everything works against a v1.20 agent.
Apache-2.0, self-hosted, no telemetry.
swarmexec v1.20.0
Follow a whole stack. swarmexec logs -f api worker db and logs -f --stack shop stream every source at once, each line tagged with where it came from
(web.2, agent@node-3); every source reconnects across its own container
replacements and detects its own format. A service with several replicas now
follows all of them instead of stopping as ambiguous. In the TUI, L on a
stack row does the same.
Wait for a deploy to actually work. swarmexec wait --stack shop blocks
until every service has converged and exits 0, or 1 with the reason: the
scheduler's message, an update that paused half way, a rollback that finished
during the wait. --healthy also waits for healthchecks — and a node that
cannot report health counts as not yet, never as healthy.
stack diff as a pipeline gate. --ignore 'services.*.deploy.replicas'
leaves runtime differences out of both sides and says so; a path that matches
nothing is reported as the typo it usually is. --format json for machines.
Install in one line. curl -fsSL https://swarm-exec.cloud-surfers.net/install.sh | sh
verifies the release's checksum and refuses anything it cannot verify. Each
release now also publishes a Homebrew formula and a Scoop manifest.
Shell completion for services, slots, stacks and contexts — two seconds at
most, and over ssh it never stops to ask for a password.
The last minutes of CPU and memory under each container in the inspect
STATS view; a gap is a gap, never a zero. That view also refreshes again while
open — it had frozen on the readings it opened with.
For the agents: init --metrics-port publishes Prometheus metrics (new:
agent build info and cap refusals; alert rules and a Grafana dashboard ship in
the repo), and init --policy-file adds a rule file — no sweeping image prune
on production, no forward onto the database. It guards against accidents, and
the docs say plainly why it is not access control.
Also here: one source for the wire protocol, a CI check for generated code, and
docs whose four translations are derived from the English and checked on
every build.
Agent update recommended: swarmexec init --force for metrics and policy;
everything else works against a v1.19 agent.
Apache-2.0, self-hosted, no telemetry.