If you were using LocalStack Community Edition for local development and CI/CD, you’ve probably already noticed: the core services that were free are no longer.
S3, SQS, DynamoDB, Lambda — everything behind a paywall. The license shifted from Apache 2.0 to BSL. Authentication tokens are now required even in local environments. For many teams, that was the last straw.
Nahuel Nucera, a developer who relied on LocalStack for his pipelines, decided not to pay. He built his own replacement from scratch. MiniStack was born.
What is MiniStack
MiniStack is a local AWS emulator, MIT-licensed, free, no account, no API key, and no telemetry. It’s a drop-in replacement for LocalStack: your existing boto3, AWS CLI, Terraform, CDK, and Pulumi configurations work without code changes.
One port. 33 AWS services. Two seconds startup.
# Installation via PyPI
pip install ministack
ministack
# Or via Docker
docker run -p 4566:4566 nahuelnucera/ministack
# Verify it's running
curl http://localhost:4566/_localstack/health
What sets it apart from other emulators
MiniStack’s strength isn’t just that it’s free. It’s that it doesn’t fake it.
Most emulators return stubbed responses for complex services. MiniStack spins up real infrastructure:
- RDS → spins up real Postgres or MySQL containers
- ElastiCache → runs real Redis
- ECS → launches real Docker containers
- Athena → executes real SQL via DuckDB
This eliminates an entire category of bugs like “works locally, fails in AWS”. If your code passes against MiniStack, it’s passing against infrastructure that behaves like production.
Quick comparison
| MiniStack | LocalStack Community | |
|---|---|---|
| Price | Free | Paid (core services) |
| License | MIT | BSL |
| Services | 33 | Limited without pro |
| Account required | No | Yes |
| Idle RAM | ~30MB | ~500MB |
| Docker image | ~150MB | ~1GB |
| Startup | ~2 seconds | ~3.3 seconds |
| Real infrastructure | RDS, Redis, ECS, Athena | Pro only |
Basic setup with boto3
import boto3
from botocore.config import Config
# S3 with virtual hosted-style addressing
s3 = boto3.client(
"s3",
endpoint_url="http://localhost:4566",
config=Config(s3={"addressing_style": "virtual"}),
aws_access_key_id="test",
aws_secret_access_key="test",
region_name="us-east-1",
)
s3.create_bucket(Bucket="my-bucket")
s3.put_object(Bucket="my-bucket", Key="file.txt", Body=b"hello world")
# AWS CLI
aws --endpoint-url=http://localhost:4566 s3 mb s3://my-bucket
aws --endpoint-url=http://localhost:4566 s3 ls
Integration with Terraform and Pulumi
With Terraform, add the endpoints to your provider configuration:
provider "aws" {
region = "us-east-1"
access_key = "test"
secret_key = "test"
skip_credentials_validation = true
skip_requesting_account_id = true
endpoints {
s3 = "http://localhost:4566"
dynamodb = "http://localhost:4566"
sqs = "http://localhost:4566"
lambda = "http://localhost:4566"
}
}
With Pulumi, in Pulumi.dev.yaml:
config:
aws:endpoints:
- s3: http://localhost:4566
dynamodb: http://localhost:4566
Lambda with warm workers
One of the most carefully crafted details in MiniStack is Lambda handling. Python functions stay warm between invocations: after the first cold start, the module remains imported in a persistent subprocess. Subsequent calls skip the import, which significantly speeds up test suites.
# Deploy Lambda function
zip function.zip lambda_function.py
aws --endpoint-url=http://localhost:4566 lambda create-function \
--function-name my-function \
--runtime python3.11 \
--role arn:aws:iam::000000000000:role/lambda-role \
--handler lambda_function.handler \
--zip-file fileb://function.zip
# Invoke
aws --endpoint-url=http://localhost:4566 lambda invoke \
--function-name my-function \
--payload '{"key": "value"}' \
response.json
Project status
MiniStack is in active development. v1.0.7 was released just days ago and includes:
- Support for S3 virtual hosted-style addressing
- Bug fix for
ConditionExpressionwith numeric keys in DynamoDB (PynamoDB compatible) - Coverage of 656 automated tests
- Services that were Pro-only in LocalStack: EC2, Cognito, EMR, ELB, EFS, WAFv2
The architecture is designed to be extensible: each service is a self-contained Python file in ministack/services/. Adding a new service is a matter of creating a file with handle_request() and reset().
Is it worth the switch?
If your team uses LocalStack Community and the license change hit you, the short answer is yes. MiniStack covers the most common services, has a fraction of the footprint, and real infrastructure for RDS/Redis/ECS eliminates an entire category of “works on my machine” bugs.
If you’re on LocalStack Pro and use very specific niche services, check the list of supported services before migrating — there are still gaps in the more advanced coverage.
For most backend projects with AWS: S3, DynamoDB, SQS, Lambda, RDS — MiniStack is more than enough.
# Get started now
pip install ministack
ministack
Repository: github.com/Nahuel990/ministack
Official site: ministack.org
