Changelog
All notable changes to Miren Runtime will be documented in this file.
Unreleased
main
v0.6.1
2026-03-24
Improvements
- Faster system log queries -
miren logs systemnow returns results in under a second instead of ~10 seconds by using VictoriaLogs' nativelimitparameter instead of server-side sorting. (#681) - JSON output for more CLI commands -
debug netdb list,debug netdb status, anddoctor confignow support--format json. Added--jsonas a shorthand for--format jsonon all commands that support it. (#687)
Bug Fixes
- Fixed delta deploys failing when cached and changed files share directories - Deploying after a cached delta could fail with
mkdir: file existswhen both the cached and changed file sets contained the same directory. (#689) - Fixed CLI commands ignoring per-app cluster selection - Commands like
route list,sandbox list, andapp listnow respect the cluster chosen viacluster switchin an app directory, instead of silently falling back to the global active cluster. (#683)
Documentation
- Added a top-level Deployment docs page covering the full deploy lifecycle. (#684)
v0.6.0
2026-03-17
Features
- Disk storage system overhaul - The disk subsystem has been rewritten with a new Universal mode backed by loop devices, replacing the previous LSVD/NBD architecture. Existing LSVD volumes are migrated automatically on first boot. Includes disk backup/restore support and a new cloud accelerator mode for segment upload/replay. (#639)
- System logs accessible from the CLI -
miren logs systemqueries server logs directly from the CLI — same interface as app logs, with--follow,--last, and--format jsonall working. Under the hood, server logs are ingested into VictoriaLogs through a structured handler, so all attributes (module, level, error fields) are preserved and queryable.miren logsis also restructured into proper subcommands (app,sandbox,build,system) — baremiren logsstill works as shorthand formiren logs app. (#645, #662, #679) - Delta file transfer for deploys - The deploy client now sends a file manifest first; the server compares it against the cached source from the previous deploy and the client only uploads what changed. Subsequent deploys of unchanged code upload nothing. (#670)
- Wildcard routes - Route all subdomains of a domain to a single app with
miren route set *.example.com myapp. Wildcard routes match any subdomain and the bare domain, with exact routes taking priority. TLS certificates are provisioned automatically for each matching subdomain. (#659)
Improvements
- Upload progress bar and caching summary - Deploy uploads show a real progress bar with percentage and speed. After upload, a summary shows how many files were cached from the previous deploy and estimated time saved. (#680)
- Eager TLS certificate provisioning - Adding a route now triggers certificate provisioning immediately in the background. HTTPS connections no longer stall 30–90 seconds on first access. (#661, #664)
- Deploy progress tracks build steps - The progress bar now tracks build steps instead of layer downloads, so it stays active on cached-image deploys. (#665)
- JSON output for log and app commands -
miren logs(all subcommands),miren app,miren app status, andmiren app historyall support--format jsonfor scripting and automation. (#675, #673) - Group help for CLI discovery -
miren help --commandslists all commands with synopses (supports--format json).miren help app.list version sandbox.stopshows help for multiple commands at once using dot notation. (#676) - System requirements check at install - The installer now verifies at least 4 GB memory and 50 GB storage before proceeding. (#663)
Bug Fixes
- Fixed rapid deploys causing orphaned sandboxes - Deploying the same app multiple times in quick succession no longer leaves orphaned sandboxes running or stale routing entries. (#672)
- Fixed disk config silent failures - Using
sizeinstead ofsize_gbin disk config no longer leaves sandboxes stuck in PENDING forever; unknown fields now surface as errors. (#666) - Fixed app TUI showing wrong concurrency - The
miren appdetails view now correctly shows fixed instance counts instead of "auto" for services with explicit concurrency settings. (#667) - Fixed env var file values including trailing newlines -
KEY=@filepathnow trims trailing line endings from file contents. (#671)
v0.5.0
2026-03-10
Features
- Multi-port and non-HTTP services - Apps can now expose multiple ports with different protocols (TCP, UDP, HTTP) using
[[services.<name>.ports]]in app.toml. Node ports are validated at deploy time to prevent conflicts. Enables use cases like IRC servers alongside HTTP endpoints. (#641) - CI deployments with GitHub Actions - Deploy from GitHub Actions and other CI systems using short-lived identity tokens instead of long-lived secrets. Bind repos to apps with
miren auth ci add --github OWNER/REPO -a APP, and GitHub Actions will authenticate automatically. Target clusters from CI with theMIREN_CLUSTERenv var. (#631, #633, #635) - Required environment variables - Declare env vars as
required = truein app.toml and deploys will fail early with a clear message listing what's missing. Vars can also be markedsensitiveand given adescriptionthat appears inmiren env list. (#638)
Improvements
- Zero-config app initialization - Running any app command without an
app.tomlnow offers to runmiren initfor you interactively, inferring the app name from your directory. In CI, the error message tells you what to do. (#654) - Bun runtime detection without lockfile - Bun apps without dependencies are now detected via
bunfig.toml, thepackageManagerfield in package.json, orbun/bunxcommands in package.json scripts. (#656) env set/env deleteshow deployment progress - Environment variable changes now go through the deployment service and show activation progress and routes, matching the UX ofdeployandrollback. (#630)
Bug Fixes
- Fixed 502 errors during deployment rollovers - The HTTP ingress now retries on a stale connection instead of immediately returning 502, and the launcher waits for new sandboxes to be ready before scaling down old ones. (#637)
- Fixed streaming responses being buffered - SSE, chunked downloads, and long-polling now work correctly. The previous timeout implementation buffered entire responses in memory before sending; timeouts are now handled at the transport level so data streams incrementally. (#634)
- Fixed
miren execpanic after command finishes -miren execandmiren app runno longer panic when the remote command completes. (#655) - Fixed
app runpanic when stdin isn't a terminal -miren app runno longer panics in non-interactive contexts like piped input or CI. (#632) - Fixed firewall rules leaking on sandbox teardown - Port forwarding rules are now cleaned up when sandboxes stop, preventing stale rules from making node ports unreachable after redeployment. (#644)
v0.4.1
2026-02-18
Bug Fixes
- Fixed app startup directory regression - Apps deployed before the WORKDIR fix (v0.4.0) would boot with CWD
/instead of/app, causing crashes. The/appdefault is now restored as a fallback for existing app versions without a storedstart_directory. (#621, #623) - Fixed noisy RPC error logs - Deploying to a server without telemetry capabilities no longer produces a spurious
[ERROR] error resolving capabilitymessage. Optional capability lookups now degrade quietly at Debug level. (#622)
v0.4.0
2026-02-17
Features
-
First-class rollbacks - Redeploy a previous app version without rebuilding. Use
miren rollbackfor an interactive picker that shows your recent versions, ormiren deploy --version <id>to deploy a specific version directly. Each rollback creates a full deployment record with provenance tracking. (#590) -
OpenTelemetry tracing - Comprehensive distributed tracing across the Miren runtime. Traces cover HTTP ingress, deploy/build pipelines, containerd operations, and CLI commands. CLI spans are shipped through the server via a proxy exporter. Cluster identity is included in trace resource attributes. See Observability for configuration details. (#595, #601, #602, #609)
Improvements
- Per-app cluster pinning - The CLI now remembers which cluster to use for each app. The first time you use
-C <cluster>with a command, that cluster is saved locally for the app. Resolution order: explicit-Cflag > per-app pin > global active cluster. Usemiren cluster currentto see which cluster the CLI will target. (#596) - Better app.toml error messages - Invalid
app.tomlfiles now surface the actual parse error instead of the confusing "app is required" message. (#614) - Exclude dead sandboxes from listing -
miren sandbox listnow hides dead sandboxes by default, showing only active ones. Use--allto see everything. (#585) - Redact secrets from debug bundles -
miren debug bundlenow redacts sensitive information and includes guidance on sharing bundles safely. (#612) -vflag moved to-V- The version flag is now-V/--version, freeing-vfor--verboseacross all commands. (#593, #594)- Disk mount robustness - Improved disk mount lifecycle handling with better error recovery and integration test coverage. (#597)
Bug Fixes
- Fixed Dockerfile WORKDIR ignored - App containers now honor the
WORKDIRdirective from your Dockerfile instead of always defaulting to/. (#617) - Fixed nested .gitignore files ignored in deploy - Deploy tarballs now respect
.gitignorefiles in subdirectories, not just the root. This prevents things likeweb/node_modules/from inflating your deploy upload. (#608) - Fixed disk space GC - Garbage collection for BuildKit cache and registry blobs now works correctly, preventing disk space from being consumed by stale build artifacts. (#588)
- Fixed activator pool cache lockout - The activator pool cache no longer permanently locks out at MaxPoolSize, which was preventing scale-to-zero apps from recovering after hitting the pool size limit. (#616)
- Fixed disk lease leak in sandbox cleanup - Periodic sandbox cleanup now properly releases disk leases before deleting sandboxes. (#613)
- Fixed empty host in route commands -
miren route setandmiren route shownow validate that a host is provided instead of accepting empty strings. (#591) - Fixed deployment cluster filter - Deployments are now correctly filtered by cluster, and
miren app historydefaults are improved. (#589)
v0.3.1
2026-02-06
Features
- Build-time environment variables - Environment variables are now available during the build process, so build commands like
npm run buildcan access API keys, database URLs, and other configuration. Variables fromapp.toml, existing config, and--env/--secretCLI flags are all injected at build time. (#581)
Improvements
-
Preserve disk mounts during server restart - The LSVD disk manager now survives server restarts, keeping disk mounts active. Use
systemctl reload mirenfor a soft restart that preserves mounts, orsystemctl restart mirenfor a full restart. This significantly reduces disruption when updating the miren server. (#554)For existing installations: To enable this feature, either re-run
sudo miren server install --forceto regenerate the systemd unit file, or manually add the following line to/etc/systemd/system/miren.serviceunder the[Service]section and runsystemctl daemon-reload:ExecReload=/bin/kill -USR1 $MAINPID -
Batch env var setting - Setting multiple environment variables now creates a single app version instead of N intermediate versions. (#578)
-
Smarter deploy coalescing - Rapid successive deploys are now coalesced so only the latest version is launched, avoiding unnecessary churn from intermediate sandbox pools. (#579)
-
Default app name from app.toml - CLI commands like
app delete,route set, androute set-defaultnow infer the app name from.miren/app.tomlwhen not specified. (#562) -
Clearer scaling display - Instance counts now show
(auto)or(fixed)suffix, and sandbox pool listings include a MODE column. (#566) -
Deploy validation for services - Deploys now fail early with a clear error when no services are defined, instead of silently deploying an unservable app. (#563)
-
Smarter
miren upgrade- Upgrade now checks permissions upfront, offers interactive sudo vs user-directory install picker, and supports a--userflag for non-root installation. (#564)
Bug Fixes
- Fixed build log retention - Build logs are now properly persisted when using the central BuildKit daemon, restoring the ability to retrieve build output after a deploy with
miren logs --build. (#561, #570) - Fixed orphaned container shims - Containerd shims are no longer left behind when app containers crash. (#577)
- Fixed env vars wiped by app.toml - Adding the first
[[env]]entry toapp.tomlno longer silently drops existing environment variables. (#580) - Fixed DNS during sandbox startup - DNS no longer returns empty responses during sandbox startup; unknown source IPs are now lazily resolved via entity store lookup. (#576)
- Fixed nil panic in
miren env list- Runningmiren env listwhen an app isn't deployed to the current cluster no longer crashes. (#572)
v0.3.0
2026-01-27
Features
- Automatic image garbage collection - Container images are now automatically garbage collected to prevent disk exhaustion. Images are kept if less than 30 days old or within the last 20 releases per app. Garbage collection runs weekly or immediately when disk usage exceeds 80%. (#544)
- Deploy-time environment variables - Set environment variables atomically with your deployment using
miren deploy -e KEY=VALUEor-s SECRET=valuefor sensitive values. Supports reading from files with@filesyntax and interactive prompts. (#521) - Graceful shutdown during redeploy - Apps now receive proper graceful shutdown time during redeploy instead of being force-killed. Configure per-service with
shutdown_timeoutin app.toml (default 10 seconds). (#520) miren deploy cancel- Cancel stuck in-progress deployments without waiting for the 30-minute lock expiry. (#517)miren debug bundle- New diagnostic command that collects system info, logs, container state, and process info into a tar.gz archive for troubleshooting. (#531)- Domain allow list for TLS - Automatic TLS certificate provisioning is now restricted to domains with explicitly configured routes, preventing certificate issuance for arbitrary domains pointed at the server. (#542)
Improvements
- Better app history display - The
miren app historycommand now shows deployment IDs (useful fordeploy cancel) and improved status formatting. (#529, #532)
Bug Fixes
- Fixed server restart killing all sandboxes - Sandbox recovery no longer incorrectly kills all sandboxes when the server restarts. (#546)
- Fixed disk lease transfers - Disk leases are now properly released when sandboxes stop, allowing new sandboxes to acquire them. (#516)
- Fixed sandbox exec issues - Fixed panic when running
sandbox execwithout a TTY and fixed wrong entrypoint being applied to service containers. (#515, #518) - Fixed deployment panic handling - Panics during deployment are now properly marked as failed instead of leaving deployments stuck. (#513)
- Fixed WebSocket 502 errors - WebSocket connections no longer fail with 502 Bad Gateway. (#507)
- Fixed cluster switch for multi-identity setups - Improved identity handling and UX when switching between clusters. (#535)
v0.2.1
2025-12-19
Improvements
- Improved
miren doctor- The diagnostic command now suggests commands for you to run instead of running them automatically. Includes better guidance for config, auth, and server issues, plus clickable routes in app listings. (#491) - Smarter install defaults -
miren server installandmiren downloadnow default to the version matching your binary instead of always usingmain. (#500, #502)
Bug Fixes
- Fixed scale-to-zero pool deletion - Pools for apps at scale-to-zero are no longer prematurely deleted after being idle for an hour, which was causing "pool has reached maximum size" errors when traffic resumed. (#497)
- Fixed activator cache cleanup - The activator now proactively cleans up cached pool references when pools are deleted, preventing stale cache errors. (#498)
- Fixed disk debug commands -
miren debug disk statusand related commands now correctly parse disk IDs. (#499)
v0.2.0
2025-12-17
Features
miren app run- Run commands in a one-off sandbox with your app's configuration. Great for debugging, migrations, or one-off tasks. (#489)- Persistent BuildKit daemon - Builds are now significantly faster thanks to a persistent BuildKit daemon that maintains layer caching across builds. No more cold starts! (#490)
miren doctorcommand - New diagnostic command to help troubleshoot your Miren setup. Includesmiren doctor appsto check app status andmiren doctor authto verify authentication. (#484)miren deploy --analyze- Preview what Miren will detect about your app before actually building it. Great for understanding how your project will be configured. (#485)- Rust and uv support - Miren now auto-detects Rust projects and Python projects using uv, and builds them appropriately. (#485)
- Log filtering - Filter logs by service name with
miren logs --service <name>and by content withmiren logs -g <pattern>. Also includes a faster chunked log streaming API under the hood. (#487, #466) - Debug networking commands - New
miren debug netdbcommands for inspecting IP allocations and cleaning up orphaned leases. Helpful for advanced troubleshooting. (#478)
Bug Fixes
- Fixed IP address leaks - Resolved several issues where IP addresses could leak during sandbox lifecycle events, container cleanup, and entity patch failures. (#479)
- Fixed stale pool reference - Deleting and recreating an IP pool no longer causes "error acquiring lease" failures. (#483)
- Fixed LSVD write handling - LSVD now uses proper Go file writes instead of raw unix calls, improving reliability. (#477)
- Fixed deployment cancellation race - Cancelling a deploy with Ctrl-C no longer causes a race condition between the main and UI goroutines. (#482)
- Fixed authentication bypass - Local/non-cloud mode now properly requires client certificates. (#469)
- Fixed entity revision check - Entity patches no longer incorrectly enforce revision checks when
fromRevisionis 0. (#470) - Fixed IPv6 environments - VictoriaMetrics and VictoriaLogs now listen on IPv6, fixing issues in environments with IPv6 enabled. (#481)
Documentation
- Updated system requirements to 4GB RAM and 20GB disk (#480)
- Improved getting started documentation (#471)
- Fixed missing pages in docs sidebar navigation (#467)
v0.1.0
2025-12-09
Initial preview release.