<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hector Ventura</title>
    <description>The latest articles on DEV Community by Hector Ventura (@hectorvent).</description>
    <link>https://dev.to/hectorvent</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F805260%2F29409f84-f7d5-43f4-9b42-4f2ba5c1ad10.png</url>
      <title>DEV Community: Hector Ventura</title>
      <link>https://dev.to/hectorvent</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hectorvent"/>
    <language>en</language>
    <item>
      <title>Why Floci is built in Java (and why that's the right call in 2026)</title>
      <dc:creator>Hector Ventura</dc:creator>
      <pubDate>Sat, 16 May 2026 18:35:05 +0000</pubDate>
      <link>https://dev.to/hectorvent/why-floci-is-built-in-java-and-why-thats-the-right-call-in-2026-50ag</link>
      <guid>https://dev.to/hectorvent/why-floci-is-built-in-java-and-why-thats-the-right-call-in-2026-50ag</guid>
      <description>&lt;p&gt;I get this question every week:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Why did you build &lt;a href="https://github.com/floci-io/floci" rel="noopener noreferrer"&gt;Floci&lt;/a&gt; in Java? Why not Go, Rust, or Python like LocalStack?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's a fair question. And the short answer is: &lt;strong&gt;the constraints picked the language, not the other way around.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The constraints came first
&lt;/h2&gt;

&lt;p&gt;Before I wrote a line of code, I knew what Floci had to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;24ms cold start, small memory at idle.&lt;/strong&gt; Otherwise CI pipelines skip it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One statically-linked binary in a ~90 MB image.&lt;/strong&gt; No bundled interpreter, no runtime to install.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real concurrency.&lt;/strong&gt; Floci has to handle SQS long polling, Lambda containers, RDS proxying, DynamoDB Streams — all at the same time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainable for years&lt;/strong&gt;, by contributors who aren't me.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those five constraints knock most languages out before personal preference enters the picture.&lt;/p&gt;




&lt;h2&gt;
  
  
  Java in 2026 isn't the Java you remember
&lt;/h2&gt;

&lt;p&gt;If your last serious Java was Spring Boot in 2015, the language has moved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From Java 8 to Java 25 (the current LTS), the highlights that actually matter:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Virtual threads&lt;/strong&gt; (Java 21, mature in 25) — millions of lightweight threads, no more thread pool tuning. For an emulator handling concurrent SQS pollers, Lambda invocations, and DB proxies, this is transformative.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Records, sealed classes, pattern matching&lt;/strong&gt; — what used to take 30 lines of boilerplate is now 1. Modeling AWS request/response types becomes a pleasure instead of a chore.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text blocks, switch expressions, &lt;code&gt;var&lt;/code&gt;&lt;/strong&gt; — the language reads like a modern language now, not an artifact of 1995.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compact object headers&lt;/strong&gt; (Java 25) — 8–12% memory savings across the board, for free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster startup, smaller footprints&lt;/strong&gt; every release — class data sharing, ahead-of-time profiling, generational ZGC. The JVM in 2026 is a different beast.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Java didn't stand still; the ecosystem just stopped talking about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then there's the runtime story, Quarkus + GraalVM:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quarkus changed the runtime model entirely. It does at &lt;em&gt;build time&lt;/em&gt; what classic Java does at startup. Reflection, classpath scanning, dependency injection: all resolved when you compile, not when the container boots.&lt;/p&gt;

&lt;p&gt;GraalVM then compiles that build-time-prepared application into a &lt;strong&gt;native binary&lt;/strong&gt;. The benefits, concretely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No JVM at runtime.&lt;/strong&gt; No class loader, no warmup, no JIT pause on first request. The binary &lt;em&gt;is&lt;/em&gt; the runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;24ms cold start&lt;/strong&gt; vs 1–3 seconds for a typical JVM app. ~100× faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~13 MiB idle memory&lt;/strong&gt; vs hundreds of MB for a JVM. ~10–30× smaller.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~90 MB Docker image&lt;/strong&gt; vs ~250 MB for a JRE-based image, often more once you add libraries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No CVE surface from a runtime you didn't write.&lt;/strong&gt; No bundled OpenSSL, no Python interpreter, no Node... just the binary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Statically linked.&lt;/strong&gt; Runs on &lt;code&gt;scratch&lt;/code&gt; or distroless base images if you want.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the part most people miss when they hear "Java." Floci doesn't carry a JVM. There is no JVM in the image. There's a binary.&lt;/p&gt;

&lt;p&gt;Underneath Quarkus sits a stack that's been battle-tested for over a decade: &lt;strong&gt;Netty&lt;/strong&gt; for non-blocking I/O (the same library powering gRPC, Cassandra, and most of the Java networking world), &lt;strong&gt;Vert.x&lt;/strong&gt; for reactive routing, and &lt;strong&gt;Jakarta EE&lt;/strong&gt; standards (JAX-RS, CDI) — boring in the best sense, with tooling and patterns everyone already knows.&lt;/p&gt;

&lt;p&gt;This isn't a bet on a trendy stack. It's a bet on infrastructure that AWS, Netflix, and LinkedIn have been running in production for years.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why not Python (LocalStack's choice)?
&lt;/h2&gt;

&lt;p&gt;Python is great. I use it for scripts, tooling, and ML work all the time. But for an emulator that needs to be small, fast, and concurrent, the language's strengths and Floci's needs don't quite line up.&lt;/p&gt;

&lt;p&gt;The numbers tell the story:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Floci&lt;/th&gt;
&lt;th&gt;LocalStack&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Image size&lt;/td&gt;
&lt;td&gt;~90 MB&lt;/td&gt;
&lt;td&gt;~1 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Idle memory&lt;/td&gt;
&lt;td&gt;~13 MiB&lt;/td&gt;
&lt;td&gt;~500 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cold start&lt;/td&gt;
&lt;td&gt;~24 ms&lt;/td&gt;
&lt;td&gt;15–30 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's roughly &lt;strong&gt;10× smaller, 40× less RAM, and 1000× faster startup&lt;/strong&gt;. Even a thoughtfully built Python emulator pays for the interpreter, the standard library, and the dependency tree — on disk and at startup. &lt;strong&gt;A GraalVM native binary doesn't carry any of that.&lt;/strong&gt; The runtime &lt;em&gt;is&lt;/em&gt; the binary.&lt;/p&gt;

&lt;p&gt;There's also the concurrency story. Floci has to handle SQS long polling, Lambda containers, RDS proxying, and DynamoDB Streams simultaneously. In Java that's the default model. In Python it means navigating async/multiprocess gymnastics around the GIL — workable, but more friction.&lt;/p&gt;

&lt;p&gt;LocalStack made a reasonable choice for what Python is good at: fast iteration on AWS API surface coverage. The price shows up downstream in the auth-token-walled "Pro" tier that pays for the engineering needed to keep a Python runtime fast and stable at that scope.&lt;/p&gt;

&lt;p&gt;Floci goes the other way. The runtime is small because the language let me make it small.&lt;/p&gt;




&lt;h2&gt;
  
  
  And yes, I know Java well
&lt;/h2&gt;

&lt;p&gt;Last point, because it's honest: I've been writing Java for 18+ years. When I'm debugging a wire-protocol mismatch at 11pm on a Sunday, I'm not fighting the language. I'm reading the AWS SDK source and writing the deserializer. The language is invisible.&lt;/p&gt;

&lt;p&gt;A maintainer who fights their own tools doesn't ship. Floci ships because the stack and I have been working together for nearly two decades.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Java + Quarkus + GraalVM → &lt;strong&gt;24ms startup, 13 MiB idle, single 90 MB binary&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Built on Netty, Vert.x, and Jakarta EE — boring, proven infrastructure&lt;/li&gt;
&lt;li&gt;Python's strengths (rapid iteration, scripting) aren't Floci's needs&lt;/li&gt;
&lt;li&gt;18 years of Java experience means I ship features instead of debugging language weirdness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The constraints picked the stack. The stack has held up.&lt;/p&gt;




&lt;p&gt;🔗 &lt;a href="https://github.com/floci-io/floci" rel="noopener noreferrer"&gt;github.com/floci-io/floci&lt;/a&gt;&lt;br&gt;
📚 &lt;a href="https://floci.io/floci" rel="noopener noreferrer"&gt;floci.io/floci&lt;/a&gt; &lt;br&gt;
💬 &lt;a href="https://join.slack.com/t/floci/shared_invite/zt-3tjn02s3q-A00kEjJ1cZxsg_imTfy6Cw" rel="noopener noreferrer"&gt;floci.slack.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>java</category>
      <category>quarkus</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Jdjdbd</title>
      <dc:creator>Hector Ventura</dc:creator>
      <pubDate>Sat, 09 May 2026 20:40:59 +0000</pubDate>
      <link>https://dev.to/hectorvent/jdjdbd-ph5</link>
      <guid>https://dev.to/hectorvent/jdjdbd-ph5</guid>
      <description>&lt;p&gt;``bzjxbxj&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Floci philosophy: stay tiny, feel like real AWS</title>
      <dc:creator>Hector Ventura</dc:creator>
      <pubDate>Sat, 09 May 2026 20:24:50 +0000</pubDate>
      <link>https://dev.to/hectorvent/the-floci-philosophy-stay-tiny-feel-like-real-aws-1h3d</link>
      <guid>https://dev.to/hectorvent/the-floci-philosophy-stay-tiny-feel-like-real-aws-1h3d</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fast and fake.&lt;/strong&gt; Tiny, instant, until your code touches a real engine and the abstraction cracks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heavy and faithful.&lt;/strong&gt; Closer to AWS, but a 3-second startup, hundreds of MB, a bundled Python runtime that turns every CI job into a slow morning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built &lt;strong&gt;&lt;a href="https://github.com/floci-io/floci" rel="noopener noreferrer"&gt;Floci&lt;/a&gt;&lt;/strong&gt; to refuse the choice. One principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Be the lightest thing possible. Be real where it counts.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The two halves of every AWS service
&lt;/h2&gt;

&lt;p&gt;Read enough AWS API docs and you notice every service has two parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A control plane:&lt;/strong&gt;  "create this bucket, list my queues." Just CRUD over JSON or XML. The hard part is wire-protocol fidelity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A data plane:&lt;/strong&gt;  "run this Lambda, connect to this database, query this Redis." This is where the real engine lives. Faking it works until it doesn't.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The control plane has no excuse to be heavy. The data plane has no excuse to be fake.&lt;/p&gt;

&lt;p&gt;So Floci does both, on purpose, in different layers.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it's structured
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌───────────────────────────────────────────┐
│  Floci core, Quarkus native binary               │
│  24 ms startup · 13 MiB idle                     │
│                                                  │
│  All control planes + stateless services         │
│  (S3, SQS, DynamoDB, IAM, KMS, ...)              │
└─────────────────┬─────────────────────────┘
                  │ Docker socket, on demand
                  ▼
┌───────────────────────────────────────────┐
│  Right-sized engines per service                 │
│                                                  │
│  Tiny sidecars:                                  │
│   • Athena, Firehose → floci-duck (DuckDB).     │
│                                                  │
│  Heavy real engines:                             │
│   • Lambda → real container                     │
│   • RDS    → real Postgres / MySQL              │
│   • Cache  → real Redis / Valkey                │
│   • MSK    → real Kafka                         │
└───────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One tiny core. Real engines pulled in only when you actually use the service that needs them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three patterns, not two
&lt;/h2&gt;

&lt;p&gt;The interesting part of the design is that there are &lt;strong&gt;three&lt;/strong&gt; patterns, not the usual two. Each picks the smallest thing that gives you real behavior:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Stateless / metadata → in-process.&lt;/strong&gt;&lt;br&gt;
S3, SQS, DynamoDB, IAM. There's no engine to fake, just specs to implement correctly. Floci does it in 13 MiB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Small embedded engine exists → tiny sidecar.&lt;/strong&gt;&lt;br&gt;
Athena doesn't need a Presto cluster. It needs &lt;em&gt;correct SQL execution&lt;/em&gt; over data in S3. So Floci uses &lt;strong&gt;&lt;a href="https://github.com/floci-io/floci-duck" rel="noopener noreferrer"&gt;floci-duck&lt;/a&gt;&lt;/strong&gt;, a small Rust binary wrapping DuckDB. Real columnar SQL, no JVM, no Hive metastore. The same sidecar powers Firehose's Parquet conversion. That's the philosophy at its purest: pick the lightest &lt;em&gt;real&lt;/em&gt; engine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. No embeddable substitute → real heavy engine.&lt;/strong&gt;&lt;br&gt;
RDS, ElastiCache, MSK, OpenSearch, Lambda. Your code speaks PostgreSQL or RESP or Kafka or runs as actual containers, there's no faking it. Floci spins up the real thing on demand and gets out of the way.&lt;/p&gt;

&lt;p&gt;The rule across all three: &lt;strong&gt;never reimplement an engine that already exists.&lt;/strong&gt; Glue the AWS API onto it, then disappear.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this buys you
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Lightweight isn't marketing.&lt;/strong&gt; A 24ms cold start means you spin Floci up per-test without thinking. ~13 MiB at idle fits free-tier CI runners. ~90 MB image is auditable. &lt;code&gt;docker compose up&lt;/code&gt; finishes before you've alt-tabbed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fidelity isn't a checkbox.&lt;/strong&gt; Lambda runs in real Lambda runtime images. RDS speaks real PostgreSQL. ElastiCache speaks real RESP. Athena runs real SQL through DuckDB against your real S3 data. If your test passes, your code actually works.&lt;/p&gt;




&lt;h2&gt;
  
  
  The tradeoffs I accept
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Floci needs the Docker socket&lt;/strong&gt; for engine-backed services. Fair deal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some services start slower than the core.&lt;/strong&gt; Postgres takes a few seconds to boot. Floci itself is 24ms, but &lt;code&gt;CreateDBInstance&lt;/code&gt; takes as long as Postgres takes. No way around that without lying.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the price of not lying to you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;Every emulator decision comes down to: &lt;em&gt;do you want your tests to tell you the truth?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A bloated emulator gets skipped. A fast-but-fake one passes tests that fail in production. Floci's whole architecture is built to dodge both ends, pick the smallest real thing for every service, and never the bloated thing that pretends.&lt;/p&gt;

&lt;p&gt;That's it. The rest is just code.&lt;/p&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 4566:4566 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; /var/run/docker.sock:/var/run/docker.sock &lt;span class="se"&gt;\&lt;/span&gt;
  floci/floci:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔗 &lt;a href="https://github.com/floci-io/floci" rel="noopener noreferrer"&gt;github.com/floci-io/floci&lt;/a&gt;&lt;br&gt;
📚 &lt;a href="https://floci.io/floci" rel="noopener noreferrer"&gt;floci.io/floci&lt;/a&gt;&lt;br&gt;
💬 &lt;a href="https://floci.slack.com" rel="noopener noreferrer"&gt;floci.slack.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've ever shipped a bug because a test mock lied to you. I'd love to know which service did it. That's what Floci's roadmap is built from.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>opensource</category>
      <category>architecture</category>
      <category>testing</category>
    </item>
    <item>
      <title>Floci (LocalStack alternative) storage modes: pick the right tradeoff per service (and never pay for it)</title>
      <dc:creator>Hector Ventura</dc:creator>
      <pubDate>Sun, 03 May 2026 19:29:06 +0000</pubDate>
      <link>https://dev.to/hectorvent/floci-localstack-alternative-storage-modes-pick-the-right-tradeoff-per-service-and-never-pay-3nj5</link>
      <guid>https://dev.to/hectorvent/floci-localstack-alternative-storage-modes-pick-the-right-tradeoff-per-service-and-never-pay-3nj5</guid>
      <description>&lt;p&gt;State that survives a &lt;code&gt;docker compose down&lt;/code&gt; is one of those things you don't think about, until your test suite needs it, your local dev needs it, and your CI pipeline absolutely doesn't.&lt;/p&gt;

&lt;p&gt;LocalStack handles persistence with one switch (&lt;code&gt;PERSISTENCE=1&lt;/code&gt;) and it's a &lt;strong&gt;Pro-only feature&lt;/strong&gt;. &lt;strong&gt;&lt;a href="https://github.com/floci-io/floci" rel="noopener noreferrer"&gt;Floci&lt;/a&gt;&lt;/strong&gt; ships four storage modes, all free, all in core, with per-service overrides. Pick the right tradeoff for the job.&lt;/p&gt;




&lt;h2&gt;
  
  
  The four modes at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Survives restart&lt;/th&gt;
&lt;th&gt;Write behavior&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;memory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Pure RAM&lt;/td&gt;
&lt;td&gt;CI, unit tests, ephemeral integration tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hybrid&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Async flush to disk&lt;/td&gt;
&lt;td&gt;Local development (the sweet spot)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;persistent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Sync write on every change&lt;/td&gt;
&lt;td&gt;"Don't lose my last write" workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wal&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Append-only log + compaction&lt;/td&gt;
&lt;td&gt;High-throughput durable workloads&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You set a global default, and override per service when one needs different behavior. That's it.&lt;/p&gt;




&lt;h2&gt;
  
  
  When to use each
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;memory&lt;/code&gt; (default) for CI and ephemeral tests
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;floci&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;floci/floci:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4566:4566"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;FLOCI_STORAGE_MODE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;memory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything stays in RAM. Container restarts wipe the slate. &lt;strong&gt;Fastest possible writes&lt;/strong&gt;, smallest possible footprint.&lt;/p&gt;

&lt;p&gt;This is the right answer for almost every CI pipeline. Each test run starts clean, you don't manage volumes, and you don't fight stale state from a previous job. Combined with Floci's 24ms cold start and 13 MiB idle footprint, you can spin up a fresh emulator per test class without thinking.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;hybrid&lt;/code&gt; for local development
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;floci&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;floci/floci:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4566:4566"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data:/app/data&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;FLOCI_STORAGE_MODE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hybrid&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reads and writes hit memory. A background flush moves data to disk every ~5 seconds. Container restarts pick up where you left off.&lt;/p&gt;

&lt;p&gt;This is the mode I run locally. It feels exactly like &lt;code&gt;memory&lt;/code&gt; while you're working, no I/O latency on writes, but &lt;code&gt;docker compose down&lt;/code&gt; doesn't nuke your seeded test data. You spend less time re-running setup scripts.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;persistent&lt;/code&gt; when losing the last write hurts
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;floci&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;floci/floci:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4566:4566"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data:/app/data&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;FLOCI_STORAGE_MODE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;persistent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every change syncs to disk before responding. Slower writes, but if Docker hard-kills the container at the wrong moment, the data that was acknowledged is genuinely on disk.&lt;/p&gt;

&lt;p&gt;Reach for this when you're building something where "did this actually save?" matters, like reproducing a production data corruption issue, or running a long-running local script you don't want to redo.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;wal&lt;/code&gt;: for high-write workloads that still need durability
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;floci&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;floci/floci:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4566:4566"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data:/app/data&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;FLOCI_STORAGE_MODE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wal&lt;/span&gt;
      &lt;span class="na"&gt;FLOCI_STORAGE_WAL_COMPACTION_INTERVAL_MS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every mutation goes to an append-only log first, with periodic compaction. You get durability without paying the random-write cost of &lt;code&gt;persistent&lt;/code&gt; mode.&lt;/p&gt;

&lt;p&gt;Useful when you're stress-testing a service that writes a lot and high-volume DynamoDB, Kinesis-heavy pipelines, anything where &lt;code&gt;persistent&lt;/code&gt; becomes the bottleneck but you still want crash-safety.&lt;/p&gt;




&lt;h2&gt;
  
  
  Per-service overrides
&lt;/h2&gt;

&lt;p&gt;This is the part that doesn't exist anywhere else: &lt;strong&gt;set the global mode, then override only the services that need different behavior.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;floci&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;floci/floci:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4566:4566"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data:/app/data&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;FLOCI_STORAGE_MODE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;memory&lt;/span&gt;                          &lt;span class="c1"&gt;# everything is ephemeral by default&lt;/span&gt;
      &lt;span class="na"&gt;FLOCI_STORAGE_SERVICES_DYNAMODB_MODE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;persistent&lt;/span&gt;    &lt;span class="c1"&gt;# except DynamoDB — keep that on disk&lt;/span&gt;
      &lt;span class="na"&gt;FLOCI_STORAGE_SERVICES_S3_MODE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hybrid&lt;/span&gt;              &lt;span class="c1"&gt;# and S3 — keep buckets across restarts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Want fast tests but keep your seeded DynamoDB tables across restarts? Two env vars.&lt;/p&gt;




&lt;h2&gt;
  
  
  How this compares to LocalStack
&lt;/h2&gt;

&lt;p&gt;LocalStack persistence is a single boolean (&lt;code&gt;PERSISTENCE=1&lt;/code&gt;) that's locked behind the &lt;strong&gt;Pro tier&lt;/strong&gt;. Beyond pricing, the design itself is different:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;LocalStack (Pro)&lt;/th&gt;
&lt;th&gt;Floci&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Paid tier&lt;/td&gt;
&lt;td&gt;Free, MIT-licensed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Granularity&lt;/td&gt;
&lt;td&gt;Global on/off&lt;/td&gt;
&lt;td&gt;Four modes, per-service overrides&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write strategy&lt;/td&gt;
&lt;td&gt;Snapshots (point-in-time)&lt;/td&gt;
&lt;td&gt;Sync, async, or WAL — your choice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;During snapshot&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Service is locked, requests block&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No locking, writes never pause&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-version&lt;/td&gt;
&lt;td&gt;Snapshots may break across versions&lt;/td&gt;
&lt;td&gt;Plain on-disk format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implementation&lt;/td&gt;
&lt;td&gt;Python &lt;code&gt;pickle&lt;/code&gt; serialization&lt;/td&gt;
&lt;td&gt;Native, format per service&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The locking part is the one most people don't see coming. LocalStack's snapshot mechanism blocks requests to a service while it's being saved, which is fine for shutdown, but surprising mid-test. Floci never pauses writes; durability comes from the storage mode you picked, not from a freeze-and-dump.&lt;/p&gt;




&lt;h2&gt;
  
  
  A pattern that just works
&lt;/h2&gt;

&lt;p&gt;For most teams, this covers 90% of what you need. &lt;strong&gt;CI:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;floci&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;floci/floci:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4566:4566"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;FLOCI_STORAGE_MODE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;memory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Local development:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;floci&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;floci/floci:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4566:4566"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data:/app/data&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;FLOCI_STORAGE_MODE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hybrid&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No auth token, no Pro tier, no surprise locking.&lt;/p&gt;

&lt;p&gt;That's the point. Persistence isn't an enterprise feature, it's a basic developer ergonomic. Floci ships it that way.&lt;/p&gt;




&lt;p&gt;🔗 &lt;a href="https://github.com/floci-io/floci" rel="noopener noreferrer"&gt;github.com/floci-io/floci&lt;/a&gt; · 📚 &lt;a href="https://floci.io/floci/configuration/storage/" rel="noopener noreferrer"&gt;Storage docs&lt;/a&gt; · 💬 &lt;a href="https://floci.slack.com" rel="noopener noreferrer"&gt;floci.slack.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>localstack</category>
      <category>devops</category>
      <category>testing</category>
    </item>
    <item>
      <title>Floci</title>
      <dc:creator>Hector Ventura</dc:creator>
      <pubDate>Thu, 30 Apr 2026 00:13:46 +0000</pubDate>
      <link>https://dev.to/hectorvent/floci-2bgd</link>
      <guid>https://dev.to/hectorvent/floci-2bgd</guid>
      <description></description>
    </item>
    <item>
      <title>Meet Floci: a fast, free, no-strings AWS emulator (no auth token, no quotas)</title>
      <dc:creator>Hector Ventura</dc:creator>
      <pubDate>Wed, 29 Apr 2026 18:58:35 +0000</pubDate>
      <link>https://dev.to/hectorvent/meet-floci-a-fast-free-no-strings-aws-emulator-no-auth-token-no-quotas-2gdh</link>
      <guid>https://dev.to/hectorvent/meet-floci-a-fast-free-no-strings-aws-emulator-no-auth-token-no-quotas-2gdh</guid>
      <description>&lt;p&gt;If you write code against AWS, you've probably hit one of these in the last year:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LocalStack Community Edition sunset in March 2026.&lt;/strong&gt; Auth tokens, frozen security updates, paid tiers for the things that used to be free.&lt;/li&gt;
&lt;li&gt;Spinning up real AWS for local dev or CI is &lt;strong&gt;slow, expensive, and risky&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Mock libraries lie to you until production day.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I started &lt;strong&gt;Floci&lt;/strong&gt; to fix this. It's a single Docker image, MIT-licensed, no account, no telemetry, no feature gates. Pull and go.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;code&gt;docker run -p 4566:4566 floci/floci:latest&lt;/code&gt; and you have 40+ AWS services on &lt;code&gt;http://localhost:4566&lt;/code&gt;. Same port and SDK calls as LocalStack. Switch by changing one env var.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🔗 GitHub: &lt;a href="https://github.com/floci-io/floci" rel="noopener noreferrer"&gt;github.com/floci-io/floci&lt;/a&gt;&lt;br&gt;
🔗 Docs: &lt;a href="https://floci.io/floci" rel="noopener noreferrer"&gt;floci.io/floci&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;I was tired of three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hidden costs.&lt;/strong&gt; Free emulators that "encourage" you toward a paid tier the moment your team grows past 1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow startup.&lt;/strong&gt; Booting an emulator that takes 3+ seconds for every CI job multiplies into hours of waste per week.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mock-only fidelity.&lt;/strong&gt; Some services (Lambda, RDS, ElastiCache, Athena, EKS) need a real engine, not a JSON shim that pretends.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Floci is what I wished existed.&lt;/p&gt;


&lt;h2&gt;
  
  
  What makes Floci different
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. It's actually fast
&lt;/h3&gt;

&lt;p&gt;Floci is built on &lt;strong&gt;Quarkus + GraalVM native image&lt;/strong&gt;. No JVM warmup, no Python interpreter startup.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Floci&lt;/th&gt;
&lt;th&gt;LocalStack&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cold start&lt;/td&gt;
&lt;td&gt;~24 ms&lt;/td&gt;
&lt;td&gt;~3,300 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Idle memory&lt;/td&gt;
&lt;td&gt;~13 MiB&lt;/td&gt;
&lt;td&gt;~143 MiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image size&lt;/td&gt;
&lt;td&gt;~90 MB&lt;/td&gt;
&lt;td&gt;~2 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That gap is why Floci is comfortable on your smallest CI runner. A test that spins up a fresh emulator per job suddenly stops being painful.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Real Docker where it matters
&lt;/h3&gt;

&lt;p&gt;Mock-only emulators are fine until your code starts depending on the real engine's behavior. Floci spins up &lt;strong&gt;real Docker containers&lt;/strong&gt; for the services where wire protocols and execution semantics matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lambda:&lt;/strong&gt; real container per function, warm pool, aliases, Function URLs, SQS/Kinesis/DDB Streams event source mappings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RDS:&lt;/strong&gt; actual PostgreSQL and MySQL containers with JDBC wire protocol proxying&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElastiCache:&lt;/strong&gt; real Redis/Valkey with RESP proxying and IAM/SigV4 token validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MSK:&lt;/strong&gt; real Apache Kafka clusters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenSearch / EKS / ECS:&lt;/strong&gt; real engines and orchestrators where applicable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the architecture from day one, not a feature flag, not a paid add-on.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Genuinely free and open
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MIT licensed.&lt;/strong&gt; Fork it, embed it, ship it inside your product. No "community edition sunset" coming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No auth token.&lt;/strong&gt; Ever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No telemetry.&lt;/strong&gt; Floci doesn't phone home.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No CI quota.&lt;/strong&gt; Run 100,000 jobs a day if you want.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No feature gates.&lt;/strong&gt; Every supported service is available to everyone.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  4. Wire-compatible with the real AWS SDKs
&lt;/h3&gt;

&lt;p&gt;Floci is validated by &lt;strong&gt;1,850+ automated compatibility tests&lt;/strong&gt; running across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS SDK for Java v2&lt;/li&gt;
&lt;li&gt;AWS SDK for JavaScript v3&lt;/li&gt;
&lt;li&gt;boto3 (Python)&lt;/li&gt;
&lt;li&gt;AWS CLI v2&lt;/li&gt;
&lt;li&gt;AWS SDK for Go v2&lt;/li&gt;
&lt;li&gt;AWS SDK for Rust&lt;/li&gt;
&lt;li&gt;Terraform / OpenTofu / AWS CDK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The principle: the SDK source is the contract. If the official SDK can't tell Floci apart from AWS at the wire level, the test passes. If it can, that's a bug.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Drop-in for LocalStack users
&lt;/h3&gt;

&lt;p&gt;Same default port (&lt;code&gt;4566&lt;/code&gt;). Same wire protocols. Same SDK endpoint override. Migration is one env var:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- AWS_ENDPOINT_URL=http://localstack:4566
&lt;/span&gt;&lt;span class="gi"&gt;+ AWS_ENDPOINT_URL=http://floci:4566
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Your application code, your IaC, your tests, all unchanged.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 30-second tour
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;floci&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;floci/floci:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4566:4566"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data:/app/data&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;

&lt;span class="c"&gt;# Overwrite the aws-cli default URL endpoint&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_ENDPOINT_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:4566"&lt;/span&gt;

aws s3 mb s3://my-bucket
aws sqs create-queue &lt;span class="nt"&gt;--queue-name&lt;/span&gt; my-queue
aws dynamodb list-tables
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Java with the AWS SDK v2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;S3Client&lt;/span&gt; &lt;span class="n"&gt;s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;S3Client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;endpointOverride&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://localhost:4566"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Region&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;US_EAST_1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;credentialsProvider&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;StaticCredentialsProvider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nc"&gt;AwsBasicCredentials&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"test"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"test"&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forcePathStyle&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done.&lt;/p&gt;




&lt;p&gt;Testcontainers integration (it just works)&lt;br&gt;
If you write JUnit/Spring Boot tests, there's an official Testcontainers module on Maven Central. No manual GenericContainer setup, no port juggling.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.floci&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;testcontainers-floci&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.1.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span class="nt"&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then in your test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Testcontainers&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;S3IntegrationTest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Container&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;FlociContainer&lt;/span&gt; &lt;span class="n"&gt;floci&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FlociContainer&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;shouldCreateBucket&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;S3Client&lt;/span&gt; &lt;span class="n"&gt;s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;S3Client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;endpointOverride&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;floci&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getEndpoint&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Region&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;floci&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRegion&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;credentialsProvider&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;StaticCredentialsProvider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                &lt;span class="nc"&gt;AwsBasicCredentials&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;floci&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAccessKey&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;floci&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSecretKey&lt;/span&gt;&lt;span class="o"&gt;())))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forcePathStyle&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createBucket&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bucket&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"my-bucket"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's also spring-boot-testcontainers-floci for Spring Boot users.  auto-configures Spring Cloud AWS to point at the container, zero boilerplate.&lt;br&gt;
Module page: testcontainers.com/modules/floci&lt;/p&gt;




&lt;h2&gt;
  
  
  What's supported today
&lt;/h2&gt;

&lt;p&gt;40+ services and growing. The big ones: &lt;strong&gt;S3, SQS, SNS, DynamoDB (+ Streams), Lambda, API Gateway v1 &amp;amp; v2, Cognito, KMS, Secrets Manager, IAM, STS, Step Functions, CloudFormation, EventBridge (+ Scheduler), CloudWatch Logs/Metrics, Kinesis, ElastiCache (Redis/Valkey), RDS (PostgreSQL/MySQL), ECS, EC2, OpenSearch, EKS, MSK, Glue, Athena, Data Firehose, ACM, AppConfig, Bedrock Runtime, SES/SES v2, SSM Parameter Store, etc&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Full per-service operation list: &lt;a href="https://floci.io/floci/services/" rel="noopener noreferrer"&gt;floci.io/floci/services&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Where it's heading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EC2&lt;/strong&gt; with real Docker-backed compute (alpha)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quarkus DevServices&lt;/strong&gt; integration for Java devs&lt;/li&gt;
&lt;li&gt;A per-language, per-service &lt;strong&gt;compatibility status dashboard&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of that interests you or if a service you need isn't there yet, I'd love your input. Floci already has a great roster of contributors fixing real bugs and adding real services. There's room for more.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to help
&lt;/h2&gt;

&lt;p&gt;If Floci sounds useful:&lt;/p&gt;

&lt;p&gt;⭐ &lt;strong&gt;Star the repo:&lt;/strong&gt; &lt;a href="https://github.com/floci-io/floci" rel="noopener noreferrer"&gt;github.com/floci-io/floci&lt;/a&gt;. It genuinely helps surface the project to other devs in the same boat&lt;br&gt;
💬 &lt;strong&gt;Join Slack:&lt;/strong&gt; community workspace at &lt;a href="https://floci.slack.com" rel="noopener noreferrer"&gt;floci.slack.com&lt;/a&gt;. Questions, feedback, and weird edge cases all welcome&lt;br&gt;
🐛 &lt;strong&gt;Open an issue:&lt;/strong&gt; found a wire-level mismatch with the real AWS SDK? That's exactly the kind of bug I want to know about&lt;br&gt;
🤝 &lt;strong&gt;Contribute:&lt;/strong&gt; good first issues are labeled, and PRs that add a missing API operation are very welcome&lt;/p&gt;

&lt;p&gt;Thanks for reading and if you give Floci a try, let me know what works and what doesn't. The whole point is to be the emulator developers actually want to use.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>devops</category>
      <category>opensource</category>
      <category>aws</category>
    </item>
  </channel>
</rss>
