MiniStack: The Free LocalStack Replacement the Community Was Waiting For

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 ConditionExpression with 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