Changelog
Notable features and fixes per marina release. The authoritative list of every tagged release lives on GitHub; this page highlights the changes worth knowing about. Releases before v0.3 shipped under the name klimax; their entries below use today's names.
marina is pre-1.0 and versions with the same date were cut together during rapid iteration. Patch releases with no user-visible change (dependency bumps, CI, docs) are folded into the nearest entry below.
Upgrading between releases? After
brew upgrade --cask marina, destroy and re-create the VM so
the new version re-provisions it: marina destroy && marina
up. Provisioning is baked into the binary, so an in-place VM keeps
running the old setup until you rebuild it — the host-backed image cache
survives, so it's fast. See
Reset.
v0.3.4 — 2026-10-19
- Changed: Lima updated from v2.2.0 to v2.2.1. The first
marina updownloads the matching guest agent (a few MB). - Fixed: the hostagent pidfile now records the boot session. A pidfile left from before a Mac reboot is ignored instead of matched against a reused PID.
- Fixed: the hostagent flushed its log to disk after every line, which slowed all of its logging when many port-forwarded connections closed at once. It now flushes at most every 100 ms.
- Security:
golang.org/x/netv0.60.0 fixes GO-2026-6603, GO-2026-6610, GO-2026-6611, GO-2026-6612 and GO-2026-6617. - Upgrading:
marina downbeforebrew upgrade --cask marina, thenmarina up. No VM rebuild needed.
v0.3.3 — 2026-10-02
- New:
marina doctorchecks that macOS apps resolve the local DNS zone (checkdns-system-resolver). The existingdnscheck queries the server directly, likedig @172.30.255.53, so it stayed green while curl and browsers failed. The new check resolvesmarina-probe.demo.internal, a recordmarina upnow publishes, through the macOS resolver. - New: when the check fails because of an MDM encrypted-DNS profile
(Kandji, Jamf, Intune…),
marina doctornames the profile and its server, andmarina upwarns. Such a profile sends every lookup to its DoH/DoT server and never reads/etc/resolver; only the MDM admin can exempt the zone. See Local DNS troubleshooting. - Upgrading: run
marina up(ormarina doctor --fix) once to publish the probe record. No VM rebuild needed.
v0.3.1 – v0.3.2 — 2026-10-01
- Fixed (v0.3.2):
marina cluster e2e-test-nginxfailed when its first request got no answer at all ("network is unreachable") in the moments after the Service got its IP. It retried only refused connections; it now retries every error. - Fixed (v0.3.1): changing
network.disablePortMirroringon an existing VM had no effect. Setting it tofalsegave new clusters127.0.0.1kubeconfigs while the VM still forwarded nothing there, sokubectlfailed with connection refused.marina upnow applies the change in place, likevm.mounts: it offers a VM restart (non-interactive runs only warn). Nomarina destroyneeded. - Note (v0.3.1): a cluster keeps the API address it was created with.
Switching to
127.0.0.1leaves existing clusters working; switching back breaks clusters created in loopback mode — recreate them.
v0.3.0 — 2026-09-28
- Renamed: the project, the CLI and the site —
marinaat marina.run. A marina is where boats berth side by side; marina keeps many kind clusters side by side in one VM. - Changed (breaking): every name that carried "klimax" —
~/.marina, themarina.run/fleetlabel,apiVersion: marina.run/v1alpha1, and a new local CA. - Added:
marina migratemoves a klimax installation over;klimaxremains as an alias ofmarinafor now. See Coming from klimax.
v0.2.5 – v0.2.6 — 2026-09-28
- Changed (v0.2.6): Ingresses are no longer published in the
local DNS zone by default. Set
network.dns.ingress: trueto publish Ingress rule hosts at the ingress controller's VIP. That setting also gives every Ingress an automatic<ingress>.<namespace>.<cluster>.demo.internalname, which is why it is now off. Without it, name an ingress controller's hosts with anexternal-dns.kubernetes.io/hostnameannotation on its Service. - Changed: the default local DNS zone is now
demo.internalinstead ofklimax.internal. Names become<service>.<namespace>.<cluster>.demo.internal.
If your config does not set network.dns.domain, the next
klimax up switches to the new zone: it writes
/etc/resolver/demo.internal and creates and trusts a new root CA.
Move existing clusters over with klimax dns attach <cluster> and
klimax ca attach <cluster>. To keep the old names, set
network.dns.domain: "klimax.internal" in your config.
Existing clusters keep publishing Ingresses until you run
klimax dns attach <cluster>, which re-applies ExternalDNS with
the new setting and removes the Ingress records.
v0.2.4 — 2026-09-26
- Fixed: macOS rejected the certificates v0.2.2 and v0.2.3 issued
for
demo.internalnames, even with the root trusted — in Safari, in Go programs, and incurlwithout--cacert. Apple's verifier reads certificate name constraints more strictly than the standard, and each intermediate carried two. They now carry one; with the root trusted, browsers,curl, Go and Python all accept the certificates with no extra flags. Runmarina ca attach <cluster>on existing clusters to re-issue theirs.
v0.2.3 — 2026-09-26
- Added: fleet-wide names. Each fleet has its own zone,
<fleet>.demo.internal, and any member can publish there withexternal-dns.kubernetes.io/hostname: gateway.lab.demo.internal. The first member to publish a name owns it; deleting it hands the name to the next claimant. See the Hostname playbook. - Added: fleet certificates — an intermediate constrained to the
fleet's zone and a
*.<fleet>.demo.internalwildcard in every member asdefault/marina-fleet-wildcard-tls(plus amarina-fleet-caClusterIssuer with cert-manager).marina ca secret --fleetcopies it. - Changed: a fleet and a cluster can no longer share a name —
both would own
<name>.demo.internal. - Fixed: deleting a cluster now removes the fleet-zone records it published, and the last member takes the fleet's zone and certificates with it.
Existing fleet members pick up the fleet zone with
marina dns attach <cluster> and the fleet certificate with
marina ca attach <cluster>.
v0.2.2 — 2026-09-26
- Added: HTTPS on local names, on by default. marina runs its own
certificate authority: a root trusted in the macOS System keychain (one
sudoprompt on the nextmarina up), constrained to.demo.internalso it cannot vouch for any other site; one intermediate per cluster, constrained to that cluster's zone; and a*.<cluster>.demo.internalwildcard in the Secretdefault/marina-wildcard-tls. No mkcert, homepki or cert-manager to install. See Local DNS names → HTTPS. - Added:
marina ca status,cert,attach,secret,trustanduntrust. With cert-manager already in a cluster,marina ca attachadds amarina-caClusterIssuer. See CLI reference → CA. - Added:
network.dns.nameTemplatesets the automatic name; the default is unchanged (<service>.<namespace>). - Docs: macOS keeps a "no such name" answer for about 75 seconds,
not the 5 the previous release notes said — look a new name up only once
marina dns listshows it.
Existing clusters get their certificates with
marina ca attach <cluster> after the upgrade.
v0.2.1 — 2026-09-26
- Fixed: local DNS published every Service type, not
just LoadBalancer Services. Headless Services appeared with pod IPs and
host-network pods with node IPs — neither reachable from the Mac. Now
only LoadBalancer Services and Ingress hosts get names. Clusters attached
under v0.2.0 pick up the fix with
marina dns attach <cluster>, which also removes the extra records. - Changed: a name looked up before it is published is now cached as "no such name" for 5 seconds instead of 30.
- Docs: local DNS has its own page, Local DNS names.
v0.2.0 — 2026-09-26
- Added: local DNS names for LoadBalancer Services, on
by default. Every LoadBalancer Service resolves as
<service>.<namespace>.<cluster>.demo.internalfrom the Mac, the VM and every pod — no domain to own, no DNS provider. Custom names use theexternal-dns.kubernetes.io/hostnameannotation.marina upruns etcd and CoreDNS on the kind network and writes/etc/resolver/demo.internalonce (onesudoprompt); each new cluster gets ExternalDNS. Turn it off withnetwork.dns.enabled: false. See Local DNS names. - Added:
marina dns listshows every published name, andmarina dns attach <cluster>adds existing clusters to the zone.marina statusandmarina doctorreport on it. See CLI reference → DNS. - Fixed: one of the host-to-cluster forwarding rules
named the kind bridge without its
br-prefix, so it never matched. Another rule carried the same traffic, so nothing was broken;marina upnow installs the correct rule and removes the dead one.
Clusters created before v0.2.0 keep working but have no names. Run
marina up, then marina dns attach <cluster>
for each one you want in the zone.
v0.1.63 – v0.1.64 — 2026-09-24
- Added:
marina startandmarina stop, aliases ofmarina upandmarina down. They match the verbslimactland colima use.stopstops the whole VM, so every cluster stops with it — there is no per-cluster stop. See CLI reference → VM lifecycle. - Security: v0.1.64 updates
google.golang.org/grpcfrom v1.82.1 to v1.83.1, which fixes a vulnerability thatgovulncheckreports as reachable from marina's code. No behaviour change.
v0.1.62 — 2026-09-11
- Added: every pull-through mirror now
serves the
dockerCLI, not just Docker Hub.docker pull quay.io/…, gcr.io and Artifact Registry are cached the same way cluster pulls are. See Registry mirrors and the docker CLI. - Fixed: the docs claimed Docker could not mirror
anything but Docker Hub. It can — per-registry mirrors go in
/etc/docker/certs.d/<host>/hosts.toml, which is a different directory from the one the kind nodes use. Testing the wrong one produced a wrong conclusion.
Applied by marina up, with no Docker restart — the
config is read on each pull. Nothing to change in your config file: the
mirrors you already have are the ones that get wired up.
v0.1.61 — 2026-09-11
- Added: Docker Hub pulls from the
dockerCLI now go through marina's pull-through cache. Previously only kind clusters used the mirrors, sodocker pullanddocker composefetched from the internet every time and counted against Docker Hub's rate limit. See Registry mirrors and the docker CLI. - Changed: the progress messages during a long VM start now name the phase they are waiting on, and say explicitly when the guest provisioning scripts are running. A first boot spends about four of its five minutes installing packages, Docker, kind and kubectl, which previously looked like a hang.
This entry originally said the other mirrors could never serve the
docker CLI, because the daemon "has no per-registry mirror
setting". That was wrong — it does, through
hosts.toml, just not through the setting we were looking
at. v0.1.62 ships the rest.
v0.1.60 — 2026-09-11
- Added: marina works behind a corporate proxy. Your
Mac's system proxy is picked up automatically;
network.proxyoverrides it. The proxy reaches everything that pulls — the Docker daemon, the registry mirrors, and the containerd inside every kind node — and marina computesno_proxyitself from the bridge CIDR, the cluster subnets and the mirror names, so cluster-internal traffic is never sent to a proxy that cannot route it. See Configuration → Behind a corporate proxy. - Added:
vm.caCerts.filestrusts extra certificate authorities — a TLS-intercepting proxy, or a private registry with a self-signed chain. Installed in the VM, in every registry mirror, and in every kind node, since each keeps its own trust store. See Trusting extra certificate authorities.
Both are applied by marina up without recreating the VM,
and removing either takes effect the same way. Clusters created before
you add a certificate need recreating, because a kind node's trust store
is set up when the node is built.
v0.1.59 — 2026-09-10
- Added:
vm.mounts— a list of host directories to share into the VM, so bind mounts from your Mac work. Each entry takes alocation(~expanded), an optionalwritable(defaultfalse) and an optionalmountPoint. Every shared directory appears in the VM at the same absolute path, which is what makesdocker run -v ~/projects/conf:/etc/appresolve. - Added:
marina statusnow lists the VM's host mounts (and flags a config change waiting to be applied). It reads the instance config, so it works on a stopped VM.
Docker runs inside the VM, so it resolves a bind-mount source there. Before this release a bind for an unshared host path did not fail — the daemon created the missing directory in the guest and the container saw an empty one. If a container ever mysteriously found nothing where your files should be, this was why.
Changing vm.mounts does not need
marina destroy. marina up compares the list
against the VM and offers to restart it — a restart still stops every
kind cluster on the VM, so it asks first, and changes nothing when run
non-interactively. See
Configuration.
v0.1.58 — 2026-09-10
- Changed:
vm.cpusandvm.memorynow default to a share of your Mac rather than to fixed numbers, so one config suits a 16 GiB Air and a 64 GiB Studio. CPUs get three quarters of the cores; memory gets half the RAM. A 10-core, 32 GiB M1 Pro gets 8 CPUs and 16 GiB. Anything you set explicitly still wins.
| Mac RAM | VM memory | Share |
|---|---|---|
| 8 GiB | 4 GiB | 50% |
| 16 GiB | 8 GiB | 50% |
| 24 GiB | 12 GiB | 50% |
| 32 GiB | 16 GiB | 50% |
| 64 GiB | 32 GiB | 50% |
macOS keeps the other half, whatever the machine. Disk sizes stay fixed, since they are sized by what images need rather than by the machine, and both disks are sparse.
v0.1.57 — 2026-09-09
- Changed: new resource defaults —
cpus: 8,memory: "20GiB",disk: "20GiB",imageDisk: "30GiB". The root disk is smaller than before becauseimageDiskis now on by default: container images live on that separate disk, so the root disk only carries the OS, Docker metadata and volumes. Both are sparse — the sizes are ceilings, not what they consume on your Mac. Existing configs are untouched; defaults apply to values you have not set. - Changed:
imageDiskdefaulting to30GiBmeansmarina destroyno longer discards the container image store. Recreating the VM stops re-pulling every image — and a locally built image, which no registry mirror can restore, is no longer lost. - Added:
marina upwarns when a config asks for more than the Mac has — more CPUs than cores, more memory than RAM, or a disk total beyond free space. It never blocks: the disks grow on demand and macOS swaps rather than refusing, so each warning names the setting to lower and leaves the decision to you. - Fixed:
marina up --show-vm-logsnow shows the boot logs on its own. It enabled Lima's reporting but marina silenced the output, so it only worked when paired with--debug— which nothing told you.
v0.1.56 — 2026-09-09
- Changed:
marina upnow reports progress while the VM starts. Between Starting Lima instance and VM is running it used to print nothing at all — on a first boot that gap is minutes of image download, boot and cloud-init, and it reads as a hang. A line every 15 seconds says otherwise. Restarting an already-provisioned VM takes about 14 seconds, so the common case still prints nothing extra. - Changed: the note listing config options your file does not set now links the configuration reference and the annotated example. It used to say "see config.example.yaml", a file that only exists in the repository — a Homebrew install has no copy of it.
v0.1.55 — 2026-09-09
- Added:
marina disk resize-image <size>grows the persistent image-cache disk in place, keeping the images on it.vm.imageDisksizes the disk mounted over/var/lib/containerd— which is where images actually live, since Docker in the VM uses the containerd snapshotter. That disk fills long before the VM root disk does. - Fixed: raising
vm.imageDiskin the config used to do nothing to an existing VM, silently. The size applies only when the disk is first created, so the only way to get a bigger one was to delete it — discarding the image cache the disk exists to preserve.marina upnow warns when the live disk and the configured size disagree, and quotes the command that fixes it.
Growing the image disk needs the VM stopped, because Lima locks the
backing file while an instance holds it:
marina down && marina disk resize-image 30GiB && marina up.
The guest partition and filesystem grow on the next start; shrinking is
not supported.
v0.1.54 — 2026-09-07
- Fixed:
marina fleet exportwrote the zero value of every optional field, so a one-cluster export opened with an emptydefaults:block and lines likestrategy: "",registries: nullanddependsOn: []. Valid YAML, but an exported manifest is something you then edit, and that noise reads as configuration someone chose rather than left unset. Unset fields are now omitted. - Fixed:
marina doctornow notices when the hostagent's binary was replaced underneath it. The previous check compared the running binary's path to the current one, which cannot see an in-place overwrite — both sides read the same string. That is exactly whatmake dev-installdoes, and it is what makes macOSamfidkill subsequentmarinacommands, so doctor reported everything healthy while the machine was in the broken state the check exists to catch. It now compares the binary's timestamp against the hostagent's start time.
Upgrading via Homebrew does not hit the
amfid problem — it writes a new file and re-points a symlink,
so the running hostagent keeps its own copy. You will still see the new
warning after an upgrade, and it is worth acting on: the hostagent is
running the older marina until you
rebuild the VM.
v0.1.53 — 2026-09-06
- Security: bumped
golang.org/x/cryptoto v0.56.0 for GO-2026-6354 and GO-2026-6355, two denial-of-service flaws inx/crypto/sshthat marina reached through its own guest SSH and hostagent paths. Unlike the stdlib CVEs patched earlier, a newer Go toolchain does not clear these — only a dependency bump does. - Added:
marina fleet export— the inverse offleet create -f. Reads live clusters and writes a Fleet manifest, so an ad-hoc lab can be captured into a reproducible file. Select clusters by name, by-lselector, or from an interactive picker. See Fleet management → Exporting a fleet. - Added:
-o text|json|yamlonmarina statusandmarina doctor. They were the two most automation-relevant commands and the only ones without it, so Marina UI and AI agents had to scrape prose. Text output is unchanged; each doctor check now carries a stableidso tooling can key offroute/iptables/ip-forwardinstead of matching wording. - Added:
marina doctor --fixapplies the repairs marina can perform itself — the macOS host route, the iptables no-NAT exemption, and guest IP forwarding. Creating or starting the VM, installing Rosetta, and clearing a stale hostagent stay advisory: the first ismarina up, and the last kills a live process. - Fixed:
marina doctor's hostagent check never actually worked on macOS. It compared the running binary via/proc/<pid>/exe, which does not exist on macOS, so the comparison was unreachable — on the only platform marina supports, and for a failure mode that is macOS-only. Its fallback usedos.FindProcess, which on Unix succeeds whether or not the process exists, so any leftover pidfile was reported as a running hostagent. Both fixed; a stale pidfile is now named as such. - Changed: building from source now
needs Go 1.26+ (was 1.25.7), because
x/cryptov0.56.0 requires it. Installing via Homebrew is unaffected — the released binaries are prebuilt. - Changed: CI, security scanning and releases now build
with the latest stable Go rather than the exact version pinned in
go.mod, so stdlib CVE patches are picked up automatically instead of needing a hand-edited pin each time. Released binaries were previously built against a pinned toolchain with known stdlib CVEs.
v0.1.52 — 2026-08-11
- Added:
vm.imageDiskputs the VM's container image store on its own Lima data disk (mounted over/var/lib/containerd), sokindest/node,registry:2and locally built images survivemarina destroy— a locally built image is the only kind no registry mirror can restore. Unset by default;"10GiB"is a comfortable size. See Configuration → Persistent image store. - Changed: the VM is now based on Ubuntu 26.04 LTS. 25.04 was an interim release that had already reached EOL, so freshly created VMs had stopped receiving security updates.
- Changed: bumped the bundled kind CLI to
v0.32.0 and the default
kind.nodeVersiontokindest/node:v1.36.1, the image that CLI is validated against. - Changed: cluster creation no longer sleeps 5 s
before applying the MetalLB
IPAddressPool— it retries until the validating webhook accepts it, with a 60 s deadline so a genuinely broken webhook still fails loudly. Measured on a live VM, the MetalLB phase went from 20.4 s to 14.8 s.
v0.1.51 — 2026-08-09
- Added:
marina shellis now also a command runner —marina shell <cmd> [args…]runs it in the VM, passesstdin/stdout/stderrthrough, and exits with the remote command's code, so it composes in pipelines andiftests. Trailing arguments used to be accepted and silently ignored. Flag parsing stops at the first positional (marina shell docker ps -aworks as typed);-tforces a pseudo-terminal. See CLI reference → Running commands in the VM. - Added:
marina copy <src>… <dst>copies files either direction overscp. Mark the VM side with avm:prefix —marina copy ./x vm:/tmp/x,marina copy vm:/tmp/x ./x— with-rfor directories. See CLI reference → Copying files. - Added:
marina sudoersprintsNOPASSWDrules scoped to the two/sbin/routecommandsmarina upneeds, so it stops prompting for a password;--checkreports whether they're in effect by reading the sudo policy. See CLI reference → Passwordless host route. - Added:
marina autostart install|uninstall|statusmanages a per-user launchd agent (dev.marina.autostart) that runsmarina upat login, logging to~/.marina/logs/autostart.log. It depends on the sudoers rules above — launchd can't answer a password prompt. See CLI reference → Starting at login. - Added:
marina disk resize <size>grows the VM disk without recreating the VM — it rewritesvm.diskand the Lima instance config, and the image and guest filesystem expand on the nextmarina down && marina up. Shrinking is refused. See Configuration. - Added:
marina prune(--dry-run,--downloads,-y) reclaims superseded Lima guest agents and registry caches whose mirror is no longer configured. Caches of configured mirrors are never touched — that's stillmarina registry clean-cache. See Registry mirrors. - Fixed:
marina statusandmarina doctorreported the macOS host route as present when it was absent — the probe was a plainroute -n get, which the default route answers for any address. It now requires the returned destination to be the CIDR's own base, andstatusprints the gateway it resolved:172.30.0.0/16 → present (via 192.168.64.3). See Networking & L3 routing. - Security: bumped gRPC to v1.82.1 for GO-2026-6061.
v0.1.50 — 2026-07-11
- Fixed:
marina doctoralways reported the no-NAT iptables rule as missing, even right after a successfulmarina up. The probe omitted the-d <vm-net>destination qualifier that the installed rule carries —iptables -Crequires an exact spec match — and ran unsudoed as the unprivilegedlimaSSH user, so the permission error was swallowed into a false "missing". It now reconstructs the rule exactly and runs undersudo, making doctor's no-NAT line trustworthy again. See Networking & L3 routing.
v0.1.48 – v0.1.49 — 2026-07-09
- Removed: the local push registry
(
kind-registry:5000) is gone — config schema, container,certs.dhost mapping, and the Fleetregistries.localRegistrytoggle all removed. To get a locally built image into a cluster, build against the VM's Docker (eval "$(marina docker-env)") and load it withkind load docker-image. See Registry mirrors. - Changed:
network.disablePortMirroringnow defaults totrue, so marina coexists with other Lima VMs out of the box and kubeconfigs use the VM'slima0IP. Set it tofalseto force loopback (127.0.0.1) addressing — e.g. for a single VM or when host security software blocks vzNAT IPs. See Networking. - Added: two Google Artifact Registry
pull-through mirrors to the defaults —
registry-us-docker-pkgdev(5040) andregistry-us-central1-docker-pkgdev(5050), alongside the existing docker.io, quay.io, and gcr.io mirrors. - Security: binaries are built with Go
1.25.12 to patch the
crypto/tlsECH CVE.
v0.1.43 – v0.1.47 — 2026-07-06
- Changed: bumped MetalLB to v0.16.1 (the
new default
kind.metalLBVersion) and tightened LoadBalancer / metrics-server readiness waits to 180 s. - Changed: bumped the bundled Lima runtime to v2.1.4 and version-stamped the cached guest agent so it refreshes when Lima changes.
- Fixed: marina now rejects hostname-like
registry mirror names (any
namewith a.or:). Such a name shadows its own upstream on thekindDocker network and silently breaks the pull-through cache — use a safe form likeregistry-quayio. See Registry mirrors. - Security: releases now ship SBOMs, CI
runs
govulncheckwith Dependabot enabled, and binaries are built with Go 1.25.11 to pick up the latest stdlib CVE patches.
v0.1.42 — 2026-07-04
- Added: a top-level
marina kubeconfigcommand (aliaskc) grouping every kubeconfig op —path,env,merge,use(merge + switch context), andremove. See CLI reference → Kubeconfig. - Deprecated:
marina cluster useandcluster merge— still work, but preferkubeconfig envandkubeconfig merge. - Fixed: raised the MetalLB and metrics-server readiness waits to 300 s so slower first-pull machines don't time out.
v0.1.41 — 2026-07-04
- Changed: the embedded Lima logs are hidden by
default — marina quiets them to
errorso only its own output (and genuine Lima errors) show. Surface them with--debug(Lima atinfo) or--lima-log-level trace|debug|info|warn|error|off. See CLI reference → Logging.
v0.1.40 — 2026-07-04
- Added: fleet adoption —
marina fleet adopt <fleet> <cluster>…pulls running clusters into a fleet by setting theirmarina.run/fleetnode label.fleet create/cluster apply -fnow warn when the manifest lists clusters that exist but aren't fleet members, and--adoptrelabels them in place (they show asadoptin the plan). See Fleet management → Adopting existing clusters. - Added:
marina upreviews the config before creating the VM — it lists options your file doesn't set that this marina version supports (defaults apply), and offers to update a pinnedkind.nodeVersionthat has drifted from the version matched to the bundled kind CLI.
v0.1.38 – v0.1.39 — 2026-07-03
- Added:
marina fleet describe <name>shows a fleet's member clusters with their num, ports, nodes, and labels (aliasesdesc,show). - Changed:
marina cluster createno longer takes--num— the cluster num is always auto-assigned to the lowest free slot. Pin one where it matters via a Fleet manifest'snum:field.
v0.1.36 – v0.1.37 — 2026-07-03
- Added: a top-level
marina fleetcommand that operates on live clusters grouped by themarina.run/fleetnode label —fleet list,fleet create -f,fleet delete <name>|-f, andfleet label <name>. See Fleet management. - Added: kubectl-style label selectors on
the cluster commands —
marina cluster list -l <selector>to filter andmarina cluster delete -l <selector>to delete matching clusters. - Changed: the bundled Agent Skill now covers Fleet manifests and cluster labels.
v0.1.35 — 2026-07-03
- Added:
marina cluster label <name>relabels an existing cluster's nodes without recreating it — repeatable-l key=valuesets or overwrites a label (--overwriteby default), and-l key-removes one. See Managing clusters → Node labels.
v0.1.32 – v0.1.34 — 2026-07-03 · Fleets
- Added: declarative fleets of kind
clusters.
marina cluster apply -f <manifest>reconciles a Fleet manifest (apiVersion: marina.run/v1alpha1) into existence — creating missing clusters independsOnorder, up tomaxParallelat a time, with--dry-runand per-cluster registries, addons, and labels. It's additive: existing clusters are skipped, never mutated. See Fleet management. - Added:
marina cluster delete -f <manifest>tears a fleet down in reverse-dependency order (-yto skip the prompt). - Added: node labels on every cluster —
managed-by=marinaalways,marina.run/fleet=<name>for fleets,topology.kubernetes.io/region+zone, and your own via the manifestlabelsmap ormarina cluster create -l key=value. - Changed: the resource formerly called
ClusterSetis now Fleet.
v0.1.30 — 2026-07-03
- Changed: bumped the default Kubernetes node image to
kindest/node:v1.35.0and MetalLB tov0.15.2. - Fixed: registry mirrors now work on containerd
2.x — cluster containerd is configured with
certs.dhosts.tomlfiles instead of the oldcontainerdConfigPatches. See Registry mirrors. - Added:
marina cluster createnow warns whenkind.nodeVersionis overridden away from the version the bundled kind CLI is validated against — overriding it is unsupported. - Added:
marina doctorsurfaces Rosetta status, so you can see at a glance whether Rosetta 2 emulation is available in the VM. - Fixed:
marina upno longer re-adds the macOS host route (or prompts for sudo) when the route is already correct — repeat runs are quieter and fully idempotent.
v0.1.29 — 2026-07-02
- Added:
marina skill installships a bundled Agent Skill that teaches AI coding tools like Claude Code how to drive marina. Installs into~/.claude/skills/marina/by default;--printemits it for other tools andmarina skill pathreports where it lives.
v0.1.28 — 2026-06-17
- Fixed: the Docker daemon could fail to start inside
the VM on hosts whose macOS username is also a valid Linux username.
The guest user is now pinned to
lima, so theSocketUser=limaoverride is always valid.
v0.1.24 – v0.1.27 — 2026-04 to 2026-06
- Changed: bumped the bundled Lima runtime to the
2.1.xseries. - Fixed: an sshd provisioning idempotency bug — the
ClientAliveIntervalcheck is now anchored so Ubuntu's commented-out default is skipped, avoiding SSH socket-permission errors on repeatedmarina up. - Documentation: added the vs. other tools comparison (including OrbStack) and reworked the diagrams and logo.
v0.1.23 — 2026-04-02
- Added:
kind.customDnsResolversis now actually wired into each cluster's CoreDNS. Forward specific domains (e.g. an internalcorp.internalzone) to chosen upstream resolvers. See Configuration.
v0.1.22 — 2026-04-02
- Added:
network.disablePortMirroring— run marina alongside other Lima-based tools (Rancher Desktop, Colima) without fighting over127.0.0.1port mirroring. With it set, kubeconfigs address the VM'slima0IP directly. See Networking.
v0.1.20 — 2026-03-30
- Added: short-name aliases for the main commands.
- Fixed: prevented SSH socket exhaustion on the guest.
v0.1.0 – v0.1.19 — 2026-03-27 · initial release
- Multi-cluster kind management on a single Lima (Apple Virtualization.framework) VM, with pure L3 routing — reach pods and LoadBalancer services by their real IP, no port-forwarding.
- Pull-through registry mirrors for
docker.io,quay.io, andgcr.io, plus a local push registry — with a host-backed cache that survives teardowns. - Automatic kubeconfig merge/removal on cluster create/delete, plus a
cluster mergesubcommand. - Docker context and
docker-envsupport. - Built-in nginx end-to-end routing smoke test, and an
ssh-into-the-VM command. - Shell completion.
- Optional Rosetta support; all state stored under
~/.marina, with a default config generated on first run.
See also
- GitHub releases — every tag with full commit history.
- Upgrading from an old install — how to wipe and reinstall from scratch.