All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.5.17 - 2026-05-18
- neptune: Neptune control plane —
CreateDBCluster,DescribeDBClusters,ModifyDBCluster,DeleteDBCluster,CreateDBInstance,DescribeDBInstances,ModifyDBInstance,DeleteDBInstance; each cluster is backed by a real TinkerPop Gremlin Server Docker container behind a transparent TCP proxy (#881) - apigateway:
GetAccountandUpdateAccount— account-level configuration including throttle settings and CloudWatch log role ARN; enables Terraform and CDK stacks that callaws_api_gateway_account(#867) - apigatewayv2:
HTTP_PROXYintegration type — forwards inbound requests to the configuredIntegrationUriwithRequestParameterstransformations matching AWS-faithful semantics (#860) - dynamodb:
ExecuteStatement,ExecuteTransaction,BatchExecuteStatement— hand-rolled PartiQL tokenizer and recursive-descent parser supporting SELECT/INSERT/UPDATE/DELETE,?positional placeholders,begins_with, andBETWEEN; translates to existing service calls with no new storage (#864) - sns:
FilterPolicyScope=MessageBody— filter policies scoped to the message body are now evaluated at publish time; previously the scope was persisted but ignored, delivering all messages regardless of the policy (#863) - cognito:
PostConfirmationandPreSignUpLambda triggers —PostConfirmation_ConfirmSignUpfires afterConfirmSignUp;PreSignUp_SignUpfires before user persistence onSignUp;autoConfirmUser=truein the PreSignUp response auto-confirms and chains into PostConfirmation (#859) - ses:
PutAccountSuppressionAttributes(PUT /v2/email/account/suppression) — set account-level suppression list reasons (BOUNCE/COMPLAINT);GetAccountresponse now includes aSuppressionAttributesobject reflecting the stored setting (#853) - cur / bcm-data-exports: Cost and Usage Reports (
AWSOrigamiServiceGatewayService.*) and BCM Data Exports (AWSBillingAndCostManagementDataExports.*) management planes sharing one underlying export pipeline (#850)
- dynamodb: honor legacy
Expectedcondition inUpdateItem—handleUpdateItemnow reads theExpectedfield, andevaluateLegacyExpectednormalizes the legacy{"Value": x}shape to{"AttributeValueList": [x]}before evaluation; conditional writes that should fail were silently succeeding (#888) - apigatewayv2:
Routeresponses now includeauthorizerId— the field was persisted and used at dispatch time but never emitted bytoV2RouteNode, breaking SDK and Terraform reads (#887) - eventbridge: persisted rules no longer disappear on reload —
Rule.getRegion()is a derived getter with no setter;ObjectMapperwrote"region"intoeventbridge-rules.jsonand then threwUnrecognizedPropertyExceptionon startup, causing all persisted rules to be silently dropped (#878) - s3:
PutObjectnow returns the checksum for the algorithm actually specified by the caller; previously always returnedChecksumSHA1+ChecksumSHA256regardless of--checksum-algorithm(#877) - eks: cluster readiness polling now uses the container's bridge IP instead of the container hostname, fixing clusters stuck in
CREATINGwhen Floci runs inside Docker; startup failures are handled gracefully instead of returning 500 (#873) - eventbridge: region is now correctly propagated through rule dispatch so SQS queue lookup uses the rule's region rather than the primary region (#870)
- eventbridge:
EventBusNameis now accepted as a full ARN (arn:aws:events:…:event-bus/my-bus) in addition to a plain name across all EventBridge operations (#843)
1.5.16 - 2026-05-15
- stepfunctions:
ValidateStateMachineDefinition— validates ASL definitions and returns structured diagnostics with/States/<state>/<field>paths for precise error location (#845) - stepfunctions:
ListTagsForResource,TagResource,UntagResourcefor state machines and activities; covers both the AWS SDK (JSON 1.0) and Terraform (REST) wire paths (#767) - rds: cluster parameter group actions —
CreateDBClusterParameterGroup,DescribeDBClusterParameterGroups,DeleteDBClusterParameterGroup,ModifyDBClusterParameterGroup,DescribeDBClusterParameters; mirrors the existing instance-level parameter group shape and unblocks IaC stacks that define AuroraClusterParameterGroupresources (#838) - s3: full
SelectObjectContentevaluator with floci-duck integration — recursive WHERE (AND, OR, NOT, LIKE, BETWEEN, IN, IS NULL, comparisons), JSON Lines and JSON array input formats, cross-format output (CSV→JSON, JSON→CSV), realBytesScanned/BytesReturnedstats; routes CSV and JSON through floci-duck when available with a pure-Java fallback for standalone mode (#835) - eventbridge:
UpdateEventBus— update event bus description, KMS key, dead-letter config, or log config (#834) - ce: AWS Cost Explorer service —
GetCostAndUsage,GetCostAndUsageWithResources,GetDimensionValues,GetTags,GetReservationCoverage,GetReservationUtilization,GetSavingsPlansCoverage,GetSavingsPlansUtilization,GetCostCategories; cost is synthesized from existing resource state multiplied by the bundled pricing snapshot; supportsDAILY/MONTHLY/HOURLYgranularity, all standard metrics, andGroupByonDIMENSION,TAG, andCOST_CATEGORY(#832) - transcribe: AWS Transcribe service —
StartTranscriptionJob,GetTranscriptionJob,ListTranscriptionJobs,DeleteTranscriptionJob,CreateVocabulary,GetVocabulary,ListVocabularies,UpdateVocabulary,DeleteVocabulary(#827)
- core: remove AWS SDK from Floci's runtime classpath to eliminate version conflicts with user-bundled SDKs (#846)
- core: improve log level structure and reduce noise in hot paths (#847)
- s3: make
us-east-1bucket creation idempotent — repeatedCreateBucketcalls for the same bucket inus-east-1no longer raiseBucketAlreadyOwnedByYou(#844) - ec2: support wildcard (
*,?) filter values across all EC2 resources (VPCs, Subnets, Security Groups, Instances, Internet Gateways, Route Tables, Volumes), matching real AWS filter behavior (#837) - pricing: bundle pricing snapshot resources into the native image — the Price List service was unavailable in GraalVM native builds (#836)
- kms:
Encryptnow derives a fresh AES-GCM nonce per call (was deterministic, leaking plaintext equality);Decryptnow validatesEncryptionContextas AAD and raisesInvalidCiphertextExceptionon any mismatch (#825) - s3: strip
charsetparameter fromContent-Typein XML responses (#809) - sqs: FIFO
ReceiveMessagenow returns messages from multiple distinct message groups in a single call (#785) - sqs: honor
AttributeNamesandMessageSystemAttributeNamesonReceiveMessage(#784) - sqs: implement
AddPermissionandRemovePermission(#781) - stepfunctions: honor
TimeoutSecondsonParallelstate (#771)
- Improve README readability (#831)
1.5.15 - 2026-05-13
- pricing: AWS Price List Service —
DescribeServices,GetAttributeValues,GetProducts,ListPriceLists,GetPriceListFileUrlwith pagination; backed by a bundled static snapshot;PriceListshape matches the real SDK's array-of-JSON-strings format (#821) - eventbridge:
TestEventPattern— validates a sample event against a pattern without firing any targets; returns{"Result": <bool>}; raisesInvalidEventPatternExceptionon malformed patterns (#824) - ses: v2 suppression list endpoints —
PutSuppressedDestination,GetSuppressedDestination,DeleteSuppressedDestination,ListSuppressedDestinations(#813) - s3: virtual-hosted style addressing —
*.s3.localhost.floci.io,*.localhost.localstack.cloud, and*.s3.localhost.localstack.cloudare now resolved as virtual-hosted buckets;EmbeddedDnsServershipslocalhost.localstack.cloudandlocalhost.floci.ioas built-in suffixes so spawned containers resolve correctly without extra config (#805) - cloudwatch-logs:
PutSubscriptionFilter,DescribeSubscriptionFilters,DeleteSubscriptionFilter— upsert semantics andByLogStreamdefault distribution (#810)
- dynamodb: broad conformance pass —
ValidationException(wasInvalidParameterValue) for table-name errors; min-length 3 enforced for all operations;ListTablesalphabetical ordering,Limitvalidation, pagination; enum validation forReturnValues/ReturnConsumedCapacityfires before table lookup;ProjectionExpressiononGetItem,Query,Scan,BatchGetItem;Select=COUNTomitsItems; parallel scanSegment/TotalSegmentsvalidation with hash-based sharding; reserved words rejected inFilterExpression/ConditionExpression/UpdateExpression; legacyAttributesToGet,AttributeUpdates,QueryFilter,ScanFilter,KeyConditionsAPI; item size limit (400 KB) and number normalization on write;TagResource/UntagResource/ListTagsOfResourcewith ARN validation;SETinto a non-existent nested map auto-creates the map (#826) - dynamodb:
SET a = :v, b = anow reads pre-update value ofaforb(atomic snapshot semantics);ClientRequestTokenidempotency with 10-minute TTL and SHA-256 body-hash conflict detection; parenthesized arithmeticSET c = (c - :v)now applies correctly (#804) - apigateway: sibling
{proxy+}resources now resolved by longest parent prefix, matching real AWS routing behaviour (#811) - cloudformation: provision
AWS::ApiGateway::Authorizerand wireAuthorizerIdon methods — previously the resource was silently stubbed, leaving stacks reportingCREATE_COMPLETEwith no authorizer registered (#796) - cloudformation: preserve
Targets[].SqsParameters(includingMessageGroupId) when provisioningAWS::Events::Rule— FIFO SQS targets delivered without aMessageGroupIdwere rejected by AWS (#793) - sqs: return MD5 of current request body on FIFO deduplication replay (#786)
- sqs: honor
MaximumMessageSizeattribute onSendMessage(#782) - sqs: omit
Messagesfield from emptyReceiveMessageJSON response (#780) - sns: enforce message size limits on
PublishandPublishBatch(#783) - ses: allow
SendRawEmailwithoutSourcewhen aFrom:header is present in the MIME payload (#800) - lambda: automatically detect the Docker network of the running Floci container and use it for spawned Lambda containers — removes the need to manually set
FLOCI_SERVICES_LAMBDA_DOCKER_NETWORKin Docker Compose setups (#765) - core: fix CRLF line-ending issues on Windows by adding
.gitattributesnormalisation rules (#790)
1.5.14 - 2026-05-10
- textract: Textract service support —
DetectDocumentText,AnalyzeDocument,StartDocumentTextDetection,GetDocumentTextDetection,StartDocumentAnalysis,GetDocumentAnalysis(#719) - multitenancy: per-account storage isolation across all services — if the AWS access key ID is exactly 12 digits, it is used directly as the account ID and all resources are fully isolated from other accounts (#753)
- tls: optional TLS/HTTPS support — set
FLOCI_TLS_ENABLED=trueto serve all endpoints over HTTPS; auto-generates and persists a self-signed certificate that includesFLOCI_HOSTNAME/FLOCI_BASE_URLin its SANs; user-provided certificates supported viaFLOCI_TLS_CERT_PATHandFLOCI_TLS_KEY_PATH(#754) - apigatewayv2: WebSocket data-plane support —
wss://connections,PostToConnection,GetConnection,DeleteConnection,@connect/@disconnect/$defaultroutes (#712) - cognito:
UpdateGroup,ListUsersInGroup(#761) - cognito:
AdminCreateUserwithMessageAction=RESEND(#755) - ses:
UpdateAccountSendingEnabled(v1 Query protocol) (#737) - ses:
TagResource,UntagResource,ListTagsForResourceon v2 REST JSON protocol (#749) - ses: v2 tag endpoints extended to
EmailTemplateARNs (#759) - ses: v2 tag endpoints extended to
EmailIdentityARNs (#760) - docker: named-volume storage for child containers (RDS, ElastiCache, OpenSearch, MSK) so data survives container restarts without requiring a host bind-mount (#743)
- docker: ship
awslocalCLI wrapper in the-compatimage (#746)
- cfn: reconcile Lambda functions on stack update (#736)
- docker:
/etc/floci/aws/configmissing in published Docker images (#740) - eventbridge: persist and forward
SqsParameters.MessageGroupIdfor FIFO SQS targets (#742) - sqs: tags set at
CreateQueuenot returned byListQueueTags(#747) - apigateway: treat
ANYmethod as wildcard when matching concrete HTTP methods (#750) - s3: parse
versionIdfrom copy-source header forCopyObjectand multipart part-copy (#751) - sqs: drop uppercase
"Tags"key fromCreateQueueJSON handler to match AWS wire format (#752)
- All service and configuration docs moved to environment-variable-first;
application.ymlreference moved toconfiguration/advanced/ - New page: Multi-Account Isolation
- New page: TLS / HTTPS
- Go Testcontainers page rewritten to match the published
testcontainers-floci-goAPI - LocalStack migration table completed with all mapped variables (
USE_SSL,CUSTOM_SSL_CERT_PATH,DOCKER_HOST,PERSIST_STATE,LAMBDA_REMOTE_DOCKER)
1.5.13 - 2026-05-07
- backup: AWS Backup Phase 1 — vaults, plans, selections, on-demand jobs with simulated CREATED→RUNNING→COMPLETED lifecycle, recovery points, tagging via
SharedTagsController, andGetSupportedResourceTypes - codedeploy: Server platform (Phase 4) — on-premises instance management (
RegisterOnPremisesInstance,DeregisterOnPremisesInstance,GetOnPremisesInstance,BatchGetOnPremisesInstances,ListOnPremisesInstances,AddTagsToOnPremisesInstances,RemoveTagsFromOnPremisesInstances); Server AppSpec YAML parsing; EC2 and on-premises instance resolution by tag filters; full lifecycle event execution (ApplicationStop→DownloadBundle→BeforeInstall→Install→AfterInstall→ApplicationStart→ValidateService); SSM Run Command integration for hook script execution with graceful degradation when SSM is unavailable; per-instanceInstanceTargettracking inListDeploymentTargets/BatchGetDeploymentTargets - elbv2: Lambda target type — ALB listeners forward requests to Lambda functions using the full ALB→Lambda event format (
httpMethod,path,queryStringParameters,multiValueQueryStringParameters,headers,multiValueHeaders,body,isBase64Encoded); Lambda→ALB response mapping (statusCode,headers,multiValueHeaders,body,isBase64Encoded); Lambda target groups always report as healthy inDescribeTargetHealthwithout HTTP probing - eventbridge: Archive and Replay support —
CreateArchive,DescribeArchive,UpdateArchive,DeleteArchive,ListArchives,StartReplay,DescribeReplay,CancelReplay,ListReplays; events captured automatically to matching archives and replayed on demand (#702) - route53: Route53 Phase 1 — hosted zones with auto-created SOA + NS records,
ChangeResourceRecordSets(CREATE/UPSERT/DELETE with atomic batch validation),ListResourceRecordSets, change tracking (always INSYNC), health checks (create/get/list/update/delete), and per-resource tagging viaChangeTagsForResource/ListTagsForResource - scheduler:
TagResource,UntagResource,ListTagsForResourcefor schedule groups (#700) - sqs, dynamodb: TRACE-level payload logging for request and response bodies to aid debugging (#697)
- ssm: Run Command —
SendCommand,GetCommandInvocation,ListCommands,ListCommandInvocations,CancelCommand,DescribeInstanceInformation;UpdateInstanceInformation(agent registration);ec2messagespolling protocol (GetMessages,AcknowledgeMessage,SendReply,FailMessage,DeleteMessage,GetEndpoint) so the realamazon-ssm-agentrunning inside EC2 containers can register, receive commands, and report output - transfer: Transfer Family management-plane API — server lifecycle (
CreateServer,DescribeServer,DeleteServer,ListServers,StartServer,StopServer,UpdateServer), user management (CreateUser,DescribeUser,DeleteUser,ListUsers,UpdateUser), SSH key management (ImportSshPublicKey,DeleteSshPublicKey), and tagging (TagResource,UntagResource,ListTagsForResource)
- appconfig: use capital
"Tags"body key inTagResource/ListTagsForResourceto match AWS SDK wire format (#704) - docker: respect
DOCKER_HOSTenv var and handle barehost:portvalues without a URI scheme (#705) - ec2:
AssociateRouteTablenow returns<associationState>in the response;DescribeRouteTablessupports theassociation.route-table-association-idfilter;DescribeTagscorrectly appliesresource-id,resource-type,key, andvaluefilters (#706)
1.5.12 - 2026-05-04
- apigatewayv2: WebSocket API support, Update ops, Route/Integration Responses, Models, and Tagging (#682)
- autoscaling: EC2 Auto Scaling stored-state management API and capacity reconciler (#681)
- ses: add
TestRenderTemplate(v1) andTestRenderEmailTemplate(v2) (#692) - glue: Schema Registry support — registries, schemas, versions, compatibility checks, metadata, tags, and Java SerDe SDK compatibility (#621)
- parity: LocalStack drop-in compatibility layer (#696)
- sfn: apply
ItemSelector/Parameterstransformation in Map state (#683) - ecs: fix delete resource issue (#685)
- lambda: use function region in container AWS environment (#687)
- cloudformation: adopt existing DynamoDB tables on stack update (#689)
- cloudformation: resolve Floci virtual-hosted template URLs (#690)
- docker: fix
ARGordering in compat Dockerfile soVERSIONbuild-arg is applied correctly
1.5.11 - 2026-05-02
- ec2: real Docker container execution with SSH, UserData, and IMDS support (#658)
- cognito: implement
AdminRespondToAuthChallengeoperation (#666) - pipes: populate SQS message attributes in pipe source records (#667)
- cloudformation: add
Fn::ImportValuecross-stack reference resolution (#669) - elbv2: ALB proxy, CodeDeploy, and ECS integration (#677)
- lambda: support
ImageConfig.WorkingDirectory(#673)
- Normalize bare
host:portDocker host values to prevent URI parse failure (#665) - athena: use embedded DNS server to resolve S3 URL used by floci-duck containers (#672)
- iam: protocol-aware Access Denied response in IAM enforcement filter (#657)
- iam: read
Actionfrom form body in IAM enforcement filter (#655) - lambda: fix incorrect request size limit (#674)
- sqs: inject
QueueUrlinto form body for query protocol path-based requests (#670) - ecr: properly check if
host-persistent-pathis the name of a Docker volume (#678)
1.5.10 - 2026-04-30
- lambda: support
ImageConfigCommandandEntryPointfor container images (#630) - ses: add
ConfigurationSetCRUD on v1 Query and v2 REST JSON protocols (#631) - cloudformation: provision
AWS::Pipes::Piperesources (#634) - cognito: include all standard attributes in
DescribeUserPoolschema (#642) - ses: add
SendBulkEmail(v2) andSendBulkTemplatedEmail(v1) (#645) - cognito: Custom Auth Flow integration with Lambda triggers (#646)
- codebuild, codedeploy: implement real Docker-based build execution (phase 2) (#649)
- iam: seed 23 additional AWS managed execution-role policies (#650)
- dynamodb: implement
ExportTableToPointInTime,DescribeExport, andListExports(#653) - cloudformation: support
AWS::Lambda::EventSourceMappingresource type (#654)
- docker: replace
bash /dev/tcpHEALTHCHECK withbusybox wgetfor Alpine runtime compatibility (#625) - pipes: resolve
InputTemplatepaths through JSON-encoded string fields (#635) - dynamodb: fix GSI query pagination infinite loop when items share a sort key (#637)
- cloudformation: wrap
ZipFileinline source in a zip archive before passing to Lambda (#639) - lambda: inject log group, log stream, and Floci endpoint env vars into Lambda containers (#640)
- cloudformation: resolve path-style AWS S3
TemplateURLagainst local S3 (#641) - eks: use named Docker volume for k3s data directory to avoid
EINVALon macOS APFS (#643) - apigateway: support
_custom_id_tag onCreateRestApi(#644) - apigateway: implement
GET /restapis/{id}/deployments/{deploymentId}(#652) - athena: connect to floci-duck container via IP instead of DNS (#648)
1.5.9 - 2026-04-28
- elbv2: Elastic Load Balancing v2 management API — Phase 1 (#617)
- codebuild, codedeploy: add management APIs (#622)
- cloudformation: resolve changesets by ARN in
DescribeChangeSet,ExecuteChangeSet,DeleteChangeSet(#608) - lambda: drop dead pooled containers in
WarmPool.acquire()before reuse (#610) - apigateway: propagate TOKEN authorizer context to
AWS_PROXYLambda integrations (#581) - pipes: invoke non-Lambda targets per-record instead of batch envelope (#590)
- docker: avoid host mountinfo false positives in container detection (#616)
- s3: emit
x-amz-transition-default-minimum-object-sizeon lifecycleGET/PUT(#615) - s3: fix OOM on
PutObjectwith large payloads (#620) - kms:
GetKeyRotationStatusnow returnsfalsefor asymmetric and HMAC keys (#618) - lambda: inject default AWS credentials into Lambda containers (#623)
- ec2: persist VPC DNS attributes and support
DescribeVpcEndpointServices(#624)
1.5.8 - 2026-04-25
- pipes: add filtering, input templates, batch sizes, and DLQ routing (#576)
- cognito: add
TagResource,UntagResource,ListTagsForResourcefor user pools (#579) - ses: implement email template CRUD with stored, inline, and ARN variants (#573)
- sqs: clear SNS FIFO deduplication cache on
PurgeQueue(#594) - athena: real SQL execution via floci-duck DuckDB sidecar (#584)
- lambda: embedded DNS server for virtual-hosted S3 URL resolution inside containers (#585)
- lambda: bind-mount hot-reload via
S3Bucket=hot-reload(#601)
- dynamodb: accept full ARN for
TableNameacross all operations (#580) - dynamodb: enforce
DeletionProtectionEnabledon create, update, and delete (#583) - lambda: support nested Python handler module paths (#570)
- dynamodb: serialise concurrent mutations and transactions via per-item locks (#572)
- pipes: return parameters and tags in mutation responses; warn on stream record loss (#588)
- pipes: read
EventBridgeEventBusParametersforSourceandDetailType(#589) - lambda: parse empty payload without error (#600)
- docker: make bind-mounted
/var/run/docker.sockwork on all host types (#602) - lambda: replace blocking
/nexthandler with reactive pattern (#596) - lambda: wire
S3VirtualHostFilterto container-aware DNS suffix (#598) - s3-control: accept plain S3 ARN (
arn:aws:s3:::bucket) inListTagsForResource(#603) - rds: fix
DBSubnetGroupshape, non-master auth pass-through, and volume lifecycle (#604)
1.5.7 - 2026-04-23
- docker: fix Docker image build issue introduced in 1.5.6
1.5.6 - 2026-04-23
- ses: SMTP relay support for
SendEmailandSendRawEmail(#534) - appconfig: resource tagging and predefined deployment strategies (#533)
- firehose: implement
DeleteDeliveryStreamAPI (#535) - pipes: EventBridge Pipes service — CRUD API, source polling, and target invocation (#539, #555)
- docker: centralize Docker config and add private registry authentication (#549)
- scheduler: invoke targets when EventBridge Scheduler schedules fire (#551)
- secretsmanager: add
UpdateSecretVersionStagehandling (#545) - cognito, kms: allow caller-pinned resource IDs via the reserved
floci:override-idtag (#568) - sqs: add option to clear deduplication cache on
PurgeQueue(#561)
- dynamodb: return correct attributes for
UPDATED_NEW/UPDATED_OLDon new items (#538) - lambda: initialize ESM pollers at startup; fix worker-pool exhaustion in RuntimeApiServer (#543)
- secretsmanager: fix incorrect update of
AWSPENDINGon secret value update (#542) - kms: support
HMAC_*key specs inCreateKey(#544) - lambda: add missing
FunctionConfigurationfields and fix response shape (#546) - s3: wrap S3 Control XML errors in
ErrorResponsewrapper (#560) - native, acm: fix native image reflection for ACM (#559)
- s3: enforce conditional writes (#566)
1.5.5 - 2026-04-19
- eks: implement EKS service with real k3s data plane support (#493)
- s3: implement static website hosting with index document redirection (#507)
- lambda: reactive S3-to-Lambda sync for hot-reloading (#509)
- dynamodb: support
ReturnValuesOnConditionCheckFailure(#505) - eventbridge: add
PutPermissionandRemovePermissionsupport (#499) - cognito: implement
AdminEnableUserandAdminDisableUser(#514) - cognito: implement
AdminResetUserPassword(#516) - kinesis: support
AT_TIMESTAMPshard iterator type (#520) - opensearch: real OpenSearch container support via Docker image (#528)
- secretsmanager: add version stages handling in
PutSecretValue(#527) - s3: preserve explicit object server-side-encryption headers (#515)
- dynamodb: support arithmetic in SET expressions (#480)
- sqs: include
MD5OfMessageAttributesinSendMessageBatchJSON response (#496) - cloudformation: forward Lambda environment variables during stack provisioning (#510)
- kms: support
ECC_SECG_P256K1via BouncyCastle JCA (#502) - dynamodb: validate sort key in
buildItemKeyto prevent item collisions (#506) - storage: make
scan()return a mutable list for non-in-memory backends (#517) - ses: align
/_aws/sesinspection endpoint with LocalStack behavior (#512) - lifecycle: run shutdown hooks before HTTP server stops (#519)
- kinesis: return real
ShardIdinPutRecordandPutRecordsresponses (#518) - lambda: restore create-copy-start ordering for provided runtimes (#524)
- lambda: fix container lifecycle on timeout (#529)
- lambda: destroy container handle on interrupt and generic exceptions (#530)
- lambda: wake blocked
/nextpoller and drain queue onRuntimeApiServer.stop()(#531)
- s3: harden path traversal defenses in
S3ServiceandS3Controller(#508)
1.5.4 - 2026-04-17
- iam: seed AWS managed policies at startup (#400)
- s3: preserve
Content-Dispositionon object responses (#408) - sfn: add SQS
sendMessageAWS SDK integrations (#409) - kinesis: implement
EnableEnhancedMonitoringandDisableEnhancedMonitoring(#417) - msk: implement Amazon MSK service with Redpanda orchestration (#419)
- dynamodb: add
EnableKinesisStreamingDestinationsupport (#427) - lambda: enforce reserved and per-region concurrency (#424)
- eventbridge: implement
TagResourceandUntagResource(#453) - cloudwatch: implement
GetMetricData(#451) - cognito: create, list, and delete user pool client secrets (#345)
- ec2: implement
CreateVolume,DescribeVolumes,DeleteVolume(#455) - athena, glue, firehose: implement local Data Lake stack with real SQL execution (#429)
- tagging: implement Resource Groups Tagging API (#459)
- bedrock-runtime: stub
ConverseandInvokeModel(#486) - kinesis: implement
UpdateStreamMode(#488) - lambda: support
ScalingConfig.MaximumConcurrencyon SQS event source mappings (#490) - lambda: add
UpdateFunctionConfigurationAPI (#472) - dynamodb: support
UPDATED_OLDandUPDATED_NEWReturnValues(#477)
- elasticache: scope single-arg
AUTHto default user per Redis ACL spec (#390) - auth: bind SigV4 token identity and use timing-safe comparison (#389)
- apigatewayv2: add missing JSON handler operations and
stageNameauto-deploy (#393) - cloudformation: populate SQS queue ARN in resource attributes (#396)
- elasticache, rds: prevent orphaned Docker containers on shutdown and restart (#398)
- s3: remove XML declaration from
GetBucketLocationresponse (#403) - lambda: resolve handler paths with subdirectories; skip validation for dotnet runtimes (#404)
- iam: enforce IAM when enabled (#411)
- dynamodb: implement
DELETEaction for set attributes (#415) - sqs: use queue-level
VisibilityTimeoutas fallback inReceiveMessage(#413) - lambda: raise Jackson
maxStringLengthfor large inline zip uploads (#418) - dynamodb: support
REMOVEfor nested map paths (#421) - cognito: return only description fields in
ListUserPoolClients(#420) - s3: honor canned object ACLs on write paths (#422)
- ecr: fall back to named volume for registry data when
host-persistent-pathis unset inside containers (#442) - kinesis: return time-based
MillisBehindLatest(#444) - lambda: accept name, partial ARN, and full ARN for
{FunctionName}path parameter (#450) - dynamodb: accept newline as
UpdateExpressionclause separator (#449) - cognito: add
audclaim to ID tokens (#454) - s3: implement bucket ownership controls (#456)
- dynamodb: support continuous backups and PITR actions (#458)
- kinesis: accept AWS SDK v2 CBOR content type (#457)
- dynamodb: fix expression evaluation,
UpdateExpressionpaths, andConsumedCapacity(#197) - lambda: include
LastUpdateStatusin function configuration responses (#463) - Add log rotation by default to all Floci-launched containers (#466)
- sqs: honor queue-level
DelaySecondson FIFO queues (#476) - ecr: fix port and network issues (#483)
- s3-control: accept URL-encoded ARNs and return XML errors (#491)
1.5.3 - 2026-04-12
- appconfig: new AppConfig service (#324)
- ecr: new ECR service — push, pull, manage repositories and images (#337)
- docker: add
HEALTHCHECKto all Floci Dockerfiles (#328) - lambda: add
PutFunctionConcurrencystub (#325)
- Unify service metadata behind a descriptor-backed catalog for enablement, routing, and storage lookups (#357)
- s3: return XML error responses for presigned POST failures (#327)
- sqs: make per-queue message operations atomic (#333)
- eventbridge: apply
InputPathwhen delivering events to targets (#335) - cloudformation: topologically sort resources before provisioning (#332)
- s3: return empty
LocationConstraintforus-east-1buckets (#336) - dynamodb: attach
X-Amz-Crc32header to JSON protocol responses (#347) - cognito: return sub UUID as
UserSubinSignUpresponse (#351) - kinesis: accept same-value
Increase/DecreaseStreamRetentionPeriod(#352) - sns: recognize attributes set during subscription creation (#353)
- ecr, s3: fix CDK compatibility and resolve macOS ECR port conflict (#354)
- kms: implement real asymmetric sign/verify and
GetPublicKey(#355) - eventbridge: implement advanced content filtering operators (#356)
- cognito: correct HMAC signature computation in
USER_SRP_AUTH(#358) - s3: include non-versioned objects in
ListObjectVersionsresponse (#359) - secretsmanager: resolve partial ARNs without random suffix (#360)
- lambda: correct Function URL config path from
/url-configto/url(#364) - elasticache: scope user auth to groups, use
StorageFactory, throwNotFoundFault(#367) - apigatewayv2: fix route matching for path-parameter routes (#368)
- s3: implement S3 Control
ListTagsForResource,TagResource,UntagResource(#363) - cloudformation: resolve stacks by ARN in addition to name (#386)
1.5.2 - 2026-04-10
- kinesis: add
IncreaseStreamRetentionPeriodandDecreaseStreamRetentionPeriod(#305) - kinesis: resolve stream name from
StreamARNparameter (#304) - kms: add
GetKeyRotationStatus,EnableKeyRotation, andDisableKeyRotation(#290) - s3: preserve
Cache-Controlheader onPutObject,GetObject,HeadObject, andCopyObject(#313)
- apigateway: implement v2 management API and CloudFormation provisioning (#323)
- cloudwatch: implement tagging support for metrics and alarms (#320)
- dynamodb: handle null for Java AWS SDK v2 DynamoDB
EnhancedClient(#309) - dynamodb: implement
list_appendwithif_not_existssupport (#317) - dynamodb: remove duplicate
list_appendhandler that breaks nested expressions (#321) - rds:
DescribeDBInstancesreturns empty results due to wrong XML element names and missingFilterssupport (#319) - s3: preserve leading slashes in object keys to prevent key collisions (#286)
- Support LocalStack-compatible
_user_request_URL for API Gateway execution (#314)
1.5.1 - 2026-04-09
- Native image build failure due to
SecureRandominCognitoSrpHelper
1.5.0 - 2026-04-09
- cloudformation: add
AWS::Events::Ruleprovisioning support (#261) - eventbridge: add
InputTransformersupport and S3 event notifications (#294) - dynamodb: load persisted DynamoDB streams on startup (#299)
- Native build: append
-march=x86-64-v2for amd64 compatibility (#303) - dynamodb:
DescribeTablereturnsProjection.NonKeyAttributes(#300) - rds: implement missing resource identifiers and fix filtering (#302)
- s3: implement S3 Lambda notifications (#278)
- cognito: implement SRP-6a authentication (#298)
- s3: use case-insensitive field lookup for presigned POST policy validation (#289)
- s3: use
ConfigProviderfor runtime config lookup inS3VirtualHostFilter(#288) - Register Xerces XML resource bundles for native image (#296)
1.4.0 - 2026-04-08
- kms: add
GetKeyPolicy,PutKeyPolicy, and fixCreateKeytag handling (#280) - ses: add SES V2 REST JSON protocol support (#265)
- lambda: add missing runtimes and fix handler validation (#256)
- scheduler: add EventBridge Scheduler service (#260)
- secretsmanager: add
BatchGetSecretValuesupport (#264) - sfn: nested state machine execution and activity support (#266)
- Use AWS-specific content type in all JSON-based controller responses (#240)
- dynamodb: add
list_appendsupport to update expressions (#277) - Default shell executable to
/bin/shfor Alpine compatibility (#241) - lambda: drain warm pool containers on server shutdown (#274)
- dynamodb: support
addfunction with multiple values (#263) - Handle base64-encoded ACM certificate imports (#248)
- dynamodb: include
ProvisionedThroughputin GSI responses (#273) - Return 400 when encoded S3 copy source is malformed (#244)
- cognito: resolve auth, token, and user lookup issues (#279)
- s3: enforce presigned POST policy conditions (
eq,starts-with,content-type) (#203) - s3: fix versioning
IsTruncated,PublicAccessBlock,ListObjectsV2pagination, and Kubernetes virtual host routing (#276)
1.3.0 - 2026-04-06
- ec2: add EC2 service with 61 operations, integration tests, and documentation (#213)
- ecs: add ECS service (#209)
- dynamodb: add
ScanFiltersupport forScanoperation (#175) - eventbridge: forward resources array and support resources pattern matching (#210)
- lambda: add
AddPermission,GetPolicy,ListTags,ListLayerVersionsendpoints (#223) - sfn: JSONata improvements,
States.*intrinsics, DynamoDBConditionExpression,StartSyncExecution(#205) - Add
GlobalSecondaryIndexUpdatessupport in DynamoDBUpdateTable(#222) - Add scheduled rules support for EventBridge Rules (#217)
- Fall back to Docker bridge IP when
host.docker.internalis unresolvable (#216) - lambda: copy code to
TASK_DIRfor provided runtimes (#206) - lambda: honor
ReportBatchItemFailuresin SQS ESM (#208) - lambda: support
Code.S3Bucket+Code.S3KeyinCreateFunctionandUpdateFunctionCode(#219) - ses: add missing
Resultelement to query protocol responses (#207) - sns: make
Subscribeidempotent for sametopic+protocol+endpoint(#185)
1.2.0 - 2026-04-04
- cloudwatch-logs: add
ListTagsForResource,TagResource, andUntagResource(#172) - cognito: add group management support (#149)
- s3: support
Filterrules inPutBucketNotificationConfiguration(#178) - lambda: implement
ListVersionsByFunctionAPI (#193) - Officially support Docker named volumes for native images (#155)
- Health endpoint (#139)
- Implement
UploadPartCopyfor S3 multipart uploads (#98) - Support
GenerateSecretStringandDescriptionforAWS::SecretsManager::Secretin CloudFormation (#176) - Support GSI and LSI in CloudFormation DynamoDB table provisioning (#125)
- Add CloudFormation
Fn::FindInMapandMappingssupport (#101) - lifecycle: add support for startup and shutdown initialization hooks (#128)
- s3: add conditional request headers (
If-Match,If-None-Match,If-Modified-Since,If-Unmodified-Since) (#48) - s3: add presigned POST upload support (#120)
- s3: add
Rangeheader support forGetObject(#44) - sfn: add DynamoDB AWS SDK integration and complete optimized
updateItem(#103) - apigateway: OpenAPI/Swagger import, models, and request validation (#113)
- apigateway: add AWS integration type for REST v1 (#108)
- cognito: auto-generate
sub, fix JWT sub claim, addAdminUserGlobalSignOut(#183) - cognito: enrich User Pool responses and implement
MfaConfigstub (#198) - cognito: OAuth/OIDC parity for RS256/JWKS,
/oauth2/token, and OAuth app-client settings (#97) - Globally inject AWS
request-idheaders for SDK compatibility (#146) - Defer startup hooks until HTTP server is ready (#159)
- dynamodb: fix
FilterExpressionforBOOLtypes, List/Setcontains, and nested attribute paths (#137) - lambda: copy function code to
/var/runtimefor provided runtimes (#114) - Resolve CloudFormation Lambda
Code.S3Keybase64 decode error (#62) - Resolve numeric
ExpressionAttributeNamesin DynamoDB expressions (#192) - Return stable cursor tokens in
GetLogEventsto fix SDK pagination loop (#184) - s3: evaluate S3 CORS against incoming HTTP requests (#131)
- s3: fix list parts for multipart upload (#164)
- s3: persist
Content-Encodingheader on S3 objects (#57) - s3: prevent
S3VirtualHostFilterfrom hijacking non-S3 requests (#199) - s3: resolve file/folder name collision on persistent filesystem (#134)
- s3: return
CommonPrefixesinListObjectswhen delimiter is specified (#133) - secretsmanager: return
KmsKeyIdinDescribeSecretand improveListSecrets(#195) - sns: enforce
FilterPolicyon message delivery (#53) - sns: honor
RawMessageDeliveryattribute for SQS subscriptions (#54) - sns: pass
messageDeduplicationIdfrom FIFO topics to SQS FIFO queues (#171) - sqs: route queue URL path requests to SQS handler (#153)
- sqs: support binary message attributes and fix
MD5OfMessageAttributes(#168) - sqs: translate Query-protocol error codes to JSON
__typeequivalents (#59) - Support DynamoDB
QueryBETWEENandScanIndexForward=false(#160)
1.1.0 - 2026-03-31
- acm: add ACM certificate management service (#21)
- Add
HOSTNAME_EXTERNALsupport for multi-container Docker setups (#82) - Add JSONata query language support for Step Functions (#84)
- Add Kinesis
ListShardsoperation (#61) - opensearch: add OpenSearch service emulation (#132)
- ses: add SES (Simple Email Service) emulation (#14)
- Add virtual host support for S3 bucket routing (#88)
- apigateway: add AWS integration type for API Gateway REST v1 (#108)
- apigateway: OpenAPI/Swagger import, models, and request validation (#113)
- Docker image with AWS CLI (
floci:x.y.z-aws) (#95) - Implement
GetRandomPasswordfor Secrets Manager (#80) - s3: add presigned POST upload support (#120)
- s3: add
Rangeheader support forGetObject(#44) - s3: add conditional request headers (#48)
- sfn: add DynamoDB AWS SDK integration (#103)
- Added
versionIdto S3 notifications for versioning-enabled buckets (#135) - Align S3
CreateBucketandHeadBucketregion behavior with AWS (#75) - DynamoDB table creation compatibility with Terraform AWS provider v6 (#89)
- dynamodb: apply filter expressions in
Query(#123) - dynamodb: respect
if_not_existsforupdate_item(#102) - Fix S3
NoSuchKeyfor non-ASCII keys (#112) - kms: allow ARN and alias to encrypt (#69)
- Resolve compatibility test failures across multiple services (#109)
- s3: allow upload up to 512 MB by default (#110)
- sns: add
PublishBatchsupport to JSON protocol handler - Storage load after backend is created (#71)
1.0.11 - 2026-03-24
- s3: add
GetObjectAttributesand metadata parity (#29)
1.0.10 - 2026-03-24
- s3: return
versionIdinCompleteMultipartUploadresponse (#35)
1.0.9 - 2026-03-24
- lambda: add Ruby runtime support (#18)
1.0.8 - 2026-03-24
- s3: return
NoSuchVersionerror for non-existentversionId
1.0.7 - 2026-03-24
- s3: fix unit test error
1.0.6 - 2026-03-24
- s3: truncate
LastModifiedtimestamps to second precision (#24)
1.0.5 - 2026-03-23
- s3: fix
CreateBucketresponse format for Rust SDK compatibility (#11)
1.0.4 - 2026-03-20
- ci: fix Docker build on native pipeline
- ci: fix workflow artifact download path
1.0.2 - 2026-03-15
- ci: fix Docker build action trigger
1.0.1 - 2026-03-15
- ci: fix GitHub Actions workflow trigger
1.0.0 - 2026-03-15
Initial public release of Floci — a fast, free, open-source local AWS emulator.
- SSM, SQS, SNS, SES, S3, DynamoDB, Lambda, API Gateway, Cognito, KMS, Kinesis, Secrets Manager, CloudFormation, Step Functions, IAM, STS, ElastiCache, RDS, EventBridge, and CloudWatch emulation
- AWS SDK and CLI wire-protocol compatibility on port 4566
- Native binary and JVM Docker images
- In-memory, persistent, hybrid, and WAL storage modes