September 13, 2026 · v1.5.11
v1.5.11 is a CloudFormation release. Eighteen more resource types got a real update handler, so a stack update no longer falls through to the create handler and mints a new physical id for a resource that only changed a property — a distribution, an HTTP API, a queue policy or an alias keeps its identity and its children. UpdateReplacePolicy: Retain now holds for every handler-side replacement, not just the ones on the shared helper. Alongside that, a presigned S3 URL is verified against the credentials that signed it, an SDK call from a Lambda runs under the function's execution role, and five reads that users reported come back the way AWS returns them.
Description and Parameters only, so a caller checking a template before a deploy could not see that it needs CAPABILITY_IAM or that it declares a transform. Contributed by @iot-rocket.DescribeStacks and DescribeChangeSet left the Capabilities member out, so a client could not see what a deploy had acknowledged. Contributed by @iot-rocket.Id and DomainName on a distribution with the old one deleted, a new ApiId with every route and integration re-created under it, a queue or topic left with no policy at all after the cleanup delete stripped what the create had just written. Each type now updates through the service's own call and keeps its id. Contributed by @iot-rocket.DELETE_SKIPPED. Every inline delete now goes through one helper that reads the policy, and a resource inside a nested stack reads its own policy instead of whatever the parent left behind. Contributed by @iot-rocket.x-amz-checksum-crc32 into every presigned PutObject, computed over the empty body, and MiniStack verified it against the real body: a stock getSignedUrl upload failed with 400 BadDigest. Contributed by @bognari.Records array, so every S3-triggered function raised on it and the async path dropped it in the function's DLQ. Contributed by @ppettitau.AUTH=true every runtime received account-root credentials, so a call from a handler bypassed the role the function declares and a policy that should have denied it did nothing. Contributed by @adamkeener.CallbackId was the operation id, so two concurrent executions of one function registered the same id and an answer sent for one completed the other. Contributed by @iot-rocket. Reported by @Nhollas.PENDING → ACTIVATING → RUNNING. Contributed by @po-luka-miletic.logGroupClass and kmsKeyId, a SecureString parameter reports its KeyId, a security group's IPv6 and prefix-list rules survive DescribeSecurityGroups, and a launch template keeps its metadata options and shutdown behaviour — four reads that made Terraform plan the same change on every run. Reported by @edersonbrilhante. Fn::GetAtt on a user pool client's ClientSecret resolves instead of rolling the stack back. Reported by @JoshuaSmeda.docker pull ministackorg/ministack:1.5.11 docker run -d -p 4566:4566 ministackorg/ministack:1.5.11
Or pin in compose.yaml:
services:
ministack:
image: ministackorg/ministack:1.5.11
ports:
- "4566:4566"
Issues and PRs welcome on GitHub. Discussion on r/ministack.