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.249-cp314-cp314-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.14Windows x86-64

plutus_ai-0.3.249-cp314-cp314-manylinux_2_28_x86_64.whl (8.0 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

plutus_ai-0.3.249-cp314-cp314-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

plutus_ai-0.3.249-cp314-cp314-macosx_10_15_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

plutus_ai-0.3.249-cp313-cp313-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.13Windows x86-64

plutus_ai-0.3.249-cp313-cp313-manylinux_2_28_x86_64.whl (8.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

plutus_ai-0.3.249-cp313-cp313-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

plutus_ai-0.3.249-cp313-cp313-macosx_10_13_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

plutus_ai-0.3.249-cp312-cp312-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.12Windows x86-64

plutus_ai-0.3.249-cp312-cp312-manylinux_2_28_x86_64.whl (8.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

plutus_ai-0.3.249-cp312-cp312-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

plutus_ai-0.3.249-cp312-cp312-macosx_10_13_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

plutus_ai-0.3.249-cp311-cp311-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.11Windows x86-64

plutus_ai-0.3.249-cp311-cp311-manylinux_2_28_x86_64.whl (8.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

plutus_ai-0.3.249-cp311-cp311-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

plutus_ai-0.3.249-cp311-cp311-macosx_10_9_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.249-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 4e996b8dfa2ea5523ec69c3ecd433d4dcda64054ff7fad27c1ad0d60c01827f6
MD5 5b66348df41825245449e9b8ce159fd1
BLAKE2b-256 37ced82f0417ccf09e847c12557dbb80619aa333473ca6f38f9693f186054ce6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.249-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 804826b2823b658a3c7feed90c4a12c0feb8d0cb58608e9a34de9180683ae7fd
MD5 f4d87de4beec670e85df1f205ac6f580
BLAKE2b-256 0c8a6b0dbcb773635d3f1d2fdf24278989c6764d5ce2212681aeb994f9ebb6d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.249-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 88dcdc0f78ec59630cee86938ac6c3699e927dd92137255f69e35f6326ed69f1
MD5 695f0fb0a38035823945aca932f6dba5
BLAKE2b-256 1e980a48bc4dcc71d47004a466f61a31bebdcd14d7d8f1fac0fa5d88a2daab05

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.249-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 57b4eec1d1bbd7c6a82f316b65b177a857e014b56156f3bc9837f254752fcf1d
MD5 38af3f436514a61529a98e7bdb3449fc
BLAKE2b-256 544234549bd92f22d563c0a6830f6b56090465e5bbac950e2d4f6c2cdf52008b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.249-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 de3c169b5cd3688233e27baa4a5db0979be416511ed81866333672c0d8c37090
MD5 b7d7fb2d15ad4faaccee3bee9495deb9
BLAKE2b-256 24553c07752ce9973d02e0de9928c5e1fc4fcfaf5fad3753a51489d876bc26eb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.249-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7c297b5007925d00aba6ccd36b64ee7aeea7571d35e3a07a4ef59309147e239b
MD5 583185937f776dd79044a66908feac4a
BLAKE2b-256 a85e7c2dd68df8c4aff827b42c05e813f526f5f349a54ebd0277043b99b8a194

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.249-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ab6d10860766a1d74ff855999a9c03cf3d46319210c994e8687d2a32b0dcdbda
MD5 a94e3ed6d9391ed746376c0fa4e8627d
BLAKE2b-256 1260a63d49d9ef9a93dc4cb4d6eda85446054304f62b917eec18298912426017

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.249-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 510e372499e37fb55cd368301a1326ee1a20905bfe9e79a51848374f8e2bfba3
MD5 da9dcebe646b8642f4e059a90ac1c614
BLAKE2b-256 fc7169fb4ddf183ef8776cc487d94bf14359c8efc82867f2676bdd93493ce695

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.249-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 151dfa9e059d14f13931194d0d6fb426d977dcfa0772c421bdd1030d9238bbeb
MD5 2a3dd9e749e801924a5bc21cbb21e5cd
BLAKE2b-256 1d273de83804f1442d1a5ff71d4e281050057ea8b902b9dfa85604244ab1dcfc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.249-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c6c25b0636895e4a45a584cb8ce9890ac674aeff396a3c1c90c9663ed52c9c35
MD5 80e302f8e4738d663dd50d2607a10a80
BLAKE2b-256 44bd2bf25292724889d71c3ab93583c2ab0b37cffc93de07ac4637a16a24233f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.249-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6f351ce1227dfc8838e6b9d3d3134007af2b9984c74f48f7e3be4e08a6d3f525
MD5 114de400ccdd7784af202ab66aa103d4
BLAKE2b-256 9435fb6037235f8955416b2ce58b3bd65b949e0a12d87db3168b436e14429df2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.249-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 abcd99cb6431ccbe4447079c2c0e7210a59a973e901bee0041543c2f1f901ee3
MD5 b58eda283daff534063716638cbcb104
BLAKE2b-256 61335d81aeffb57c16fdb4d76c29f0127f358262e3c602d2efd3b08dd7bd9ff7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.249-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7650d0b945f4e439fba67191195e94379ba51357999b25b63f12626aa60a422d
MD5 a4100ea79e2747f2da07bf36aaefad36
BLAKE2b-256 8c5c67b64de229c7ee02c7457efd03c1690889255f46c816a850ab10025b030f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.249-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e39ecdc294653d675c206097f0942baf0a3abf2a4a354fdcdb224e3a9f54817f
MD5 993d8285f68b3c24f1ee882c536cbe6b
BLAKE2b-256 47aaf1f6c2639f217823608f2ae2923ee645c3b56473812991f008621378ca02

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.249-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6c63b7bd152344cfc6b832ca98a5c0ea7186a9ba6024aa5304a076a9e13b3913
MD5 7fc114ddbbdaa002b429482521c4ec93
BLAKE2b-256 ed4ad553db9c61571f0c30bcfd4ea45ff300f274e5790640e8ddef60a64ac7a9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.249-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7b6a7001c3f3f128f1f36620f83e08a274b99fb1285e89f1de49efbc639a2233
MD5 a8cfbf5acc0dffa6f5bb55d54b617a06
BLAKE2b-256 e3a3306cfd0f4041f49ceb877dbe9c0183606e262f39dd6c8c59e4d4fe0b157f

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