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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

plutus_ai-0.3.271-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.271-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.271-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 3792818b30e1c0c4ce9598b97e6c80a0703c5ec8008c1c5cb936bd15e78f5af8
MD5 87523e5d47e96089ad2886b5149d38c2
BLAKE2b-256 cc59754a96b3c84955eab91b2c309465f15248fccec7fef0a6428132371b4909

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.271-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ff48820fe24cac0d814e2786a03f6bfd4c6ee5fb17df0a28737bd30b836926b3
MD5 6bcbfe2cec627022548cae7bf547814d
BLAKE2b-256 df01456538f6b5906a525c975f5e33f015bf88803991eff853cf68edeedbc4c9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.271-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5215a9d74771c99169f63d153b910e8fd0098d22e2d422f6406c308414e35374
MD5 a7cacb0d769adce76c27f4b02b6c300e
BLAKE2b-256 489e1d01532763d69ca71a21f5654d7fc80a35e084c7e038c54b4e7bd67418c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.271-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 32e300ae1bafdaa7e8dab9e27514c983e996e1e02b737d663d05041792aacaf0
MD5 dc7685c2eadce7a8169bdff5137f45e2
BLAKE2b-256 38d7d4f1159877b4d8445e929ae0e41532c8c09cf58b51a257ad65faf526ff5e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.271-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 2a2c32ae1b129079764d71a6335248bf908be90fca08a04cf6cd0c1ba7b0d504
MD5 bee2f910362561b558aa7c49057180b2
BLAKE2b-256 473b1189dc2461ad5d4a4bb6ccc73b4b29781f9c0e3f0c279030d42397fbedf9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.271-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 766c73e5169b6d5f38aef38dd904a4f5aec64dea08d6e4db7f83a8d1da3a5836
MD5 bd7927b15cb19487beb0eb04662b227a
BLAKE2b-256 b429113af3d8aa6a1a9976387482c41614bb1ee07ea68f7faeabc9ad990ab3e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.271-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c2bc5ea537531bc150c4725712219593187a6360fa6ddf7b325ae5749d94146d
MD5 249b33f7da28b7da3d625cdc174638fd
BLAKE2b-256 d184978d05f6151efee5b49504e9ba528110c20c662b8b4223752a5baf50c724

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.271-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 8e8f15f346713159fd5e2d95ad22c51cf9a8630d2eaae61c0e1dff051753a5b9
MD5 c4ed30fd6c809359efc166398aaa85bb
BLAKE2b-256 806f862baf1e4f73a8ce850275ac59ea5691d2c41c48ce7667fc15e6718a15f3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.271-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 03c2a68cca64eac529e8aeebb70f8e129a9517689561c8d2a5e65ca98942bb18
MD5 ca520a6c1f56584f991ddca9ac8a8f29
BLAKE2b-256 4a07fb0c21a03fdfdcf08718336f3ee41fd75a54254e27579f37723e46c30bbd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.271-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ea77d552a1d465290c38e03ca1572f6117cb147509ab64aabbb40e00c1924e39
MD5 269875efab520b6c392b34b8142cc42e
BLAKE2b-256 0986533688294c0f972b3ecddd13a6d1217a87b8fda61edde425e8315b5c3441

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.271-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 25c3bd3abddd70b61738892dfe5cbd95780322fda6b55eacce4d27311caf2bda
MD5 e2cc2de1e8c075448e2571c44b63fda1
BLAKE2b-256 75829736a69f72e192f242ed8fb2a2343447d15c78d5ce27673bf84185292754

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.271-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 34f7aeffc42a7230eed30a14c523231821a253deff33881e54bcb9b0f4ebc180
MD5 23a365f123bdc45007506e4cdac94d3d
BLAKE2b-256 dfdb47844a05530ab1d231f00fba5e345e53b7aa63fd96b1af753bf53f86b30f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.271-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c9785c74956364cd10f5a812b00e3effdb1d4aaae170cf0cfffdb0f8d812bd13
MD5 c5795ee283c8c9506f1846465657629a
BLAKE2b-256 86f027bc0156b75826c6d463719aa5782bc21035f61eeae4b7bd252b108a8f14

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.271-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 15a31e3c9929b1def4905b8b04bb301d95876443cf3afcbaf41d9353ccf70995
MD5 2d4875b7fefb4833d8eef1e943fc2c6c
BLAKE2b-256 dcce1a9067e22d522163e6d74991affe8c2eb109fd6d5c631ed7705f1d3645fa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.271-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d40fec1b919b1395c0dc35ede6220e668c76c32a04419f2a15b71ba252371a4f
MD5 0818e154afed3863ff140ac03a1fa202
BLAKE2b-256 835b812f3f5713a725b1f87737aff3a2c1a35ace31bdbf895c2d5fbc5ff4cada

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.271-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1022cd1be7e57695061d2deb7b2e1ad46b3793b630f0536a4f1940ce59f1a5f1
MD5 91bab7ccf8a02eb12c3b88bf021dbc93
BLAKE2b-256 8f0505a962de91e528fb1179e44fc8ec94127100d479ed0493c749f54d0f9200

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