Observed since 20 Oct, 18:13 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Azure Container Instance Distributed Operations
The open-source engine powering Secrets by Merabytes™
Disrupting how secrets, tokens, and one-time credentials are shared — forever.
acido isn’t just another CLI tool. It’s the backbone of an infrastructure-first rethink of how secrets, tokens and one-time credentials are built, deployed and consumed.
Already powering Secrets by Merabytes™ — the first truly open-source secret-sharing app — acido installs like a developer tool and scales like an enterprise service.
Deploy fleets of workloads on Azure Container Instances in minutes.
Leverage full transparency: open source, auditable, no lock-in.
Built for the next generation of identity, secrets and “one-time everything”.
Whether you’re building a secure secret-sharing system, a distributor of short-lived credentials, or simply pushing containerised tasks to the edge — acido gives you the power, the scale and the freedom of open source.
Speed: Distribute scans across 10, 50, or 100+ containers. What takes 24 hours on one machine completes in minutes with parallelization.
Cost-Effective: Pay only when scanning. Spin up 100 containers for 30 minutes, then destroy them - no idle infrastructure costs.
Tool Support: Works with any containerized security tool (nmap, masscan, Nuclei, Nikto, gowitness, etc.).
Simple: Split targets automatically, deploy containers, collect results, cleanup - all automated.
+---------------------------+
| 1. Prepare targets file |
| urls.txt |
+------------+--------------+
|
v
+---------------------------+
| 2. Configure (first time) |
| acido configure |
+------------+--------------+
|
v
+-----------------------------+
| 3. Create nuclei image |
| `acido create nuclei |
| --image projectdiscovery/|
| nuclei:latest` |
+------------+----------------+
|
v
+----------------------------------------------+
| 4. Run distributed scan fleet |
| ` acido fleet nuclei-scan |
| -n 10 |
| -im nuclei |
| -t "nuclei -list input" |
| -i urls.txt |
| -o results |
| --rm-when-done (optional auto cleanup)` |
+------------+---------------------------------+
|
v
+---------------------------+
| 5. View results |
| Open 'results' file |
+------------+--------------+
|
v
+------------------------+
| 6. Cleanup acido fleet |-- Yes (auto --rm-when-done)
+------------------------+
|
No v
+---------------------------+
| Manual cleanup |
| `acido rm nuclei-scan` |
+---------------------------+
(If --rm-when-done was used, skip manual cleanup.)
Inspired by axiom.
Prerequisites:
Open Azure Cloud Shell:
Run the install script:
curl -o install.sh https://raw.githubusercontent.com/merabytes/acido/main/install.sh
chmod +x install.sh
# Replace SUB_ID with your Azure Subscription ID
./install.sh \
-s SUB_ID \
-g acido-rg \
-l eastus \
-p acido \
-a acidocr \
-S acidostore123 \
--show-secret \
--emit-env-file acido.env \
--create-rg
This creates: Service Principal, ACR, Storage Account, blob container, and generates a complete environment file.
Load environment and install:
source acido.env
pip install acido
You're ready! All Azure credentials are configured via environment variables.
acido create https://github.com/projectdiscovery/nuclei
echo -e "example.com\ntest.com" > targets.txt
acido fleet nuclei-scan -n 3 -im nuclei -t 'nuclei -list input' -i targets.txt
acido ls # List all instances
acido rm nuclei-scan # Remove specific fleet
acido ip create pentest-ip # Create IPv4 address
acido ip ls # List all IPs
acido ip rm pentest-ip # Remove IP address
# Create images
acido create https://github.com/projectdiscovery/nuclei
acido create nmap --image nmap:latest
# Deploy fleet
acido fleet <name> -n <count> -im <image> -t '<command>' -i <input-file>
# Manage containers
acido ls # List all instances
acido rm <name> # Remove instances
# Manage IP addresses
acido ip create <name> # Create IPv4 address
acido ip ls # List all IPs
acido ip rm <name> # Remove IP
acido ip select # Select IP interactively
# Nuclei scan across 10 containers
acido fleet nuclei-scan -n 10 -im nuclei -t 'nuclei -list input' -i urls.txt
# Nmap scan with auto-cleanup
acido fleet nmap-scan -n 5 -im nmap -t 'nmap -iL input -p-' -i targets.txt --rm-when-done
# List all running instances
acido ls
# Remove specific fleet
acido rm nuclei-scan
# Remove all matching pattern
acido rm 'scan-*'
# Create standalone public IP (no NAT Gateway stack)
acido ip create my-ip
# Create public IP with full NAT Gateway stack for egress
acido ip create nat-ip --with-nat-stack
# Select IP for use with containers
acido ip select
# Deploy with IP routing (containers use selected IP for egress)
acido fleet scan -n 10 -im nmap -t 'nmap -iL input' -i targets.txt
# List all IPs (shows NAT stack indicator)
acido ip ls
# Clean IP configuration from local config
acido ip clean
# Cleanup
acido ip rm my-ip
Acido supports bidirectional connectivity for containers that need to accept inbound connections (e.g., VoIP servers, game servers, SSH bastions).
Key Concepts:
--bidirectional flag with acido run to enable inbound connectivityacido fleet always uses NAT Gateway (no bidirectional support)💼 Enterprise Option: For advanced security and centralized control, see Azure Firewall Integration (Solution 4 - ~$900/month)
🔥 NEW: Automatic Firewall Rules: Use --expose-ip with --bidirectional to automatically create Azure Firewall rules, route tables, and network rules. See EXPOSE_IP_FEATURE.md for details.
Examples:
# 1. Create a standalone public IP (no NAT Gateway needed for bidirectional)
acido ip create voip-ip
acido ip select
# 2. Deploy VoIP server with bidirectional connectivity
acido run voip-server \
-im asterisk:latest \
-t "./start-asterisk.sh" \
--bidirectional \
--expose-port 5060:udp \
--expose-port 5060:tcp \
--cpu 4 \
--ram 8 \
-d 86400
# 3. Deploy game server (Minecraft)
acido run minecraft \
-im minecraft-server:latest \
-t "./start.sh" \
--bidirectional \
--expose-port 25565:tcp \
--cpu 2 \
--ram 4 \
--no-cleanup
# 4. Deploy SSH bastion (time-limited for security)
acido run ssh-bastion \
-im ubuntu:20.04 \
-t "service ssh start && sleep infinity" \
--bidirectional \
--expose-port 22:tcp \
-d 3600 # Auto-cleanup after 1 hour
# 5. Deploy with automatic firewall rules (requires configured firewall)
# Restrict access to specific source IPs
acido run api-server \
-im nginx:latest \
--bidirectional \
--expose-ip 192.168.1.100 \
--expose-ip 192.168.1.101 \
--expose-port 80:tcp \
--expose-port 443:tcp \
-d 7200
# 6. DMZ mode - allow all traffic on all ports
acido run dmz-server \
-im myserver \
--bidirectional \
--dmz \
-d 86400
# 7. Custom resource allocation for fleet (no bidirectional support)
acido fleet scan -n 10 -im nmap \
-t 'nmap -iL input' -i targets.txt \
--cpu 8 --ram 16
Important Notes:
--bidirectional flag is only available for acido run (single containers)acido fleet does NOT support --bidirectional (fleet always uses NAT Gateway for egress)--expose-port format is PORT:PROTOCOL or PORT_START-PORT_END:PROTOCOL (e.g., 5060:udp, 8080:tcp, 10000-10099:udp for ranges)--expose-port--expose-ip <source-ip> flag with --bidirectional enables automatic Azure Firewall rule creation with source IP filtering
--dmz flag allows all traffic on all ports to container (requires firewall)
--cpu and --ram to configure container resources (works for both run and fleet)
acido run: 4 CPU cores, 16 GB RAM (when not specified)acido fleet: 8 CPU cores, 8 GB RAM (when not specified) - reduced to fit within Azure quota limitsacido run: --entrypoint and --task are both optional - if not provided, uses the default entrypoint/cmd from the Docker imageacido fleet: --task is required to specify the command to execute across the fleetCommand Execution:
--task / -t: Override the container's CMD (command to execute)
acido run (uses image default if not provided)acido fleet--entrypoint: Override the container's ENTRYPOINT (optional for acido run)Both acido run and acido fleet support setting custom environment variables using the -e or --env flag, similar to Docker.
Two formats supported:
KEY=value - Set KEY to the specified valueKEY - Use value from your current environmentExamples:
# Set environment variables with explicit values
acido run myapp \
-im myapp:latest \
-e DEBUG=true \
-e LOG_LEVEL=info \
-e API_KEY=secret123
# Use environment variables from your shell
export DATABASE_URL="postgresql://localhost/mydb"
export API_TOKEN="xyz789"
acido run myapp \
-im myapp:latest \
-e DATABASE_URL \
-e API_TOKEN \
-e APP_ENV=production
# Works with fleet too
acido fleet workers -n 5 \
-im worker:latest \
-t "python worker.py" \
-e WORKER_POOL=large \
-e REDIS_URL \
-e DEBUG=false
Notes:
-e flags can be specifiedAcido can be run in a Docker container for isolated and reproducible environments.
Quick Start:
Build the Docker image from the latest version:
./build.sh
Or from a specific branch/tag:
./build.sh v0.45.0
./build.sh feature-branch
Run acido commands:
# Show help
docker run --rm acido-cli:main --help
# Run with Azure credentials
docker run --rm \
-e AZURE_RESOURCE_GROUP=your-rg \
-e IMAGE_REGISTRY_SERVER=your-registry.azurecr.io \
-e IMAGE_REGISTRY_USERNAME=your-username \
-e IMAGE_REGISTRY_PASSWORD=your-password \
-e STORAGE_ACCOUNT_NAME=your-storage \
acido-cli:main ls
Key Features:
build.sh)Documentation:
Acido can be deployed as an AWS Lambda function, enabling serverless security scanning workflows.
Key Features:
Supported Operations:
{
"operation": "fleet",
"image": "nmap",
"targets": ["merabytes.com", "uber.com"],
"task": "nmap -iL input -p 0-1000"
}
{
"operation": "run",
"name": "runner-01",
"image": "ubuntu",
"task": "./run.sh"
}
{
"operation": "ls"
}
{
"operation": "rm",
"name": "fleet-1"
}
{
"operation": "ip_create",
"name": "pentest-ip"
}
{
"operation": "ip_ls"
}
{
"operation": "ip_rm",
"name": "pentest-ip"
}
Quick Example:
{
"image": "nmap",
"targets": ["merabytes.com", "uber.com", "facebook.com"],
"task": "nmap -iL input -p 0-1000"
}
Documentation:
A separate lightweight Python package is available for interacting with acido Lambda functions via REST API:
pip install acido-client
Key Features:
Quick Example:
from acido_client import AcidoClient
client = AcidoClient() # Uses LAMBDA_FUNCTION_URL from environment
# Fleet operation
response = client.fleet(
image="kali-rolling",
targets=["merabytes.com", "uber.com"],
task="nmap -iL input -p 0-1000"
)
# List instances
response = client.ls()
CLI Usage:
export LAMBDA_FUNCTION_URL="https://your-lambda-url.lambda-url.region.on.aws/"
acido-client fleet --image kali-rolling --targets example.com --task "nmap -iL input -p 0-1000"
acido-client ls
See acido-client/README.md for complete documentation.
Acido supports spinning up ephemeral GitHub self-hosted runner containers on Azure Container Instances.
Key Features:
Quick Example:
Run a GitHub runner for 15 minutes via CLI:
acido run github-runner-01 \
-im github-runner \
-t './run.sh --url https://github.com/myorg/myrepo --token TOKEN' \
-d 900
Or via AWS Lambda:
{
"operation": "run",
"name": "github-runner-01",
"image": "github-runner",
"task": "./run.sh --url https://github.com/myorg/myrepo --token ${RUNNER_TOKEN}",
"duration": 900
}
Documentation:
Acido includes a OneTimeSecret-like service for secure secrets sharing via AWS Lambda and Azure KeyVault.
Key Features:
Quick Example:
Create a secret:
{
"action": "create",
"secret": "Your secret message here"
}
Retrieve the secret (one-time only):
{
"action": "retrieve",
"uuid": "generated-uuid-from-create"
}
Documentation:
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.53.0 | 26 Apr 2026 | 14 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 18:13 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:d3b8ab1a314561134b367bfe256f94e507f8629a9fee60585516d80108603491