<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>fakecloud</title>
      <link>https://fakecloud.dev</link>
      <description>Free, open-source local AWS cloud emulator</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://fakecloud.dev/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Mon, 06 Apr 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Why I&#x27;m building a free, open-source AWS emulator</title>
          <pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fakecloud.dev/blog/why-fakecloud/</link>
          <guid>https://fakecloud.dev/blog/why-fakecloud/</guid>
          <description xml:base="https://fakecloud.dev/blog/why-fakecloud/">&lt;p&gt;A few days ago, our CI started failing. The culprit: &lt;code&gt;localstack:latest&lt;&#x2F;code&gt; now requires an account and an auth token. Broken builds.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;d seen LocalStack creeping toward proprietary for a while, but this was the moment it actually hit. A colleague noticed it at the same time as me, but I was already working on a fix. I patched the build, but the question stuck: how long can we keep using the old version until we start having real problems?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;i-don-t-trust-mocks&quot;&gt;I don&#x27;t trust mocks&lt;&#x2F;h2&gt;
&lt;p&gt;I should back up. I care about tests a lot. Enough to become a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;chaijs&#x2F;chai&quot;&gt;maintainer of Chai.js&lt;&#x2F;a&gt;. Enough that when I build something, the test infrastructure comes first.&lt;&#x2F;p&gt;
&lt;p&gt;But I have a specific opinion about &lt;em&gt;what kind&lt;&#x2F;em&gt; of tests matter. I hate mocks. Not the concept — the way most codebases use them. You end up with tests that don&#x27;t test anything real. You&#x27;re asserting that you call functions in the right order. You&#x27;re verifying the plumbing, not the behavior.&lt;&#x2F;p&gt;
&lt;p&gt;The worst part is when mocked tests give you false confidence. I&#x27;ve seen tests that assert you do the wrong thing successfully — the mock doesn&#x27;t care, it just returns what you told it to. Your tests pass. Your code has a bug. You ship it.&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;re building on AWS, you need integration tests that actually talk to something that behaves like AWS. Not a mock. Not a stub that returns 200 to everything. Something that implements the real behavior: if you call API A then API B, and AWS would produce side effect C, then your test environment should produce side effect C too.&lt;&#x2F;p&gt;
&lt;p&gt;That&#x27;s what LocalStack used to give us. And that&#x27;s what I wanted to keep — but free and open source.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;so-i-built-it&quot;&gt;So I built it&lt;&#x2F;h2&gt;
&lt;p&gt;I started fakecloud on April 4th, 2026. Three days later: 13 AWS services, 300+ commits, 1,000+ tests.&lt;&#x2F;p&gt;
&lt;p&gt;That pace was possible because of two things. First, I used LLMs heavily throughout — not to generate code I don&#x27;t understand, but as a force multiplier with strong guardrails. Every feature ships with E2E tests. The tests are the guardrails. If the LLM generates something that doesn&#x27;t match real AWS behavior, the tests catch it.&lt;&#x2F;p&gt;
&lt;p&gt;Second, Rust. I chose Rust because I love static-typed compiled languages, and Rust&#x27;s type system is genuinely amazing. You get the performance of no garbage collector without having to manually manage memory. It means fakecloud starts in under 100ms and runs as a single binary — no Docker required, no runtime dependencies.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;correctness-is-the-whole-point&quot;&gt;Correctness is the whole point&lt;&#x2F;h2&gt;
&lt;p&gt;fakecloud doesn&#x27;t try to be a scalable production cloud. It&#x27;s not that. It&#x27;s a testing tool. And the one thing a testing tool needs to get right is correctness.&lt;&#x2F;p&gt;
&lt;p&gt;What does that mean in practice? If you call &lt;code&gt;CreateQueue&lt;&#x2F;code&gt;, then &lt;code&gt;SendMessage&lt;&#x2F;code&gt;, then &lt;code&gt;ReceiveMessage&lt;&#x2F;code&gt; on real AWS and get back your message with specific attributes — fakecloud should do exactly the same thing. If it doesn&#x27;t, that&#x27;s a fakecloud bug.&lt;&#x2F;p&gt;
&lt;p&gt;We currently verify this with 280+ E2E tests that use the official &lt;code&gt;aws-sdk-rust&lt;&#x2F;code&gt; crate and 34,856 auto-generated conformance test variants validated against official AWS Smithy models — covering all 731 API operations across 13 services at 100% conformance. The plan for the near future: set up a real AWS account and run our test suite against both fakecloud and real AWS side by side, so we can verify behavioral parity automatically.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-here-today&quot;&gt;What&#x27;s here today&lt;&#x2F;h2&gt;
&lt;p&gt;13 services, 731 API operations, all open source, all free:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;S3&lt;&#x2F;strong&gt; (74 actions) — objects, multipart uploads, versioning, lifecycle, notifications, encryption&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SQS&lt;&#x2F;strong&gt; (20 actions) — FIFO queues, dead-letter queues, long polling, batch operations&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SNS&lt;&#x2F;strong&gt; (34 actions) — fan-out to SQS, HTTP delivery, filter policies, platform applications&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;EventBridge&lt;&#x2F;strong&gt; (57 actions) — pattern matching, scheduled rules, connections, API destinations, endpoints&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;IAM&lt;&#x2F;strong&gt; (128 actions) — users, roles, policies, groups, instance profiles, OIDC&#x2F;SAML providers&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;STS&lt;&#x2F;strong&gt; (8 actions) — assume role, session tokens, federation&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SSM&lt;&#x2F;strong&gt; (146 actions) — parameters, documents, commands, maintenance windows, associations, automation, sessions&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;DynamoDB&lt;&#x2F;strong&gt; (57 actions) — tables, items, transactions, PartiQL, backups, global tables, streaming&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Lambda&lt;&#x2F;strong&gt; (10 actions) — function CRUD, invoke, event source mappings&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Secrets Manager&lt;&#x2F;strong&gt; (23 actions) — versioning, soft delete, rotation, replication, resource policies&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CloudWatch Logs&lt;&#x2F;strong&gt; (113 actions) — groups, streams, filtering, deliveries, transformers, anomaly detection&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;KMS&lt;&#x2F;strong&gt; (53 actions) — encryption, aliases, key management, grants, custom key stores&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CloudFormation&lt;&#x2F;strong&gt; (8 actions) — template parsing, resource provisioning&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Services talk to each other: S3 notifications deliver to SNS&#x2F;SQS. SNS fans out to SQS. EventBridge rules fire on schedule and deliver to targets. This is the kind of cross-service behavior that matters in integration tests and that most emulators get wrong or skip entirely.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;try-it&quot;&gt;Try it&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #ADBAC7; background-color: #22272E;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F69D50;&quot;&gt;curl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6CB6FF;&quot;&gt; -fsSL&lt;&#x2F;span&gt;&lt;span style=&quot;color: #96D0FF;&quot;&gt; https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;faiscadev&#x2F;fakecloud&#x2F;main&#x2F;install.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F47067;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F69D50;&quot;&gt; bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F69D50;&quot;&gt;fakecloud&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then point any AWS SDK at &lt;code&gt;http:&#x2F;&#x2F;localhost:4566&lt;&#x2F;code&gt; with dummy credentials. That&#x27;s it.&lt;&#x2F;p&gt;
&lt;p&gt;The code is at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;faiscadev&#x2F;fakecloud&quot;&gt;github.com&#x2F;faiscadev&#x2F;fakecloud&lt;&#x2F;a&gt;. It&#x27;s AGPL-3.0 — free and open source, including for commercial use.&lt;&#x2F;p&gt;
&lt;p&gt;If you need a local AWS emulator for your integration tests, give it a try. And if something doesn&#x27;t behave like real AWS — &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;faiscadev&#x2F;fakecloud&#x2F;issues&quot;&gt;open an issue&lt;&#x2F;a&gt;. That&#x27;s a bug, and we&#x27;ll fix it.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
