Skip to main content

Cross-platform CLI tool for one-click dev environment setup.

Project description

isetup

Last synced with code: 2026-04-23 · 62 tools · 8 profiles · Go 1.22+ · also on PyPI

中文文档

Cross-platform CLI tool that detects your OS, hardware, and architecture, then adaptively runs the right install commands to one-click deploy your dev environment.

CLI-only tools. isetup is designed for command-line engineers. The default template includes only terminal-based tools — no GUI applications.

New machine? isetup install. Done.

Features

  • Auto-detection — OS, architecture, distro, GPU, available package managers, shell
  • Multi-platform — macOS, Linux (Ubuntu/Fedora/Arch), Windows, WSL
  • Profile-based config — group tools by use case (00-base, 01-lang-runtimes, 02-git-tools, 03-python-dev, 04-ai-tools, 05-shell-enhancements, 06-system-tools, 07-gpu)
  • Adaptive install — automatically picks brew, apt, choco, winget, dnf, pacman, or custom shell scripts based on what's available
  • Root / Docker aware — auto-detects UID 0 and omits sudo so installs work inside containers without sudo installed
  • Template variables{{.Arch}}, {{.OS}}, {{.Home}} in shell commands for arch-aware downloads
  • Dependency orderingdepends_on ensures tools install in the right order
  • Conditional profileswhen: has_gpu skips GPU tools on machines without a GPU
  • Skip installed — auto-detects tools already in PATH, skips them (use -f to force reinstall)
  • Rich diagnostics — full command output, environment snapshot, and timing in ~/.isetup/logs/
  • Real-time progress[N/Total] counter with system info header, no silent waiting
  • Interactive picker — arrow keys + Space to select specific tools (auto-opens on isetup install in a TTY, or force with -i)
  • Dry-run mode — preview all commands without executing

Install

Via pip (cross-platform, no Go toolchain required):

pip install isetup

The wheel bundles a matching pre-built binary; pip picks the right one for your OS/arch. Works inside a virtualenv or pipx.

Easiest (if Go is installed):

go install github.com/host452b/isetup@latest

One-liner (Linux / macOS):

curl -fsSL https://raw.githubusercontent.com/host452b/isetup/main/install.sh | bash

Custom install directory:

INSTALL_DIR=~/.local/bin curl -fsSL https://raw.githubusercontent.com/host452b/isetup/main/install.sh | bash

Windows (PowerShell):

$version = (Invoke-RestMethod "https://api.github.com/repos/host452b/isetup/releases/latest").tag_name.TrimStart('v')
$url = "https://github.com/host452b/isetup/releases/download/v$version/isetup_${version}_windows_amd64.zip"
Invoke-WebRequest $url -OutFile isetup.zip
Expand-Archive isetup.zip -DestinationPath .
Move-Item -Force isetup.exe "$env:USERPROFILE\AppData\Local\Microsoft\WindowsApps\"
Remove-Item isetup.zip

From source:

git clone https://github.com/host452b/isetup.git && cd isetup && go build -o isetup .

Verify:

isetup version

Quick Start

# Generate default config (optional — isetup works without it)
isetup init

# Edit your config
vim ~/.isetup.yaml

# Preview what will be installed
isetup install --dry-run

# Install (interactive picker in a TTY, install-all otherwise)
isetup install

# Force the interactive picker even with other flags
isetup install -i

# Install specific profiles only (non-interactive)
isetup install -p 00-base,04-ai-tools

Interactive Mode

Run isetup install -i (or just isetup install in a TTY with no other flags) to pick tools with arrow keys.

isetup install · interactive mode                    linux/amd64 · apt,pip,npm

[x] ▼ 00-base                                           14/14 selected
      [x] curl                  apt
      [x] git                   apt
      [ ] neovim                apt
[x] ▶ 01-lang-runtimes                                   7/ 7 selected
[ ] ▶ 04-ai-tools                                        0/ 7 selected
[·] ✗ 07-gpu                    no GPU detected          0/ 2 (disabled)

─────────────────────────────────────────────────────────────────────────────
↑/↓ move · Space toggle · →/← expand/collapse · Enter confirm · q quit · ? help

Keys:

Key Action
/ / k / j Move cursor
/ l Expand profile
/ h Collapse profile; from a tool row, jump to parent profile
Space Toggle selection (on a profile: all selectable children at once)
Enter Go to confirmation page
Y / Enter on confirm Start install
E on confirm Return to picker, preserving selection
q / Esc / Ctrl+C Exit without installing
? Toggle help overlay

Defaults on open:

  • Profiles whose when: condition is satisfied on the current system → selected, collapsed.
  • Profiles whose when: is unmet (e.g., has_gpu on a laptop) → disabled (cannot be toggled).
  • Tools with no install method on the current system → unchecked, shown with ⚠ no method.

Dependencies are resolved at confirm time: selecting claude-code automatically pulls in node-lts, nvm, and curl — they appear on the confirm page under "Required dependencies".

The interactive flow opts out when stdin isn't a TTY (CI, curl | bash) or when any install flag is passed (-p, -f, --dry-run). To force interactive inside a TTY even with those flags, pass -i explicitly.

Default Tools

The built-in template installs 62 tools across 8 profiles:

lang-runtimes — Language Runtimes & Version Managers

Tool Description
nvm Node.js version manager — switch between Node versions per project
node-lts Node.js LTS release, installed via nvm
typescript TypeScript compiler (tsc)
golang Go programming language
rust Rust toolchain via rustup (rustc, cargo, rustfmt)
miniconda Conda package/env manager — auto_activate_base disabled, use conda activate manually
mise Polyglot runtime manager (asdf replacement, manages Node/Python/Go/etc. versions)

base — Core CLI Essentials

Editor & Terminal

Tool Description
git Distributed version control
neovim Modern terminal editor (Vim fork)
tmux Terminal multiplexer — split panes, detach sessions
tmux-ide Scripted tmux session layouts (npm)

Search & Navigation

Tool Description
fzf Fuzzy finder — interactive filter for files, history, branches
ripgrep Recursive grep replacement (rg), extremely fast
fd Simpler, faster find alternative with sane defaults
tree Visualize directory structure as a tree

Modern CLI Replacements (Rust-powered)

Tool Description
bat cat replacement with syntax highlighting and Git integration
eza ls replacement with icons, colors, and Git status

Data Processing

Tool Description
glow Terminal Markdown reader — TUI browser, remote file rendering
jq Command-line JSON processor — parse API responses, transform configs
yq YAML/TOML/XML processor — edit CI configs, K8s manifests

System Utilities

Tool Description
htop Interactive process viewer and system monitor
btop Resource monitor with rich TUI (CPU, memory, disk, network)
make Build automation — many repos ship a Makefile by default
curl URL data transfer (HTTP client, API testing)
wget File downloader with resume support
zip Compression utility
unzip Decompression utility
fonts-firacode Fira Code programming font with ligatures

git-tools — Git & CI/CD

Tool Description
gh GitHub CLI — PRs, issues, actions, repos from terminal
glab GitLab CLI — MRs, pipelines, issues from terminal
lazygit Terminal UI for git — staging, branching, rebasing visually
delta Git diff pager with syntax highlighting and side-by-side view
gitlab-runner GitLab CI runner — run CI jobs locally, manage runners

python-dev — Python Ecosystem

Tool Description
uv Ultra-fast Python package installer (pip replacement)
pip-tools httpie (HTTP client), black (formatter), ruff (linter)
pip-build-tools build, twine, hatchling — Python package publishing
huggingface-hub Hugging Face CLI — download/upload models and datasets
pr-analyzers gitlab-pr-analyzer, github-pr-analyzer, jira-lens
playwright Browser automation for testing (Chromium/Firefox/WebKit)
pgcli PostgreSQL CLI with auto-completion and syntax highlighting
ai-ml-libs chromadb (vector DB), pgvector, langsmith, langfuse (LLM observability)
casts-down Podcast download + Whisper transcription CLI

ai-tools — AI & LLM

Tool Description
claude-code Anthropic Claude Code — AI coding assistant in terminal
codex-cli OpenAI Codex CLI — AI code generation
cursor Cursor AI editor (CLI installer)
yoyo PTY proxy for AI agent auto-approve workflows
arxs Multi-source academic paper search CLI (go install preferred, shell fallback)
ollama Run LLMs locally (Llama, Mistral, etc.)
llama-cpp High-performance C++ LLM inference (llama-cli, llama-server)

gpu — NVIDIA GPU (conditional: when: has_gpu)

Tool Description
cuda-toolkit NVIDIA CUDA compiler and libraries
nvidia-driver NVIDIA driver v550

shell-enhancements — Shell Productivity

Tool Description
zoxide Smarter cd — learns your most-used directories
starship Cross-shell prompt with git status, language versions, minimal config
direnv Auto-load .envrc per directory — manage env vars per project

system-tools — Debugging & Networking

Tool Description
lsof List open files and ports — find what's using port 8080
netcat TCP/UDP Swiss Army knife — test connections, port scanning
tcpdump Network packet capture and analysis
dnsutils DNS lookup tools: dig, nslookup
strace Trace system calls — debug process behavior (Linux only)
sqlite3 SQLite database CLI — lightweight DB queries and debugging
net-tools Classic network commands: ifconfig, netstat, route
speedtest-cli Network speed test from the terminal (speedtest-cli --simple)

Commands

isetup init                      Generate default ~/.isetup.yaml
isetup init --force              Overwrite existing config
isetup detect                    Print detected system info as JSON
isetup install                   Interactive picker in a TTY, install-all otherwise
isetup install -i                Force the interactive picker (arrow keys, Space, Enter)
isetup install -p 00-base,04-ai-tools  Install specific profiles (non-interactive)
isetup install -f                Reinstall even if already installed
isetup install --dry-run         Preview commands without executing
isetup install --timeout 5m      Set per-tool timeout (default 10m)
isetup list                      List all profiles and tools
isetup version                   Print version

Configuration

Config lives at ~/.isetup.yaml (override with --config).

version: 1

settings:
  log_level: info
  dry_run: false

profiles:
  00-base:
    tools:
      - name: curl
        apt: curl
        brew: curl

      - name: git
        apt: git
        dnf: git
        pacman: git
        brew: git
        choco: git

  01-lang-runtimes:
    tools:
      - name: nvm
        depends_on: curl
        shell:
          unix: "curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash"

      - name: node-lts
        depends_on: nvm
        shell:
          unix: "source ~/.nvm/nvm.sh && nvm install --lts"

      - name: golang
        brew: go
        depends_on: curl
        shell:
          linux: |
            GO_VERSION=$(curl -fsSL "https://go.dev/VERSION?m=text" | head -1)
            TMPFILE=$(mktemp /tmp/go-XXXXXX.tar.gz)
            curl -fsSL "https://go.dev/dl/${GO_VERSION}.linux-{{.Arch}}.tar.gz" -o "$TMPFILE"
            sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf "$TMPFILE"
            rm -f "$TMPFILE"

  04-ai-tools:
    tools:
      - name: claude-code
        depends_on: node-lts
        shell:
          unix: "curl -fsSL https://claude.ai/install.sh | bash"

      - name: arxs
        depends_on: golang
        shell:
          unix: |
            if command -v go >/dev/null 2>&1; then
              go install github.com/host452b/arxs/v2@latest
            else
              curl -fsSL https://raw.githubusercontent.com/host452b/arxs/main/install.sh | sh
            fi

  07-gpu:
    when: has_gpu
    tools:
      - name: cuda-toolkit
        apt: nvidia-cuda-toolkit

See template/default.yaml for the full 61-tool configuration.

Install Methods

Each tool can declare multiple install methods. isetup picks the best one for the current system:

Key Expands to Platform
apt: X sudo apt install -y X (fallback: apt-get) Linux (Debian/Ubuntu) — sudo omitted when root
dnf: X sudo dnf install -y X Linux (Fedora/RHEL) — sudo omitted when root
pacman: X sudo pacman -S --noconfirm X Linux (Arch) — sudo omitted when root
brew: X brew install X macOS
choco: X choco install X -y Windows (priority)
winget: X winget install --id X -e --accept-source-agreements Windows (fallback)
pip: [X, Y] pip3 install X Y Any (conda pip preferred)
npm: X npm install -g X Any (requires Node.js)
shell: Custom commands per OS Any

Shell Priority

shell.linux / shell.darwin / shell.windows  (exact OS match)
  → shell.unix                               (linux + darwin fallback)
    → shell (string shorthand)               (unix only)

Template Variables

Shell commands support Go template interpolation:

Variable Example value
{{.Arch}} x86_64, aarch64, arm64
{{.OS}} linux, darwin, windows
{{.Distro}} Ubuntu 22.04.3 LTS
{{.Home}} /home/user

Conditions

Condition Meaning
when: has_gpu Skip profile if no GPU detected

Logging

Logs are written to ~/.isetup/logs/ (override with --log-dir).

Each run produces two files:

  • isetup-<timestamp>.env.json — environment snapshot (OS, arch, GPU, pkg managers — no sensitive env vars)
  • isetup-<timestamp>.log — per-tool install record with command, stdout, stderr, exit code, duration

Example terminal output:

Detecting system...
OS: linux | Arch: amd64 | Shell: /bin/bash
Package managers: apt, pip3, npm
GPU: NVIDIA H200 NVL

[1/61] Installing nvm (shell: curl -o- https://nvm.sh/install.sh | bash)...
[1/61] nvm                  PASS    (shell ) 0.7s
[2/61] Installing node-lts (shell: source ~/.nvm/nvm.sh && nvm install --lts)...
[2/61] node-lts             PASS    (shell ) 0.5s
[3/61] git                  SKIP    already installed
[4/61] Installing glab (shell: curl ... | sudo bash)...
[4/61] glab                 PASS    (shell ) 2.1s
[5/61] cuda-toolkit         FAILED  (apt   ) 1.1s
       E: Unable to locate package nvidia-cuda-toolkit

─────────────────────────────
Installed: 50 | Failed: 1 | Skipped: 6
Log: ~/.isetup/logs/isetup-2026-03-25T00-04-21.log

Output is color-coded: green for PASS, red for FAILED, yellow for SKIP. First line of stderr is shown inline for failed tools.

System Detection

isetup detect outputs full system info as JSON:

{
  "os": "darwin",
  "arch": "arm64",
  "arch_label": "arm64",
  "distro": "macOS 15.3.2",
  "kernel": "24.3.0",
  "wsl": false,
  "is_root": false,
  "shell": "/bin/zsh",
  "gpu": {
    "detected": true,
    "model": "Apple M3 Pro"
  },
  "pkg_managers": ["brew", "pip3", "npm"]
}

Project Structure

isetup/
├── main.go                  # Entry point
├── embed.go                 # Embeds default template
├── cmd/                     # CLI commands (cobra)
├── internal/
│   ├── config/              # YAML parsing + validation
│   ├── detector/            # OS/GPU/shell/pkg manager detection
│   ├── executor/            # Install engine (bootstrap, resolver, runner, topo sort)
│   └── logger/              # Structured logging
└── template/
    └── default.yaml         # Default config template

Install Flow

What happens when you run curl -fsSL ... | bash or isetup install:

┌─────────────────────────────────────────────────────────────┐
│  curl -fsSL .../install.sh | bash                            │
│  → downloads isetup binary                                   │
│  → prints getting-started hints (does NOT auto-run install) │
└───────────────────────────┬─────────────────────────────────┘
                            │  user runs:  isetup install  (or -i)
                            ▼
┌─────────────────────────────────────────────────────────────┐
│  1. DETECT SYSTEM                                            │
│     OS, arch, distro, GPU, shell, package managers          │
│     → SystemInfo struct                                      │
└───────────────────────────┬─────────────────────────────────┘
                            │
                            ▼
┌─────────────────────────────────────────────────────────────┐
│  2. LOAD CONFIG                                              │
│     ~/.isetup.yaml → parse YAML → validate                  │
│     (if no config: use embedded default.yaml)               │
└───────────────────────────┬─────────────────────────────────┘
                            │
                            ▼
┌─────────────────────────────────────────────────────────────┐
│  3. BOOTSTRAP (minimal containers only)                      │
│     Missing curl/wget/ca-certificates/gnupg?                │
│     → apt update && apt install -y ...                       │
│     → fallback: apt-get if apt fails                        │
└───────────────────────────┬─────────────────────────────────┘
                            │
                            ▼
┌─────────────────────────────────────────────────────────────┐
│  4. COLLECT & SORT TOOLS                                     │
│     Profiles sorted alphabetically (00-base → 07-gpu)       │
│     Topological sort by depends_on                          │
│     → ordered tool list                                      │
└───────────────────────────┬─────────────────────────────────┘
                            │
                            ▼
┌─────────────────────────────────────────────────────────────┐
│  5. FOR EACH TOOL:                                           │
│                                                              │
│     ┌── already in PATH?  → SKIP                            │
│     ├── depends_on failed? → SKIP                           │
│     ├── when: condition not met? → SKIP                     │
│     └── resolve install method:                             │
│         shell.linux > apt > dnf > pacman > pip > npm        │
│                                                              │
│     Execute command (timeout: 10m default)                   │
│     If apt fails → retry with apt-get                       │
│     If root → strip sudo from commands                      │
│                                                              │
│     Log: stdout, stderr, exit code, duration                │
│     Report: PASS / FAIL / SKIP                              │
│                                                              │
│     On FAIL:                                                 │
│       • Print first 3 lines of stderr                       │
│       • Print retry command (copy-pasteable)                │
└───────────────────────────┬─────────────────────────────────┘
                            │
                            ▼
┌─────────────────────────────────────────────────────────────┐
│  6. SUMMARY                                                  │
│     Installed: N | Failed: N | Skipped: N                   │
│     Log: ~/.isetup/logs/isetup-<timestamp>.log              │
│                                                              │
│     If failures:                                             │
│       • List all failed tools with retry commands           │
│       • "Tip: paste to AI assistant for diagnosis"          │
└─────────────────────────────────────────────────────────────┘

Install Method Resolution (per tool)

Has shell.linux / shell.darwin / shell.windows?
  → YES: use it (highest priority — exact OS match)
  → NO: check shell.unix fallback
         → YES: use it (linux + darwin)
         → NO: try package managers:
                apt → apt-get (fallback) → dnf → pacman → brew → choco → winget
                → pip (conda pip > pip3 > pip)
                → npm
                → no method found: SKIP

Troubleshooting

Tool install hangs: Use --timeout 2m to set a shorter per-tool timeout. Check ~/.isetup/logs/ for the full command output.

Minimal container (no curl/wget): isetup auto-detects missing prerequisites (curl, wget, ca-certificates, gnupg) and installs them via apt/apt-get before running any profiles. Works out-of-the-box in bare ubuntu:22.04 Docker containers.

Permission denied: isetup auto-detects root and omits sudo. If you're not root and sudo fails, ensure your user has sudo privileges.

Profile not found: Check available profiles with isetup list. Profile names are case-sensitive.

Already installed tools: isetup skips tools found in PATH. Use -f to force reinstall.

Custom config location: Use --config /path/to/config.yaml to point to a non-default config file.

Exit Codes

Code Meaning
0 All tools installed or skipped successfully
1 One or more tools failed to install
2 Configuration error (invalid YAML, validation failure)

Build

go build -o isetup .

Requires Go 1.22+.

Documentation

Document Description
README.md This file — features, install, usage, flow diagram
README_zh.md Chinese documentation
CHANGELOG.md Version history with all changes
CONTRIBUTING.md How to add tools and submit PRs
SECURITY.md Security policy and vulnerability reporting
CLAUDE.md Project rules for AI agents (coding conventions)
template/default.yaml Full 62-tool configuration (the source of truth)

License

MIT

Project details


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.

isetup-1.2.2-py3-none-win_arm64.whl (1.7 MB view details)

Uploaded Python 3Windows ARM64

isetup-1.2.2-py3-none-win_amd64.whl (1.9 MB view details)

Uploaded Python 3Windows x86-64

isetup-1.2.2-py3-none-manylinux_2_17_x86_64.whl (1.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

isetup-1.2.2-py3-none-manylinux_2_17_aarch64.whl (1.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

isetup-1.2.2-py3-none-macosx_11_0_x86_64.whl (1.8 MB view details)

Uploaded Python 3macOS 11.0+ x86-64

isetup-1.2.2-py3-none-macosx_11_0_arm64.whl (1.7 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

Details for the file isetup-1.2.2-py3-none-win_arm64.whl.

File metadata

  • Download URL: isetup-1.2.2-py3-none-win_arm64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for isetup-1.2.2-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 43dafa5b87f0636a1d215d1027c0b9adb920183c9eacb84269123b24231fa935
MD5 fd86d6b48460b59ac8223970c542d442
BLAKE2b-256 fff886cd1d68f132efb3f61bb3bfadff682a0fcb5f5c1e8f07a7b8082728d926

See more details on using hashes here.

File details

Details for the file isetup-1.2.2-py3-none-win_amd64.whl.

File metadata

  • Download URL: isetup-1.2.2-py3-none-win_amd64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for isetup-1.2.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 87cf096d87ffdbbb37c7e5e4dfaa1f9302271efadda4c4c7e492a45e19db86c5
MD5 057e8642ee97c7e82a2d1bdae27c2431
BLAKE2b-256 f3385d781e2d116a1a67c6e624c9ba2663e3380727d6631a42bcb766075ebbf3

See more details on using hashes here.

File details

Details for the file isetup-1.2.2-py3-none-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for isetup-1.2.2-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 dc6eceed75716ae136bb0acd1a797d62c8d0203fea0915bcfdbc35ccc326034d
MD5 67eaa151ad314bd9869e4c43225678b4
BLAKE2b-256 237fc70789c5d402b96fcac6b0a2b3bdb0dc8c6e837ae0c1c0c2c51079994855

See more details on using hashes here.

File details

Details for the file isetup-1.2.2-py3-none-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for isetup-1.2.2-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 e728540f05b7e3d6f0231901322bd5c7d8a379d0501125b7ec1d752111d0ac23
MD5 2d86393387036827e82d0a163c0e7407
BLAKE2b-256 d535c76b107a456320779fa0abff331b375bcba625827c43a623074015ec7a18

See more details on using hashes here.

File details

Details for the file isetup-1.2.2-py3-none-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for isetup-1.2.2-py3-none-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 68a606f7499bee4be83b52e4ebc7103b5e2b6acf2c0d38bff005087fb56c680b
MD5 b25ed7feaf1dedaf50d4400999709e51
BLAKE2b-256 7f4f13c060526f2ea93bd857b278d1b9980cebdbb72ea5ddac51aa7fdeddb108

See more details on using hashes here.

File details

Details for the file isetup-1.2.2-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for isetup-1.2.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 86abb5d62684777918a1016efac2b08a60f12c78b6d2896504ad9d5bff5a5103
MD5 09122b003826a78b3fed0b313bc6f73e
BLAKE2b-256 0232a517511f367163eb6e27efca1b7b7d47736220eeced7d33ff644e0fbe554

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