floci-io/flociPublic

Light, fluffy, and always free - The AWS Local Emulator alternative

AI summary: Frictionless, account-free AWS cloud environment emulation deployed instantly via a single Docker compose command.

Stars
18.3K
+55 today
Forks
1.9K
Watchers
60
Open issues
108
Open PRs
130
Contributors
~189
Commits
1.1K
Branches
23

JavaMITCreated Feb 18, 2026Last push todayLatest release 1.5.34+255 stars this week+314 this month

Star history

since Apr 5, 2026
05K10K15KApr 2026May 2026Jun 2026Aug 2026
18.3K stars as of Aug 7, 2026, tracked back to Apr 5, 2026. Historical curve reconstructed from public GitHub event archives, calibrated to the current total.

Signals and awards

derived from tracked data
  • Widely adopted

    18,308 stars

  • Actively maintained

    Pushed within 48 hours

  • Community-driven

    ~189 contributors

  • Well documented

    High community health score

  • Permissive license

    MIT

  • Continuous integration

    Automated checks passing

  • Repeat trending

    5 trending appearances

What floci does

Floci addresses the overhead of testing AWS-dependent applications by providing a self-contained, locally deployable cloud emulator. Unlike alternatives that require authentication tokens, feature gates, or cloud accounts, it operates entirely offline through containerization. The architecture allows developers to instantly spin up mock AWS services like S3, SQS, EC2, and ECS using standard testcontainers. By bypassing account validation completely, it guarantees zero-friction CI/CD pipeline integration and local development setups. The technical approach relies on lightweight service mocks that respond to standard AWS SDK requests seamlessly.

Software engineers and DevOps professionals building applications on AWS who want to avoid the friction of managing real cloud credentials during development. Users need basic familiarity with Docker and AWS SDKs.

  • Zero authentication: Operates entirely without access keys, tokens, or account registration.
  • Docker compose native: Deploys the entire mock infrastructure using a standard docker-compose up command.
  • AWS service parity: Provides localized endpoints for core services including S3, SQS, EC2, and ECS.
  • Testcontainer integration: Natively hooks into existing testcontainer setups for automated integration testing.
  • Offline first architecture: Processes all AWS SDK calls locally without any external network dependencies.

Where teams use it

Local development without cloud spend

Developers building AWS-native applications can test their code locally without incurring EC2 or S3 charges, avoiding the need for shared sandbox accounts.

Ephemeral CI/CD testing

DevOps teams can spin up isolated AWS environments for integration tests in GitHub Actions without managing long-lived IAM credentials.

Air-gapped environments

Security-conscious enterprises can validate AWS integrations in completely disconnected environments where external network calls are blocked.

Rapid prototyping

Architects can experiment with AWS service interactions like SQS queues or S3 buckets instantly without waiting for infrastructure provisioning.

Getting started: docker compose up

README

main branch

Floci Floci

Light, fluffy, and always free
No account. No auth token. No feature gates. Just docker compose up.

Latest Release Build Status Docker Pulls Docker Image Size License: MIT GitHub Stars

Quick Start · Features · Services · SDKs · Testcontainers · Migration · Docs


What is Floci?

Floci is a free, open-source local AWS emulator for development, testing, and CI.

It gives you AWS-shaped services on your machine without requiring a cloud account, an auth token, or paid feature gates. Point your AWS SDK, CLI, Terraform, CDK, OpenTofu, or test suite at http://localhost:4566 and keep your existing workflows.

Floci is named after floccus, the cloud formation that looks like popcorn.

Quick Start

The fastest way to run Floci is with the official CLI

floci start

Export the AWS environment variables:

eval $(floci env)

Use your existing AWS tools normally:

aws s3 mb s3://my-bucket

aws dynamodb create-table \
  --table-name demo-table \
  --attribute-definitions AttributeName=pk,AttributeType=S \
  --key-schema AttributeName=pk,KeyType=HASH \
  --billing-mode PAY_PER_REQUEST

aws dynamodb list-tables

Watch it run

This short demo shows the CLI flow: start Floci, export the local AWS environment, run standard AWS CLI commands, and stop the emulator.

floci-cli-demo.mp4

All AWS services are available at http://localhost:4566. Any region works. Credentials can be any non-empty values unless you explicitly enable stricter service-specific auth checks.

Prefer Docker Compose?

Create a compose.yaml file:

services:
  floci:
    image: floci/floci:latest
    ports:
      - "4566:4566"

Start Floci:

docker compose up

Then configure your AWS environment manually:

export AWS_ENDPOINT_URL=http://localhost:4566
export AWS_DEFAULT_REGION=us-east-1
export AWS_ACCESS_KEY_ID=test
export AWS_SECRET_ACCESS_KEY=test
Using the old hectorvent/floci image?

Update your image name:

# Before
image: hectorvent/floci:latest

# After
image: floci/floci:latest

The old hectorvent/floci repository no longer receives updates.

Features

Local AWS without the cloud account

Run AWS-compatible services locally without an AWS account, auth token, or paid feature gates.

Real Docker where fidelity matters

Lambda, RDS, Neptune, ElastiCache, MSK, ECS, EC2, EKS, OpenSearch, and CodeBuild use real Docker-backed execution instead of shallow mocks.

Drop-in AWS compatibility

Point standard AWS clients at http://localhost:4566. Existing credentials, regions, SDKs, CLI commands, and IaC workflows stay familiar.

Fast enough for CI

The native image starts in milliseconds and keeps idle memory low, making it practical for local development and test pipelines.

Configurable persistence

Choose from in-memory, persistent, hybrid, and write-ahead log storage depending on the durability profile you need.

Why Floci?

LocalStack's community edition sunset in March 2026, requiring auth tokens and freezing security updates. Floci is the no-strings-attached alternative.

Capability Floci LocalStack Community
Auth token required No Yes
Security updates Yes Frozen
Startup time ~24 ms ~3.3 s
Idle memory ~13 MiB ~143 MiB
Docker image size ~90 MB ~1.0 GB
License MIT Restricted
API Gateway v2 / HTTP API Yes No
Cognito Yes No
RDS, ElastiCache, MSK Real Docker No
Neptune (graph DB + Gremlin WebSocket) Real Docker No
DocumentDB (MongoDB-compatible) Real Docker No
ECS, EC2, EKS Real Docker No
CodeBuild Real Docker execution No
Native binary ~40 MB No

69 AWS services. Broad coverage. Free forever.

Architecture Overview

flowchart LR
    Client["AWS SDK / CLI"]

    subgraph Floci ["Floci, port 4566"]
        Router["HTTP Router\nJAX-RS / Vert.x"]

        subgraph Stateless ["Stateless Services"]
            A["SSM · SQS · SNS\nIAM · STS · KMS\nSecrets Manager · SES\nCognito · Kinesis\nEventBridge · Scheduler · AppConfig\nCloudWatch · Step Functions\nCloudFormation · ACM · Config · CloudTrail\nAPI Gateway · AppSync · ELB v2 · Auto Scaling\nElastic Beanstalk · CodeDeploy · CodePipeline · Backup · Bedrock Runtime · Route53 · Transfer"]
        end

        subgraph Stateful ["Stateful Services"]
            B["S3 · DynamoDB\nDynamoDB Streams"]
        end

        subgraph Containers ["Container Services"]
            C["Lambda\nElastiCache\nRDS\nNeptune\nECS\nEC2\nMSK\nEKS\nOpenSearch\nCodeBuild"]
            D["Athena -> floci-duck\nDuckDB sidecar"]
        end

        Router --> Stateless
        Router --> Stateful
        Router --> Containers
        Stateless & Stateful --> Store[("StorageBackend\nmemory · hybrid · persistent · wal")]
    end

    Docker["Docker Engine"]
    Client -->|"HTTP :4566\nAWS wire protocol"| Router
    Containers -->|"Docker API\nIAM / SigV4 auth"| Docker
Loading

Supported Services

Floci supports local emulation for application services, data services, eventing, identity, infrastructure, billing, and container-backed workloads.

Category Services
Core app services S3, SQS, SNS, DynamoDB, Lambda, IAM, KMS, Secrets Manager, SSM
Events and workflows EventBridge, EventBridge Pipes, EventBridge Scheduler, Step Functions, CloudWatch Logs, CloudWatch Metrics
API and identity API Gateway REST, API Gateway v2, AppSync, Cognito, ACM, Route53, Cloud Map
Containers and compute ECS, EC2, Lightsail, EKS, ECR, CodeBuild, CodeDeploy, CodePipeline, AWS Batch, Auto Scaling, Elastic Beanstalk, ELB v2
Data, analytics, and AI Athena, Glue, EMR, Firehose, OpenSearch, S3 Vectors, Textract, Transcribe, Bedrock Runtime
Databases and caching RDS, RDS Data API, Neptune, DocumentDB, MemoryDB, ElastiCache
Messaging and transfer SES, Kinesis, MSK, Amazon MQ, Transfer Family, IoT Core
Security and governance WAF v2, CloudTrail, CloudFront, Resource Groups Tagging API
Cost and billing Pricing, Cost Explorer, Cost and Usage Reports, BCM Data Exports
Backup and config AWS Backup, AWS Config, AppConfig, AppConfigData, CloudFormation, Cloud Control API

For operation-level compatibility, see the Services Overview.

Detailed service notes
Service How it works Notable features
SSM In-process + EC2 containers Parameter Store (version history, labels, SecureString, tagging); Run Command (SendCommand, GetCommandInvocation, direct EC2 container execution, agent polling)
SQS In-process Standard and FIFO queues, DLQ, visibility timeout, batch operations, tagging
SNS In-process Topics, subscriptions, SQS, Lambda and HTTP delivery, tagging
S3 In-process Versioning, multipart upload, pre-signed URLs, Object Lock, event notifications
S3 Vectors In-process Vector buckets, indexes, put / get / list / delete vectors, cosine similarity queries
DynamoDB In-process GSI, LSI, Query, Scan, TTL, transactions, batch operations; Streams with shard iterators and Lambda event source mapping
Lambda Real Docker Runtime environment, execution model, warm container pool, aliases, Function URLs
API Gateway REST In-process Resources, methods, stages, Lambda proxy, MOCK integrations, AWS integrations
API Gateway v2 In-process HTTP APIs, routes, integrations, JWT authorizers, stages
AppSync In-process GraphQL API management API, schema registry, AWS scalars, domain names, channel namespaces
IAM In-process Users, roles, groups, policies, instance profiles, access keys; STS AssumeRole, WebIdentity, SAML, GetFederationToken, GetSessionToken
Cognito In-process User pools, app clients, auth flows, JWKS and OpenID well-known endpoints
KMS In-process Encrypt, decrypt, sign, verify, data keys, aliases
Kinesis In-process Streams, shards, enhanced fan-out, split and merge
Secrets Manager In-process Versioning, resource policies, tagging
Step Functions In-process ASL execution, task tokens, execution history
CloudFormation In-process Stacks, change sets, resource provisioning, StackSets (cross-account instances)
EventBridge In-process Custom buses, rules, SQS, SNS and Lambda targets
EventBridge Pipes In-process Poller-based integration connecting SQS, Kinesis, DynamoDB, and MSK sources to targets with optional filtering
EventBridge Scheduler In-process Schedule groups, schedules, flexible time windows, retry policies, DLQs
CloudWatch Logs In-process Log groups, streams, ingestion, filtering
CloudWatch Metrics In-process Custom metrics, statistics, alarms
ElastiCache Real Docker Redis / Valkey protocol, IAM auth, SigV4 validation
MemoryDB Real Docker Redis / Valkey protocol via real containers; JSON 1.1 control plane; reuses ElastiCache RESP proxy
RDS Real Docker PostgreSQL, MySQL, MariaDB, IAM auth, JDBC-compatible engines
RDS Data API REST JSON over real RDS containers Raw SQL execution and transactions for local MySQL / MariaDB RDS resources
Neptune Real Docker Graph DB via TinkerPop Gremlin Server (default) or Neo4j for openCypher/Bolt (NEPTUNE_DB_TYPE); RDS-shaped control plane; SigV4 proxy on port 8182
DocumentDB Real Docker, mock mode available MongoDB-compatible cluster via real MongoDB containers; RDS-shaped control plane; MongoDB wire protocol on port 27017
MSK Real Docker Kafka-compatible broker via Redpanda
Amazon MQ Real Docker RabbitMQ broker via rabbitmq:3-management; AMQP + management console
Athena In-process with DuckDB sidecar Real SQL execution over S3 and Glue-backed views
Glue In-process Data Catalog, Schema Registry, tables consumed by Athena
EMR In-process Cluster (job flow) lifecycle, instance groups and fleets, steps, security configurations, tagging
Data Firehose In-process Streaming delivery, NDJSON flush to S3
ECS Real Docker Clusters, task definitions, tasks, services, capacity providers, task sets
EC2 Real Docker RunInstances launches containers, SSH key injection, UserData, IMDS, VPC resources
Lightsail In-process Instances, disks, static IPs, key pairs, ports, tags, regions, blueprints, bundles, operations
ACM In-process Certificate issuance and validation lifecycle
ECR In-process with real registry Repositories, docker push / pull, image-backed Lambda functions
Resource Groups Tagging API In-process GetResources, tag and untag resources, tag key and value discovery across services
SES In-process v1 and v2 APIs: send email, raw email, identity verification, DKIM, templates, configuration sets, account sending
OpenSearch Real Docker Domain CRUD, tags, versions, instance types, upgrade stubs
AppConfig In-process Applications, environments, profiles, hosted versions, deployments
AppConfigData In-process Configuration sessions and dynamic configuration retrieval
Bedrock Runtime In-process stub Dummy Converse and InvokeModel responses for local development
EKS Real Docker, mock mode available k3s clusters with live Kubernetes API server
ELB v2 In-process ALB, NLB, target groups, listeners, routing rules, Lambda targets, tags
CodeBuild In-process with real Docker Real buildspec execution, CloudWatch logs, S3 artifacts
CodeDeploy In-process with Lambda traffic shifting Deployment groups, configs, lifecycle hooks, auto-rollback
CodePipeline In-process orchestration Pipelines, executions, S3 artifacts, approvals, local providers, custom workers
AWS Batch In-process Compute environments, job queues, job definitions, job submission and lifecycle
Auto Scaling In-process with reconciler Launch configs, ASGs, desired capacity reconciliation, lifecycle hooks
Elastic Beanstalk In-process Applications, application versions, environments, configuration templates, platform and solution stack metadata
AWS Backup In-process Vaults, backup plans, selections, simulated job lifecycle, recovery points
AWS Config In-process Config rules, configuration recorders, delivery channels, conformance packs, tagging
CloudTrail In-process Trails, event selectors (S3 data events with bucket/prefix matching), StartLogging/StopLogging, scheduled gzipped log file emission to the destination bucket at AWS-shaped key paths, IAM-deny path emits AccessDenied records
CloudFront In-process Distributions, origins, cache behaviors, invalidations, tagging
WAF v2 In-process Web ACLs, IP sets, regex pattern sets, rule groups, logging configs, resource associations, tagging (REGIONAL and CLOUDFRONT scopes)
Route53 In-process Hosted zones, SOA and NS records, resource record sets, change tracking, tagging
Cloud Map In-process HTTP and DNS namespaces, services, instance registration, discovery queries, operations, tagging
Transfer Family In-process Server lifecycle, user management, SSH key import, tagging
Textract In-process stub API-compatible stubs, dummy block data, async job simulation
Transcribe In-process stub Transcription jobs and custom vocabularies; jobs complete immediately, no real audio processing
Pricing In-process with static snapshot Product discovery, attributes, price list files, pagination
Cost Explorer In-process Cost synthesized from Floci resource state and pricing snapshots
Cost and Usage Reports In-process with floci-duck sidecar CUR 2.0 and FOCUS 1.2 columns, account-scoped storage, Parquet emission
BCM Data Exports In-process Export lifecycle, executions, update and delete operations

Real Docker Integration

Floci uses real Docker containers when in-process emulation would reduce fidelity. This applies to stateful databases, connection-heavy protocols, runtimes, and build systems.

Service Default image What is real
Lambda public.ecr.aws/lambda/<runtime> AWS runtime environment, execution model, warm container pool
ElastiCache valkey/valkey:8 Redis / Valkey protocol, ACL-based IAM auth, SigV4 validation
RDS PostgreSQL postgres:16-alpine PostgreSQL engine, IAM auth, JDBC-compatible access
RDS MySQL / Aurora mysql:8.0 MySQL engine, IAM auth, JDBC-compatible access
RDS MariaDB mariadb:11 MariaDB engine, IAM auth, JDBC-compatible access
Neptune tinkerpop/gremlin-server:3.7.3 TinkerPop Gremlin Server; Gremlin WebSocket on port 8182; SigV4 auth proxy
Neptune (openCypher) neo4j:5-community Neo4j backend when FLOCI_SERVICES_NEPTUNE_DB_TYPE=neo4j; openCypher over Bolt
DocumentDB mongo:7.0 MongoDB engine; MongoDB wire protocol on port 27017
MSK redpandadata/redpanda:latest Kafka-compatible broker via Redpanda
Amazon MQ rabbitmq:3-management RabbitMQ broker; AMQP on port 5672, management console on 15672
EC2 AMI-mapped Linux images Linux containers, SSH key injection, UserData, IMDS, IAM credentials
ECS User-specified task image Container lifecycle, start, stop, health checks
EKS rancher/k3s:latest Kubernetes API server via k3s
CodeBuild User-specified environment image Buildspec execution, log streaming, S3 artifact upload
OpenSearch opensearchproject/opensearch:2 Full OpenSearch engine with REST API
ECR registry:2 OCI-compatible registry for docker push and docker pull

Docker-backed services require the Docker socket:

docker run -d --name floci \
  -p 4566:4566 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -u root \
  floci/floci:latest

Overriding default images

Variable Default
FLOCI_SERVICES_ELASTICACHE_DEFAULT_IMAGE valkey/valkey:8
FLOCI_SERVICES_RDS_DEFAULT_POSTGRES_IMAGE postgres:16-alpine
FLOCI_SERVICES_RDS_DEFAULT_MYSQL_IMAGE mysql:8.0
FLOCI_SERVICES_RDS_DEFAULT_MARIADB_IMAGE mariadb:11
FLOCI_SERVICES_MSK_DEFAULT_IMAGE redpandadata/redpanda:latest
FLOCI_SERVICES_OPENSEARCH_DEFAULT_IMAGE opensearchproject/opensearch:2
FLOCI_SERVICES_NEPTUNE_DEFAULT_IMAGE tinkerpop/gremlin-server:3.7.3
FLOCI_SERVICES_NEPTUNE_DEFAULT_NEO4J_IMAGE neo4j:5-community
FLOCI_SERVICES_DOCDB_DEFAULT_IMAGE mongo:7.0
FLOCI_SERVICES_EKS_DEFAULT_IMAGE rancher/k3s:latest
FLOCI_SERVICES_ECR_REGISTRY_IMAGE registry:2
FLOCI_ECR_BASE_URI public.ecr.aws

Persistence and Storage Modes

Floci can trade speed for durability depending on the workflow. Configure the default mode with FLOCI_STORAGE_MODE, or override storage per service.

Mode Behavior Best for Durability
memory Entirely in RAM. Data is lost when the container stops. CI and ephemeral tests None
persistent Loaded at startup and flushed to disk immediately on every write operation. Simple local state preservation with immediate persistence Medium
hybrid In-memory performance with periodic async flushing every 5 seconds. Local development Good
wal Write-ahead log. Every mutation is logged before responding. Maximum durability Highest

Use memory for fast test runs. Use hybrid when you want state preserved across container restarts without much overhead.

For more detail, see the Storage Configuration documentation.

Multi-Account Isolation

Floci supports per-account resource isolation with no extra setup. If AWS_ACCESS_KEY_ID is exactly 12 digits, Floci uses it as the account ID. Resources created by one account are invisible to another.

AWS_ACCESS_KEY_ID=111111111111 aws sqs create-queue --queue-name orders
AWS_ACCESS_KEY_ID=222222222222 aws sqs create-queue --queue-name orders

Any other key format, such as test or AKIA..., causes Floci to fall back to FLOCI_DEFAULT_ACCOUNT_ID, which defaults to 000000000000.

STS temporary credentials are routed too: credentials from AssumeRole resolve to the assumed role's account, so the cross-account assume-role-then-provision pattern works locally. Resolution precedence is 12-digit AKID → temporary-session lookup → FLOCI_DEFAULT_ACCOUNT_ID.

See the Multi-Account Isolation docs.

SDK Integration

Point your existing AWS SDK at http://localhost:4566.

Java, AWS SDK v2
var client = DynamoDbClient.builder()
    .endpointOverride(URI.create("http://localhost:4566"))
    .region(Region.US_EAST_1)
    .credentialsProvider(StaticCredentialsProvider.create(
        AwsBasicCredentials.create("test", "test")))
    .build();

client.createTable(b -> b
    .tableName("demo-table")
    .billingMode(BillingMode.PAY_PER_REQUEST)
    .attributeDefinitions(
        AttributeDefinition.builder().attributeName("pk").attributeType(ScalarAttributeType.S).build())
    .keySchema(
        KeySchemaElement.builder().attributeName("pk").keyType(KeyType.HASH).build()));

System.out.println(client.listTables().tableNames());
Python, boto3
import boto3

client = boto3.client(
    "ssm",
    endpoint_url="http://localhost:4566",
    region_name="us-east-1",
    aws_access_key_id="test",
    aws_secret_access_key="test",
)

client.put_parameter(
    Name="/demo/app/message",
    Value="hello from floci",
    Type="String",
    Overwrite=True,
)

response = client.get_parameter(Name="/demo/app/message")
print(response["Parameter"]["Value"])
Node.js, AWS SDK v3
import { SQSClient, SendMessageCommand } from "@aws-sdk/client-sqs";

const client = new SQSClient({
  endpoint: "http://localhost:4566",
  region: "us-east-1",
  credentials: { accessKeyId: "test", secretAccessKey: "test" },
});

await client.send(
  new SendMessageCommand({
    QueueUrl: "http://localhost:4566/000000000000/demo-queue",
    MessageBody: "hello from floci",
  }),
);
Go, AWS SDK v2
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/credentials"
    "github.com/aws/aws-sdk-go-v2/service/s3"
)

func main() {
    cfg, err := config.LoadDefaultConfig(context.TODO(),
        config.WithRegion("us-east-1"),
        config.WithCredentialsProvider(
            credentials.NewStaticCredentialsProvider("test", "test", ""),
        ),
        config.WithBaseEndpoint("http://localhost:4566"),
    )
    if err != nil {
        log.Fatal(err)
    }

    client := s3.NewFromConfig(cfg, func(o *s3.Options) {
        o.UsePathStyle = true
    })

    out, err := client.ListBuckets(context.TODO(), nil)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(out.Buckets)
}
Rust, AWS SDK
use aws_sdk_secretsmanager::config::{Credentials, Region};
use aws_sdk_secretsmanager::Client;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let config = aws_config::defaults(aws_config::BehaviorVersion::latest())
        .region(Region::new("us-east-1"))
        .credentials_provider(Credentials::new("test", "test", None, None, "floci"))
        .endpoint_url("http://localhost:4566")
        .load()
        .await;

    let client = Client::new(&config);

    client
        .create_secret()
        .name("demo/secret")
        .secret_string("hello from floci")
        .send()
        .await?;

    Ok(())
}
Bash, AWS CLI
export AWS_ACCESS_KEY_ID=test
export AWS_SECRET_ACCESS_KEY=test
export AWS_DEFAULT_REGION=us-east-1

aws --endpoint-url http://localhost:4566 s3 mb s3://my-bucket
aws --endpoint-url http://localhost:4566 s3 ls

Testcontainers

Floci has Testcontainers modules for starting isolated Floci instances directly from tests. This avoids shared state, manual daemon setup, and port conflicts.

Language Package Latest Registry Source
Java io.floci:testcontainers-floci 1.4.0 Maven Central GitHub
Node.js @floci/testcontainers 0.1.0 npm GitHub
Python testcontainers-floci 0.1.1 PyPI GitHub
Go In progress In progress N/A GitHub
Java
<dependency>
    <groupId>io.floci</groupId>
    <artifactId>testcontainers-floci</artifactId>
    <version>1.4.0</version>
    <scope>test</scope>
</dependency>
@Testcontainers
class S3IntegrationTest {

    @Container
    static FlociContainer floci = new FlociContainer();

    @Test
    void shouldCreateBucket() {
        S3Client s3 = S3Client.builder()
                .endpointOverride(URI.create(floci.getEndpoint()))
                .region(Region.of(floci.getRegion()))
                .credentialsProvider(StaticCredentialsProvider.create(
                        AwsBasicCredentials.create(floci.getAccessKey(), floci.getSecretKey())))
                .forcePathStyle(true)
                .build();

        s3.createBucket(b -> b.bucket("my-bucket"));
    }
}

For Testcontainers 2.x / Spring Boot 4.x, use version 2.5.0.

Node.js / TypeScript
npm install --save-dev @floci/testcontainers
import { FlociContainer } from "@floci/testcontainers";
import { S3Client, CreateBucketCommand } from "@aws-sdk/client-s3";

describe("S3", () => {
  let floci: FlociContainer;

  beforeAll(async () => {
    floci = await new FlociContainer().start();
  });

  afterAll(async () => {
    await floci.stop();
  });

  it("creates a bucket", async () => {
    const s3 = new S3Client({
      endpoint: floci.getEndpoint(),
      region: floci.getRegion(),
      credentials: {
        accessKeyId: floci.getAccessKey(),
        secretAccessKey: floci.getSecretKey(),
      },
      forcePathStyle: true,
    });

    await s3.send(new CreateBucketCommand({ Bucket: "my-bucket" }));
  });
});
Python
pip install testcontainers-floci
import boto3
from testcontainers_floci import FlociContainer


def test_s3_create_bucket():
    with FlociContainer() as floci:
        s3 = boto3.client(
            "s3",
            endpoint_url=floci.get_endpoint(),
            region_name=floci.get_region(),
            aws_access_key_id=floci.get_access_key(),
            aws_secret_access_key=floci.get_secret_key(),
        )
        s3.create_bucket(Bucket="my-bucket")

Compatibility Testing

The compatibility-tests directory validates Floci across SDKs and tooling workflows.

Module Language / Tool SDK / Client Tests
sdk-test-java Java 17 AWS SDK for Java v2 1,326
sdk-test-node Node.js AWS SDK for JavaScript v3 449
sdk-test-python Python 3 boto3 311
sdk-test-go Go AWS SDK for Go v2 + RDS Data API SDK v1 157
sdk-test-awscli Bash AWS CLI v2 205
compat-terraform Terraform v1.10+ 22
compat-opentofu OpenTofu v1.9+ 16
compat-cdk AWS CDK v2+ 20

2,506 automated compatibility tests across 5 SDKs and 3 IaC tools.

Migrating from LocalStack

Floci is a drop-in replacement for LocalStack Community. The port, credentials, SDK configuration, and CLI endpoint pattern work the same way. Swap the image and keep going.

# Before
image: localstack/localstack

# After, standard image
image: floci/floci:latest

# After, if init scripts need AWS CLI or boto3
image: floci/floci:latest-compat

LocalStack environment variables are translated automatically:

LocalStack Floci equivalent
LOCALSTACK_HOST FLOCI_HOSTNAME
PERSISTENCE=1 FLOCI_STORAGE_MODE=persistent
LAMBDA_DOCKER_NETWORK FLOCI_SERVICES_LAMBDA_DOCKER_NETWORK
LAMBDA_REMOVE_CONTAINERS=1 FLOCI_SERVICES_LAMBDA_EPHEMERAL=true
DEBUG=1 QUARKUS_LOG_LEVEL=DEBUG

Init scripts mounted under /etc/localstack/init/ run unchanged. The /_localstack/init and /_localstack/health endpoints are still served. Once the emulator is up, the log also ends with a LocalStack-style Ready. line, so tooling that watches the log for it — such as the default wait strategy of Testcontainers' LocalStackContainer — works unchanged. Set LOCALSTACK_PARITY=false to opt out of automatic translation.

See the full migration guide.

Image Tags

Every tag combines a variant and a channel.

Channel Standard Compat with AWS CLI and boto3
Release, floating latest latest-compat
Release, pinned x.y.z x.y.z-compat
Nightly, floating nightly nightly-compat
Nightly, dated nightly-mmddyyyy nightly-mmddyyyy-compat

Use latest for stable releases, a pinned version for reproducible builds, and nightly to track main.

# Recommended
image: floci/floci:latest

# Includes AWS CLI and boto3
image: floci/floci:latest-compat

# Pinned release
image: floci/floci:1.5.11

# Track main
image: floci/floci:nightly

Configuration

All settings are overridable through environment variables with the FLOCI_ prefix.

Variable Default Description
FLOCI_PORT 4566 Port exposed by the Floci API
FLOCI_DEFAULT_REGION us-east-1 Default AWS region
FLOCI_DEFAULT_ACCOUNT_ID 000000000000 Default AWS account ID
FLOCI_BASE_URL http://localhost:4566 Base URL used when Floci returns service URLs
FLOCI_HOSTNAME Unset Hostname used in returned URLs when Floci runs inside Docker Compose
FLOCI_STORAGE_MODE memory Storage mode: memory, persistent, hybrid, or wal
FLOCI_STORAGE_PERSISTENT_PATH ./data Directory used for persisted state
FLOCI_ECR_BASE_URI public.ecr.aws ECR base URI used when pulling container images
FLOCI_SERVICES_S3_ENFORCE_AUTH false Enforce S3 public/private read access and reject unknown signed S3 access keys

Full reference: configuration docs

Multi-container Docker Compose

When your application runs in a different container, set FLOCI_HOSTNAME to the Floci service name so returned URLs, such as SQS QueueUrl values, resolve correctly.

services:
  floci:
    image: floci/floci:latest
    ports:
      - "4566:4566"
    environment:
      - FLOCI_HOSTNAME=floci

  my-app:
    environment:
      - AWS_ENDPOINT_URL=http://floci:4566
    depends_on:
      - floci

Without this, services may return URLs using localhost, which points to the wrong container from the application container.

Community

Join the Floci community on Slack or GitHub Discussions. Feature ideas, compatibility questions, design tradeoffs, and rough proposals are welcome.

Sponsors

Floci is independent open source, funded by its users. If Floci saves you time, consider sponsoring the project — every tier keeps the emulators fast, light, and free.

🥇 Gold

Large logo with top placement, a dedicated support channel, input on roadmap priorities, and custom integration help.

Your logo here — become a Gold sponsor.

🥈 Silver

Logo in this README and on floci.io, priority issue support, and a mention in release notes.

Your logo here — become a Silver sponsor.

🥉 Community

Name in this README, a sponsor badge on GitHub, and our sincere thanks.

Star History

Star History Chart

Contributors

License

MIT. Use it however you want.

View on GitHub

Recent activity

commits and pull requests

Releases and announcements

54 total
  1. 1.5.341.5.34Jul 29, 2026

    ## 🎉 Highlights This release adds **in-process CloudTrail with S3 data event emission**, brings **Step Functions HTTP invoke** and the **`States.JsonMerge` intrinsic**, ships **SES identity policies for authorization**, and lands **provenance and SBOM attestations** on published container images. Cognito hostname handling, CloudFormation IAM inline policies, and DynamoDB expression parsing all see meaningful conformance work. Welcome to the 7 first-time contributors. ### 🔍 CloudTrail: in-process with S3 data event emission **In-process CloudTrail** with **S3 data event emission** lands (#1460). CloudTrail moves from lifecycle-only support to actually capturing and emitting events, so audit-log workflows that depend on CloudTrail data events can now be exercised end to end locally. ### 🧩 Step Functions: HTTP invoke + `JsonMerge` Two coordinated Step Functions capabilities: - **HTTP invoke step** (#1503) — external HTTP endpoints callable directly from state machines - **`States.JsonMerge` intrinsic** (#1662) — the JSONata merge operation now works in payload templates Combined with the JSONata `Assign` support in 1.5.33, Step Functions expression coverage keep

  2. 1.5.331.5.33Jul 15, 2026

    ## 🎉 Highlights This release adds **EKS Fargate profiles**, brings **Step Functions JSONata workflow variables**, expands **Cognito** with `GlobalSignOut` and `RevokeToken`, and lands substantial **S3 conformance work** on ACLs, replication, encryption defaults, and error handling. IAM gets S3 list condition context, and lifecycle management improves for process-bound containers. Welcome to the 7 first-time contributors. ### ☸️ EKS Fargate profiles **EKS Fargate profiles** support lands (#1523), extending the EKS + managed node groups story from 1.5.24. Real EKS provisioning patterns that use Fargate for serverless container execution now work locally. ### 🧩 Step Functions: JSONata `Assign` Step Functions now supports **JSONata workflow variables** via the `Assign` field (#1824). Recent AWS additions to Step Functions expression language now work locally — state machines using JSONata syntax for variable manipulation can be tested end to end. ### 🔐 Cognito: sign-out completion Two coordinated Cognito additions: - **`GlobalSignOut`** implemented (#1701) - **`jti` / `origin_jti` claims emitted** with `RevokeToken` support (#1705) Combined with the earlier

  3. 1.5.321.5.32Jul 11, 2026

    ## 🎉 Highlights This release adds **AWS Lightsail**, brings **AppSync Phase 5** completing the four-release AppSync build-out, lands **EventBridge Pipes enrichment**, and ships a substantial **ECS conformance push** with EFS ownership, secrets resolution, and awsvpc port allocation. S3 gains **auth enforcement**, Step Functions payload templates get more capable, and a CloudFormation architectural refactor kicks off. Welcome to the 2 first-time contributors. ### 🆕 New: AWS Lightsail **AWS Lightsail** emulation lands (#1583). Simple compute workloads that use Lightsail rather than EC2 can now be tested locally, extending Floci's compute coverage beyond the enterprise-tier services. ### 🧩 AppSync Phase 5 (complete build-out) The AppSync journey completes with **Phase 5** (#1590): Management API coverage expansion, AWS behavior alignment, and async schema creation. Across five phases (Phase 1 → 5 spanning 1.5.22 through this release), AppSync has grown from a management-API stub to a working GraphQL emulator with schema registry, `$util` runtime, VTL engine, and AWS-aligned behavior. This is one of the most complete phased service build-outs Floci has done. ### 🚢

  4. 1.5.311.5.31Jul 7, 2026

    ## 🎉 Highlights This release brings **CloudWatch Logs Insights**, adds **RDS Data API for PostgreSQL**, introduces **RDS mock mode** and **read-only Cloud Control APIs**, and lands substantial persistence and performance work. Lambda cold starts speed up with read-only code mounting, and multiple services join the durable-state family. Welcome to the 2 first-time contributors. ### 🔍 CloudWatch Logs Insights **Logs Insights query support** lands (#1448), enabling local execution of the query DSL for log analysis workflows. This closes one of the more requested CloudWatch Logs gaps. ### 🐘 RDS Data API for PostgreSQL The **RDS Data API** now supports PostgreSQL (#1720), extending the MySQL-backed Data API added in 1.5.25. Serverless SQL workflows against both engines now work locally. ### 🎭 RDS mock mode **Mock mode** for RDS lets clusters and instances be created **without Docker** (#1655). Useful for CI environments that don't have Docker-in-Docker, or for fast unit-style tests where the real engine isn't needed. ### 🌐 Cloud Control API **`list_resources` from local services** now works via the Cloud Control API (#1602), and **read-only describe/list

  5. 1.5.301.5.30Jul 3, 2026

    ## 🎉 Highlights This release adds **Amazon MQ** and **VPC Flow Logs**, brings a major **Step Functions** feature push (state machine versions, ECS integrations, ResultSelector, cross-account execution), lands **CloudFormation StackSets** with account-aware provisioning, and ships **HTTPS on port 443** with Lambda cert trust. IAM gains **AssumeRole trust policy enforcement** and **STS session policies**. Service count is now officially **68**. Welcome to the 4 first-time contributors. ### 🆕 New: Amazon MQ **Amazon MQ** broker control plane lands (#1642), backed by **RabbitMQ**. Messaging workloads that depend on Amazon MQ can now be exercised locally with a real message broker rather than a mock, continuing the real-Docker-backed pattern from RDS, ElastiCache, MSK, and OpenSearch. ### 🌐 New: VPC Flow Logs EC2 gains **VPC Flow Logs** support (#1611), enabling local testing of network observability pipelines that consume flow logs from VPCs, subnets, or ENIs. ### 🧩 Step Functions: major feature push Six coordinated Step Functions improvements land this cycle: - **State machine version APIs** (`PublishStateMachineVersion`, `List`, `Delete`) (#1562) - **Exec

Code frequency

additions and deletions
+68.2K-68.2KWeek of 2026-03-15: +51,741 linesWeek of 2026-03-15: -996 linesWeek of 2026-03-22: +10,180 linesWeek of 2026-03-22: -475 linesWeek of 2026-03-29: +21,013 linesWeek of 2026-03-29: -1,228 linesWeek of 2026-04-05: +68,194 linesWeek of 2026-04-05: -6,768 linesWeek of 2026-04-12: +29,035 linesWeek of 2026-04-12: -2,323 linesWeek of 2026-04-19: +22,774 linesWeek of 2026-04-19: -1,179 linesWeek of 2026-04-26: +35,909 linesWeek of 2026-04-26: -1,403 linesWeek of 2026-05-03: +36,799 linesWeek of 2026-05-03: -1,474 linesWeek of 2026-05-10: +31,796 linesWeek of 2026-05-10: -2,429 linesWeek of 2026-05-17: +19,011 linesWeek of 2026-05-17: -895 linesWeek of 2026-05-24: +16,048 linesWeek of 2026-05-24: -501 linesWeek of 2026-05-31: +20,397 linesWeek of 2026-05-31: -1,173 linesWeek of 2026-06-07: +27,778 linesWeek of 2026-06-07: -1,549 linesWeek of 2026-06-14: +27,128 linesWeek of 2026-06-14: -2,199 linesWeek of 2026-06-21: +33,747 linesWeek of 2026-06-21: -1,746 linesWeek of 2026-06-28: +18,396 linesWeek of 2026-06-28: -8,590 linesWeek of 2026-07-05: +26,913 linesWeek of 2026-07-05: -2,039 linesWeek of 2026-07-12: +4,129 linesWeek of 2026-07-12: -320 linesWeek of 2026-07-19: +3,798 linesWeek of 2026-07-19: -700 linesWeek of 2026-07-26: +4,549 linesWeek of 2026-07-26: -127 linesMar 15, 2026Jul 26, 2026
+509.3K lines added, -38.1K removed over the last year.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 8 commitsSun 1:00 — 6 commitsSun 2:00 — 9 commitsSun 3:00 — 1 commitsSun 4:00 — 2 commitsSun 5:00 — 3 commitsSun 6:00 — 3 commitsSun 7:00 — 7 commitsSun 8:00 — 3 commitsSun 9:00 — 5 commitsSun 10:00 — 13 commitsSun 11:00 — 8 commitsSun 12:00 — 1 commitsSun 13:00 — 1 commitsSun 14:00 — 3 commitsSun 15:00 — 4 commitsSun 16:00 — 8 commitsSun 17:00 — 5 commitsSun 18:00 — 6 commitsSun 19:00 — 6 commitsSun 20:00 — 18 commitsSun 21:00 — 8 commitsSun 22:00 — 5 commitsSun 23:00 — 11 commitsMon 0:00 — 12 commitsMon 1:00 — 10 commitsMon 2:00 — 1 commitsMon 3:00 — 2 commitsMon 4:00 — 3 commitsMon 5:00 — 0 commitsMon 6:00 — 1 commitsMon 7:00 — 1 commitsMon 8:00 — 0 commitsMon 9:00 — 3 commitsMon 10:00 — 4 commitsMon 11:00 — 2 commitsMon 12:00 — 10 commitsMon 13:00 — 4 commitsMon 14:00 — 5 commitsMon 15:00 — 5 commitsMon 16:00 — 3 commitsMon 17:00 — 3 commitsMon 18:00 — 6 commitsMon 19:00 — 9 commitsMon 20:00 — 7 commitsMon 21:00 — 9 commitsMon 22:00 — 17 commitsMon 23:00 — 11 commitsTue 0:00 — 16 commitsTue 1:00 — 12 commitsTue 2:00 — 8 commitsTue 3:00 — 2 commitsTue 4:00 — 8 commitsTue 5:00 — 4 commitsTue 6:00 — 10 commitsTue 7:00 — 8 commitsTue 8:00 — 6 commitsTue 9:00 — 5 commitsTue 10:00 — 8 commitsTue 11:00 — 7 commitsTue 12:00 — 8 commitsTue 13:00 — 3 commitsTue 14:00 — 19 commitsTue 15:00 — 4 commitsTue 16:00 — 6 commitsTue 17:00 — 4 commitsTue 18:00 — 8 commitsTue 19:00 — 5 commitsTue 20:00 — 7 commitsTue 21:00 — 5 commitsTue 22:00 — 16 commitsTue 23:00 — 6 commitsWed 0:00 — 13 commitsWed 1:00 — 16 commitsWed 2:00 — 10 commitsWed 3:00 — 5 commitsWed 4:00 — 3 commitsWed 5:00 — 8 commitsWed 6:00 — 7 commitsWed 7:00 — 5 commitsWed 8:00 — 5 commitsWed 9:00 — 4 commitsWed 10:00 — 6 commitsWed 11:00 — 5 commitsWed 12:00 — 4 commitsWed 13:00 — 2 commitsWed 14:00 — 4 commitsWed 15:00 — 6 commitsWed 16:00 — 6 commitsWed 17:00 — 8 commitsWed 18:00 — 3 commitsWed 19:00 — 6 commitsWed 20:00 — 2 commitsWed 21:00 — 6 commitsWed 22:00 — 11 commitsWed 23:00 — 25 commitsThu 0:00 — 29 commitsThu 1:00 — 11 commitsThu 2:00 — 4 commitsThu 3:00 — 0 commitsThu 4:00 — 6 commitsThu 5:00 — 4 commitsThu 6:00 — 4 commitsThu 7:00 — 5 commitsThu 8:00 — 6 commitsThu 9:00 — 1 commitsThu 10:00 — 8 commitsThu 11:00 — 5 commitsThu 12:00 — 7 commitsThu 13:00 — 4 commitsThu 14:00 — 5 commitsThu 15:00 — 7 commitsThu 16:00 — 5 commitsThu 17:00 — 5 commitsThu 18:00 — 9 commitsThu 19:00 — 5 commitsThu 20:00 — 5 commitsThu 21:00 — 7 commitsThu 22:00 — 6 commitsThu 23:00 — 8 commitsFri 0:00 — 15 commitsFri 1:00 — 16 commitsFri 2:00 — 10 commitsFri 3:00 — 10 commitsFri 4:00 — 3 commitsFri 5:00 — 5 commitsFri 6:00 — 11 commitsFri 7:00 — 9 commitsFri 8:00 — 8 commitsFri 9:00 — 2 commitsFri 10:00 — 8 commitsFri 11:00 — 5 commitsFri 12:00 — 2 commitsFri 13:00 — 6 commitsFri 14:00 — 7 commitsFri 15:00 — 3 commitsFri 16:00 — 6 commitsFri 17:00 — 6 commitsFri 18:00 — 11 commitsFri 19:00 — 2 commitsFri 20:00 — 6 commitsFri 21:00 — 3 commitsFri 22:00 — 4 commitsFri 23:00 — 8 commitsSat 0:00 — 12 commitsSat 1:00 — 8 commitsSat 2:00 — 3 commitsSat 3:00 — 7 commitsSat 4:00 — 4 commitsSat 5:00 — 2 commitsSat 6:00 — 1 commitsSat 7:00 — 9 commitsSat 8:00 — 10 commitsSat 9:00 — 9 commitsSat 10:00 — 4 commitsSat 11:00 — 0 commitsSat 12:00 — 5 commitsSat 13:00 — 7 commitsSat 14:00 — 4 commitsSat 15:00 — 6 commitsSat 16:00 — 16 commitsSat 17:00 — 6 commitsSat 18:00 — 8 commitsSat 19:00 — 12 commitsSat 20:00 — 3 commitsSat 21:00 — 8 commitsSat 22:00 — 11 commitsSat 23:00 — 9 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.
DateListRankStars gained
Jul 25, 2026daily#6+5
May 14, 2026daily#23+46
May 13, 2026daily#16+65
May 12, 2026daily#6+82
May 11, 2026daily#15+128
  • trimstray/the-book-of-secret-knowledge

    A collection of inspiring lists, manuals, cheatsheets, blogs, hacks, one-liners, cli/web tools and more.

    237.2K stars

  • krahets/hello-algo

    《Hello 算法》:动画图解、一键运行的数据结构与算法教程。支持简中、繁中、English、日本語,提供 Python, Java, C++, C, C#, JS, Go, Swift, Rust, Ruby, Kotlin, TS, Dart 等代码实现

    129.3K stars · Java

  • Stirling-Tools/Stirling-PDF

    #1 PDF Application on GitHub that lets you edit PDFs on any device anywhere

    89.1K stars · Java

  • ByteByteGoHq/system-design-101

    Explain complex systems using visuals and simple terms. Help you prepare for system design interviews.

    86.7K stars

  • usememos/memos

    Open-source, self-hosted note-taking tool built for quick capture. Markdown-native, lightweight, and fully yours.

    62K stars · Go

  • sansan0/TrendRadar

    ⭐AI-driven public opinion & trend monitor with multi-platform aggregation, RSS, and smart alerts.🎯 告别信息过载,你的 AI 舆情监控助手与热点筛选工具!聚合多平台热点 + RSS 订阅,支持关键词精准筛选。AI 智能筛选新闻 + AI 翻译 + AI 分析简报直推手机,也支持接入 MCP 架构,赋能 AI 自然语言对话分析、情感洞察与趋势预测等。支持 Docker ,数据本地/云端自持。集成微信/飞书/钉钉/Telegram/邮件/ntfy/bark/slack 等渠道智能推送。

    61.2K stars · Python