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

Uploaded CPython 3.14Windows x86-64

plutus_ai-0.3.248-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.248-cp314-cp314-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

plutus_ai-0.3.248-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.248-cp313-cp313-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

plutus_ai-0.3.248-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.248-cp312-cp312-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

plutus_ai-0.3.248-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.248-cp311-cp311-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.11Windows x86-64

plutus_ai-0.3.248-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.248-cp311-cp311-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

plutus_ai-0.3.248-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.248-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.248-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 c6e9ec6c4fbc288a64a167c4b05a3b81c3660a78318b178d1f32f8ecfa11482c
MD5 bf4000c964f8c29f5a24607beeae2754
BLAKE2b-256 99e0f754a1d95eb978d55c83f502e8ae3cc6208d5dbd8d1df512279f6a436a65

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.248-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7d54463c3d0da686e7fb5e38d9923e625fec2da418c39d808f38bd0d02785b1a
MD5 ad2e6cfb832908d58c98ba429c780c54
BLAKE2b-256 a9383f6ad1b2a52243de8cccbf8f484a7b8dc58c297b32f4f7cb4dc7aef62277

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.248-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 088498802888904a8fd6f20ae43dc9f39e4a4e18613ed5e80f42dd7a641a0dab
MD5 5b205ac4f802ad29adf7199e6ddf084e
BLAKE2b-256 fd9f90d1cbd36936ecf62e23ecdd9eaf0bc72d4cc98cc5d6b45fc0502a81ba44

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.248-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 5b1b5f358878a0ad55870b65c4f462b8313216cec411271eee0ce82dfef9b577
MD5 1109df4be36b9a57e3324a11f42382f8
BLAKE2b-256 11479ffbe6444e458badfa42aa325adcae0476ce2556ad98df430f8f93537ddc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.248-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 410a4840f8aa771dfd906dc9d4eba4bf3e1ee5a386607e4538205d7de271b187
MD5 58bebc0e44600b12434aaf0b3ef08dae
BLAKE2b-256 63368790b7273c418ba4e3e342257f4e84643ac30861a3d3dc4cae82d8966f42

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.248-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7f13575e86f2f5dcc1703ca92ce6bf1c1017cef73859048f884446e3b546db2a
MD5 aeaef1a76fa4f67d90e2b3b803bc3559
BLAKE2b-256 2edf3449298ff34a2eb52f99658dc2367446bbf600cd21eb86b80ddd5c8da8c8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.248-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 233f1428af3a1d96e61471ebbd31d9b860243de1e9e9610c49e7748d92863682
MD5 d06035369761c5cc675ad8ddf2a82384
BLAKE2b-256 9f00693a9659d90be83da77f807da2e8d387d4edce03cad30dfbacf48776c87b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.248-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 46fc21933b6458057aa4fc1a85ee2af3b578f3153c9f9581735ae1e0c9147b75
MD5 d619757f4021f084b68411f005725368
BLAKE2b-256 71fe4b7adedbaa471274bc93c45f2887abe97976094dafe6b254efc0848bb669

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.248-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7aace83e322f1785f28bf6075626b7dc32a476bd563e0d4177f9b52d401991b1
MD5 6ee237b3278f89a01314e26d6af1d460
BLAKE2b-256 1bc9b046937f5aa3a0859acb256c79fbb59bcaac659258ae3394c6b2f70b24ac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.248-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 75cd4962e9d3871f0f77ff9d2d35714fdfa25c0c63c016b6f026afe33e5fa92a
MD5 31f85446b43a4333e9ab7d10167584d5
BLAKE2b-256 5a4a986f7681b6a3091bfe3b2f152a7049c8cc605f6947bd0d9fef9da0ba8567

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.248-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4ab02bb0172af5bc0014191fb7f1e27065da4641fc6fbdaa4e616aa80a6a25c8
MD5 ccb8a1b20045af69ead49df113ceb49b
BLAKE2b-256 87a5483926b6f5ba37b8aa4adad7a024bcc6fd9bbb8b40a532d6ee7a535e753a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.248-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 599e51ba037b2a61cf361c3a4e803f9894147c603c8baf13dc1622c96a9f9c7f
MD5 bb7017e73d7966c737e47e0a87be2e82
BLAKE2b-256 66fcfb64c5fe3e0bebe37b36a19aabbc77c44c02f127d258c4621e13245a2a27

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.248-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ec7b9fc838c1a5395d406174706fb12c2b8b731a798c196ed2a52efbe57441f7
MD5 ac1b18f8804ec8f78a3875262af3baba
BLAKE2b-256 584feda6f780d5ebc8d0a3b2584888bc930627ac7efc205286961992cf79e622

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.248-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bd391a33cfaea4c096f19542bd2058eda9165f4bd85161bc7ad9c772a1b2c940
MD5 ee9b464e390cedfc4b9145dc372de072
BLAKE2b-256 acbaad2e05e22e9718f7555e2b474f818d6850fb19005f5029c1c8017a636518

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.248-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ccdef7c3af3a8fd5ce08c7cde9bcd22ec55d3df84c47f650adc843e340c20a92
MD5 a0ba1c6dc7a88108958b493dc136730b
BLAKE2b-256 eb3a82d5c7f030c167ca7eb0f1efc68fb0df3771964d0840bb38ba42e019a321

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.248-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 78965d624bfa86e7613eb602005306feb9600f22ad55bfe780c0e466ffe547e0
MD5 8d841089a29e70314adc99b70187cf70
BLAKE2b-256 f70008333f71d9ef9753f266ff002f4de845a0ee48f5162307744318a054b5c7

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