Skip to main content

Autonomous AI agent with subprocess orchestration, dynamic tool creation, and a local-first web interface

Project description

Plutus — Autonomous AI Agent with Subprocess Orchestration

A better, easier-to-use AI agent that spawns subprocesses to edit code, analyze files, and create new tools on the fly.

FeaturesQuick StartArchitectureToolsDynamic ToolsConfiguration


What is Plutus?

Plutus is an autonomous AI agent system that gives Claude (or any LLM) the ability to spawn isolated subprocesses for file editing, code analysis, shell execution, and dynamic tool creation. Think of it as Claude Code on steroids — the AI can not only run commands and edit files, but also create entirely new tools at runtime to solve problems it wasn't originally designed for.

Key Differentiators

Feature OpenClaw Plutus
File editing Basic read/write Subprocess-isolated surgical edits with diff output
Code analysis None Full AST analysis (functions, classes, complexity, call graphs)
Subprocess spawning None Parallel worker pool with JSON protocol
Dynamic tool creation None Create, validate, and hot-load new Python tools at runtime
CLI experience Basic Rich interactive REPL with slash commands
Guardrails Basic 4-tier system (observer → autonomous) with audit logging
Planning None Built-in plan/step tracking with auto-progress

Features

Subprocess Orchestration

The agent spawns isolated worker subprocesses for every operation — file edits, code analysis, shell commands, and custom scripts all run in their own process with resource limits and timeouts.

Intelligent Code Editing

Surgical find/replace edits with diff output. The agent reads files, applies precise changes, and verifies the result — all in subprocess isolation.

Deep Code Analysis

AST-based analysis of Python files:

  • Function and class extraction with signatures
  • Cyclomatic complexity scoring (A–F ratings)
  • Import dependency mapping
  • Call graph generation
  • TODO/FIXME/HACK detection
  • Module summarization

Dynamic Tool Creation

The agent can write new Python tools at runtime:

  1. Writes the tool code
  2. Validates it (syntax check)
  3. Saves it to ~/.plutus/custom_tools/
  4. Hot-loads it into the tool registry
  5. Uses it immediately

4-Tier Guardrail System

  • Observer — Read-only, AI can only observe
  • Assistant — Every action requires user approval
  • Operator — Pre-approved actions run autonomously
  • Autonomous — Full control, no restrictions

Multiple Interfaces

  • Terminal REPL (plutus chat) — Rich interactive chat with slash commands
  • Single prompt (plutus run "...") — Execute one task and exit
  • Web UI (plutus start) — Full web interface with WebSocket streaming

Quick Start

Installation

Linux & macOS:

curl -fsSL https://useplutus.ai/install.sh | bash

Windows (PowerShell):

iwr -useb https://useplutus.ai/install.ps1 | iex

That's it — the installer handles everything (dependencies, setup wizard, and first launch).

Manual installation
# Clone the repository
git clone https://github.com/Crypt0nly/plutus.git
cd plutus

# Install with pip
pip install -e .

# Run setup wizard
plutus setup

First Run

# Interactive terminal chat
plutus chat

# Or run a single prompt
plutus run "Create a Python script that sorts a CSV file by the second column"

# Or launch the web UI
plutus start

Chat Commands

Inside plutus chat, use slash commands:

Command Description
/help Show available commands
/tools List all available tools
/plan Show current execution plan
/clear Start a new conversation
/tier Show or change guardrail tier
/workers Show active subprocesses
/exit Exit the chat

Architecture

┌─────────────────────────────────────────────────────┐
│                   Agent Runtime                      │
│  ┌──────────┐  ┌──────────┐  ┌──────────────────┐  │
│  │   LLM    │  │ Planner  │  │   Guardrails     │  │
│  │ (Claude) │  │          │  │ (4-tier system)  │  │
│  └────┬─────┘  └──────────┘  └──────────────────┘  │
│       │                                              │
│  ┌────▼──────────────────────────────────────────┐  │
│  │              Tool Registry                     │  │
│  │  ┌────────┐ ┌────────────┐ ┌───────────────┐  │  │
│  │  │ Shell  │ │ Code Editor│ │ Code Analysis │  │  │
│  │  └────────┘ └────────────┘ └───────────────┘  │  │
│  │  ┌────────────┐ ┌──────────────┐ ┌─────────┐  │  │
│  │  │ Subprocess │ │ Tool Creator │ │ Browser │  │  │
│  │  └────────────┘ └──────────────┘ └─────────┘  │  │
│  │  ┌──────────┐ ┌─────────┐ ┌─────────────────┐ │  │
│  │  │Filesystem│ │ Process │ │ Custom Tools... │ │  │
│  │  └──────────┘ └─────────┘ └─────────────────┘ │  │
│  └───────────────────┬───────────────────────────┘  │
│                      │                               │
│  ┌───────────────────▼───────────────────────────┐  │
│  │           Subprocess Manager                   │  │
│  │  ┌─────────────┐  ┌──────────────────────┐    │  │
│  │  │ Worker Pool │  │  JSON stdin/stdout    │    │  │
│  │  │ (max: 8)    │  │  protocol             │    │  │
│  │  └─────────────┘  └──────────────────────┘    │  │
│  └───────────────────────────────────────────────┘  │
│                      │                               │
│  ┌───────────────────▼───────────────────────────┐  │
│  │           Worker Subprocesses                  │  │
│  │  ┌──────┐ ┌──────────┐ ┌──────────┐ ┌──────┐ │  │
│  │  │Shell │ │File Edit │ │Code Anal.│ │Custom│ │  │
│  │  │Worker│ │Worker    │ │Worker    │ │Worker│ │  │
│  │  └──────┘ └──────────┘ └──────────┘ └──────┘ │  │
│  └───────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────┘

Subprocess Communication Protocol

Workers communicate via JSON over stdin/stdout (one JSON object per line):

Agent → Worker:  {"action": "edit", "path": "/file.py", "edits": [...]}
Worker → Agent:  {"success": true, "result": {"changes": 2, "diff": "..."}}

This design provides:

  • Isolation — each operation runs in its own process
  • Safety — crashes in workers don't affect the agent
  • Parallelism — multiple workers can run simultaneously
  • Simplicity — JSON protocol is easy to debug and extend

Tools

Built-in Tools

Tool Description
shell Execute shell commands
filesystem File system operations (legacy, still available)
code_editor Create, read, and edit files via subprocess
code_analysis AST-based Python code analysis via subprocess
subprocess Direct subprocess spawning for parallel tasks
tool_creator Create new tools at runtime
process System process management
system_info System information queries
browser Web browsing (Playwright)
clipboard Clipboard operations
desktop Desktop/window management
app_manager Application management

Code Editor Operations

read       — Read file content (with optional line range)
write      — Create or overwrite a file
append     — Append content to a file
edit       — Apply surgical find/replace edits
delete     — Delete a file or directory
move       — Move/rename a file
copy       — Copy a file or directory
mkdir      — Create directories
list       — List directory contents
find       — Find files by glob pattern
grep       — Search file contents with regex
diff       — Show diff between two files

Code Analysis Operations

analyze        — Full analysis (everything below combined)
find_functions — List all function/method definitions with signatures
find_classes   — List all class definitions with methods
find_imports   — Extract all import statements
find_todos     — Find TODO/FIXME/HACK/NOTE comments
complexity     — Calculate cyclomatic complexity per function
symbols        — Extract all top-level symbols
call_graph     — Build function call graph
summarize      — Generate human-readable summary

Dynamic Tool Creation

The agent can create new tools when it encounters a task that requires capabilities it doesn't have:

# Example: Agent creates a CSV processor tool
tool_creator(
    operation="create",
    tool_name="csv_processor",
    description="Process and transform CSV files",
    code="""
import csv
from pathlib import Path

def main(args):
    path = args.get('path', '')
    operation = args.get('operation', 'read')
    
    if operation == 'read':
        with open(path) as f:
            reader = csv.DictReader(f)
            rows = list(reader)
        return {'success': True, 'result': {'rows': rows, 'count': len(rows)}}
    
    elif operation == 'sort':
        column = args.get('column', '')
        with open(path) as f:
            reader = csv.DictReader(f)
            rows = sorted(list(reader), key=lambda r: r.get(column, ''))
        return {'success': True, 'result': {'rows': rows, 'count': len(rows)}}
    
    return {'success': False, 'error': f'Unknown operation: {operation}'}
"""
)

Created tools are:

  • Validated — syntax-checked before saving
  • Persisted — saved to ~/.plutus/custom_tools/ across sessions
  • Hot-loaded — immediately available in the tool registry
  • Isolated — executed in subprocess workers

Configuration

Config File: ~/.plutus/config.json

{
  "model": {
    "provider": "anthropic",
    "model": "claude-sonnet-4-6",
    "temperature": 0.7,
    "max_tokens": 4096
  },
  "guardrails": {
    "tier": "operator",
    "audit_enabled": true
  },
  "agent": {
    "max_tool_rounds": 25
  },
  "planner": {
    "enabled": true,
    "auto_plan": true
  },
  "gateway": {
    "host": "127.0.0.1",
    "port": 7777
  }
}

Supported Providers

Provider Models Config
Anthropic Claude 4 Sonnet, Claude 4 Opus, etc. ANTHROPIC_API_KEY
OpenAI GPT-4.1, GPT-4.1-mini, etc. OPENAI_API_KEY
Ollama Llama 3.2, Mistral, etc. Local, no key needed
Custom Any OpenAI-compatible endpoint API_KEY + base URL

API Keys

Keys are stored securely in ~/.plutus/.secrets.json (chmod 600) and never exposed via the API. Set them via:

# Setup wizard
plutus setup

# Environment variable
export ANTHROPIC_API_KEY=sk-ant-...

# Or via the web UI settings page

CLI Reference

plutus                  # Show help
plutus start            # Launch web UI + API server
plutus chat             # Interactive terminal chat
plutus run "prompt"     # Run a single prompt
plutus setup            # Setup wizard
plutus status           # Show configuration
plutus tools            # List available tools
plutus set-tier <tier>  # Change guardrail tier
plutus audit            # Show audit log
plutus config-show      # Display full config as JSON

Development

# Install dev dependencies
pip install -e ".[dev]"

# Run tests
pytest tests/ -v

# Run specific test file
pytest tests/test_subprocess.py -v

# Lint
ruff check plutus/

Project Structure

plutus/
├── plutus/
│   ├── __init__.py
│   ├── __main__.py
│   ├── cli.py                      # CLI with chat REPL
│   ├── config.py                   # Configuration management
│   ├── core/
│   │   ├── agent.py                # Main agent runtime
│   │   ├── conversation.py         # Conversation management
│   │   ├── heartbeat.py            # Heartbeat system
│   │   ├── llm.py                  # LLM client (LiteLLM)
│   │   ├── memory.py               # SQLite memory store
│   │   ├── planner.py              # Plan management
│   │   └── subprocess_manager.py   # Subprocess orchestrator
│   ├── gateway/                    # Web API + WebSocket
│   ├── guardrails/                 # Permission tiers + audit
│   ├── skills/                     # YAML skill definitions
│   ├── tools/
│   │   ├── base.py                 # Tool base class
│   │   ├── registry.py             # Tool registry with hot-reload
│   │   ├── code_analysis.py        # AST-based code analysis
│   │   ├── code_editor.py          # File creation and editing
│   │   ├── subprocess_tool.py      # Direct subprocess spawning
│   │   ├── tool_creator.py         # Dynamic tool creation
│   │   ├── shell.py                # Shell commands
│   │   ├── filesystem.py           # File system operations
│   │   ├── process.py              # Process management
│   │   ├── browser.py              # Web browsing
│   │   └── ...
│   └── workers/
│       ├── shell_worker.py         # Shell command worker
│       ├── file_edit_worker.py     # File editing worker
│       ├── code_analysis_worker.py # Code analysis worker
│       └── custom_worker.py        # Dynamic tool worker
├── ui/                             # React web interface
├── bridge/                         # Local ↔ cloud workspace sync
├── shared/                         # Shared models and memory (used by local + cloud)
├── tests/
│   ├── test_subprocess.py          # 34 comprehensive tests
│   ├── test_config.py
│   ├── test_guardrails.py
│   └── test_tools.py
├── pyproject.toml
└── README.md

Cloud Version

A hosted, fully managed version of Plutus is available at useplutus.ai for users who want a zero-setup cloud experience. The cloud version includes:

  • Persistent cloud workspace with push/pull sync to your local Plutus
  • Multi-device access via any browser
  • Managed infrastructure — no API keys or server setup required
  • Priority support

The cloud backend is open-source and available to the community. Contributions, self-hosting, and custom deployments are welcome — check out the documentation to get started.

License

AGPL-3.0 License — see LICENSE for details.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

plutus_ai-0.3.270-cp314-cp314-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.14Windows x86-64

plutus_ai-0.3.270-cp314-cp314-manylinux_2_28_x86_64.whl (5.4 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

plutus_ai-0.3.270-cp314-cp314-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

plutus_ai-0.3.270-cp314-cp314-macosx_10_15_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

plutus_ai-0.3.270-cp313-cp313-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.13Windows x86-64

plutus_ai-0.3.270-cp313-cp313-manylinux_2_28_x86_64.whl (5.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

plutus_ai-0.3.270-cp313-cp313-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

plutus_ai-0.3.270-cp313-cp313-macosx_10_13_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

plutus_ai-0.3.270-cp312-cp312-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.12Windows x86-64

plutus_ai-0.3.270-cp312-cp312-manylinux_2_28_x86_64.whl (5.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

plutus_ai-0.3.270-cp312-cp312-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

plutus_ai-0.3.270-cp312-cp312-macosx_10_13_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

plutus_ai-0.3.270-cp311-cp311-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.11Windows x86-64

plutus_ai-0.3.270-cp311-cp311-manylinux_2_28_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

plutus_ai-0.3.270-cp311-cp311-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

plutus_ai-0.3.270-cp311-cp311-macosx_10_9_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

Details for the file plutus_ai-0.3.270-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.270-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 7191e7e613c06398ed59c385e37923c730662959439d5a318f57c08322a31e51
MD5 4b00f832c5659bac3415cfd34d132192
BLAKE2b-256 57d8415cc2d4c74f16e291b3170d24053a64e8567c0465c9203d54e6bc008065

See more details on using hashes here.

File details

Details for the file plutus_ai-0.3.270-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.270-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b10e34c1be5a9450cd669dc94b1e419293d5d2061ee7b5d186191c5ff8ad0176
MD5 36c4d2373ed34265acffc4097002d3e4
BLAKE2b-256 a2e87e28152b6f31b33fcfbe716670bebc38057a6673c4b1a8e7adf09e52b61a

See more details on using hashes here.

File details

Details for the file plutus_ai-0.3.270-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.270-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6f514eafa5a6329ecf155d66a2664b1e252358aca20c038973e24f6f9afd7b03
MD5 c6c8eb6301bf47e687e4c11c42d71e21
BLAKE2b-256 e792463d6b1ccad5311b649b9ebd14342a30cdaa025b99631632dd8cded7d253

See more details on using hashes here.

File details

Details for the file plutus_ai-0.3.270-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.270-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 8f3dd0fd9748db1f40638e7b9a1de00052d8a0444249e7618028ca86c06812a1
MD5 d148a33dd8ec822d3897b1297c17fa7c
BLAKE2b-256 ef91a10b8d0c78c6f93e1f9d49b45cd6c615270f8cac96215f2ca4769413aa4d

See more details on using hashes here.

File details

Details for the file plutus_ai-0.3.270-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.270-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c00c8c92444bc7c663038426016cb6b764d019b39033827672ecbf09a86ed6ab
MD5 4342ccd7f184efce3c0745f9db4f5eb8
BLAKE2b-256 5cca926f57055905d9ad53b1251e01b162bb66c7ee8c17e18912ed7d9a80e3e1

See more details on using hashes here.

File details

Details for the file plutus_ai-0.3.270-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.270-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 dbf3b237509d8d2d502a6e536eacac7fadcf94b546fdf91567a828c5fab36118
MD5 e12845bdf8b4a81582021854032cfb17
BLAKE2b-256 e90ea791ae4c910fbd87301008c96883ce555d3c5b25cdf2bbf7c17a7ff236bd

See more details on using hashes here.

File details

Details for the file plutus_ai-0.3.270-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.270-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5060daed8a2e77159c1ea4381dce794f6ba13ae0aa971b910f4e1dec3d033cbc
MD5 3091da6b0324ab67a860179a4bf5990a
BLAKE2b-256 cc97f579e94f1c34e09be03b65df97138c96bd88344790f63ca072311b6385cc

See more details on using hashes here.

File details

Details for the file plutus_ai-0.3.270-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.270-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 cd65188807b59f6d6ab3e0396365a12ddefbc1429e54053f761aaeec547b16fe
MD5 426161daae0d696514454dcd42ea20db
BLAKE2b-256 0882e07100303442231499cd7516428ac94a562cfc5f43933cc24efad27976af

See more details on using hashes here.

File details

Details for the file plutus_ai-0.3.270-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.270-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 fa93cdbc8fa4334bde1c1754efa53f63b7287878b20350a741d8c681a6e7f3a5
MD5 4ba48c99e2c3d70dc8ff6d8b525d7572
BLAKE2b-256 c740e517829eb4987e270dd7a401d2c87079c1a27ed253c1c45403c7be82de17

See more details on using hashes here.

File details

Details for the file plutus_ai-0.3.270-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.270-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bc176279f5b3baedfd3eed1ea602495459c72506ad5b9378e6abfea4694c0987
MD5 d1a2b44bcd80ed03f892488449be1ae1
BLAKE2b-256 5142bb619d076c91fdfa7e80c80de0e8f1745cb7c48b5d2d5c6314cd4b2e7845

See more details on using hashes here.

File details

Details for the file plutus_ai-0.3.270-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.270-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6ca271b98d456a3f158d7129fa67b2061d81ab41bb4133719ff9b7ffcc817c11
MD5 48cbf139a7bcdfbce27075e81b39db06
BLAKE2b-256 b90de9ff11dbb036c3f2c70cdf8a21056bd15c8203c364cf5e8381a61759906b

See more details on using hashes here.

File details

Details for the file plutus_ai-0.3.270-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.270-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 c7c0d9ab9f8802f817ff6e2e48ae1243a9af1900fc21014effe843c36e1ddb54
MD5 d8be1b289cf919382a79fe0b6ade8b54
BLAKE2b-256 2ff8a0dc2457e854dedae8490bc43dfe38cc5d33aa6359a8fd2c025d31f33b6e

See more details on using hashes here.

File details

Details for the file plutus_ai-0.3.270-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.270-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7d1c172aaf899ce5eafba220f4eb6dbad8e6482c35d82a18e54af0b0ed4ebdfb
MD5 52d376fed62dc874c80d52064d3e8c32
BLAKE2b-256 8c74d016d8fc92d36cbda7be85caebbd2d2e64a86a3f85c02f89e2869f8bf384

See more details on using hashes here.

File details

Details for the file plutus_ai-0.3.270-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.270-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8bab1032b3e669ce8cab2996a78bf9124e8689fb835a68dcfe2fe2ed9d53bb79
MD5 9a9ef10b709b076139786c3e5fc0082a
BLAKE2b-256 7f84d7f8cd9d9c6993114d2eb69f31323ae33bb8e5c8d9faf55053e57b508a6c

See more details on using hashes here.

File details

Details for the file plutus_ai-0.3.270-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.270-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b1548c161f159464c4e3abeac1ac8f6606452a6b9c823622b0ecc24de909f0fb
MD5 60c88880e589f2f8c960719090dc8d0f
BLAKE2b-256 750fd9f0a40aafcecaa54611e8b1ad967bb6dcff2e6536cfe399376e9de71264

See more details on using hashes here.

File details

Details for the file plutus_ai-0.3.270-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.270-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 339e6b8a03d8135e6bfa86b84776b2d7a86418a79f58b86aa77004aa6acfd375
MD5 56479d07ef0f164675fc30952fa9119f
BLAKE2b-256 8ae1c95e8427a307a8b5eebbf3683f65968e9d17f23cbcd1c70a5a98fce34339

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page