LocalStack Is No Longer Free
If you've been using LocalStack Community Edition for local AWS development, you've probably noticed the change. Core services like S3, SQS, DynamoDB, and Lambda have moved behind a paid plan. The license changed from Apache 2.0 to BSL.
I depended on it for local dev and CI/CD pipelines. Rather than pay, I built a replacement from scratch.
What Is MiniStack?
MiniStack is a single Python ASGI server that emulates 20 AWS services on port 4566. It's a drop-in replacement — your existing --endpoint-url, boto3 clients, Terraform providers, and CDK stacks work without code changes.
docker run -p 4566:4566 nahuelnucera/ministack
aws --endpoint-url=http://localhost:4566 s3 mb s3://my-bucket
Not Just Mocks — Real Infrastructure
The thing I'm most proud of: the infrastructure services don't fake it.
RDS creates real databases. When you call create-db-instance with engine=postgres, MiniStack spins up an actual Postgres Docker container and returns the real host:port endpoint. Connect with psycopg2, run migrations, test your queries.
ElastiCache starts real Redis. create-cache-cluster with engine=redis starts a real Redis container. Use redis-py, test pub/sub, test your caching layer.
ECS runs real containers. run-task pulls images and starts Docker containers via the Docker socket.
Athena executes real SQL. Queries run via DuckDB. Get actual result sets, not mock data.
The Full Service List
Core (in-memory):
S3, SQS, SNS, DynamoDB, Lambda (real Python execution), IAM, STS, Secrets Manager, CloudWatch Logs
Extended (in-memory):
SSM Parameter Store, EventBridge, Kinesis, CloudWatch Metrics, SES, Step Functions
Infrastructure (real Docker):
RDS, ElastiCache, ECS, Glue, Athena (DuckDB)
How It Compares
| LocalStack Free | LocalStack Pro | MiniStack | |
|---|---|---|---|
| Core services | Now paid | ✅ | ✅ Free |
| RDS/ElastiCache/ECS | ❌ | ✅ | ✅ Real containers |
| Startup | ~30s | ~30s | ~2s |
| RAM | ~500MB | ~500MB | ~30MB |
| Image size | ~1GB | ~1GB | 150MB |
| License | BSL | Proprietary | MIT |
| Price | Paid | $35+/mo | Free forever |
Architecture
It's deliberately simple. Each service is a single Python file in services/ with an async handler. The router detects the target service from:
-
X-Amz-Targetheader (DynamoDB, SecretsManager, etc.) - Authorization header credential scope
- Query parameter
Action(SQS, SNS, IAM) - URL path patterns (
/2015-03-31/functions→ Lambda) - Host header patterns
- Default → S3
Same cascade as real AWS and LocalStack.
Try It
docker run -p 4566:4566 nahuelnucera/ministack
No account. No API key. No telemetry.
- GitHub: github.com/Nahuel990/ministack
- Docker Hub: nahuelnucera/ministack
- Website: ministack.org
MIT licensed. PRs welcome.
Top comments (0)