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

Uploaded CPython 3.14Windows x86-64

plutus_ai-0.3.265-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.265-cp314-cp314-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

plutus_ai-0.3.265-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.265-cp313-cp313-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.13Windows x86-64

plutus_ai-0.3.265-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.265-cp313-cp313-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

plutus_ai-0.3.265-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.265-cp312-cp312-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.12Windows x86-64

plutus_ai-0.3.265-cp312-cp312-manylinux_2_28_x86_64.whl (5.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

plutus_ai-0.3.265-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.265-cp311-cp311-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.11Windows x86-64

plutus_ai-0.3.265-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.265-cp311-cp311-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

plutus_ai-0.3.265-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.265-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.265-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 c6125a9192da5c3970b87c557c32157f24ab1c0843523e3f6f1931f4703f2ed7
MD5 932c8f3cc554fb294a33cf97969f1106
BLAKE2b-256 ff8898ac0b9ae0255e6b36e7a5fbbf7ef244ff010d79efc4505c0785518ac4d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.265-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 db257d6cbc4c0be472d9922e13a9eb5b9ac7e4e0c9bc2bfd4bb577b3e4e9d7df
MD5 c05ca644baf83cceb37c1e8feb1cd091
BLAKE2b-256 dc627023f2293b8a9ac148500cd1ec666cd2c7f1fa21a7c7d6db4f75aa6458a2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.265-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 98501dd8728e28715fe8116a8bf35299827e5a638952bf4944d7ad6a2e761101
MD5 e1cbcf299f67a45aee0676f25fce2e96
BLAKE2b-256 ebe0f88111ae1bf921bbb6702035b258c3322ddf29ba4e477aba0c93dda2a573

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.265-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 6dd6b6e91fe64f378060ebe8392a292d60570ee670a7dbe7e8a9c27163ec1ac6
MD5 81472d4e2b0941a533e6916b7142d552
BLAKE2b-256 756bb1051036c1485418ffc7fbce56891e7bf9ba00410c6837ad3549508d6f34

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.265-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 72c00c26b5823f6b97ff7627340be0b5732ae9f143f86fede29c97c12d5a545c
MD5 0635fcc5a0b6cb508fef75be20d8a9be
BLAKE2b-256 ba265046e004aeba69e0f58fc287d1ef9e847300418eaecb3c0baf7fc255f83c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.265-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1de22ad2acb7a3f21dbff0d50fa90674ace66b4f1ef80ce33949fae130ea787c
MD5 520415c1309988ae6ee2d28fbbe41b93
BLAKE2b-256 ef48715f17c17409a83eb8c37b6e8159c062f42425dd719882e0cf2ef93ffff4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.265-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cc2dba708975e4d5d86b441891420117698367307a04f663ccfaaeddde181bea
MD5 b24b682fd6ac5e482471d5b06b3adbb8
BLAKE2b-256 ae8fceb3a7a04c7681ee5dc204855cebbb19506b15e4587b761c6b8689fe5377

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.265-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 23c9270eb639b767d46cb2dc56410cef794ee52fed1a43e312529f8712c3207b
MD5 ecd056cb97b9b0d5c093964c5e246a7b
BLAKE2b-256 a3c1d34fbc34738c83b21c515dab95c3290f70a38b2cb4bc3cf1ca6fccc9fe18

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.265-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 eabc10c0620cf7b22f48db1069c8fee999c3131c3b4d908624b035bf9fb4be3b
MD5 ef115b4a668b1686f87f60f8c2b607ff
BLAKE2b-256 5c030105a9881c4be36e8cad4b01c9a18078d1e8531bca3c9360125717bb648e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.265-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6406764177a985ebc8716338d2afaf281085eb5421ac894a5b19493d6c1e8d98
MD5 55e387c0d4d019f829a2eacf414b838e
BLAKE2b-256 f8bc876292311ece11cd21aea2aff36d52049bd1bcd05a0d6421db84b14b0012

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.265-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7ad2ec8a0c4be96daeac9fe9f189da81d13b7c189aac5dd8fc0cc1d5c153892e
MD5 2e9360d3c760539f9773d397152c58e6
BLAKE2b-256 7c92b02c532b2f2f0639db39a82141bc846fcc6e780856540def72a11d04fd9e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.265-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 63b06ec5e18eaae7b6852910bdbc9c8ef38f2e95326447c3d3a70512378834e5
MD5 89244f1791654410974b8d98f3ce104b
BLAKE2b-256 3a9d8c4db99dd407d1f47d1b03182bd99c4a3f1ec418deabd77dab1c448afe80

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.265-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d6aa5f1a0318399aee4c8a77577501ddb1dce27c5f34b43eda63e20ea48cb0af
MD5 cffabd14783ac97f5a2a7f50245c960f
BLAKE2b-256 f56bdc1971dd8f3583c83caf24fbd08f88641d307aa1e78e2544817e3b0fa250

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.265-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 772c38a7fbd43b583085a49c43e6154080296a0328bbc54c826d003715373d7e
MD5 863cab266f480d2d4feb54a2b78a19e1
BLAKE2b-256 61438129287fe88dca7057b59d209a08108d53a2c3667b558da1422fde9b59d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.265-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 173f2054a291015bf3abfb5610d18030b00bab7298619fa90905f7caded4c021
MD5 d58dd450fe09ae8015d74dd449c40bbc
BLAKE2b-256 59446aee59559bfa4fb2a8855e2b77ce99d9f5d23e7018d00dd3d89f2ae8e36a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.265-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3dab7f1b4a81239e059372e18c19f6f9e8afcc5983d74803bd0b129ecb33c3d7
MD5 94c1241b085ae96ca05d61c757793bd7
BLAKE2b-256 a1948caa1867d35ed65321ba69dd7812e6a1dba14499880c61d180d087767161

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