Home / Changelog

Changelog

Authoritative release history lives on GitHub at github.com/localemu/localemu/releases. The last five releases are mirrored here for convenience and so search engines can index the content.

v1.2.0

2026-08-01 · real EC2 access, live SG re-apply, Cognito triggers

EC2 access now works end to end with the real AWS tooling, not a LocalEmu-specific workaround. aws ssm start-session --target opens a real interactive shell (the wire codec matches session-manager-plugin byte-for-byte) and AWS-StartPortForwardingSession tunnels a local port through the same SMUX v1 framing the real plugin uses. aws ec2-instance-connect send-ssh-public-key pushes a 60-second ephemeral SSH key, matching AWS's TTL exactly. The base image (ec2-base:v4) adds an ubuntu user per AMI's canonical OS user, alongside root.

DescribeInstances no longer fabricates a PublicIpAddress: it's either a genuine, reachable host-side IP or absent, matching AWS's actual contract. Security group changes made at the ENI level (AttachNetworkInterface, ModifyNetworkInterfaceAttribute --groups=... -- what Terraform and CDK actually generate) now re-apply the live iptables rules immediately, the same as instance-level changes always did. SourceDestCheck is enforced per ENI in the container's FORWARD chain, so NAT and router instances with multiple ENIs behave correctly.

The nine Cognito User Pool Lambda triggers configurable via LambdaConfig now actually fire, at the right phase, including the full CUSTOM_AUTH challenge flow and user migration. Codes and messages that would have gone out by email or SMS are queryable from a dashboard endpoint instead of requiring real delivery.

LocalEmu no longer contacts any external host at runtime: the pytest marker-report uploader, the CI test-selection tool, the ffmpeg installer, and a handful of dead endpoint constants inherited from the upstream fork are all gone. One consequence: Transcribe is now a stub (every operation returns InternalFailure) rather than a partial implementation that depended on a runtime download.

Updated docs: EC2 (SSH, Instance Connect, SSM, SourceDestCheck), Security Groups (live ENI re-apply), Cognito (Lambda triggers).

v1.1.1

2026-06-26 · dashboard packaging fix

The 1.1.0 wheel on PyPI shipped the dashboard's index.html and SVG icons, but not its CSS or JavaScript, so /_localemu/dashboard rendered as an unstyled skeleton with no working scripts on a pip install (the Docker image was unaffected). The packaging allowlist now covers the full dashboard/static/ asset tree.

ModifyInstanceAttribute(SourceDestCheck=...) now mirrors onto the primary ENI's own bit, so DescribeInstances and DescribeNetworkInterfaces agree, matching real AWS.

v1.1.0

2026-06-11 · correctness and coverage

IAM enforcement now respects attached managed policies on every attachment surface (user, role, group), applies managed permission boundaries by intersection with the identity grant, and evaluates resource-based policies on every cross-account call (S3 bucket policy, KMS key policy, SQS / SNS / Lambda / EventBridge policies). Six new condition keys are populated for the policy evaluator: aws:PrincipalAccount, aws:ResourceAccount, aws:SourceAccount, aws:PrincipalOrgID, aws:PrincipalOrgPaths, aws:ResourceOrgID.

The operation → IAM action map now matches AWS for Lambda (lambda:Invokelambda:InvokeFunction), S3 multipart, SQS / SNS batch ops, KMS ReEncrypt, DynamoDB transactions, and the full S3Control access-point surface (s3:CreateAccessPoint rather than the non-existent s3control:CreateAccessPoint).

IMDS at 169.254.169.254 is now reachable from inside instances launched without a key pair (the common AWS CLI default), so the canonical IMDS address stops returning Connection refused. EC2 / SSM / Backup operations that previously raised InternalFailure return AWS-shaped responses: Snapshot Block Public Access, Serial Console toggles, VPC Block Public Access options and exclusions (with real iptables data-plane enforcement on the IGW-facing interface), EC2 Instance Connect Endpoints, AWS Backup protected resources, and SSM patch state stubs.

Multi-account is now documented and surfaced. AWS Organizations is wired with the full 39 ops including DescribeEffectivePolicy; CreateAccount auto-seeds an OrganizationAccountAccessRole in the new member with an inline AdministratorAccess policy. The central account registry is queryable via the new /_localemu/api/accounts admin endpoints.

S3 replicates objects on every matching rule: PutObject / CompleteMultipartUpload / CopyObject on a versioned source bucket with a ReplicationConfiguration flips x-amz-replication-status from PENDING to COMPLETED on the source and REPLICA on the destination, preserving the VersionId and carrying metadata, tags, and content-type across. Filters (Prefix / Tag / And), priority resolution, multi-destination, DeleteMarkerReplication gating, and the no-chained-replication rule all follow the AWS contract.

S3 Access Points have a real data plane: object operations addressed by ARN, alias, or hostname route to the underlying bucket; the access-point policy is consulted alongside the bucket policy; three new S3 condition keys are populated for AP requests: s3:DataAccessPointArn, s3:DataAccessPointAccount, s3:AccessPointNetworkOrigin. The bucket-policy delegation pattern (s3:DataAccessPointAccount on the bucket policy) works the AWS way and lets the AWS-canonical access-point bypass scenario be reproduced locally.

Coverage: 133 AWS services, 9,002 documented operations, 8,782 implemented (97.6%). See the full API coverage matrix. New docs: Multi-Account, Organizations, Cross-Account Access.

v1.0.0

2026-05-18 · initial release

First public release of LocalEmu. The gateway listens on localhost:4566 for all AWS services. The awsemu CLI is a thin wrapper over AWS CLI v1 pre-pointed at LocalEmu. Persistence (PERSISTENCE=1) saves all service state across restarts. IAM enforcement (IAM_ENFORCEMENT=1) evaluates identity, resource, and permission-boundary policies with the real AWS algorithm (explicit deny → resource → identity → boundary). The Export pipeline emits Terraform, CloudFormation, and JSON snapshots from live state.

Docker-backed services run real binaries against real wire protocols: EC2 (real VMs via docker run), ECS (RunTask + Service, real container exec), EKS (k3d-backed, real kubectl), RDS (Postgres, MySQL, MariaDB on real ports), Redshift (postgres:15, psql + JDBC clients connect for real), MQ (RabbitMQ broker), MSK (Apache Kafka KRaft cluster), OpenSearch (real cluster).

Athena ships a DuckDB-backed SQL engine: literal SELECTs, queries over Glue CSV / JSON / Parquet tables, partition pruning, CTAS and INSERT INTO writing Parquet back to S3 and registering Glue tables. SSM Session Manager (StartSession) is a real WebSocket-bridged shell into the EC2 container. EC2 IMDS is reachable at the canonical 169.254.169.254 address from inside containers via DNAT + MASQUERADE. DynamoDB Streams emit INSERT / MODIFY / REMOVE events. API Gateway v2 supports --target integrations end-to-end and ELBv2 ALB → Lambda forwarding works under real Terraform.

Future entries will be added in reverse-chronological order as we ship. For point-release detail follow the GitHub releases feed directly.