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

Uploaded CPython 3.14Windows x86-64

plutus_ai-0.3.251-cp314-cp314-manylinux_2_28_x86_64.whl (5.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

plutus_ai-0.3.251-cp314-cp314-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

plutus_ai-0.3.251-cp313-cp313-manylinux_2_28_x86_64.whl (5.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

plutus_ai-0.3.251-cp313-cp313-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

plutus_ai-0.3.251-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.251-cp312-cp312-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

plutus_ai-0.3.251-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.251-cp311-cp311-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

plutus_ai-0.3.251-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.251-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.251-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 045045657de5da6f864383410978fab21eb3eaa3d5a0552537c13bc0ba51446f
MD5 67900003ca512288377b3617e0833c5c
BLAKE2b-256 b29ad9abaed843b9deebcc23b5c39a30733deafb6f25600e094c34d25a6c6324

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.251-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bbe5eb3623d67ed39d36865926ae5f7c360fbe63cdbadb68c458b40a6e7b584c
MD5 473042908f9cc5401ed409d9094677eb
BLAKE2b-256 16a05be47f2534ba2508bf521b75f49a7636d15ac06674ecb0e56b7792b108bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.251-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 98e3a2bba8057922f0c226c753abb1b03b1f6453071f7d4b39c76cfd3e857687
MD5 d267413d2dcb5ae677d5193a0df49dd0
BLAKE2b-256 6e4e38a88b56a07f12f0657d50da80529de9c556eda76b60f82a74142b3700a9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.251-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 df65682b1cbf9c6e7a031da93e9121bebfcd8673ddd432709a40277aa6e38b80
MD5 b9f9e9e614b5d6d3ce48f52ebce43adb
BLAKE2b-256 e36c394edcf0fc8b2da8e963589492e014d8d06823f4c61ecdb7f5bb2823e228

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.251-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 835c16d0013801c8d2a4d748cbf4060d5fab47f18cc4e25e2bc04306ef05f8bd
MD5 deecef26644c43533f5490040d45282f
BLAKE2b-256 ffdef0679ee7b9ad2bcea305be07701ffc3910f1e8b2bb12d9ea918797b9aacd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.251-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f6d196fc25242deb78de2a8d7ffc80785cc0b35b43bd9c01d61632697c6c35d5
MD5 0702cf0feb651cb207b20f21ceefe953
BLAKE2b-256 d565d7ac9d7348dc2e78db0065809c2f641c17f0e3b2bd120bfbd4030555e9e8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.251-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 56fdb05f6400025b1a91ccf02eb9f4ecd8292f6bf4901bcef8093cf487963d18
MD5 f1c875a22e6ce0e3d1264d656bac95e6
BLAKE2b-256 fb29244b2feccb029dae2726bef7239ff8e8af5eb839de06420983558cb89511

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.251-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 0e91b748746306443de992e529808845bd4be842c189a08bdde94928550eabd4
MD5 05817163f13426bad48b2ae3c0dbe904
BLAKE2b-256 269afc826f5fada6b3aa2d5e96962113ae088bdb33f3c8ec02870d41aaffeb7f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.251-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 2ee45b24f0260dc01895bc0860ac3a98e123b7a2a8dea2e327878fa1c0a5dbbf
MD5 4e9056cd52c6569e0a680e70c6faa2d1
BLAKE2b-256 ebb0f46071fb7fdaca058eaa5bfbbd4adf06b362a4e5b84f90540f580e0a66a6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.251-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 86915cfba44249fff409ad38b8bb70c0d8f034b628e219a70f2de07d1fad74ee
MD5 e2b489a4fd2a69d717889c59e4887c1c
BLAKE2b-256 e60d66e91e2a4858e5567d3b496c4612460d82b05f17319abfd8361f419b779e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.251-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 72fdedff649a80ce3b1b94caa902b5aa902f8b50c940c9f9d020d2cf14ca28ea
MD5 7dd5bd316679750c43ad22e33eaffc17
BLAKE2b-256 484e379c7f21ceb8e6d8f53e8db1605652354fd3eb9e425d501ff1faa91e4165

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.251-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 18e4c61fa4594e84fc32ffc102153abadd0d9b688007fec21527608e25353675
MD5 acec10a05fbf9eab19fc9a68bf13a035
BLAKE2b-256 1e9f0a2012b540a1772825bc81de4229ee807308bf46328cb685aa249454406a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.251-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 e7590998f94af4331663860e45168f26f89d2be931bbd9c62e338331435a5c64
MD5 3388f90c510d1b7f2f625fb0d4ab894d
BLAKE2b-256 2bf7ec0bca0e6601419f2b3a0933ef2f72f9228cd05f99ac7bf713662619886c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.251-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e499d0c1e30ddced2acd730a0f4602c282d63e80853b80af49f4049e80b594b2
MD5 aba02f5e8814832863d79d66e09049b7
BLAKE2b-256 1a3789ed7dc3b8f8c7e53050a0e69da0f8cb3aa9923f8eda20cce8ac533d947c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.251-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 eced303bf86f256d93051dd0d048886d54f1cfa2e1aa0858baa2d545023b2a19
MD5 4cf89d90d0200da7b1bc470291f3a336
BLAKE2b-256 54ec70bf5426ff21bb837b55b493b57d192029966f85dd60f0e6997a85eba2da

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.251-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e08ca40e002dd702baf85ce13fd49217e7c38c8e78d1ea78783a2bc7fc58e253
MD5 c91f7f2206a180d52c2e816370d57272
BLAKE2b-256 c54ea969c023d7cc030ffc465ab9896e08991d5214555cf29707a64e783a62f8

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