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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

plutus_ai-0.3.269-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.269-cp312-cp312-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

plutus_ai-0.3.269-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.269-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.269-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 7e089bed52e84a68959830dcc34703211de2be4ed0573fb6f65447fc1f7c447d
MD5 71c3bcea5742f4d68abdba0e6a419cc1
BLAKE2b-256 20d1cbe6c251d6970c0b5415f0995e1e5445ec84a9bde318c49478ce09952482

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.269-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d720b4150ff712a54c1ebc1ffa3e4f61eb743987c71d83c0155b640927a3a8b0
MD5 bbe33edd24374f28304d6afc304c4820
BLAKE2b-256 479ac0334a729a1fcac436d58614fa3a86f530b73ac13fca07f5f05f656cb82a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.269-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5a122e7c4cb3d37d62fe6df3af8b822a9d65c7a0f030983361216d200f459f35
MD5 71b0b046909d066efe9f9a0bd86522d4
BLAKE2b-256 550bfd8cb783af9ac67e43d54091f2b7ae6c80d3f5475b52df22778886a98bfe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.269-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 3f94a7c76425c2cdbf0079f942b47dc4d10f7bc5682471edece1de3ff1b136b7
MD5 b2bb2bac84ba81cb0e0b3205ec618e67
BLAKE2b-256 3e558862fec66b3aa9118dcbf604997c232072009034103bb70c7842c1ecfaf0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.269-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 15e4b20c9ddb2d4a0e122f17ad6d4fd4a241af0725b57d538f6d78c26d629031
MD5 9fa2cd0a2306371e5a8c56294cddd091
BLAKE2b-256 9de2f12f42447054a51f54d334b36326022264a0d390a6e639a8f8f690ff7f51

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.269-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 06c285659bf6eb5dfe973d89b9200cb8599b078f3311f0b24d72581b090456f2
MD5 c89cd797a1cd2e137fe5adecaa8517dd
BLAKE2b-256 4d7275b597c44ddd68da8da3327e88678d4fe31a84f91b9c4163cdef9f403182

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.269-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1a45ac3af78764c154a4514dfc742c30a785e97662af3cdde24f1038d21d47e6
MD5 3fa4dd80045b1e51d58d773ca5636f2d
BLAKE2b-256 8dd06d7a5bc7e5751c9d241d14ca14ee9079b3fa3d5d6ea4403a694596c91fba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.269-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 13d0c1bc467c9ff76709399cd3becdbf986ea4ff3fbdb5c5343be1caf5d975c9
MD5 1162428163965639bae2fceac535207b
BLAKE2b-256 58c199e0b3cc5f046b6c34f80713adf1edae1ac1b74f29dac0218de6a8904ead

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.269-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a63f2330766359b32f3021bf7cade871017e2db1bd9bf7fffd67c16139fdbc1c
MD5 1a3e789cc0808136a41d86cd782dbfc5
BLAKE2b-256 294249908b9aa7cc73e41dc16b95f8aa85ff84d11494181de970bb33758ae1e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.269-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4169411e0d4eccc75454d9ebf9dfd6959c23cc32eeedd0d676cd654c095647bc
MD5 e8f280e4924a4cc029f82d762be17b8f
BLAKE2b-256 6ed8e83b15b84fc0634f19ebdbb8bcb3809dc1393f92d24e94237fe7ebb1e318

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.269-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 98118600fc7315f4eef2dc813843f6ca3e3fe8fc948315fc40d03617ffd51d2b
MD5 4998762954702f1a41715dbc895a0b3c
BLAKE2b-256 75de41311bfff4e678a863dd596682d2c02ac59b306a909abcab8ddab972106e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.269-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 16361455f6e097fb9b0da450bee0467655edfb8b09cc82086421bb151bc1adbd
MD5 e58fb6f2dddb8afd263b455232d96ec4
BLAKE2b-256 85ccaa424316eb80ffa4b25b151a12a4b1c68bb4455a443953db1df5970affb2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.269-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 99d1a30f4249b4784b751d1e3969ee308539015cd260de9418ffb3d7dbe88964
MD5 518aa2785b7cf4b69f724ba89814c8a2
BLAKE2b-256 a0492a2dd9d74970f4c34580a840c1284ee6e55976207d5d53bf729292e77250

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.269-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 418c2005dbf64332314c8527939346a092000d50f88f7f0e5ae83e656d13fc93
MD5 71077acb2a03eadfb4b508c8bc4c3de8
BLAKE2b-256 c88f811f5ac6a2a089e518784e91d76dd9063c6eb6f9516b5b10dfd666efcc8d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.269-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ac5a81fc9a1cd6bfe06acd6ca334fcfb4f0d6d33552a3839dc0c93f187bb7921
MD5 1cc625160c4f042bfd7e320bbdcb73c1
BLAKE2b-256 d18259200b274c34292f1d153857e9048406489a760c270c7d4f5d75c8c2cc4b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.269-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 35e1c03b01fc990c0f3dd8d51e4514eebaeb11165cd5a07cb6b3cf9d2d9383e0
MD5 50053e2682f59e61e2693bc8745a4098
BLAKE2b-256 010fc99757f1524305fc16f8f9a582aeaa245a1d586225a1429ccf174ce4c4fa

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