The making of

A digital twin of AWS,
built in 96 hours

One person, one AI, 77 prompt sessions, 658 commits. This is the story of robotocore, told through the prompts that built it.

0
AWS Services
0
Tests
0
Commits
0
Failures
Scroll to begin
Chapter 1

Genesis

March 6, 2026 — 3:56 AM UTC

It started with a single prompt:

Write a CLAUDE.md and a set of skills necessary to start on your job: Creating an MIT-licensed wrapper around Moto that has 100% feature parity with LocalStack.

The first prompt — prompts/20260306-035638-project-inception.md

The insight was simple: Moto already implements ~195 AWS service backends. Thousands of API operations, all in Python, all open source. What if you wrapped them in a real HTTP gateway on port 4566 and built a drop-in replacement for any AWS emulator?

Within 45 minutes, a plan materialized: 13 GA milestones, from gateway routing to Lambda execution. Then the marathon session began.

The Moto Dispatch Bridge
A Werkzeug-based bridge that reconstructs HTTP requests from Starlette and routes them through Moto's own flask_paths URL maps. No custom dispatch — use what Moto already has.
Lambda Execution
In-process Python execution, no Docker dependency. Lambda functions run in isolated threads with mocked boto3 clients pointing back at robotocore. Node.js and Ruby via subprocess.
Step Functions ASL Interpreter
A state machine interpreter handling Task, Choice, Wait, Parallel, Map, Pass, Succeed, and Fail states. 18 intrinsic functions. JSONata support.
CloudFormation — 101 Resource Types
IAM, Lambda, EC2, S3, DynamoDB, SQS/SNS, API Gateway, CloudWatch, EventBridge, Step Functions, KMS, SSM, Kinesis, ECS, ELB, CloudFront, Route53, ACM, Cognito.
Cross-Service Integrations
SQS→Lambda, Kinesis→Lambda, EventBridge→Lambda/SQS/SNS, S3→SNS, StepFunctions→Lambda, Firehose→S3, API Gateway→Lambda — all wired up.

By end of day, a second marathon session added S3 presigned URLs (SigV2 + SigV4), API Gateway v2 with WebSocket support, an IAM policy enforcement engine, CloudWatch composite alarms with metric math, and four entirely new services: Cognito (28 ops), AppSync (19 ops), ECS (20 ops), and Batch (16 ops).

13
Milestones shipped
46
Native providers
20,974
Tests passing
2
Sessions
prompts/20260306-043600-implement-milestones-1-through-11.md
Chapter 2

Scale

March 7, 2026

Day two opened with a principle that would define the entire project:

Do 100% of the work. Don't prioritize by impact — everything gets done. Sequence by dependencies, not importance.

The goal was LocalStack Enterprise parity. Not just Community — Enterprise. Every feature, every service. To get there, tooling came first.

# One script to register every Moto backend as a robotocore service uv run python scripts/batch_register_services.py --all-moto --write # Result: 147 services registered, routed, and testable # 38 native providers + 109 Moto-backed

Then came the autonomous test expansion — five parallel AI agents, each targeting different service groups, fixing 62+ expected failures by implementing native provider interceptors for operations Moto doesn't support.

This was also the day the prompt log protocol was born — the practice of recording every human prompt and AI reasoning behind every code change. Not changelogs, but decision records.

Look at what's pushing you toward stopping and checking. Make sure we're committing as we go and using the prompt log pattern. Add it to the project rules.

prompts/20260307-202500-human-continue-and-promptlog.md
147
Services registered
20,974
Tests passing
5
Parallel agents
62+
xfails eliminated
Chapter 3

The Night Watch

March 8, 2026

Day three began at 2 AM with an instruction that would produce 88 commits by sunrise:

Design and launch an overnight automation loop that expands compat test coverage across all 147 AWS services. You're in charge — do what it takes to make this work.

prompts/20260308-020000-overnight-automation.md
# The overnight loop for service in $(next_service --all); do probe_service --service $service # discover working ops chunk_service --with-probe $service # group by resource noun for chunk in chunks; do claude --headless "write tests for $chunk" validate_test_quality --file $test_file done git commit && git push # per-service commits done

88 commits across 120+ services in about three hours. But the real drama happened at 7 AM.

20 Agents, 80 Bugs

20 review agents, each in an isolated git worktree, hunting for categorical bugs across every native provider.

Pick 20 parts of our product that you believe the overnight script implemented extremely well. Launch an agent for each to review it. When those tests fail, implement the fix.

prompts/20260308-070000-categorical-review-20-providers.md
Tag stubs (creation tags not queryable)
Parent-child cascade failures
Thread safety (inconsistent locking)
Wrong error codes for missing resources
ARN construction errors
Key case conversion (PascalCase corruption)
Silent success on delete of nonexistent
Hardcoded counts in describe operations
Missing pagination support
Naive ARN parsing (split("/")[-1])

22 worktree branches merged. 59 files changed, 7,248 insertions, 528 deletions. 80 categorical bugs fixed across all 38 native providers.

The Quality Crisis
Later that day, a routine review uncovered a devastating truth. Of the 7,083 compatibility tests generated overnight: 96% were fake. They caught ParamValidationError from boto3's client-side validation. The server was never contacted. These tests would pass against a stopped server.

The response was immediate. All 6,811 fake tests were deleted. A static analysis tool (validate_test_quality.py) was built and wired into CI as a gate. The rule: no more than 5% of tests may fail to contact the server.

20
Parallel agents
80
Categorical bugs fixed
6,811
Fake tests purged
88
Overnight commits
Chapter 4

Enterprise

March 9, 2026

The final day shifted from breadth to depth. Four Tier 1 enterprise features were implemented in parallel, each in its own worktree:

Multi-Account Isolation
One line in the Moto bridge made all 109 Moto-backed services multi-account aware. Then fixed all 38 native providers to key stores by (account_id, region) tuple.
Real Database Engines
SQLite (stdlib, zero dependencies) as the default RDS engine. Real SQL execution via the RDS Data API. An in-memory Redis-compatible store for ElastiCache.
Lambda Hot Reload
LRU code cache, filesystem watcher, automatic module invalidation. Change a Lambda, see it live — no redeploy.
Mock Kubernetes API for EKS
A Starlette-based mock Kubernetes API on a random port per cluster. Pods, services, deployments, namespaces.

Then: Harden Everything

Four more agents reviewed each feature, found 35 bugs, and wrote 300 new tests.

Multi-account: 8 bugs — 6 providers keyed by region-only, 14 cross-service calls that didn't propagate account_id.
Database engines: 8 bugs — premature commits, parameter binding, overlapping savepoints.
Lambda reload: 7 bugs — bytecode cache preventing actual reload, thread safety in module clearing.
EKS mock: 12 bugs — thread safety, namespace cascade, pod status subresource, API discovery.

prompts/20260309-233000-tier1-hardening.md
4
Enterprise features
35
Bugs found in hardening
300+
New tests written
0
Failures remaining
Epilogue

The Numbers

96 hours. 77 prompt sessions. 658 commits. Every decision logged.

147
AWS services
46
Native providers
93%
Operations implemented
20,974
Tests
0
Failures
289
Prompt sessions logged

Every prompt that built this project is checked into the repository at prompts/. This page is a curated narrative; the raw transcripts are the real record.

Try it yourself

One command. Every AWS service. Free forever.

docker run -d -p 4566:4566 robotocore/robotocore:latest