Jul 28
2026
The CLI self-hosting story is finalized, remote-Docker migrations are made reliable, and a batch of fixes lands across the control plane for a more stable release.
CLI
- A finished install opens the control panel, not the setup wizard — bare
openship(and the from-sourceopenship-dev) now recognizes a Docker Compose install (the default on Linux). Re-running after setup manages the running stack instead of walking you through name / email / domain from scratch again. - Control-panel Start / Stop / Restart drive the actual stack — on a compose
install these now run
docker compose up -d/restart/downand read the stack's real state, instead of targeting a systemd unit that was never installed (which reported "stopped" for a healthy stack).
Migrations & remote Docker
- The SSH → Docker bridge no longer hangs or false-fails a healthy server —
migrating from another platform (Coolify/Dokploy/Dokku) or adopting a running
Docker host could stall the reachability check — or drop the request outright —
under the Bun-hosted API, even against a perfectly healthy daemon. The bridge
now starts reading the request socket immediately and verifies each forwarded
channel actually carries data, falling back to
docker system dial-stdioon a fresh connection when a channel opens dead. Contributed by @jbermudez00 (#271).
- Mail-server setup works from the desktop app — the iRedMail engine is now
shipped inside the packaged desktop app (and the CLI bundle) and located by an
explicit path, fixing the
Transfer iRedMail Engine … tar: could not chdirfailure on install.
Fixes
- Self-hosted GitHub connect is token-first — a remote (VPS) instance pastes
an access token inline in the Library, with no
gh auth loginhints; the gh CLI path is now desktop-only, where it belongs. - The deploy wizard lands on configuration directly — the deploy-target picker no longer flashes on entry. A sensible target is applied silently and stays one click away in the summary bar at the top.
- The control plane stops listing a phantom service — the self-managed
"Openship" project no longer shows a bogus public
openshipservice (and its strayopenship-openship.opsh.ioroute) that matched no container and read "Stopped" forever.