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

# 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 closed-source and maintained in a private repository. If you are interested in self-hosting the full cloud stack, please get in touch.

License

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

Uploaded CPython 3.14Windows x86-64

plutus_ai-0.3.201-cp314-cp314-manylinux_2_28_x86_64.whl (7.8 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

plutus_ai-0.3.201-cp314-cp314-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

plutus_ai-0.3.201-cp314-cp314-macosx_10_15_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

plutus_ai-0.3.201-cp313-cp313-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.13Windows x86-64

plutus_ai-0.3.201-cp313-cp313-manylinux_2_28_x86_64.whl (7.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

plutus_ai-0.3.201-cp313-cp313-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

plutus_ai-0.3.201-cp313-cp313-macosx_10_13_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

plutus_ai-0.3.201-cp312-cp312-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.12Windows x86-64

plutus_ai-0.3.201-cp312-cp312-manylinux_2_28_x86_64.whl (7.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

plutus_ai-0.3.201-cp312-cp312-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

plutus_ai-0.3.201-cp312-cp312-macosx_10_13_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

plutus_ai-0.3.201-cp311-cp311-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.11Windows x86-64

plutus_ai-0.3.201-cp311-cp311-manylinux_2_28_x86_64.whl (7.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

plutus_ai-0.3.201-cp311-cp311-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

plutus_ai-0.3.201-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.201-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for plutus_ai-0.3.201-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 fb4a1ba82b13595ef519b256453ca8d6914e00464059905dcafe947c015536c4
MD5 e391c84723b0d0ef9d0ac99cf1c14348
BLAKE2b-256 fe07ae1db58642638e9211a6d6e0a5ef7a87340c9b9ab81dbdee571a1092e30b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.201-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 81d16bf6bb15a6cff5af2e044639ec4fc4cefd78b6ad94f4f5db6a9406696ac8
MD5 d7a32fc089c37d240ab550e6a68873ed
BLAKE2b-256 a980d14aaab2d7799203a37ec1df747830bfcc5d084ecfa3189185706fa233c1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.201-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f2186d80b65dbf848b4a907182a0d73f3ba4674330469f4d3d14c3b376dfad58
MD5 36a14ca668e7509a746571dabc53e6a1
BLAKE2b-256 c5fb0fb3aa17995ce30f9e5b728059fcf811663c1d3c4f238207aa894e5426b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.201-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 5ef6b5f71d31ae57899e84814b8bcc71b71f68df04ac195e80d773030f8e8e45
MD5 f8854c15e8011535e41bdd988a8cdbc5
BLAKE2b-256 f5e89a44d49ba7eb68297bcff02610a8534553158645b07aceafea1a681c9318

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.201-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 1ee2c305d5f058dd9bc729085f59a467773780b736430b3367a030abaaa27d56
MD5 2614bf65a74253603fb1c29a309f9aff
BLAKE2b-256 f2881a4c602f9820ab37673a86ac5f9e3df90d0850c0f629cc70bbe1da1f4fd3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.201-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 532d8bf59da1e90076dea9eebaac51014fa8f1e23fe57641e114cc981aad0aec
MD5 f1787c71e2d28ad5b5bd2f06b248cea1
BLAKE2b-256 5c440cf68f24b2b3503d1705d770576cac9bcfe7b2a6ada23f6ebb8c20df2234

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.201-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 52c9f9a0a1ef7bb8dfb44a1f0231bae65359fd67a6fd7d9ad81de1ebc90cf557
MD5 e3d4413ecec108450e27a686dddd067b
BLAKE2b-256 26dfacc9daf0060923adbac1d88e062b1144ba2ef19ace0e68cbd2f743440946

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.201-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 ae4bffb3ff907c828db7973f6e4907ef275fddee7bf42a12d4fbcf8e73fb8657
MD5 393bfd02e6311ec64b12e92da07cf3b3
BLAKE2b-256 c4f246056eb03bb295fa5b3b7f7509a12996450c1dedbb97ed39b4e95f723981

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.201-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 cfd72c5322a97a45fbd972bbab0786684db1872c5e8e725a5cee7cbcdf9d64e6
MD5 edf9f2a61536d2be46ea73859a3fbe83
BLAKE2b-256 716a5428caec61be3d6110e81959a97ef89dd9c3b3db38c38e8bc20a63887fdc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.201-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fc3069de4f04adc0108630c7d91d978b9414142a7719ab41d0b2175edac2e715
MD5 4af459f9261ddc8935987b80b08c9dec
BLAKE2b-256 813ee6e3951f2573076fea0d8f13454615f25c3f85dc15c441f0f86329017144

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.201-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d26e18f932c6998297da8e14f26c3d498bd734068f84fd73b1939a98dc244fa0
MD5 d637e5af9d07479b770a02cad7395b82
BLAKE2b-256 79bf3089730d346d784fb63826793a88c50d43432e0be4e9067c867a0971c030

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.201-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 efba4a46b3f5eec0a366041b464ab80882416a8367364e31c00f30fc32fab16c
MD5 3792e2e4932ac2d175693bc72f7af5fa
BLAKE2b-256 f70c084094203d76194782ef48dc99ce6d0ed06f1c27f6f844db50b098f3c829

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.201-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 4adbacb4b4b7ce07e822617d462e210768ebb92c4f5c87a96575b763ba19add9
MD5 2b3048869d23e5656bbaa945e8858367
BLAKE2b-256 065af26aa7b57922a7e7526f953d7b79cd3e21abb71091fdf0a0b26322955fc0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.201-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8320e79e042a06a7339dee509c7c1719b21241ff1088b147dda4483da28be497
MD5 3d0fa06d8f5eb92721d030fb08296601
BLAKE2b-256 c0724fff80e29f47732c27ffc45a67959aceb19549af3071f0e6afc6b0c1c957

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.201-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ccf8c2ea4aeecdab132a0c4b8d0be915aa78f66d6cc8400282c193eefcaab28f
MD5 ceec8baa75ff9ffe1b956f1e46e7c97b
BLAKE2b-256 baeff5f2c145b983337595973efd871cca04e12755308b936c32a83e1c66f745

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plutus_ai-0.3.201-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 af8c0b9ec3790564f3079afefd37e54b7f7aab3fe6b72df31acb80efb2bbaa75
MD5 f17865370d383d8840a37e081b4c6f41
BLAKE2b-256 859b18ec3bedd6d14b6e6cb86bbd1f4ead445b3c32e67104456277781ca04830

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