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

Uploaded CPython 3.14Windows x86-64

plutus_ai-0.3.237-cp314-cp314-manylinux_2_28_x86_64.whl (7.9 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

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

Uploaded CPython 3.14macOS 11.0+ ARM64

plutus_ai-0.3.237-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.237-cp313-cp313-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.13Windows x86-64

plutus_ai-0.3.237-cp313-cp313-manylinux_2_28_x86_64.whl (8.0 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

plutus_ai-0.3.237-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.237-cp312-cp312-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.12Windows x86-64

plutus_ai-0.3.237-cp312-cp312-manylinux_2_28_x86_64.whl (8.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

plutus_ai-0.3.237-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.237-cp311-cp311-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.11Windows x86-64

plutus_ai-0.3.237-cp311-cp311-manylinux_2_28_x86_64.whl (8.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

plutus_ai-0.3.237-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.237-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.237-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 d2035122d72adec8e4391c2c7624d174ac4884f1fcfb0d96316f962cb516985d
MD5 b640225e84173c9dc7f1ce9297cbb4ef
BLAKE2b-256 7a30261fe44d4320c16b437821bb434755274a970a25fef37474d0fb51927005

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.237-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 dfd8d5ee5341cabc167378700f8c0ecbb1bceb84ed12550bd4832c3193f3a0b0
MD5 aeda543155fafe536aa2fbd28e675fc5
BLAKE2b-256 71a0dcc81286578113b2534e61879b529cb410d2f2787516418768d90f722eec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.237-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 28e949c6f637afc9d79d35bf09ad44b912be00cdb875f01880db7b9c37f0cbd3
MD5 c288037935aef94fcf3fa7fa7b4032dc
BLAKE2b-256 eb7bf54caf9cfff2a0d5827e694f41012e9265110be70d2698fdd806aab084d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.237-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 d1cea7c2c7970edf3d67a8d8562f6212ce59a9822e09d5f5bf957461f0b6b634
MD5 b11121916e6e19e415e6109470612add
BLAKE2b-256 f638d589a5e63f70b324a1050e2c024a1cab0f80a2dc327c0ca019c32c020f90

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.237-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 6fe8dd0b0d5278b5d2b5c5a676e3db6a2de8c1df1a8fef3a49492cc8ba1cf4d4
MD5 34afcdaedab1dc040c0ea869248b3f6c
BLAKE2b-256 2944e10c1131233745cb360fd4e52ded6a7fbf23685d58a4f8f77b26ec111d84

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.237-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 69dfcf04df6b8dd34eed00dfeddce19664ee3e41efc384d50412aa806a91ed7b
MD5 9fd32776f2eadd394952aa18f89ce9af
BLAKE2b-256 79d2204d5e3800cdee24c4178ae31f13d1b7de8e9e5ce2b433eb6f9be2015e33

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.237-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 489d809360a36eda68ec3694efac5b4f1de6b0961f519ded7a3578e66763f6e2
MD5 cb7b1f94a57591c5bea54cf10a032e0e
BLAKE2b-256 05ef56f8c0844ac752cb320580300272ba1db086e23c6b3ca5d9baba197de6e1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.237-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 5fd307b30a9871371660c499d4bbfe2676b59864e11ebbabbee87b9eb4c2938c
MD5 228010583651aba7232fbfee894a9d92
BLAKE2b-256 65f7770fd11ce0ad2a73a34fa6aff53235b65716d689c0ecde15d1e16aa6b0c2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.237-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3b28b2ef7fdaaee2dcd1a18dc59fd262b99a3b93b5f8e906dc1c413ab5c4601d
MD5 3b465a2a9304c78c6419ee2267db740f
BLAKE2b-256 7ae2e0b39c6dde32e9c1107d8e5986754eb45114be6d61fa34677c306eab4f3c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.237-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6730a9b15072e1178eec0c33e3ec3427ad149e5ec3df4ce0e7303a54b3299979
MD5 b99b69c2d40141b5a05b1e082b31c203
BLAKE2b-256 04c7e5c8a1557050db10a292f2c45dc85e8bce03fc1e5c37ec04457a0124ad3d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.237-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 24fffb147707ed4228cd29b4d4d3fda13d71b07cf8f7b50b6702e469c1d84cbb
MD5 1958605100e4ec9f5188c3713ebeea36
BLAKE2b-256 53d348dd4d1eeab1b0473f71b57f5da9fdaf25f466acf43edfb5c3da1910132a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.237-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 d4157d633fdbd8d0e08d409668232bd9c4415dc5cbc0a3b1e89d8ea7e0e536d1
MD5 0901dab24689c5ae174cd787f72aeb6d
BLAKE2b-256 ded95358e05417ffac84a64a36d523090938c0a33c17fb3096432d02901d23e2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.237-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 57efe01ae8430c34a0aa164ada195da88b93267fdfe2570114a6388b971d60f2
MD5 e3a58054717290ac05a8ae7bbca9f73e
BLAKE2b-256 c7130b7c2039b7fcebe47f80d91fee15877b79046fe77f10c4fd6519247495d7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.237-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 18128cfd427a348d5d8685e63ebd513402d6d44bcc64823b5bf647b86417b5d8
MD5 990d798d0163311468c9b1a9355fad6a
BLAKE2b-256 703bd20b24678807f234c72462c14e2b899b93b206f3b11c687107f3d95007e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.237-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7ff4ab0a99f4af0e56e66c86f549c8a4d5c5de8d27b3a587f7fcc4ab42a1f145
MD5 f4bd721ce71066292baf378f024fb4f7
BLAKE2b-256 f6d5086a36c6d5c3bcfa1b0476e7b601bf42e1044cd1807bb57375317d5f35b3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.237-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 65f3395cea0814c802b4434475fed939457641551f920ece4a61fb0b8cdabaa1
MD5 587f25a7240c0abd9366e7e58c475992
BLAKE2b-256 b0a828196410805cadb21a1923954fe25960b6f981ea6fd0bc3d4f12d83c70cb

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