Releases: overcast-sh/overcast
Release list
v0.0.1-alpha.38
Overcast v0.0.1-alpha.38
Docker Images
Full image with the web management console:
- Pull:
ghcr.io/neaox/overcast:0.0.1-alpha.38 - Moving tag:
ghcr.io/neaox/overcast:alpha - Registry: overcast package
Headless slim image for CI pipelines:
- Pull:
ghcr.io/neaox/overcast-slim:0.0.1-alpha.38 - Moving tag:
ghcr.io/neaox/overcast-slim:alpha - Registry: overcast-slim package
docker run --rm -p 4566:4566 -p 4567:4567 ghcr.io/neaox/overcast:0.0.1-alpha.38
docker run --rm -p 4566:4566 ghcr.io/neaox/overcast-slim:0.0.1-alpha.38Native Binaries
Download a binary for your platform from the assets below and verify it with SHA256SUMS.
| Asset | SHA256 |
|---|---|
overcast-darwin-amd64 |
6ae434fdbebf0952bfe75a663162aceb345a800ea811e0793821b8a522a4e3da |
overcast-darwin-arm64 |
b43c953006003ec15211109f4186719d64699fccaf41ad8aa81a61b5d72562e5 |
overcast-linux-amd64 |
f58491631a048b7003f9f11c6529eadd767614cabefc470e3b7f6e548e7dda0a |
overcast-linux-arm64 |
804260f363eb0425dd33f9bf6ebec922884d7ea10e72cdc36977c5359aa0bfb5 |
overcast-windows-amd64.exe |
61a5e3bf1c860d3f6b5652678f3aa5bcf7b53690e3681f108fb7f6cbec045c99 |
overcastd-darwin-amd64 |
0d9e8406615257026fe6bc547d717e9ca33f08617025d6f0de2e1bd69ecab399 |
overcastd-darwin-arm64 |
eea0523cbdc096632698135b07bdcdfb67672f6282629924151e4d81c483a98a |
overcastd-linux-amd64 |
50c7810ca754838629d7a3c20b0718b99b3c686e7901ca248c90b89caf1d0b5b |
overcastd-linux-arm64 |
41dba2450b09c8eacb05bbf2e6c0b5248e380815038277073b0b7b64938546be |
overcastd-windows-amd64.exe |
984627dd15e66c276fd446d722d79fb870460d7f780877eb6fe7ac711d8992b0 |
Release Notes
Added
-
[apigateway/web] Monitor tab on the REST and HTTP API detail pages, charting requests, 4XX/5XX errors, and latency per API or per stage
-
[cloudformation/s3]
AWS::S3::BucketgainsBucketNamespaceandBucketNamePrefix, both Replacement on update;BucketNamePrefixappends the account/region suffix the way the console does -
[iam] the
s3:x-amz-bucket-namespacecondition key is populated from the request header, so AWS's publishedDeny+StringNotEqualsaccount-regional enforcement pattern works -
[lambda] the Telemetry API subscription endpoint (
PUT /2022-07-01/telemetry) — the surface modern observability extensions call — with schemaVersion validation, the documented cross-API exclusivity with the Logs API, and JSON-format function log records embedded as objects from schemaVersion 2022-12-13. Deliveries are batched per the subscription's buffering configuration — maxItems, maxBytes and timeoutMs with AWS's defaults and limits — instead of one POST per record, and a subscriber whose batch was lost is told: the next batch opens with aplatform.logsDroppedevent carrying the dropped counts, in AWS's documented shape -
[lambda] platform records now carry AWS's documented depth.
platform.start,platform.runtimeDoneandplatform.reportgain thetracingmember with the X-Amzn-Trace-Id actually handed to the runtime;platform.runtimeDonemetrics — including theresponseLatencyspan, andproducedBytesfrom the length the runtime declared — are measured by the in-container init, from the runtime being handed the event to its answer arriving back, with the host's own measurement as the fallback when the runtime never answered (responseDurationandruntimeOverheadstay documented-out — the first ends only after the answer has streamed through, the second exists only at the runtime's next poll); andplatform.runtimeDoneandplatform.reportcarryerrorType: Runtime.ExitErrorwhen the runtime exited, while timeout and handler-error records stay nameless, as AWS's own examples do -
[lambda] extensions' own lifecycle is on the platform stream:
platform.extensionat registration (replayed to later subscribers) andplatform.telemetrySubscription/platform.logsSubscriptionat subscribe, named for the API the subscription came through -
[lambda/web] execution environments report how they were initialized (on-demand, proactive after a settled deploy, or provisioned) and why they were removed (idle TTL, configuration change, container died, ...) — an origin badge and removal reason on the instances panel and system map, initOrigin/evictedReason on the instance SSE events, and an init_origin field on the cold-start server log line
-
[router] 292 operations newly modeled by AWS are recognised, spanning 4 services new to the corpus (
account-access,agent-registry,agent-registry-control,pricing-plan-manager). A signed request to one reaches a protocol-correct501markedx-emulator-unsupported, in that service's own error envelope, instead of falling through to the S3 fallback and coming back as a bucket or object answer -
[s3]
CreateBucketsupports account regional namespaces:x-amz-bucket-namespace: account-regionalwith a<prefix>-<accountId>-<region>-anname creates the bucket in the account's per-region namespace instead of the global one, and re-creating it returnsBucketAlreadyOwnedByYouin every region, including us-east-1 -
[web] Monitor charts gained labeled X/Y axes with aligned gridlines, an AWS-console-style auto-refresh interval picker (Off/10s/30s/1m/5m), and a bucket-width chip; any card expands into a full-width dialog with drag-to-zoom into a time window, a y-axis scale, and per-series whole-range summaries in the legend; the time window holds still while auto-refresh is off or a chart is being inspected
-
[web/s3] tick boxes on the bucket's object listing, with a header box for everything currently listed, and a Download .zip button that fetches the whole selection as one archive — entries named relative to the folder they were ticked in, so a selection made in
logs/2026/unpacks asq1.csvrather than rebuilding the key path around it. The archive is built and sent object by object rather than assembled first, and the console asks for it with a form submission so the browser streams it to disk: a multi-gigabyte selection costs neither the server nor the tab multi-gigabyte memory. An object that disappears between the listing and the download is named in a_download-errors.txtinside the archive, since a download that has already begun has no status code left to spend -
[web/s3] S3 folders and objects are addressable — the object browser keeps its place in the URL, so an object is linkable and reload, Back and Forward all work — and the object inspector gains a Versions tab: one object's own history, with the details and preview of whichever revision you pick
-
[web/s3] the create-bucket dialog gains an S3 Bucket Namespace choice — global (default) or account regional, which turns the name field into a prefix and shows a live
<prefix>-<accountId>-<region>-anpreview before submitting — and the bucket list badges a bucket "Account regional" when its name matches the reserved suffix, inferred from the name, since neither ListBuckets nor the AWS console reports a namespace for an existing bucket
Changed
-
[apigateway] request metrics are recorded under every AWS-documented dimension combination —
ApiNameandApiName+Stage(REST),ApiIdandApiId+Stage(HTTP) alongside the detailed per-route set — so CloudWatch queries at the API or stage level now return data -
BREAKING [apigateway] HTTP (v2) API error metrics are recorded under AWS's real metric names,
4xxand5xx
migration: CloudWatch queries or alarms watching4XXError/5XXErroron an HTTP API must switch to4xx/5xx; REST API metric names are unchanged -
[metrics] the 5-minute rollup tier is retained for 30 days (previously 7), and the 30-day Monitor view charts 15-minute buckets instead of 1-hour ones
-
[router] the pinned AWS API models moved to 2026-08-21: 37 operations changed protocol traits, 5 changed an HTTP or target binding and 37 path bindings changed which services share them. A protocol-trait change moves that operation's error envelope; a binding change moves which request shape reaches the operation at all; a binding shared by several services is answered without the credential-scope check an unshared one gets, because the models no longer name a single owner for it
-
BREAKING [s3]
CreateBucketnow rejects a global-namespace bucket name ending in the reserved-ansuffix
migration: rename a bucket ending in-an, or create it withx-amz-bucket-namespace: account-regionalinstead -
[web] log rendering converged on the shared virtualized viewer: its table mode gained level badges, click-to-expand rows, and hover-copy, and a new reusable LogPanel owns fetch + filter + auto-refresh for any log group or stream (declarative filter model with relative or fixed time windows); the Lambda Monitor tab now renders its logs through it, with a filter box and time-window picker
Fixed
-
[apigateway] REST v1 create-deployment returned createdDate as epoch milliseconds; the AWS CLI and SDKs parse the field as epoch seconds, so the call errored client-side even though the deployment was created. The response now uses the same seconds conversion as get-deployments and the stage responses
-
BREAKING [apigateway] Usage plan responses (
CreateUsagePlan,GetUsagePlan,GetUsagePlans) no longer return akeyIdsmember — the API GatewayUsagePlanshape has no such member; the underlying key associations are unaffected and remain fully readable
migration: stop readingkeyIdsfrom usage plan responses; the AWS SDKs never surfaced the member there, so SDK-based clients are unaffected — useGetUsagePlanKeys(the modeled channel) to read a plan's attached API key IDs -
BREAKING [apigateway]
RestApiresponses (CreateRestApi,GetRestApi,GetRestApis,UpdateRestApi) no longer return anarnmember, a...
v0.0.1-alpha.37
Overcast v0.0.1-alpha.37
Docker Images
Full image with the web management console:
- Pull:
ghcr.io/neaox/overcast:0.0.1-alpha.37 - Moving tag:
ghcr.io/neaox/overcast:alpha - Registry: overcast package
Headless slim image for CI pipelines:
- Pull:
ghcr.io/neaox/overcast-slim:0.0.1-alpha.37 - Moving tag:
ghcr.io/neaox/overcast-slim:alpha - Registry: overcast-slim package
docker run --rm -p 4566:4566 -p 4567:4567 ghcr.io/neaox/overcast:0.0.1-alpha.37
docker run --rm -p 4566:4566 ghcr.io/neaox/overcast-slim:0.0.1-alpha.37Native Binaries
Download a binary for your platform from the assets below and verify it with SHA256SUMS.
| Asset | SHA256 |
|---|---|
overcast-darwin-amd64 |
6a9bb5e5293b2e0a1c9576a2eea9dbff9d1063e8c42c8ac20066c3d18f6185eb |
overcast-darwin-arm64 |
e1577756fb25fe0ef6a43d4da0ba11fef4a132a91c0823ce6f7400b069927a5c |
overcast-linux-amd64 |
91108ec5f743e46ad11d330cfeb49331ee40b3eb51ceef22f23ada342bfdb584 |
overcast-linux-arm64 |
ab4e2e8cac426bbdeb8c4c879de0aa9eaf7e82a9694d39d0a84a2ccec2367447 |
overcast-windows-amd64.exe |
ba2998f0ebaaf21fdb8a41fdd6a25541d3f77bf2fa9979d8d9f2e2f4a1892ea3 |
overcastd-darwin-amd64 |
4822ffaf5deacf352e1e72236f4384d680802dffe507eb1b1d5868bbb732a24d |
overcastd-darwin-arm64 |
ae8a07a486ec0a16644ec57269d4f2c47344eba42039cadc88920bf5f41ef103 |
overcastd-linux-amd64 |
493429a1968d5a3492d66b4a26eecd7f5acf929a530864381467f5a29fed75ac |
overcastd-linux-arm64 |
62989659ded2dac954244aa4f6db578381f103b14f43f41b09b2af965e146a77 |
overcastd-windows-amd64.exe |
95e546c5a02f26f47779377b53eade1e2bf00263822e1be12c6ec2bc32ad0b43 |
Release Notes
Added
-
[athena]
CreateWorkGrouppersistsConfigurationandGetWorkGroupreturns it; it was previously discarded -
[backup/cloudwatch-logs] tag operations for the resources that had none. Backup gains
TagResource/ListTags/UntagResource(POST /tags/{ResourceArn},GET /tags/{ResourceArn},POST /untag/{ResourceArn}), with tags stored inline on the vault or plan record so they die with it, and the CloudFormation provisioner forwardsBackupVaultTags/BackupPlanTagsand reconciles a tag-only stack update in place. CloudWatch Logs gains the modernTagResource/UntagResource/ListTagsForResourcetrio for log groups, resolving a resource ARN to the log group name and sharing the existingTagLogGroup/UntagLogGroup/ListTagsLogGroupspelling's validation and storage rather than duplicating it -
[ci] a
Lockfile freshnesscheck fails a pull request whoseweb/pnpm-lock.yamlwas generated against amainthat has since changed its own copy, and a sweep on every lockfile push tomainre-judges the open pull requests so a stale one is blocked before it merges rather than after — the case that kept every PR red for 28 minutes on 2026-08-22. It is not a merge queue: two lockfile PRs auto-merging in the same instant can still race -
[ci] a pruned Smithy shape snapshot under
models/aws/shapes/, regenerated and digest-verified alongside the AWS operation manifest -
[cloudformation]
ContinueUpdateRollbackis now supported, so a stack inUPDATE_ROLLBACK_FAILEDis recoverable rather than a stack you have to delete and redeploy. That state is reached when an update fails and the automatic rollback fails too — usually because both were blocked by the same thing outside the stack, a host port already bound or a resource something else is still holding — and it has no last known stable state, so every laterUpdateStack,ExecuteChangeSetand change set has nowhere to start from; previously the operation returned 501, and the only way forward wasdelete-stackand a deploy from scratch. Clearing the blocker and calling it now resumes the rollback: the deletes that failed are retried, what the failed attempt half-created is retired, and the stack reachesUPDATE_ROLLBACK_COMPLETEand is updatable again. A retry that meets the same blocker lands back inUPDATE_ROLLBACK_FAILEDand can be tried again. Nested stacks are continued before their parent, so a wedged child is recovered rather than reported rolled back from above.ResourcesToSkipis honoured for a resource that cannot be cleaned up at all, AWS'sNestedStackName.ResourceLogicalIDform included: the resource is left physically untouched, reportedUPDATE_COMPLETE, and the rest of the stack rolls back around it. Any other stack status gets AWS'sStack:<arn> is in <status> state and can not be updated., and everyResourcesToSkipmember is validated before the operation is accepted -
[cloudformation]
AWS::CloudTrail::Trail,AWS::Transfer::Server,AWS::Transfer::User,AWS::IAM::ManagedPolicyandAWS::IAM::InstanceProfilenow merge a stack's own tags onto the resources they create, and reconcile a stack-tag-only change on update, matching every other propagating resource type -
[cloudformation/web] a deployed stack now says which resources are stubs or backed by an inert/stub-tier service, on the same
ResourceStatusReasonCloudFormation already exposes and in the console's stack view, instead of only a server log line nobody sees -
[cloudwatch] CloudWatch answers Smithy RPC v2 CBOR. The pinned model declares
rpcv2Cborfor CloudWatch — the only dispatched service it declares it for — and a newer AWS SDK major negotiates it for a service that declares it, but Overcast claimed the protocol nowhere: its Smithy RPC registration carried no protocol service, so all fifteen dispatched operations answered501 Not ImplementedoverPOST /service/GraniteServiceVersion20100801/operation/<Op>while the identical call over the JSON or Query protocol worked. All fifteen now answer over CBOR, from the same implementation the other two protocols use — the request and response shapes and every validation rule are shared, so a call returns the same result whichever protocol an SDK picks, andPutMetricAlarmstill marks the alarms Overcast will not evaluate. The router's protocol-symmetry gate consequently exercises CloudWatch over CBOR for real, which it could not before: an operation added to the Query and JSON tables without a CBOR binding now fails the build instead of quietly becoming a fourth protocol gap -
[cognito]
LambdaConfigtriggers (PreSignUp,PostConfirmation,PreTokenGeneration,PostAuthentication,CustomMessage) are now invoked duringSignUp,ConfirmSignUp,AdminCreateUser,AdminConfirmSignUp,ResendConfirmationCode,ForgotPassword,ConfirmForgotPassword,InitiateAuth,AdminInitiateAuthandRespondToAuthChallengeon the classicX-Amz-TargetAPI, through the same synchronous Lambda invoker Secrets Manager rotation, API Gateway and AppSync already use. A trigger that errors or is unreachable fails the call withUserLambdaValidationExceptioninstead of being silently skipped, exceptPostConfirmation, which AWS documents as fire-and-forget since the account is already confirmed by the time it runs.CUSTOM_AUTH'sDefineAuthChallenge/CreateAuthChallenge/VerifyAuthChallengeResponseremain tracked separately (#88, #94, #101);PreAuthentication,UserMigrationand the Smithy RPC v2 duplicate dispatch path's non-token triggers are not yet wired -
[compat] four new registry groups.
rds-clusterscovers the Aurora DB cluster lifecycle — create, describe, modify, stop, start, delete — andrds-cluster-memberscovers a cluster with an instance in it:DBClusterMembers, writer election, the settings a member inherits from its cluster, and the membership pruningDeleteDBInstancedoes. Both run in the Go, Python, Node and Java SDK suites and the CLI suite, over ground nothing outside the emulator's own Go tests had ever looked at, and they are what found the cluster response-envelope and membership fixes below.eventbridge-patterns(TestEventPattern,TestEventPatternNoMatch) andlambda-invoke-error(a handler that throws must come back as HTTP 200 withFunctionErrorset) are implemented in all seven SDK/CLI suites;eventbridge-patternsis the dotnet-sdk and rust-sdk suites' first EventBridge coverage -
[config] the startup log names the resolved bind address(es), says that
OVERCAST_LISTENis what changes them, and says why the default was chosen — containerised or native -
[config] Overcast warns once at startup when
OVERCAST_HOSTNAME's subdomains do not resolve on this host — a resolver limitation (Windows does not resolve*.localhostthe way Linux does) that otherwise surfaces far from its cause: virtual-hosted-style S3 addressing breaks silently, andcdk deployasset publishing fails with a baregetaddrinfo ENOTFOUNDon a bucket-shaped hostname. The probe is two DNS lookups run off the startup critical path — the bare hostname, then a synthetic subdomain of it — and only warns, never fails, since path-style S3 addressing is unaffected; the message also flags the case where a custom hostname is resolved only through a hosts file, where the warning is an expected false positive rather than a bug -
[config] LocalStack's environment variables are accepted as compatibility aliases for their Overcast equivalents.
LOCALSTACK_HOSTmaps toOVERCAST_HOSTNAME— LocalStack's documentedhostname[:port]format is parsed and a port part must matchOVERCAST_PORT— andEDGE_PORT,GATEWAY_LISTEN,DEFAULT_REGION,DATA_DIR,DEBUG,PERSISTENCE,HOSTNAME_EXTERNALandLAMBDA_RUNTIME_ENVIRONMENT_TIMEOUTmap to the matchingOVERCAST_*/LAMBDA_*setting, completing the drop-in-replacement audit.SERVICES,LOCALSTACK_API_KEYandLOCALSTACK_AUTH_TOKENare recognised and logged once at startup as inert rather than silently ignored. Every alias shares one mechanism and one conflict rule: a value that disagrees with an explicit `OVERCAST_...
v0.0.1-alpha.36
Overcast v0.0.1-alpha.36
Docker Images
Full image with the web management console:
- Pull:
ghcr.io/neaox/overcast:0.0.1-alpha.36 - Moving tag:
ghcr.io/neaox/overcast:alpha - Registry: overcast package
Headless slim image for CI pipelines:
- Pull:
ghcr.io/neaox/overcast-slim:0.0.1-alpha.36 - Moving tag:
ghcr.io/neaox/overcast-slim:alpha - Registry: overcast-slim package
docker run --rm -p 4566:4566 -p 4567:4567 ghcr.io/neaox/overcast:0.0.1-alpha.36
docker run --rm -p 4566:4566 ghcr.io/neaox/overcast-slim:0.0.1-alpha.36Native Binaries
Download a binary for your platform from the assets below and verify it with SHA256SUMS.
| Asset | SHA256 |
|---|---|
overcast-darwin-amd64 |
f1e331f6b72d556bfff0d13a597ac4d5a3622144ae29edb29ed3a71d5e186e04 |
overcast-darwin-arm64 |
960186b1e74347ac3fdf84446224c576dc10ac2c4f96ece987f58d5366c73d33 |
overcast-linux-amd64 |
c4568d5ceeba438cf02381dcf5846dcf7fce293f9ba40407bee2d0012d51e15c |
overcast-linux-arm64 |
75ff98f34ebea38e5f9686b01166543057862c48238ad9def000571b0de820f3 |
overcast-windows-amd64.exe |
4e1ee01ea6e3815e08db2fc31f4eeacdf52802c435fcf79f42f45f9a816fcd25 |
overcastd-darwin-amd64 |
8c77d83924aa0d29f5e22c677b783c3585b3a8034daeff8081db3640720a802a |
overcastd-darwin-arm64 |
258a71aecbbc9e3d804cd55e559b3b9fea2a45794ffa9ec56b3ce6535c6acdc7 |
overcastd-linux-amd64 |
08e3f7564f4388fafc149e446e51bfefe2c5f927271f32224b2c97a5300cc177 |
overcastd-linux-arm64 |
daeab55224f40c0d612a832e2df00f77c7f78d1a2994b5c8d9e2a39d6f2ad6ee |
overcastd-windows-amd64.exe |
ca41a8c095c2feb04879e89343e9d3b514614cf6442e6022d79a6fd0ddb1ba50 |
Release Notes
Added
-
[mcp] a request that asks for a streamed response now gets one: the notifications belonging to that request arrive as they happen, followed by its result. Progress, log messages and cancellation are scoped to a single request — MCP revision
2026-07-28says such notifications "flow only on the response stream of the request they relate to" — so a long tool call reports its progress on its own response instead of on a separate connection, and a client reading in order sees the work reported before the answer to it. Cancelling a call deliversnotifications/cancelledon the cancelled call's stream, which then ends without a result. A request that did not ask for a stream is answered exactly as before, and a request refused before it reaches a handler is still an HTTP error rather than a stream carrying one -
[web/tls] a Settings page in the console, whose first section drives HTTPS setup end to end: it reports the serving mode, certificate and trust-store state, mints the CA and server certificate on a click, and installs the CA into the system trust store behind the OS approval prompt. A containerized daemon still prepares the certificate material, so the CA is downloadable at
/api/ca.pembefore the restart, and hands back the host-sideovercast https enable --endpoint ...one-liner. The one step no UI can take — restarting withOVERCAST_TLS=auto— is shown verbatim in per-shell tabs, and a "Switch to HTTPS" button appears once the TLS listener answers -
[web] a header gear opening that Settings page, in every build including bundled ones; the connection is editable there as well as from the existing header plug, both sharing the first-run dialog's form and its live reachability probe
-
[web] an empty CloudFormation, SQS or Lambda list page in the console now says when the resources exist in a different region — "No stacks in
us-east-1. There are 3 inap-southeast-2." — with a button that switches to it. A developer whoseAWS_REGIONpoints somewhere the console does not sees a working emulator and an empty list, and nothing on that screen is about regions, so it reads as a lost deploy or a broken emulator. The notice appears only when the selected region is genuinely empty and another genuinely is not: an account with nothing in it anywhere says nothing at all -
[tls]
OVERCAST_CA_DIRputs the local CA somewhere other than$OVERCAST_DATA_DIR/ca, so a container can mint certificates from a CA that outlives it. State and a trust anchor have opposite lifetimes — state is disposable, while installing a root certificate is a per-machine, permanent act — and tying them to one directory is what made everydocker compose downcost another root-certificate approval. Create the CA once on the host withovercast https enable, mount it read-only (-e OVERCAST_CA_DIR=/ca -v ~/.overcast/data/ca:/ca:ro), and recreation,down -vand image upgrades all keep working with no further prompts; this is the anchor-durable/leaf-ephemeral split mkcert, Caddy and step-ca use. Read-only mounts are supported directly: leaf caching becomes best-effort (a re-mint costs about a millisecond) rather than a startup failure, and because a bind-mounted CA carries the host's ownership and0600keys that the unprivileged container user usually cannot read, the entrypoint serves from a private in-container copy when that happens — the mount is never written to.docker-compose.ymlnow gives the CA its own volume -
[events/web] every event on the stream now carries the request id of the API call that caused it, so a
PutObjectand the notification, queue write and delivery it set off are all attributable to one call instead of appearing as unrelated activity; the bus derives it from the context a publisher already passes, which covers asynchronous work — an SNS fan-out delivering after itsPublishreturned is attributed to thatPublish— and leaves it off entirely for events no request caused, such as container and timer activity, rather than inventing an id that resolves to nothing; the Events page shows the id in the expanded event and in what the copy button writes, matches it in the filter box so pasting one narrows the console to that call's events, and links each row to the request's trace whenOVERCAST_DEBUGis set; a trace's own Events tab correspondingly lists everything its request caused, where it previously showed only the single row summarising the request itself
Changed
-
BREAKING [mcp] the log level is stated per request instead of set once for a connection, and a request that names none is sent no
notifications/messageat all.logging/setLevelset a threshold that every client on the server then shared, which MCP revision2026-07-28replaces with a level named in each request's_meta— so one client can ask for debug without making another listen to it. Silence is the default rather than a threshold nobody chose: the revision requires that a server not emit log notifications for a request that did not ask for them. Deciding this before the notification is built also means an emit with no audience costs nothing, which matters because these fire from the emulator's own paths whether or not MCP is in use
migration: putio.modelcontextprotocol/logLevelin a request's_metato receivenotifications/messagefor it; requests that omit it are answered without any -
[mcp] a client is told the tool, prompt or resource list changed without having to complete a handshake first. Emission used to be gated on the
initializelifecycle, which MCP revision2026-07-28removes: a stateless client never performs one, so a provider registering after startup would have gone unannounced to it. A client that opened asubscriptions/listenstream and named the notification type has already said it is ready to receive, which is what the gate existed to establish -
[web] the Metrics & Health page is reordered — health and runtime facts in one summary band, then a uniform runtime card grid, then advisories and per-subsystem diagnostics; the advisories section collapses to a single line when there is nothing to report, and the Docker table moved to the foot of the page and now shows each service its own socket
-
BREAKING [ec2] every EC2 describe now refuses a filter name it does not implement, with AWS's
InvalidParameterValue: The filter '<name>' is invalid. It used to answer one of two ways, and which one depended on which helper the handler happened to be written with: theparseFilterValuesdescribes (VPCs, subnets, security groups, route tables, internet gateways, VPC endpoints, peering connections) looked each filter up by name, never saw the rest, and returned everything; thematchFiltersones (NAT gateways, network interfaces) compared every supplied filter against an attribute map and returned nothing. Both are confidently wrong, in opposite directions, in one service, so a caller could not even work around them consistently. This is the root of thetag:Namebug fixed in #1033 — a find-or-create script'sdescribe-vpcs --filters Name=tag:Name,...was ignored, soVpcs[0]was the seeded default VPC and the script adopted it instead of creating its own private one; implementing that one filter fixed that one filter, while the next unimplemented name failed in exactly the same silent way. Which names each operation implements is now declared in one place per operation, and that declaration is what matches the filter, writes the error and is checked against the capability tables — which the same change makes accurate, several having claimed filters that were never applied. The set is also wider than it was:DescribeAddresses,DescribeImages,DescribeKeyPairs,DescribeRegions,DescribeAvailabilityZones,DescribeInstanceTypesandDescribeTagsimplement filters they previously accepted and ignored, andDescribeInstancesgainedinstance-id, which its capability note had claimed for some time. CDK's VPC context provider sends only names Overcast implements, on all four describes it calls, soVpc.fromLookupandcdk deployare unaffected
...
v0.0.1-alpha.35
Overcast v0.0.1-alpha.35
Docker Images
Full image with the web management console:
- Pull:
ghcr.io/neaox/overcast:0.0.1-alpha.35 - Moving tag:
ghcr.io/neaox/overcast:alpha - Registry: overcast package
Headless slim image for CI pipelines:
- Pull:
ghcr.io/neaox/overcast-slim:0.0.1-alpha.35 - Moving tag:
ghcr.io/neaox/overcast-slim:alpha - Registry: overcast-slim package
docker run --rm -p 4566:4566 -p 4567:4567 ghcr.io/neaox/overcast:0.0.1-alpha.35
docker run --rm -p 4566:4566 ghcr.io/neaox/overcast-slim:0.0.1-alpha.35Native Binaries
Download a binary for your platform from the assets below and verify it with SHA256SUMS.
| Asset | SHA256 |
|---|---|
overcast-darwin-amd64 |
c9943e14b893a43861a61b4c15077001999961b470045dad039e2c976f32fbfe |
overcast-darwin-arm64 |
7c5c3c6ad44d6273a39b60bec37d615310229a7d9807e283eace4b1304760f38 |
overcast-linux-amd64 |
f5854fd7f7e16471cca233a54343553cb35cf12fbba09fc0460a2ee4e6df3668 |
overcast-linux-arm64 |
db52c1d0661c01be4dbdc8b3f7d5d9c8006d2878d19972ec4cfb87ddb669c5d1 |
overcast-windows-amd64.exe |
6af8c890f09632bc5aa820447e602f39ac17a7a1c4219dc9199a98fac5c56f5b |
overcastd-darwin-amd64 |
7781e37051935faf61eaaf468ef269b4183001c66310bb63a93c15573bdadc34 |
overcastd-darwin-arm64 |
7e1fdc8af34928a4a68aa303dfa37ba72f9f2906a78b34b0c17bdc2a90018387 |
overcastd-linux-amd64 |
0329517ee093191a6ab257bc98e215a6e903f7b81efa38bd85f45dd564abd063 |
overcastd-linux-arm64 |
c5e67a209b43f3740a9c6e97da2ca8453cefa8c3012b544b63e148d0335a446f |
overcastd-windows-amd64.exe |
c5806039857913f5e50b2495397e0bbdbcc163972e5042ad69609af94f52b3a0 |
Release Notes
Added
-
[appconfig]
UpdateApplicationis implemented, atPATCH /applications/{ApplicationId}; an omittedNameorDescriptionleaves the stored value alone -
BREAKING [appconfig] the create operations require the members AWS marks required —
Nameon an environment,NameandLocationUrion a configuration profile,Content-Typeon a hosted version — and creating an environment or a profile under an application that does not exist answersResourceNotFoundExceptionin place of storing an unreachable record
migration: pass the required member, and create the application first -
[appconfig] the create operations apply an inline
Tagsmap,CreateHostedConfigurationVersionhonours theLatest-Version-Numberheader with aConflictException,ListConfigurationProfileshonourstypeandListHostedConfigurationVersionshonoursversion_label -
[appconfig] every list operation paginates on
max_resultsandnext_tokenand answers aNextToken; a token that cannot be decoded gets aBadRequestExceptionin place of a silent restart at the first page -
BREAKING [appconfigdata]
StartConfigurationSessionacceptsRequiredMinimumPollIntervalInSeconds, reports it back inNext-Poll-Interval-In-Seconds, and refuses a poll that arrives before it has elapsed, as AWS does; the member used to be ignored
migration: poll no more often than the interval the session asked for, or dropRequiredMinimumPollIntervalInSecondsfromStartConfigurationSession -
[backup] the vault and plan operations honour the members AWS models:
ListBackupVaultsandListBackupPlanspage onmaxResultsandnextToken, withListBackupVaultsalso filtering onvaultTypeandsharedand an undecodable token getting anInvalidParameterValueExceptionin place of a silent restart at the first page;CreateBackupVaultvalidates the vault name against the pattern AWS documents;DescribeBackupVaulthonoursbackupVaultAccountId; andGetBackupPlananswers not-found for aversionIdother than the plan's current one, rather than returning the current version under the requested version's name -
[console] a Lambda's Configuration tab says what its VPC configuration actually does here — the container really joins the VPC's network, but Overcast restricts nothing and security groups are never applied, so a test that "proves" the VPC wiring works passes whether or not it is correct. Shown only on functions that have a VPC configured; the empty state carries a one-line version for everyone else
-
[dns] a query for a resource endpoint the calling container cannot reach is refused instead of answered with Overcast's own address. Overcast is authoritative for every subdomain of its split-horizon domains, and a container endpoint is one of those — so a missing network alias never produced a clean failure, it produced Overcast's address, and the client connected to the emulator on the engine's port and waited for its own timeout. The refusal is immediate, and the log line names the resource, the caller, and the networks each is on
-
[dns] the refusal requires positive identification — some container is advertising that exact alias, on a network the caller is not attached to. A name that merely looks like a resource endpoint is still answered, because those labels are ordinary words in a bucket name:
my.rdsis addressed virtual-hosted asmy.rds.localhost, and refusing it would break the bucket -
[docs]
docs/networking.mdgains a section on Lambda, ECS and VPCs — a row-by-row comparison of what AWS routes and what Overcast currently allows, why the emulator's own APIs stay reachable from inside a VPC on purpose, and what to do about the two*_NETWORK-era migrations (OVERCAST_NETWORK, and the seeded default VPC turning up inDescribeVpcs) -
[ec2/ecs]
assignPublicIp: ENABLEDon anawsvpcConfigurationkeeps the task reachable from outside its VPC, matching what the field buys on AWS. It was stored and ignored before -
BREAKING [ecr] images pushed to the emulated ECR survive an Overcast restart. The registry container keeps its blobs in a named Docker volume,
overcast-ecr-registry-data-<port>, carrying the sameovercast.service=ecrlabels every other managed resource does; the container itself stays disposable. The gap this closes iscdk deploy: cdk-assets asksDescribeImagesfor a container asset's content-hash tag and skips both the build and the push when it resolves, so a registry that came back empty made every deploy after a restart rebuild and re-upload assets that had not changed. Only the fixed-port claim (OVERCAST_ECR_REGISTRY_PORT, default4510) gets a volume — an ephemeral registry's container name is deliberately random and its port is whatever the daemon had spare, so a volume keyed to either would be a fresh orphan on every start, and one well-known name shared between concurrent instances would put two registry processes on one filesystem. Repository metadata still follows the state backend, and re-creating a repository is enough for its images to reappear: the first read reconciles it against the registry
migration: a restart no longer clears the registry. Discard the images withdocker volume rm overcast-ecr-registry-data-4510while Overcast is down, or setOVERCAST_ECR_REGISTRY_PERSIST=falseto keep the old container-lifetime storage -
[ecr]
OVERCAST_ECR_REGISTRY_PERSIST(defaulttrue) backs the fixed-port registry with that volume. Set it false for storage that dies with the registry container, which is worth doing when the volume itself is the problem — a corrupt one, or a runner that has to start from nothing -
[eks]
DescribeAddonVersionsfilters onaddonName,kubernetesVersion,types,publishersandownersand pages withmaxResults/nextToken; omittingaddonNamereturns the whole add-on catalog rather than nothing, and each entry now carries itstype,publisherandowner -
[eks]
ListInsightshonours the modeledfilteron category, Kubernetes version and status, and pages withmaxResults/nextToken; an undecodablenextTokengets anInvalidParameterExceptionin place of a silent restart at the first page -
[lambda] an asynchronous invocation whose function returns an error is now retried, as AWS retries it: two more attempts, waiting one minute after the first and two after the second, matching AWS's default
MaximumRetryAttemptsand the wait AWS documents for a function error. Previously a single failure was final, so a handler that failed on a cold start and would have succeeded on the retry lost its event — and, with aDeadLetterConfigconfigured, dead-lettered an event AWS would have run. Each attempt acquires its own execution environment and is tracked as its own invocation, which is what a retry is on AWS rather than a resumption of the last one. A function throttled by its own reserved concurrency is the documented exception and is not retried again: AWS sends those events to the dead-letter queue "without any retries" -
[lambda]
DeadLetterConfigon a function is honoured: an asynchronous invocation that fails is delivered to the SQS queue or SNS topicTargetArnnames, carrying the original event as the message body and theRequestID,ErrorCodeandErrorMessagemessage attributes AWS documents. It is stored and echoed byCreateFunction,UpdateFunctionConfiguration,GetFunctionandGetFunctionConfiguration, and an explicitly emptyTargetArnremoves the target as on AWS. Overcast still makes one attempt where AWS makes three, so the event reaches the queue sooner than it would on AWS; nothing in a dead-letter message reports the attempt count, so what a consumer reads is unchanged.PutFunctionEventInvokeConfigon-failure destinations — a different feature, carrying the invocation record rather than the event — remain unimplemented outside event source mappings -
[lambda]
PutFunctionEventInvokeConfigand its family —Get,Update,DeleteandListFunctionEventInvokeConfigs— are implemented, so a function's asynchronous invocation settings are configurable per fu...
v0.0.1-alpha.34
Overcast v0.0.1-alpha.34
Docker Images
Full image with the web management console:
- Pull:
ghcr.io/neaox/overcast:0.0.1-alpha.34 - Moving tag:
ghcr.io/neaox/overcast:alpha - Registry: overcast package
Headless slim image for CI pipelines:
- Pull:
ghcr.io/neaox/overcast-slim:0.0.1-alpha.34 - Moving tag:
ghcr.io/neaox/overcast-slim:alpha - Registry: overcast-slim package
docker run --rm -p 4566:4566 -p 4567:4567 ghcr.io/neaox/overcast:0.0.1-alpha.34
docker run --rm -p 4566:4566 ghcr.io/neaox/overcast-slim:0.0.1-alpha.34Native Binaries
Download a binary for your platform from the assets below and verify it with SHA256SUMS.
| Asset | SHA256 |
|---|---|
overcast-darwin-amd64 |
e73e204bae6770bd4216c313e4b6a88a7c5ec816c368061d2338d67152d7f6ce |
overcast-darwin-arm64 |
ca7708b8c3da8af9cb27d31c771ab3f37e447140a3a332f2e46dee3631acdbf5 |
overcast-linux-amd64 |
980bed4b05ee6b8702a3fc45c01fc5385c15a673155b027fbf57eb985ac8e522 |
overcast-linux-arm64 |
8151a8bf01fdcf597932a83768a0e7dfe844ca79b034c5e8da785ccf862b7bc5 |
overcast-windows-amd64.exe |
5e0763ab5851eefbf618a769a79c1d6fe5956e61d2ff3dcd120821b44fcb2ec5 |
overcastd-darwin-amd64 |
035d20679361ee8728c6b1a4cbb7173411ac225fe50ea7bb66a601987d488b22 |
overcastd-darwin-arm64 |
ea322f434da544c01f52943622d335d912b2acebee1e7accf2315ecf71c2e375 |
overcastd-linux-amd64 |
0bfa543587c9a67094d48e606b4642b955246a7d962977a528b5d07b0f8b1664 |
overcastd-linux-arm64 |
f6a4e419bfd5d166e7d68a0ff6f3760bb3ca9b608124e111f37773bf7ed2883b |
overcastd-windows-amd64.exe |
37309ebfff523d85625f92ec8c896c6e728524f2fadfe5edcbe51b28d5b9e479 |
Release Notes
Added
-
[acm]
TagResource,UntagResourceandListTagsForResource— the modern aliases of the*Certificatetag operations, addressing the certificate byResourceArn.RequestCertificateapplies inlineTagsat creation -
[cloudtrail] Trails are taggable:
AddTags,RemoveTagsandListTags, plus an inlineTagsListonCreateTrail -
[iam] Managed policies and instance profiles are taggable:
TagPolicy/UntagPolicy/ListPolicyTagsandTagInstanceProfile/UntagInstanceProfile/ListInstanceProfileTags; andCreateUser,CreateRole,CreatePolicyandCreateInstanceProfileapply inlineTagsat creation -
[kinesis]
TagResource,UntagResourceandListTagsForResource— the ARN-addressed tag operations the AWS CLI'skinesis tag-resourceuses, reading and writing the same tag set asAddTagsToStream— andCreateStreamapplies inlineTagsat creation -
[scheduler]
ListSchedulesandListScheduleGroupshonourMaxResults,NextTokenandNamePrefix, andListSchedulesalso filters onState; aNextTokenthat cannot be decoded gets aValidationExceptionin place of a silent restart at the first page -
[ses] SESv2 resource tagging:
TagResource,UntagResourceandListTagsForResourceon/v2/email/tags, for email identities.CreateEmailIdentityapplies inlineTagsat creation,GetEmailIdentityreports them, and deleting an identity drops them -
[sns]
CreateTopicapplies inlineTagsat creation, as AWS does; a repeat idempotent call leaves an existing topic's tags untouched -
[transfer] Transfer Family servers and users are taggable:
TagResource,UntagResourceandListTagsForResource, plus inlineTagsonCreateServerandCreateUser.DescribeServerandDescribeUserreport them -
[web/s3] the object inspector opens on a named version: it shows that version's metadata and body, its copy-URL carries
?versionId=, and a version that cannot be read is explained rather than left blank — a delete marker as the tombstone it is, an id that no longer exists as a listing that has gone stale -
[web/cloudwatch] a Clear button on the log events viewer empties the buffer on screen without stopping the tail, so a live stream can be read from a known point instead of scrolling past everything that came before. The events are hidden, not lost — "Show N earlier" puts them back, and so does Refresh
-
[web/s3] an expiry hint on noncurrent version rows, counted the way the sweeper counts it — from the moment the version's successor was written, and skipping the newest versions a rule's
NewerNoncurrentVersionsretains -
[web/s3] search and sort controls on the bucket object browser: filter by name or prefix, switch between this-folder and fully recursive listings, and sort by name, size or last modified
-
[web/s3] a Versioning panel on the bucket Configuration tab, which is the first way to enable or suspend versioning from the console rather than through the API. The state was already reported there; only the control was missing. Suspending says what it actually does — new writes are stored with version id
null, and every version already stored is kept, which is not the same as turning versioning off -
[ec2] each region seeds a default VPC on first use, with a default subnet per availability zone, an attached internet gateway, a main route table carrying the default route, and a default security group —
DescribeVpcs --filters Name=isDefault,Values=trueand CDK'sVpc.fromLookup(isDefault: true)previously found nothing. Its backing network is the shared data plane, so "no VPC" and "the default VPC" are the same place;DeleteVpcon it removes the record and leaves the network, and an internet-gateway change on it is ignored rather than recreating the network under every running container -
[eks] a live-mode cluster's API server carries DNS aliases on the shared data plane. The endpoint
DescribeClusterreturns is still the published host port, so this is groundwork rather than a complete path
Changed
-
BREAKING [docker]
overcast-slimhas no SQLite, so a volume mounted at/datano longer gives it persistent storage:autoresolves to memory, andhybridandpersistentrefuse to start. This is what the image was always documented to do — it only appeared to persist because the wrong binary was shipped
migration: usewal, which is durable and needs no SQLite, or switch to the fullovercastimage -
[ecr] the registry asks for a fixed host port (
OVERCAST_ECR_REGISTRY_PORT, default 4510 — LocalStack's registry port) sorepositoryUriis stable across restarts, falling back to an ephemeral port when it is taken; the portrepositoryUrithen advertises is selected by the Docker daemon itself proving it can dial it — a dual-stack ephemeral publish can split IPv4 and IPv6 onto different host ports, and only the daemon knows which family itslocalhostreaches — and a path nothing answers on is one actionable warning instead of aCannotPullContainerErrorin a later task launch -
[scheduler]
CreateScheduleandCreateScheduleGroupanswer 200, the status code their AWS models bind, in place of 201 -
BREAKING [scheduler]
UpdateSchedulereplaces the whole schedule, as AWS does. An optional member the caller leaves out of the request —Description,ScheduleExpressionTimezone,State,StartDate,EndDate, or anything insideTarget— ends up unset, where it used to keep its stored value; the schedule keeps its name, group, ARN andCreationDate
migration: send the whole schedule, not just the parts you are changing — read it withGetSchedule, change what you mean to change, and send the result back -
BREAKING [config]
LAMBDA_NETWORK,ECS_NETWORK,RDS_NETWORK,ELASTICACHE_NETWORK,MSK_NETWORK,EKS_NETWORKandEFS_NETWORKare replaced by a singleOVERCAST_NETWORK(defaultovercast). Every container Overcast starts now shares one data plane instead of one network per emulator service, which is what made cross-service reachability a per-service bug; the seven per-service networks are removed at startup once nothing is attached to them
migration: unset the old variables. If you set one to a custom value, setOVERCAST_NETWORKto it instead; if you joined a compose service toovercast_lambdaor another per-service network, joinovercastinstead. -
[lambda/ecs] containers are created on a control plane that carries the Runtime API and the emulator endpoint, separately from the data plane they reach other resources on — the split a VPC needs in order to restrict one without severing the other
Fixed
-
[acm] tagging a certificate that does not exist is a
ResourceNotFoundExceptioninstead of succeeding and stranding the tags under an ARN nothing owns, andListTagsForCertificatereturns tags in a stable key order instead of a different order per call -
[cloudformation] a create that fails with rollback disabled leaves
StackStatusReasonset to AWS's summary of which resources failed, rather than to the underlying service error — which stays on the resource and its event, where AWS keeps it -
[cloudformation] stack operations accept the stack ARN wherever AWS does —
DescribeStacks,DescribeStackEvents,ListStackResources,DescribeStackResources,GetTemplate,GetTemplateSummary,UpdateStack,DeleteStack,CreateChangeSet, andDeleteChangeSetresolvedStackNameby name only, so clients that poll by the stack ID (CDK's deploy monitor among them) gotValidationError: Stack [arn:…] does not existfor a stack that was right there. Conversely, aCREATE-typeCreateChangeSetnaming an unknown stack ARN no longer mints a placeholder stack literally named the ARN — an ARN is a handle to an existing stack, and now answers "does not exist" -
[cloudformation] mutating a deleted stack now behaves as on AWS —
UpdateStackon aDELETE_COMPLETEstack reports it does not exist instead of resurrecting it, and a repeatDeleteStackis a no-op success instead of re-running the delete and appending a second wave of delete events -
BREAKING [cloudformat...
v0.0.1-alpha.33
Overcast v0.0.1-alpha.33
Docker Images
Full image with the web management console:
- Pull:
ghcr.io/neaox/overcast:0.0.1-alpha.33 - Moving tag:
ghcr.io/neaox/overcast:alpha - Registry: overcast package
Headless slim image for CI pipelines:
- Pull:
ghcr.io/neaox/overcast-slim:0.0.1-alpha.33 - Moving tag:
ghcr.io/neaox/overcast-slim:alpha - Registry: overcast-slim package
docker run --rm -p 4566:4566 -p 4567:4567 ghcr.io/neaox/overcast:0.0.1-alpha.33
docker run --rm -p 4566:4566 ghcr.io/neaox/overcast-slim:0.0.1-alpha.33Native Binaries
Download a binary for your platform from the assets below and verify it with SHA256SUMS.
| Asset | SHA256 |
|---|---|
overcast-darwin-amd64 |
b1cd32963bb8e99b863a0d545235c0fa0b5a834b30af32407bd1f84fb8db5c96 |
overcast-darwin-arm64 |
c1ffe7553301245a5c9723a13d5635a680aaf968899c344d1576338d731ab1f9 |
overcast-linux-amd64 |
e842631ec5ccb9008035d3364638f08f7f92a86c245361921331f5dc6c6a67f8 |
overcast-linux-arm64 |
cdf3c046237fea0a9748599460cfbb9117f19e41e30326e006f406e9b17d6cff |
overcast-windows-amd64.exe |
a89dc09adfdb2ecdece607a08e5d1a52361364ae9e5227af0f6fda7fc8844b6c |
overcastd-darwin-amd64 |
a72e172dde09a90d61f7253ffbcf6d7126204aa2b9c95c8c706b8a0e041344fa |
overcastd-darwin-arm64 |
c8905ee9bcf8e2857ff635662d0f200199078ed8b8dc5bd7aa6f4c5e826ca64f |
overcastd-linux-amd64 |
d20e564c4002c23b87e548ccb6c88cf38df50a86504db437f9223c6388ba7015 |
overcastd-linux-arm64 |
9f459c5886b2f05b844049907d2439f40e447e5c80369bfc6ffe84f62d249627 |
overcastd-windows-amd64.exe |
6fe65289848291b80f4f1c27c4aa31ae20145e05c8dba75b04dc1a9e70e643a9 |
Release Notes
Added
-
[cloudwatch]
PutMetricAlarmcarries more of the alarm:Tagsare applied at creation as on AWS, andUnitselects which datapoints an alarm evaluates, so a metric published under several units evaluates separately per unit. PromQL alarms (EvaluationCriteria) join metric math and anomaly detection in returning501rather than being created un-evaluated -
[iam] permissions boundaries —
PutUserPermissionsBoundary,DeleteUserPermissionsBoundary,PutRolePermissionsBoundaryandDeleteRolePermissionsBoundary, plus thePermissionsBoundaryparameter onCreateUser/CreateRoleand thePermissionsBoundarymember on the user and role responses
Changed
-
BREAKING [cloudwatch]
PutMetricAlarmrequiresStatistic,ComparisonOperator,Period,EvaluationPeriodsandThresholdfor an alarm on a metric
migration: pass them explicitly. They areRequired: Noonly because a PromQL alarm supplies them insideEvaluationCriteria; an alarm on a metric that omitted one used to be created withAverage/GreaterThanThreshold/ 60s / 1 period /0.0substituted, which arms an alarm nobody configured -
[web/debug] the Request Traces status and method filters are multi-select, so "all errors" is 4xx and 5xx ticked together rather than two separate looks, and 3xx joins the status list; the filters live in the URL, so they survive Back from a trace's detail page and can be shared as a link
Fixed
-
[cloudformation/cloudwatch] an
AWS::CloudWatch::Alarmthe template does not name deploys — CloudFormation mints{Stack}-{Logical}-{RANDOM}for an omittedAlarmName, which is what CDK'sAlarmconstruct and everymetric.createAlarm()helper rely on, where the empty name used to reachPutMetricAlarmand come back as AWS's ownValue null at 'alarmName'. Every property now reaches the alarm too:DatapointsToAlarmandTreatMissingDatawere dropped, so an "M out of N" alarm was evaluated as "N out of N" andnotBreachingreverted tomissing. A property the template omits is left out of the request rather than sent empty -
[cloudformation]
AWS::Events::Rule,AWS::StepFunctions::StateMachine,AWS::ApiGateway::RestApi,AWS::Scheduler::ScheduleGroup,AWS::ECR::RepositoryandAWS::IAM::Userare named by CloudFormation when the template omits their name. Each carries the logical ID, so two unnamed resources of one type in a stack are two resources — the rule and the schedule group used to share one empty name and quietly become a single resource, and the rest failed the stack -
[cloudformation] a stack that rolls an update back is handed its previous template and parameters again, so
GetTemplatedescribes what is deployed rather than the attempt that failed and the next update resolves parameters from it; a nested stack whose own update fails restores its child template and parameters as part of rolling its resources back, instead of keeping the failed attempt's metadata because the parent never recorded the update as a success; and a rollback that cannot persist the metadata it restored reportsUPDATE_ROLLBACK_FAILEDrather than claiming the rollback completed -
[cloudformation]
UpdateStackhonours theDisableRollbackmember of the request it was given, rather than the value the stack was created with, and an update that fails with rollback disabled keeps the resource records the attempt reached — soDescribeStackResourcesno longer reports pre-update properties for a resource the update already changed, and no longer drops the resources it updated before the failure -
[debug/cloudformation] request traces record every internal hop, including the work that continues after the response is sent — a CloudFormation or CDK deploy runs for minutes past its HTTP reply, and every hop after the first second used to be dropped.
DeleteStackandRollbackStackrecord the internal calls they make, asCreateStackandUpdateStackalready did, where teardown hops were previously never recorded at all; and a stack created from aTemplateURLrecords the template fetch as a hop, with the S3 request it makes linking back to the CloudFormation request that triggered it -
[debug/s3] hops are named and linked whatever protocol answered them: a hop links reliably to the request it triggered, where S3 hops in particular used to link to nothing; hops for S3 calls name the service instead of showing a blank one, S3's REST paths being bare bucket paths that no prefix rule can attribute; and a Query-protocol request is named by its operation however the client ordered the form parameters, where one with a large parameter ahead of
Action— aCreateStackcarrying a real template, typically — used to show a blank operation -
[iam] permissions boundaries attached to a user or role are applied by
SimulatePrincipalPolicyand by opt-in request-time enforcement, so a bounded principal no longer gets permissions AWS would deny through the boundary intersection -
[lambda] a failed
CreateFunctionorUpdateFunctionCodeno longer leaves the stored deployment package ahead of the function'sCodeSha256,RevisionIdand source metadata, so a later read or cold start cannot run code the configuration does not describe -
[lambda] a
PutObjectlanding the bytes a function is already running is no longer treated as a new deployment. Re-uploading an unchanged asset — or the very upload the function read at create time — leavesRevisionId,LastModifiedand the warm execution environment alone, instead of rotating the revision under callers using it for optimistic concurrency and forcing a needless cold start -
[scheduler] schedules fire SNS, Step Functions, Kinesis, Firehose, ECS and EventBridge event bus targets, not just Lambda and SQS — delivery goes through the same dispatcher EventBridge rules and Pipes use, so one target ARN behaves identically on a schedule and on a rule — and
SqsParameters.MessageGroupId,KinesisParameters.PartitionKey,EventBridgeParametersandEcsParametersare honoured when a schedule fires.CreateScheduleandUpdateSchedulereject a target type Overcast cannot fire with aValidationException, instead of accepting a schedule that would silently never fire -
[scheduler]
RetryPolicyandDeadLetterConfigare honoured: a failed firing is retried up toMaximumRetryAttempts(capped at 6 attempts) whileMaximumEventAgeInSecondsallows, then sent to the configured SQS dead-letter queue -
[state] Lambda deployment packages carry an explicit storage-tier classification, pinning them to the SQLite-backed tier so a future change cannot silently make every stored zip memory-resident at startup
-
[web/debug] long request paths no longer stretch the traces table off-screen — the Path column is bounded against the page's own width and carries the full path as a tooltip — and the table's horizontal scrollbar is reachable without scrolling to the bottom of an infinitely growing list
Release: https://github.com/Neaox/overcast/releases/tag/v0.0.1-alpha.33
v0.0.1-alpha.32
Overcast v0.0.1-alpha.32
Docker Images
Full image with the web management console:
- Pull:
ghcr.io/neaox/overcast:0.0.1-alpha.32 - Moving tag:
ghcr.io/neaox/overcast:alpha - Registry: overcast package
Headless slim image for CI pipelines:
- Pull:
ghcr.io/neaox/overcast-slim:0.0.1-alpha.32 - Moving tag:
ghcr.io/neaox/overcast-slim:alpha - Registry: overcast-slim package
docker run --rm -p 4566:4566 -p 4567:4567 ghcr.io/neaox/overcast:0.0.1-alpha.32
docker run --rm -p 4566:4566 ghcr.io/neaox/overcast-slim:0.0.1-alpha.32Native Binaries
Download a binary for your platform from the assets below and verify it with SHA256SUMS.
| Asset | SHA256 |
|---|---|
overcast-darwin-amd64 |
c045fda95e5f31ad79a8200278c0cb6acc77737b82c11f762bf14561bd745f10 |
overcast-darwin-arm64 |
e27f2adc055fa8b358e340cfb75c11bf36dc788878aad5b806f49223e8f9bb6f |
overcast-linux-amd64 |
860bab296faa5e8583af105445c71eca8688607b76583fbcda78dcfa169628b7 |
overcast-linux-arm64 |
b748389c4df535cd6ca6eed3e77fc21917b63342510ac20f352e9676a2f7ebdb |
overcast-windows-amd64.exe |
7c37b28359bfb716f61d590bea22bc95ee345575a81b7f91a3ef0d14a6433d82 |
overcastd-darwin-amd64 |
6d85b58b3f177c4e63ea70d654c95c7cfcaa9217d573edf859d9714437998d41 |
overcastd-darwin-arm64 |
791a50dc2903594d7b5a7d2ffb2a9755951d4763bf3427c4e099bd63ad23ee5b |
overcastd-linux-amd64 |
53e36549f11c914c50a3712386ba13549914f758e9d0836bdafd9f328ff479da |
overcastd-linux-arm64 |
bc4a5c8919aae68d44f185588068b6c5b6bc290792c4e76db012e2b7c407b11c |
overcastd-windows-amd64.exe |
ac7c87429afe0804ed618d6508ad9f4e48cafe5d6a72f895387ed3383fc5dd76 |
Release Notes
Added
-
[cloudwatch-logs]
CreateLogGroupaccepts AWS'stagsfield and applies it as part of creating the log group, over AWS JSON and RPC v2 CBOR alike;AWS::Logs::LogGroupnow passes itsTagsstraight to the create instead of following up withTagLogGroup, so a rejected tag map leaves nothing behind -
[config]
OVERCAST_HOSTaccepts a comma-separated list of addresses to bind, so one emulator can be on loopback and on a host-local bridge address without being on any network the machine is attached to. A wildcard combined with a specific address is refused rather than silently failing the second bind -
[lambda]
TagResource,UntagResourceandListTagswork on event source mappings. Their tags are stored separately from the mapping and are deleted with it, so they never appear inEventSourceMappingConfiguration, which has noTagsmember. Code signing configurations, capacity providers and network connectors still return501 -
[lambda]
Code.S3ObjectVersiononCreateFunctionandUpdateFunctionCodefetches that version of the deployment package, which is what CDK emits once the asset bucket has versioning enabled -
[lambda] JSON logging —
LogFormat: JSONis honoured onCreateFunctionandUpdateFunctionConfiguration, which used to answer 501 for it. The plain-text START/END/REPORT lines are replaced by Telemetry-API-shapedplatform.start,platform.runtimeDoneandplatform.reportevents, one{"time","type","record"}object per log line;SystemLogLevelfilters those by AWS's system log level event mapping andApplicationLogLevelfilters function output by the"level"member of each record, with anything unparseable treated as INFO. Both default to INFO, and filtering covers CloudWatch Logs and theX-Amz-Log-Resulttail — Telemetry and Logs API subscribers still receive every record.AWS_LAMBDA_LOG_FORMAT, andAWS_LAMBDA_LOG_LEVELunder JSON, reach the execution environment so managed and custom runtimes can structure their own output, and a change to the logging configuration retires warm environments. Text output is unchanged; the init-phaseplatform.initStartandplatform.initReportrecords are not emitted yet, and both are DEBUG at the default system log level -
[lambda] execution images for every runtime AWS still accepts on CreateFunction: Python 3.14, Java 25 and the Amazon Linux 2023 Java runtimes, .NET 10, Ruby 3.4 and 4.0, plus the Node.js, Python, .NET, Ruby and
provided.al2runtimes that are past end of support but still deployable -
[lambda]
TracingConfig,EphemeralStorageandKMSKeyArnare validated against AWS's own constraints, stored, and returned byCreateFunction,GetFunction,GetFunctionConfigurationandUpdateFunctionConfiguration.TracingConfigandEphemeralStorageare always present in a function's configuration, defaulting toPassThroughand 512 MB as on AWS. None of the three changes what a function does: X-Ray is not emulated, the ephemeral storage size is not enforced on the container, and environment variables are not encrypted at rest -
[release] Docker line tags
:1and:1.2, so a user can pin a release line rather than a single version or the moving:latest -
[release] a maintenance-release path for patching an older minor after 1.0:
support/<major>.<minor>branches cut from their tag, backports cherry-picked out ofmain, and the full test and compat suites running on them -
[s3]
PutBucketLifecycleConfigurationacceptsx-amz-transition-default-minimum-object-size, and both it andGetBucketLifecycleConfigurationreport the behaviour in force. The sweeper applies it: under the defaultall_storage_classes_128Kan object below 128 KB does not transition, undervaries_by_storage_classit still transitions toGLACIERorDEEP_ARCHIVE, and a rule with its ownObjectSizeGreaterThan/ObjectSizeLessThanfilter sets its own floor.AWS::S3::Bucket.LifecycleConfiguration.TransitionDefaultMinimumObjectSizenow dispatches through it instead of failing the resource -
[s3]
PutBucketWebsiteandGetBucketWebsitecarry the wholeWebsiteConfiguration:RedirectAllRequestsToandRoutingRulesare preserved alongside the index and error documents, with AWS's mutual exclusion, required fields andProtocolenum enforced rather than silently dropped.AWS::S3::Bucket.WebsiteConfigurationdispatches both new elements through S3, translating CloudFormation'sRedirectRule/RoutingRuleConditionspellings. Overcast still serves no S3 website endpoint, so nothing is actually redirected -
[s3] buckets can send their object events to EventBridge.
NotificationConfigurationnow carriesEventBridgeConfiguration, and while it is set every object mutation is published to the default event bus as AWS'saws.s3/Object Created/Object Deletedevent, through EventBridge's own delivery path so rule patterns, input transformers, retries and DLQs all apply. The detail omitsrequest-id,requester,source-ip-address,sequencerandversion-idrather than fabricating them.AWS::S3::Bucket.NotificationConfiguration.EventBridgeConfigurationdispatches through S3 instead of failing the resource -
BREAKING [s3] object version history. A versioning-enabled bucket mints a version id for every write, keeps the previous version as noncurrent, and answers a delete by adding a delete marker instead of removing anything;
versionIdaddresses a specific version onGetObject,HeadObject,DeleteObject,DeleteObjectsandCopyObject's source.Suspendedkeeps the versions it already has and writes the singlenullversion, and objects stored before a bucket was versioned — including objects persisted by an earlier build — are that key'snullversion with nothing to migrate by hand.ListObjectVersionsreturns versions and delete markers in AWS's order, keys ascending then most recently stored first, withprefix,delimiter,max-keysand resumablekey-marker/version-id-markerpagination. A bucket that never enables versioning behaves exactly as before, down to the absentx-amz-version-id
migration: a bucket you had already setVersioningConfigurationEnabledorSuspendedon now behaves as AWS does —DeleteObjectwrites a delete marker rather than removing the object, andDeleteBucketreportsBucketNotEmptyuntil the markers and the versions under them are deleted by version id. Empty such a bucket withListObjectVersionsfollowed by version-targetedDeleteObjects, which is what the AWS SDKs' own cleanup loop does. Set the bucket back to unversioned if you did not mean to enable it — there is no such transition on AWS or here, so delete the bucket and recreate it -
[s3] the lifecycle sweeper executes
NoncurrentVersionExpiration,NoncurrentVersionTransitionandExpiredObjectDeleteMarker, which were previously refused for want of any versions to act on. A version's noncurrent clock starts when the version that replaced it was written,NewerNoncurrentVersionsretains that many newer versions first, and noncurrent transitions honour the bucket'sx-amz-transition-default-minimum-object-sizeexactly as current-version transitions do. Expiring the current version of a versioned object adds a delete marker rather than deleting it, andExpiredObjectDeleteMarkerclears a marker once it is the key's only version.AWS::S3::Bucket.LifecycleConfigurationtranslates all three instead of failing the resource -
[s3] object event notifications carry
versionIdandsequencer, in both theRecords[].s3.objectpayload delivered to SQS and Lambda and the EventBridge detail, and an EventBridge delete now reports"deletion-type": "Delete Marker Created"when a versioned bucket wrote a tombstone -
[web/cloudformation] the stack detail page and the stack list say why a deploy failed. The banner carries
StackStatusReason, falls back to theResourceStatusReasonof the resource that actually failed once a terminal rollback has cleared the stack-level reason, and spells out what the status means: aROLLBACK_COMPLETEstack has no stable state to ...
v0.0.1-alpha.31
Overcast v0.0.1-alpha.31
Docker Images
Full image with the web management console:
- Pull:
ghcr.io/neaox/overcast:0.0.1-alpha.31 - Channel tag:
ghcr.io/neaox/overcast:alpha - Registry: overcast package
Headless slim image for CI pipelines:
- Pull:
ghcr.io/neaox/overcast-slim:0.0.1-alpha.31 - Channel tag:
ghcr.io/neaox/overcast-slim:alpha - Registry: overcast-slim package
docker run --rm -p 4566:4566 -p 4567:4567 ghcr.io/neaox/overcast:0.0.1-alpha.31
docker run --rm -p 4566:4566 ghcr.io/neaox/overcast-slim:0.0.1-alpha.31Native Binaries
Download a binary for your platform from the assets below and verify it with SHA256SUMS.
| Asset | SHA256 |
|---|---|
overcast-darwin-amd64 |
8570aed5f05046bad9c3b08878d23f04e4e3870964bd3ac854ac1bf9e34b9b32 |
overcast-darwin-arm64 |
1661c08d04031c362d1e9e77ab6958ba6818e39cb9d1c02a2729f621cff0f235 |
overcast-linux-amd64 |
e001832bee043b60b8b5a3e05763193dd6f516853256f057f7608cdbbf6a25fb |
overcast-linux-arm64 |
1a12cfdd2f55e767dd4a52ae4331531a1a260f5e1e221795a261d5ff4457f8b8 |
overcast-windows-amd64.exe |
db96c62c6393db58f68f00cea40b1569894cf1da9e01793793cff1f45f607114 |
overcastd-darwin-amd64 |
d6cf53cb58f0c52727ecc116314017cfe7c71ce40398222d74cb04007bffcf0e |
overcastd-darwin-arm64 |
93fa0a7bf4285e66dd52b63cfadb2296895008c060b815c114beaac4d524d9fb |
overcastd-linux-amd64 |
973100a0ef65830457c9b5658be733de39aeb3bfff2910e57156d22ea8296312 |
overcastd-linux-arm64 |
a27070849194336c37ac109130d09a1cad9ee0f4fcc61c3ef4e57135bcde11ed |
overcastd-windows-amd64.exe |
fae4c472138f4ba396d1179bae781b9d731a5f1ffecb7460941b4ac52503d869 |
Release Notes
Added
-
Resource tagging operations added across 25 services: AppConfig, Athena, Cognito, DynamoDB, ECS, EKS, ElastiCache, ELBv2, EventBridge, Firehose, Glue, IAM, KMS, Lambda, MSK, Pipes, RDS, Scheduler, Secrets Manager, Shield, SNS, SQS, SSM, Step Functions, and WAF. Includes shared
Taggableinterface, genericApplyTags/RemoveTags/ListTagshelpers inserviceutil, andTagStore+NSStorefor separate-namespace tag storage. CloudFormation tag propagation is wired through for Lambda and Secrets Manager. -
[router] new
/_debug/trace/*endpoints for full request tracing — request/response bodies, per-handler structured log capture across 22 services, internal service-hop recording, stack traces captured during handler execution, and AWS errors. Active whenOVERCAST_DEBUG=true; traces are looked up by the request ID already returned in every response (x-amzn-requestid/x-amz-request-id);/_debug/traceslist and/_debug/trace/{id}detail endpoints support cursor-based bidirectional pagination; internal traces (health, inbox, SSE, debug polling) are capped at 20% of buffer capacity so they never crowd out user-facing requests; service/operation detection for Query-protocol services reads the request body via the generatedawsapi.Registry;GET /_events/request/{requestId}queries the event history by request ID (History.FindByRequestID). Includes BFF proxy routes and a web UI at/debug/traces— infinite-scroll list with live polling, deduplication, service filter with counts, millisecond timestamps, and hop-count badges; per-trace tabs for overview (side-by-side request/response with copy buttons and referer), hops (upstream/downstream navigation via request IDs), logs, errors, and events (event-console matching layout); sequence diagram/waterfall/flow map views; Prism syntax highlighting for JSON, XML, form-encoded bodies, and Go stack traces; copy-as-curl; sharedCheckboxFilterDropdownandformatBodyForDisplayused by the traces, events, and S3 preview pages;OVERCAST_DEBUG_TRACE_BUFFERenv var for ring-buffer sizing. -
[router] GET /_health now includes a
dockerblock with per-service Docker connection status. Responses from Docker-backed describe endpoints carryx-overcast-backing,x-overcast-backing-reason, andx-overcast-container-healthheaders. -
Web UI: S3 copy-URL buttons (S3 URI and path-style formats, actions-menu UX), header endpoint indicator with copy button, overhauled connection dialog with debounced endpoint validation and combobox suggestions, auto-detect API port (Docker socket, native, or 1:1 mapping), connection settings always visible, Docker connectivity banners on resource pages, and Docker health metrics on
/metrics. -
[bff]
normalizeEndpointrewrites all loopback endpoints to internal API port, fixing BFF proxying in Docker with remapped ports and no socket.deriveAPIBaseURLreturns endpoint known/unknown alongside URL; handles native custom API port via default-UI-port fallback. -
[combobox] add
allowFreeTextprop for editable-after-selection behaviour (seeds query from current value, commits on blur) -
[kms]
UpdateKeyDescription -
[ci] a
Release branch basecheck fails any pull request whose base is arelease/*branch and puts the rebase-onto-maininstructions in its job summary — the release bot is that branch's only writer, and a PR into it skips the test matrix, compat suite, changelog gate and breaking-change hold, which all run on pull requests intomain
Changed
- [ci] the release changelog gate runs on pull requests into
mainonly, so a mis-based PR gets the base-branch message instead of advice to fold a fragment that was correct all along
Fixed
-
[cloudformation/dynamodb] Local secondary indexes are applied on table creation, while unsupported LSI updates now fail without mutating the table. DynamoDB table TTL configuration is validated, applied, and reconciled during stack create and update.
-
[cloudformation/cloudwatch-logs] Log group retention, resource tags, and propagated stack tags are applied when a stack creates or updates the group.
-
[cloudformation/kms]
AWS::KMS::Keyupdates dispatchPutKeyPolicyonly whenKeyPolicyactually changed, so an unchanged caller-locking policy created withBypassPolicyLockoutSafetyChecksurvives unrelated stack updates; aKeyPolicygiven as a JSON string is forwarded verbatim instead of double-encoded;Descriptionchanges are applied throughUpdateKeyDescriptioninstead of being ignored -
[ecs/rds/elasticache/msk] resources no longer report RUNNING/available/ACTIVE when Docker is unavailable.
-
BREAKING [kms/cloudformation] key-policy mutations apply AWS schema and caller lockout-safety validation.
migration: ensure custom policies retainkms:PutKeyPolicyfor the caller, or explicitly setBypassPolicyLockoutSafetyCheck -
[kms/cloudformation] KMS keys created by CloudFormation now honor
Enabled: falseon first deployment and restore the enabled default when the property is removed. -
BREAKING [secretsmanager/cloudformation] generated-secret templates validate before mutation, while KMS key metadata and CloudFormation tags round-trip through the service APIs.
migration: use PasswordLength 1..4096 (or omit it for 32), and keep GenerateStringKey absent from the template object -
[waf/stepfunctions/shield/glue/elbv2/rds] fix tag validation gaps: WAF no longer publishes spurious creation events on tag writes; Step Functions typed path validates tags; Shield and ELBv2 validate tag limits; Glue uses shared helpers; RDS fixes unbounded loop; removed dead TaggedResource and shieldTagsToList.
-
[waf] TagResource accepts and ListTagsForResource returns Tags/TagList as lists of {Key,Value} structs, matching the WAFv2 wire format that SDK clients send — previously tag operations were unusable via the SDK
-
[web] path-style S3 copy URLs percent-encode object keys, so keys with
#,?, spaces, or unicode paste as working links -
[web] bundled builds follow the server-injected API endpoint on boot instead of a stale stored one; only endpoints entered in the connection dialog persist as overrides
-
[web] reopening connection settings seeds the form from the active endpoint, so Connect keeps a custom endpoint instead of reverting it to the default
-
BREAKING [logs]
PutRetentionPolicyvalidatesretentionInDaysagainst AWS's fixed value set and returnsInvalidParameterExceptionotherwise, matching real CloudWatch Logs
migration: use one of the AWS-documented retention values (1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1096, 1827, 2192, 2557, 2922, 3288 or 3653 days) -
[router] debug tracing no longer pins an oversized request body's full backing array in memory when truncating it into the trace ring buffer, and internal CloudFormation dispatch hop bodies are capped at 1 MiB and flagged truncated
-
[router] traces of responses written without an explicit status code record 200 instead of appearing in-flight forever in the debug UI
-
[sns]
TagResourceandUntagResourceresponses include the empty result element botocore requires, so the AWS CLI no longer fails client-side after a successful tagging call -
[sns] tag operations answer a missing topic with error code ResourceNotFound as on real SNS; topic operations keep NotFound
-
[athena] TagResource validates tags (limit and reserved-prefix checks) with InvalidRequestException, matching real Athena
-
[eventbridge] tag operations no longer 500 (or panic) on a corrupt persisted tag blob, validate tags, surface store write failures, and answer ResourceNotFoundException for a rule or event bus that does not exist
-
[firehose] TagDeliveryStream accepts Tags as a list of {Key,Value} structs matching the real API instead of rejecting SDK requests with a 400; ListTagsForDeliveryStream serializes an untagged stream's Tags as [] rather than null
-
[pipes/router] the shared /tags/{resourceArn} route space now has a single dispatching owner that routes by the ARN's service prefix, so Pipes tag operations reach Pipes instead of silently landing in ...
v0.0.1-alpha.30
Overcast v0.0.1-alpha.30
Docker Images
Full image with the web management console:
- Pull:
ghcr.io/neaox/overcast:0.0.1-alpha.30 - Channel tag:
ghcr.io/neaox/overcast:alpha - Registry: overcast package
Headless slim image for CI pipelines:
- Pull:
ghcr.io/neaox/overcast-slim:0.0.1-alpha.30 - Channel tag:
ghcr.io/neaox/overcast-slim:alpha - Registry: overcast-slim package
docker run --rm -p 4566:4566 -p 4567:4567 ghcr.io/neaox/overcast:0.0.1-alpha.30
docker run --rm -p 4566:4566 ghcr.io/neaox/overcast-slim:0.0.1-alpha.30Native Binaries
Download a binary for your platform from the assets below and verify it with SHA256SUMS.
| Asset | SHA256 |
|---|---|
overcast-darwin-amd64 |
154b132c03433abeb20320a1799e735dbbc8318353f1a3fda98e7f42f6d017f0 |
overcast-darwin-arm64 |
c1983e6457d329a71a9b39bb98644a6e7c85ba035f81afff24969310cf9d42e6 |
overcast-linux-amd64 |
bd206ec3935acd9240a65d447308bfcad5de301d06ca3c78c98674305de7e1a4 |
overcast-linux-arm64 |
43fb09dadd7b210910dd0804a8001559a62b47321b5451b573403e0f0f52ff90 |
overcast-windows-amd64.exe |
b6f1491325d36dd9c65383aa395183ad70e744e0a34fea2194993b1c7d6d934c |
overcastd-darwin-amd64 |
236adea7334df619dff3e5fd0aad0752ec4462d07c0814429759c3068171d6ac |
overcastd-darwin-arm64 |
62afda0b2df35247429236246975887ede1b8dfe47301066fc6814234bc43451 |
overcastd-linux-amd64 |
b5bac75bd10f4de82e6e911c0f3c97706db5168000fb59be2dad37385a7140c4 |
overcastd-linux-arm64 |
5c5e510621878ecee921825aca3c27caaf1cc4036b109c40d07f92adfd12ba5b |
overcastd-windows-amd64.exe |
0ea5d784df00328103fd2a5e896f3daa085de65a786ffb2e264593eab726392a |
Release Notes
Added
- [waf/web/docs] add Web ACL metadata CRUD views, global search, and system-map nodes while accurately surfacing missing rule enforcement and 501 boundaries
Changed
- [web/ecs] service and task screens prioritize recent container failures, stopped tasks, and logs over follow-on scheduler noise
Fixed
-
[cloudformation/rds/ecs] CloudFormation waits for asynchronous resources to become usable before completing them and preserves their physical IDs through stabilisation failures so rollback can delete what it created.
AWS::RDS::DBInstanceandAWS::RDS::DBClusternow remain in progress until the database reportsavailable, or fail with RDS's recorded reason and roll the stack back;cdk deployno longer returns green while the engine is still initialising. Failed RDS databases and ECS services are now removed during rollback instead of being leaked under names that collide with the next deployment. -
[cloudformation/s3]
AWS::S3::Bucketnow applies lifecycle, versioning, notification, encryption, tag, CORS, and website properties through S3, including in-place updates, removals, and rollback restoration. S3 lifecycle configuration now validates and round-tripsNoncurrentVersionExpirationwhile true version-history execution remains tracked separately. -
[cloudformation/lambda] Lambda resources now preserve supported function and event-source properties, reject unsupported fields before mutation, roll back partial updates, and store validated resource policies safely
-
[sns/cloudformation] CloudFormation SNS topics and subscriptions now forward configured SNS attributes, including subscription filtering and raw SQS delivery (#522)
-
[ecs/web] cluster summaries and topology reflect current resources, while stopped tasks remain inspectable with AWS-compatible status, reason, and one-hour retention metadata
-
[ecs] stopped tasks retain a bounded container log tail for post-mortem diagnostics
-
[rds] database containers stopped, crashed, or removed through Docker are now recovered with bounded backoff immediately, after Docker reconnects, or during Overcast startup; repeated crash loops settle to
failed, onlyStopDBInstanceestablishes a durable stopped state, and MySQL 8 initialization now preserves AWS-valid special-character passwords while usingcaching_sha2_password -
[web/ecs] service diagnostics now keep the actual failed task and container logs visible instead of letting a later clean exit replace the cause; ECS screens add precise event times, two-way task navigation, and distinct working map destinations
Release: https://github.com/Neaox/overcast/releases/tag/v0.0.1-alpha.30
v0.0.1-alpha.29
Overcast v0.0.1-alpha.29
Docker Images
Full image with the web management console:
- Pull:
ghcr.io/neaox/overcast:0.0.1-alpha.29 - Channel tag:
ghcr.io/neaox/overcast:alpha - Registry: overcast package
Headless slim image for CI pipelines:
- Pull:
ghcr.io/neaox/overcast-slim:0.0.1-alpha.29 - Channel tag:
ghcr.io/neaox/overcast-slim:alpha - Registry: overcast-slim package
docker run --rm -p 4566:4566 -p 4567:4567 ghcr.io/neaox/overcast:0.0.1-alpha.29
docker run --rm -p 4566:4566 ghcr.io/neaox/overcast-slim:0.0.1-alpha.29Native Binaries
Download a binary for your platform from the assets below and verify it with SHA256SUMS.
| Asset | SHA256 |
|---|---|
overcast-darwin-amd64 |
e30067d382ad85882b047ad3f3f5ffdba9aa62fe153ccf5b511ffde58bb9f5bb |
overcast-darwin-arm64 |
e63537f321caf3c40332153f67ea03045c0ef5c2f91811922818bf46a594117b |
overcast-linux-amd64 |
dc1bc0fbc8c310afe96cec43306bc5653b5fdcc59da3e4bca8bed4c444f9ee9e |
overcast-linux-arm64 |
092e0f96a26240e88f99fd721fe4173be9f229b0830f91701b727dda86eeb89b |
overcast-windows-amd64.exe |
0c7aeda9f89551bd080e79468025e5d11ada06b60b2a96aa1d195797f12292c0 |
overcastd-darwin-amd64 |
17e5941eb1b097117588c682e9315df49eb72dbd15a55b4b75fdcab7abf497ef |
overcastd-darwin-arm64 |
1e606a262852328af745d561662138a1003837910b82a63e5a60db1e0efe3937 |
overcastd-linux-amd64 |
e2c4700f644e7ee4e27871445d7bec67e0eb5bd31c688230031d4f7ccd252dda |
overcastd-linux-arm64 |
c9d3403c5fdbf1fe6b9d2057903f68156b1b05868188074782a6d42c4999d664 |
overcastd-windows-amd64.exe |
5648600b256c6b265a3d50e16c735eb401add63d4ba5cae3de63c135a7a7d86d |
Release Notes
Added
-
BREAKING [stepfunctions] a real Amazon States Language interpreter —
StartExecutionnow runs the state machine instead of reportingSUCCEEDEDimmediately. All eight state types,Retry/Catch, the full Choice operator set and the input/output pipeline are interpreted;Taskstates invoke Lambda, SQS, SNS, DynamoDB and nested state machines through Overcast's own router.DescribeExecution,GetExecutionHistory,ListExecutions,StopExecution,DescribeStateMachineForExecutionandStartSyncExecutionreport what really ran, and the console gains an executions list and a state-history view. Anything Overcast cannot interpret —.waitForTaskToken, activity tasks,aws-sdk:integrations, distributedMap, JSONata — fails the execution loudly withStates.Runtimerather than passing through silently.CreateStateMachinenow rejects definitions that are not valid ASL withInvalidDefinition, as AWS does.StartExecutionreturns while the execution isRUNNINGandStopExecutionreally interrupts it, both matching AWS;StartSyncExecutionis the synchronous path
migration: an execution that used to reportSUCCEEDEDunconditionally can now legitimately endFAILEDorTIMED_OUT— assert on the real outcome. State machines created with a definition that is not valid ASL are rejected at create time.OVERCAST_STEPFUNCTIONS_EXECUTION_TIMEOUT(default15m) is a runaway guard on each execution; it is not on the request path, so ordinaryWaitstates are unaffected -
BREAKING [cloudwatch]
PutMetricAlarmrefuses alarm shapes it cannot evaluate — metric math, anomaly detection, extended statistics — with a501instead of creating an alarm that never fires
migration: replace a metric-math, anomaly-detection or percentile alarm with a single-metric alarm using Average, Sum, SampleCount, Minimum or Maximum -
[apigateway] usage-plan throttle and quota limits are measured on every request that presents an API key —
GetUsagereturns AWS's daily[used, remaining]log per key, and reaching a limit publishes anapigateway:Throttledevent.OVERCAST_ENFORCE_APIGATEWAY_THROTTLE(default off) turns that measurement into rejection, answering an over-limit request with API Gateway's429:TooManyRequestsExceptionfor the rate limit,LimitExceededExceptionfor the quota. The console's Usage Plans page shows each plan's rate, burst and quota, today's usage per API key, and a live feed of limits being reached -
[autoscaling] Auto Scaling groups converge for real — a single background reconciler launches and terminates EC2 instances until the owned instance set matches
DesiredCapacity, runs thePending/InService/Terminatinglifecycle, replaces unhealthy instances, and records aDescribeScalingActivitiesentry for every launch and termination.PutScalingPolicyexecutesSimpleScalingandStepScalingpolicies, throughExecutePolicyor from a CloudWatch alarm naming the policy ARN in its actions, honouring cooldowns andMinAdjustmentMagnitude;PutLifecycleHookreally pauses a launch or termination inPending:Wait/Terminating:Wait, publishes the EventBridge lifecycle-action event, and waits forCompleteLifecycleActionor the heartbeat timeout. New:DescribeScalingActivities,ExecutePolicy,CompleteLifecycleAction,RecordLifecycleActionHeartbeat,SetInstanceHealthandSetInstanceProtection -
[cloudwatch] alarm state transitions publish the
CloudWatch Alarm State Changeevent to EventBridge and notify SNS alarm actions; newDescribeAlarmHistory,EnableAlarmActionsandDisableAlarmActions, plusStateReasonData,Dimensions,DatapointsToAlarmand the action lists onDescribeAlarms. The console's CloudWatch page gains a live alarms view showing state, reason, what is being evaluated, and recent transitions -
[ecs/secretsmanager/ssm] a container definition's
secretsare resolved and injected as environment variables at task start, from Secrets Manager (including the:json-key:suffix thatecs.Secret.fromSecretsManager(secret, "password")produces) or SSM Parameter Store. They were parsed into nothing, so a task promised its credentials started without them and the application failed to reach its database with no explanation. A secret that cannot be resolved is named in a warning and left out rather than injected empty, which would be indistinguishable from a secret whose value is the empty string -
[ecs/logs] task containers using the
awslogslog driver have their output shipped to CloudWatch Logs, into the group fromawslogs-groupand a stream named<prefix>/<container>/<task-id>as on ECS — under either launch type and however the task was started. A crash-looping task previously explained itself nowhere, its container being gone beforedocker logscould reach it -
[ecs] deployments report
rolloutState,rolloutStateReasonandfailedTasks, and a service records the AWS-shaped events for a placement failure, for being unable to consistently start tasks, and for a tripped deployment circuit breaker. In the console a service row expands to show its rollout state, failed task count and event log, and task detail showsstopCodeand per-container failure reasons; the Run Task and Create Service dialogs now take subnets, security groups and assignPublicIp, so a Fargate task can be started from the UI at all — it previously always failed with "Network Configuration must be provided when networkMode is 'awsvpc'" -
[ecs/elbv2] a service registers its tasks with the target groups in its
loadBalancers, at the task's ENI address and container port, and deregisters them when they stop or the service scales in -
[efs] mount targets can serve a real NFSv4 export —
OVERCAST_EFS_NFS=truein live mode starts one unprivileged NFS-Ganesha container per mount target, with access points as pseudo-paths -
[elbv2/ecs] a load balancer forwards to its targets, so
ApplicationLoadBalancedFargateServicehands out a URL that serves the application. A listener now stores theDefaultActionscarrying its target group — previously parsed by the CloudFormation handler and dropped — and a request arriving on the load balancer's DNS name is proxied round robin to a registered target, preserving the Host so an app behind it builds its own links correctly. A load balancer with nothing healthy behind it answers 503, as ALB does -
[eventbridge] rule targets now fan out to Lambda, SNS, Step Functions, Kinesis and Firehose, not just SQS and scheduled ECS tasks; an EventBridge event bus is also a valid target, delivered through
PutEventswith a hop budget so bus-to-bus forwarding cannot recurse.InputPathandInputTransformerare applied to a target's payload before delivery, and a failed delivery honours the target'sRetryPolicyand dead-letter queue. The console's bus view lists each rule's targets with its resolved type and the last delivery outcome — delivered, retried, dead-lettered or dropped -
[iam]
SimulateCustomPolicy, evaluating policy documents passed in the request without touching any stored entity. Opt-in request-time enforcement (OVERCAST_ENFORCE_IAM, unchanged and still off by default) now shares the simulator's evaluator, so a simulation describes what enforcement would decide, and it is documented in the IAM service reference. The console's IAM page gains a policy simulator — pick a principal or paste a policy, see the decision and the statements behind it — with the enforcement flag's state shown beside it, so anAccessDeniedcan be told apart from an application bug -
[pipes/web] a pipe detail view showing the resolved source, enrichment and target types, recent executions, and whether a pipe is actually wired or only stored
-
[release] breaking changes wait while a minor or patch release PR is open. That PR's section of
CHANGELOG.mdis written and reviewed while it sits there, and every push tomainis folded into it, so a break merged in the window ships under a version number that promised there was none. The release bot comments on the held pull request with the entries holding it and t...