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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

plutus_ai-0.3.243-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.243-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.243-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 35b27cd70b9e3149aa87d834b6ba537a983a73b410523217043270964ae1d0d6
MD5 628f3125956db6cc84b5f1e895c64be5
BLAKE2b-256 a2780312fc1a3ec760622ffcbf971acd73d5b7245d7c9db520bddcef335ff979

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.243-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0f49d8989e8952dd8a0bf3f38aaefad5a402f23c8b078094bb9f2eb2e7deebc4
MD5 02ec64b226188747d828520d7cc770d7
BLAKE2b-256 1f4ac8b807cafaf34f550e7d4b2cd0fc3d2a59802ac80970372a964a58a0357c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.243-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6c8da7b7ec5484cc48023ad1d60f445d670a85ca7d3ef74ae3d61d6b50bcb1a5
MD5 634517be4b442a2645b712938f521d79
BLAKE2b-256 272d5238b9a2ed5562fcb6bd3d6c105104e6668e147054899604667dc81f72ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.243-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 ac52731b008d16ea6bacad4ad22601f5856522b613be4528b55eb0a5b9a7365e
MD5 c537cfba96f7d51ce70b5061ffaa40fa
BLAKE2b-256 c9f29a1f346631184ad6b3b1f6d87ed684ca4d81ab8306a1d2f45b72c3b920c1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.243-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 2e5ad78a73b04e902761fc63b41d7432b7cf33288b7cbd70f614cca5a0585b5d
MD5 b469c105a87bbabadadf38858dd74eaf
BLAKE2b-256 726aa565ff65d27091021ede16df6136861be88dd4d1605456e5c5b8be8737e1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.243-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ae1179aadcc5ca93b8ad3ee340693c0d1f64bbac870a3e9845f521ce4c990853
MD5 9577245476dcc5fec5c43e3f05f041b7
BLAKE2b-256 75bee56b6f8f05c8dc653c7d4558addc14f7ad5f6345487afbd0a27b1d99ca00

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.243-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f845445d54eb1bb41982d038b2f612dd28978582ec5feebaa15115f0dc7f1fa1
MD5 c415ca5b125698b96f441e5ae6690535
BLAKE2b-256 44b860795d85c9b7b8a579b025f4f16af9da432edc74c455ce636c921685f654

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.243-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 a206cb9017029bacad20f707552d44f29118afb5127e9f7868f00aa402d169e8
MD5 55c64ad7b241b5fe8ed02b7c71812ab7
BLAKE2b-256 4b320300a83d7844390339bb9f4417d687ac471f49f4728e7862d2c27debd565

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.243-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 46853cbb9e41843d86a8f3a99bd6d583b79793982188d0be962b3d9702281913
MD5 258a3e39b2f9cb42c1130e9f4c1b9daa
BLAKE2b-256 5c4dbcbd6a335436d4bb0a3032b44c38707022569405644dd350619a3fa9f4cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.243-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0a1c1dced18a82e2c0e657b59f3a495068d2738dca6ca23ccbaf61d485c827fa
MD5 44881a2c3a8ceabd0c826555987e55bc
BLAKE2b-256 ca145fa0af555074cb94e11f5d7c53dd43e304eb7021bcaae3b56e89ace71169

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.243-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 246af7f6669d5ddb889f985553c7dfa75527ce2c4902bb19ab7a9ab08f8b5a38
MD5 c6d9840a7466e11364846dfc66155aac
BLAKE2b-256 43777d8e353ac6c4353bcec2b70e47eddf8d928e7e7384f9077a7e49b4606b3e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.243-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 beefe04a3e921f7e8698147853d01e8a0c19f1d5cf7aeb3f8cca9cb214db247c
MD5 0a653700f48cca3119ac3afb8385d4a6
BLAKE2b-256 40df369fbcebb9f603a55f810393e5087d84c53d364158197e9aab9119adb784

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.243-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 5e9841fd92c79b9b3fead142447981dc0de869508d64c1fe52ebc2e2c10149a0
MD5 1d7704214bf259e1e221d418813114e5
BLAKE2b-256 9dd631edd18d67bb6f11a13828fc80eddcb42be6dc6a3749abdb032ac78f4438

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.243-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1b876159a73055234bdc1f2a14418f482a2640499151f1732b1ea867cdab7bd0
MD5 875a29347d781d8e0c9dec64aeef0532
BLAKE2b-256 ea9d1731dbe54e1a163da51481ef6c26bc09fe6fcebe02220b9e319841cb18af

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.243-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6e5a18931303e4352341476a6fe715e3f31b4d2fe2f246a823485ad29c21649a
MD5 d679db60401822258ae51225746f4d57
BLAKE2b-256 8d12e407195f1f990fd4f44226e2463ac2469da9504ed57ae8216dc2b8cf7325

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.243-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 58e96680abb5ac202287724aba5b160ca653f0bd140b75f7c0bd89a4569151a4
MD5 9073bea1382366bf08879f9e2645c92e
BLAKE2b-256 b4db7b1d4646248c97c968d0264d763c8ec484ff72320b442709232c13e654a3

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