What it does
27 Azure services emulated behind a single port. Works with Terraform, Pulumi, Azure SDKs, and curl.
| Service | Service | Service |
|---|---|---|
| Resource Groups | Blob Storage | Table Storage |
| Queue Storage | Key Vault | Cosmos DB |
| Service Bus | Azure Functions | Virtual Networks |
| DNS Zones | Container Registry | Event Grid |
| App Configuration | Managed Identity | DB for PostgreSQL |
| DB for MySQL | Azure SQL Database | Azure Cache for Redis |
| Container Instances | Kubernetes Service (AKS) | Public IP Addresses |
| Network Security Groups | Load Balancer | Application Gateway |
| Storage Accounts |
How it compares
| LocalStack (AWS) | MiniStack (AWS) | Azurite (Azure) | miniblue | |
|---|---|---|---|---|
| Services | 80+ | 36 | 3 (storage only) | 27 |
| Docker image | ~1GB | ~200MB | ~300MB | ~8MB |
| Startup | ~10s | ~5s | ~3s | <1s |
| Real backends | DynamoDB Local | RDS, S3, SQS | No | Postgres, Redis, Docker |
| Terraform | Yes | Yes | No | Yes |
| License | BSL | MIT | MIT | MIT |
Quick Start
# Homebrew
brew tap moabukar/tap && brew install miniblue
# Or Docker
docker run -p 4566:4566 -p 4567:4567 moabukar/miniblue:latest
Then interact with it:
azlocal health
azlocal group create --name myRG --location eastus
azlocal keyvault secret set --vault myvault --name db-pass --value secret123
azlocal storage blob upload --account myacct --container data --name file.txt --data "Hello!"
No Azure account or credentials needed.
Terraform
https://github.com/user-attachments/assets/eea72535-6eb7-419d-9f9c-6f42b80d5efc
bash scripts/trust-cert.sh # one-time cert trust
provider "azurerm" {
features {}
metadata_host = "localhost:4567"
skip_provider_registration = true
subscription_id = "00000000-0000-0000-0000-000000000000"
tenant_id = "00000000-0000-0000-0000-000000000001"
client_id = "miniblue"
client_secret = "miniblue"
}
See examples/terraform/ for full examples including three-tier, serverless, and microservices scenarios.
Real Backends (optional)
| Feature | Env var |
|---|---|
| Real PostgreSQL databases | POSTGRES_URL=postgres://user:pass@host:5432/db |
| Real Redis connectivity | REDIS_URL=redis://host:6379 |
| Real Docker containers (ACI) | Docker daemon running |
| Real k3s cluster per AKS resource | AKS_BACKEND=k3s (Docker daemon required) |
| File persistence | PERSISTENCE=1 |
| Postgres persistence | DATABASE_URL=postgres://... |
Real backends shell out to the host Docker daemon. The default moabukar/miniblue:latest image is FROM scratch and has no docker CLI, so use the binary install (Homebrew, releases page) or the full Docker target which adds it:
docker build --target=full -t miniblue:full .
docker run -v /var/run/docker.sock:/var/run/docker.sock \
-p 4566:4566 -p 4567:4567 \
-e AKS_BACKEND=k3s miniblue:full
miniblue tears down its k3s containers on graceful shutdown (SIGTERM/SIGINT/docker stop); orphans from a forced kill are reaped by the next start.
Configuration
| Variable | Default | Description |
|---|---|---|
PORT | 4566 | HTTP port |
TLS_PORT | 4567 | HTTPS port |
LOG_LEVEL | info | debug, info, warn, error |
SERVICES | all | Comma-separated list to enable selectively |
PERSISTENCE | off | Set to 1 for file-based persistence |
Full configuration reference in the docs.
Documentation
Full docs at miniblue.io covering:
- Installation (Homebrew, Docker, binary, Helm)
- Quick Start
- Terraform Guide
- Pulumi Guide
- SDK Guide (Python, Go, JavaScript)
- CLI Reference
- API Parity Matrix
- Architecture