September 17, 2026 · v1.5.13
v1.5.13 is mostly about things that were quietly costing you: the first request to any service pulled in the whole CloudFormation package, and through its provisioners AppSync and graphql, so a stack you never declared was paying for itself on every cold start. ImportTable created the table, said COMPLETED and never opened the source objects. Under AUTH=true a Secrets Manager grant written by the CDK matched nothing, because the resource was built from the name in the request instead of the stored ARN. Alongside those, the AWS::LanguageExtensions transform arrives.
Fn::ForEach left the stack in CREATE_IN_PROGRESS for good and an Fn::ToJsonString reached SSM as a Python dict. The transform now runs between AWS::Include and SAM: Fn::ForEach over literal, CommaDelimitedList and intrinsic collections, nested and inside Properties, plus Fn::Length and Fn::ToJsonString. Contributed by @iot-rocket.cloudformation.wait_conditions above the path check, so every first request pulled in the whole package and, through its provisioners, AppSync and graphql; the first /_ministack/reset ran appsync.reset() with it. The import now sits behind the path match, and a guard keeps it there. Reported by @ThailerL.COMPLETED and imported nothing: the source objects were never opened. CSV and DYNAMODB_JSON, GZIP or uncompressed, are now read from the prefix and written into the table, with per-item errors in the /aws-dynamodb/imports log group. A missing bucket or prefix fails the import and leaves no table behind. Contributed by @gakuto-cw21.secret:<name>, while AWS evaluates the stored ARN with the six random characters minted at CreateSecret. The grant shape the CDK writes for a secret looked up by name matched nothing under AUTH=true. Contributed by @iot-rocket.PutGroupPolicy stored a malformed document; all three inline handlers now answer NoSuchEntity before MalformedPolicyDocument. An AWS::IAM::Policy skipped a Role, User or Group that was not there and reported CREATE_COMPLETE. Contributed by @iot-rocket.lambda:FunctionUrlAuthType, so the policy grantInvokeUrl writes matches. The WebSocket @connections API asks for execute-api:ManageConnections. iot-jobs-data operations are authorized under iotjobsdata:, except StartCommandExecution. Contributed by @iot-rocket.GetLayerVersionByArn now evaluate it for account, root, public and organization grants, and an attached function keeps the content after the grant is revoked. Contributed by @iot-rocket.docker pull ministackorg/ministack:1.5.13 docker run -d -p 4566:4566 ministackorg/ministack:1.5.13
Or pin in compose.yaml:
services:
ministack:
image: ministackorg/ministack:1.5.13
ports:
- "4566:4566"
Issues and PRs welcome on GitHub. Discussion on r/ministack.