RepoPilot

floci-io/floci

Light, fluffy, and always free - AWS Local Emulator

Healthy

Healthy across the board

HealthyDependency

Permissive license, no critical CVEs, actively maintained — safe to depend on.

HealthyFork & modify

Has a license, tests, and CI — clean foundation to fork and modify.

HealthyLearn from

Documented and popular — useful reference codebase to read through.

HealthyDeploy as-is

No critical CVEs, sane security posture — runnable as-is.

  • Last commit today
  • 24+ active contributors
  • Distributed ownership (top contributor 46% of recent commits)
  • MIT licensed
  • CI configured
  • Tests present

Computed from maintenance signals — commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Healthy" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Healthy
[![RepoPilot: Healthy](https://repopilot.app/api/badge/floci-io/floci)](https://repopilot.app/r/floci-io/floci)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card

This card auto-renders when someone shares https://repopilot.app/r/floci-io/floci on X, Slack, or LinkedIn.

Ask AI about floci-io/floci

Grounded in the actual source code. Pick a starter question or write your own.

Or write your own question →

Onboarding doc

Onboarding: floci-io/floci

Generated by RepoPilot · 2026-06-24 · Source

🎯Verdict

GO — Healthy across the board

  • Last commit today
  • 24+ active contributors
  • Distributed ownership (top contributor 46% of recent commits)
  • MIT licensed
  • CI configured
  • Tests present

<sub>Computed from maintenance signals — commit recency, contributor breadth, bus factor, license, CI, tests</sub>

TL;DR

Floci is a free, open-source AWS service emulator that runs in Docker, providing local development and testing without AWS accounts or feature gates. It mimics AWS Lambda, S3, DynamoDB, SQS, SNS, and other services for local development workflows. Built primarily in Java with polyglot support (Python, TypeScript, Rust, Go), it positions itself as the successor to LocalStack Community Edition after that project's March 2026 sunset and introduction of mandatory auth tokens. Polyglot monorepo with Java core engine, Python/TypeScript/Rust/Go service implementations, and compatibility test suite. Structure: root contains CI workflows (.github/workflows/), main binaries (bin/awslocal), and compatibility-tests/compat-cdk/ for AWS CDK integration testing with TypeScript stacks. Services are modular; bin/awslocal is the main CLI entry point.

👥Who it's for

AWS developers and DevOps engineers building serverless applications (Lambda, CDK stacks) who need local AWS service emulation for development and CI/CD testing. Contributors are typically infrastructure engineers familiar with Docker, AWS APIs, and polyglot backend development.

🌱Maturity & risk

Actively developed and production-ready for local testing workflows. The project has semantic versioning (.releaserc.json), automated CI/CD (release.yml, compatibility.yml workflows), comprehensive GitHub organization setup (CODEOWNERS, dependabot), and a community (1k+ stars evidenced by badges, Slack workspace, GitHub Discussions). It's mature enough that it positions itself as a LocalStack replacement.

Low-to-moderate risk. Heavy reliance on Java (8.4MB codebase) creates dependency management complexity; the polyglot nature (6+ languages) increases build surface area. Single maintainer risk visible in CODEOWNERS structure, though GitHub org suggests team effort. Docker image distribution through hub.docker.com/r/floci/floci (image recently migrated from hectorvent/floci) is stable. No visible breaking changes warnings in visible files.

Active areas of work

Active maintenance with semver-based releases (semantic-release via .releaserc.json), nightly CI runs (workflows/nightly.yml), and compatibility testing against AWS CDK 2.171.1. The Docker image namespace migration (hectorvent → floci) is recent. Dependabot automation suggests active dependency updates.

🚀Get running

Clone and start the Docker-based emulator:

git clone https://github.com/floci-io/floci
cd floci
docker compose up

For CDK compatibility testing:

cd compatibility-tests/compat-cdk
npm install
npm run build

Daily commands: Primary entry: docker compose up (Docker Compose configuration in root). For CLI: bin/awslocal (shell wrapper). For compatibility tests: cd compatibility-tests/compat-cdk && npm run build && npm run cdk deploy (uses aws-cdk-local ^2.0.0 binding). For documentation builds: GitHub Actions workflow triggers workflows/docs.yml.

🗺️Map of the codebase

🛠️How to make changes

Service implementations: Look under language-specific directories (src/ for Java core likely in root, Python modules, TypeScript in compatibility-tests/). CLI behavior: bin/awslocal wrapper. New AWS service: Add to Java core, bind in polyglot layers. Tests: Follow BATS pattern in compatibility-tests/compat-cdk/test/cdk.bats. CI/CD: Modify .github/workflows/ for new checks. Docs: Update README.md and CONTRIBUTING.md.

🪤Traps & gotchas

Docker-dependent: docker compose up requires Docker daemon running and significant disk space for base images. AWS credential simulation: AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY env vars typically set to dummy values (check .github/workflows for examples). CDK compatibility layer: aws-cdk-local ^2.0.0 requires specific Node.js version (check compatibility-tests/compat-cdk/.npmrc or package.json engines if present). Image namespace migration: Old hectorvent/floci images no longer updated; must use floci/floci:latest. Java version constraints likely present in pom.xml (not visible in file list but implied by .mvn/ wrapper).

💡Concepts to learn

  • localstack/localstack — Direct predecessor/alternative: LocalStack Community Edition that Floci explicitly positions as a free replacement for (LocalStack going paid-only in March 2026)
  • aws/aws-cdk — Ecosystem integration: Floci's compatibility-tests/compat-cdk runs actual AWS CDK 2.171.1 stacks; aws-cdk-local bridge depends on aws-cdk core
  • moto/moto — Alternative AWS mock library: Python-based service mocking library providing similar local testing but library-level rather than Docker-based
  • aws-amplify/amplify-cli — Ecosystem companion: Amplify CLI supports local emulation via LocalStack; Floci can serve as drop-in replacement via environment variable configuration
  • serverless/serverless — Ecosystem integration: Serverless Framework commonly uses LocalStack/Floci for local Lambda and function testing via docker-compose plugin

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add BATS integration tests for CDK compatibility layer

The compatibility-tests/compat-cdk directory has a test/cdk.bats file structure but appears to be a template. Given that aws-cdk-local is a key dependency and the repo is an AWS emulator, there should be comprehensive BATS tests validating CDK constructs (S3, Lambda, DynamoDB, etc.) work correctly with Floci. This would mirror the existing pattern in compat-terraform and compat-opentofu tests.

  • [ ] Review compatibility-tests/compat-cdk/test/cdk.bats and identify missing test cases for core AWS services
  • [ ] Add test cases for at least: S3 bucket creation, Lambda function deployment, DynamoDB table creation, and API Gateway setup
  • [ ] Verify tests run successfully with ./run-bats-in-container.sh and document any Floci-specific behavior differences
  • [ ] Update compatibility-tests/compat-cdk/README.md with test coverage details

Add GitHub Actions workflow for Node.js dependency security scanning

The repo has Dependabot configured (.github/dependabot.yml) but lacks a dedicated workflow to regularly audit npm vulnerabilities in compatibility-tests (compat-cdk has aws-cdk-lib, aws-cdk, TypeScript dependencies). Adding an npm audit or Snyk workflow would catch security issues early and align with the SECURITY.md file's intent.

  • [ ] Create .github/workflows/security-audit.yml with npm audit or Snyk scanning for compatibility-tests/compat-cdk and compatibility-tests directories
  • [ ] Configure the workflow to run on schedule (weekly) and on pull_request to main branch
  • [ ] Set failure conditions for high/critical vulnerabilities and document exceptions in SECURITY.md
  • [ ] Test the workflow by intentionally introducing a known vulnerable package version to verify detection

Add TypeScript strict mode and linting enforcement for compat-cdk

The compatibility-tests/compat-cdk has a tsconfig.json but likely doesn't enforce strict TypeScript checking or ESLint rules. Given that this is a reference implementation for CDK users, stricter type safety would improve code quality and serve as a better example. The bin/app.ts file should demonstrate best practices.

  • [ ] Update compatibility-tests/compat-cdk/tsconfig.json to enable: strict: true, noImplicitAny: true, strictNullChecks: true
  • [ ] Add ESLint configuration (.eslintrc.json) with @typescript-eslint/parser and recommended rules
  • [ ] Add lint and type-check scripts to compatibility-tests/compat-cdk/package.json
  • [ ] Integrate lint checks into .github/workflows/ci.yml under a new 'lint-cdk' job and fix any existing violations

🌿Good first issues

  • Add TypeScript type definitions for the awslocal CLI wrapper (bin/awslocal currently lacks TypeScript .d.ts); improves IDE autocomplete for npm-based consumers
  • Expand compatibility-tests/compat-cdk/test/cdk.bats with S3 bucket lifecycle policies and DynamoDB stream testing to increase service coverage validation
  • Document Python/Rust/Go service implementation patterns in CONTRIBUTING.md with concrete examples from existing services (currently only TypeScript CDK integration is well-documented)

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 97b08f6 — chore(docker): ship awslocal wrapper in the -compat image (#746) (herder)
  • ccac5f6 — fix(eventbridge): persist and forward SqsParameters.MessageGroupId for FIFO SQS targets (#722) (#742) (hectorvent)
  • 5d51052 — fix(docker): /etc/floci/aws/config missing in published Docker images (#740) (vonZeppelin)
  • 3163625 — fix(test): services must be running test fix (#741) (hectorvent)
  • d7ec2b2 — feat(textract): add Textract service support and integration tests (#719) (Romeo-mz)
  • d971288 — feat(ses): add UpdateAccountSendingEnabled (v1) (#737) (okinaka)
  • 271f27d — fix(cfn): reconcile lambda functions on update (#736) (cwright-hartree)
  • 294c0c1 — Release 1.5.13 (hectorvent)
  • c444da2 — Release 1.5.13 (hectorvent)
  • 8e617c6 — feat(transfer): add AWS Transfer Family management-plane API (#732) (hectorvent)

🔒Security observations

The codebase has several significant security concerns, primarily in the docker-compose.yml configuration. Critical issues include unrestricted Docker socket access, exposed Redis and Elasticsearch instances without authentication, and unvalidated environment variable handling. The repository demonstrates good security practices in vulnerability reporting (SECURITY.md with private reporting) and dependency management (pinned versions in package.json), but infrastructure-level security hardening is needed. The application appears to be designed for local development/emulation, but the current configuration would pose substantial risks if deployed in a networked or production environment

  • High · Docker Socket Mounted in Container — docker-compose.yml - volumes section. The docker-compose.yml mounts /var/run/docker.sock directly into the floci container. This grants the container full access to the Docker daemon, allowing it to spawn privileged containers, escape isolation boundaries, or escalate privileges. Fix: Remove the Docker socket mount if not essential. If required, use rootless Docker mode, implement Docker API authentication, or use a dedicated Docker-in-Docker solution with restricted capabilities.
  • High · Exposed Redis Port Range — docker-compose.yml - ports section. Redis ports 6379-6399 are exposed without authentication configured. Redis by default has no authentication enabled, allowing unauthenticated access to in-memory data stores from external networks. Fix: Implement Redis authentication with requirepass, restrict port exposure to localhost only, use Redis ACLs (Redis 6+), or run Redis on a private network only accessible to authorized services.
  • High · Exposed Elasticsearch Port Range — docker-compose.yml - ports section. Elasticsearch ports 9200-9299 are exposed without security configuration. Elasticsearch has no authentication by default, allowing unauthorized data access, modification, or deletion. Fix: Enable Elasticsearch security features (X-Pack), implement authentication and encryption, restrict port exposure to internal networks only, or use cloud-managed Elasticsearch with built-in security.
  • Medium · Broad Port Range Exposure — docker-compose.yml - ports section. RDS proxy ports (7001-7099) are exposed to all interfaces. While intended for local development, this wide port range may inadvertently expose services in production-like environments. Fix: Bind ports to 127.0.0.1:7001-7099 instead of 0.0.0.0 for development. Use environment-specific port bindings and restrict to localhost where possible.
  • Medium · Environment Variables Not Validated — docker-compose.yml - environment section. The docker-compose.yml uses several environment variables (FLOCI_STORAGE_HOST_PERSISTENT_PATH, FLOCI_BASE_URL) with ${PWD} substitution. No validation ensures safe values are used, potentially allowing path traversal or SSRF attacks. Fix: Validate all environment variable inputs, implement path normalization and canonicalization, use allowlists for base URLs, and document expected formats. Use .env.example with safe defaults.
  • Medium · Overly Permissive Service Alias — docker-compose.yml - networks section. The network alias 'localhost.floci.io' may conflict with local development patterns and could enable DNS-based attacks within the Docker network. Fix: Use more specific network aliases, implement network policies, validate incoming hostnames, and consider using service discovery mechanisms instead of fixed DNS aliases.
  • Low · Data Volume Permissions Undefined — docker-compose.yml - volumes section. The ./data volume is mounted without explicit permission controls, relying on default Docker permissions which may be overly permissive. Fix: Define explicit volume permissions using 'mode' flag, set proper file ownership, implement SELinux or AppArmor labels, and restrict directory access to required users only.
  • Low · Missing Security Headers in Configuration — docker-compose.yml and application configuration. No explicit security headers are configured for the HTTP services exposed on port 4566. Common headers like HSTS, CSP, X-Content-Type-Options are not mentioned. Fix: Implement security headers in the application or reverse proxy layer, configure HSTS for HTTPS, add Content-Security-Policy, X-Frame-Options, X-Content-Type-Options headers.

LLM-derived; treat as a starting point, not a security audit.

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/floci-io/floci shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live floci-io/floci repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/floci-io/floci.

What it runs against: a local clone of floci-io/floci — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in floci-io/floci | Confirms the artifact applies here, not a fork | | 2 | License is still MIT | Catches relicense before you depend on it | | 3 | Default branch main exists | Catches branch renames | | 4 | Last commit ≤ 30 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>floci-io/floci</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of floci-io/floci. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/floci-io/floci.git
#   cd floci
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of floci-io/floci and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "floci-io/floci(\\.git)?\\b" \\
  && ok "origin remote is floci-io/floci" \\
  || miss "origin remote is not floci-io/floci (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
  && ok "license is MIT" \\
  || miss "license drift — was MIT at generation time"

# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
  && ok "default branch main exists" \\
  || miss "default branch main no longer exists"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 30 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~0d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/floci-io/floci"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Embed this chat in your README →

Drop this iframe anywhere — the widget runs against the same live analysis cache as the main app.

<iframe
  src="https://repopilot.app/embed/floci-io/floci"
  width="100%" height="500"
  style="border:1px solid #d0d7de; border-radius:8px;"
  allow="microphone"
  loading="lazy"
></iframe>