Release 2.5.0This release adds two more AWS services, ships cloudemu's redesigned logo, makes the built-in Kubernetes cluster work smoothly inside…
This release adds two more AWS services, ships cloudemu's redesigned logo, makes the built-in Kubernetes cluster work smoothly inside Docker, and rewrites the docs so anyone — in any language, not just Go — can see what cloudemu really is: a local cloud you run and point your apps at.
New look
cloudemu has a brand-new logo — a cloud paired with a terminal prompt and the tagline "the cloud, in memory." It's transparent and theme-adaptive, so it looks crisp on both light and dark backgrounds across GitHub, the docs, and pkg.go.dev.
Features
Two more AWS services
Point the real AWS SDK (or the aws CLI) at cloudemu and these respond just like the real thing — only in memory, with no account and no bill.
- GuardDuty (threat detection) — manage detectors, threat-intelligence sets, filters, and findings entirely in memory. Full coverage of all 87 operations, so
aws-sdk-go-v2/service/guarddutyand theaws guarddutyCLI work by only changing the endpoint. - MSK — Managed Streaming for Apache Kafka — create and manage Kafka clusters, configurations, and connectors. Full coverage of all 59 operations for
aws-sdk-go-v2/service/kafkaand theaws kafkaCLI.
Enhancements
Clearer documentation
- The README now speaks to everyone. It leads with what cloudemu actually is — a runnable local cloud (via Docker or a single binary) that you point any app, in any language, at — rather than a Go-testing-only tool. New copy-paste Docker quickstart, a "three ways to run it" overview, and a proper Contributing & community section for newcomers.
Cleaner internals
- OCI tidy-up. Oracle Cloud (OCI)-only capabilities moved out of the shared service packages, keeping each provider's code self-contained and easier to extend.
Fixes
Kubernetes
- Works inside Docker now. When you run the cloudemu container, its built-in Kubernetes cluster is reachable from your machine with
kubectland client libraries — previously it advertised an address that couldn't be dialed from outside the container. - `kubectl apply --server-side` for core resources. Server-side apply, "create the object if it doesn't exist yet," and finalizer-aware deletes now work for ConfigMaps, Secrets, Services, and Deployments — so real tools and operators behave the way they would on a genuine cluster.
Technical Details
New AWS SDK-compat services (#388, #389)
- #388 GuardDuty — REST-JSON (
awsRestjson1), path + HTTP-method routing, no version prefix; four-layer architecture (services/guardduty/driverproviders/aws/guarddutyserver/aws/guarddutyregistration). 87 operations: detectors + child resources (IP sets, threat-intel/entity/trusted-entity sets, filters), findings, and members, with atomic creates, typed exceptions, and deep-copied reads. Real-SDK roundtrip tests. - #389 MSK (Kafka) — REST-JSON under three version prefixes (
/v1/,/api/v2/,/replication/v1/); same four-layer architecture. 59 operations: clusters (v1 + v2, atomic name claim withConflictException), configurations, and connectors, with deterministicClock/idgenand real-SDK roundtrip tests.
Kubernetes data plane (#390, #400)
- #390 typed server-side apply for core kinds —
application/apply-patch+yamlnow runs through real field-ownership (managedFields) + conflict detection instead of a plain RFC-7396 merge; apply-to-missing now creates (no more 404 on a fresh cluster); typed deletes honormetadata.finalizers(Terminating instead of hard delete) for ConfigMap, Secret, Service, and Deployment. Verified against realkubectl. - #400 Docker-reachable Kubernetes endpoint — when
--hostbinds all interfaces (0.0.0.0, as the Docker image does), the data plane now advertises a routable host (default127.0.0.1) with matching cert SANs, so an EKS/AKS/GKE kubeconfig from the container works with hostkubectl/client-go. New--advertise-hostflag for reaching it from another machine; OCI port (4571) declared for opt-in use.
Brand, docs & internals (#396, #397, #401, #393)
- #396 / #397 redesigned, transparent, theme-adaptive logo (light/dark PNG exports with type baked in, served via a `` block).
- #401 README/metadata reframe — any-language, three-modes-first framing; Docker quickstart; fixed broken snippets; Contributing/community footer; aligned
llms.txt/AGENTS.md/doc.go/docs/README.mdopeners. - #393 moved OCI-only capabilities out of shared driver packages.