Skip to main content

Interactive HTTP/HTTPS debugging proxy with runtime policies and terminal UI.

Project description

proxyscope

proxyscope is an interactive HTTP/HTTPS debugging proxy with a terminal UI.
It supports request/response inspection, response editing, replay, and both static and editor-based policy rules.

Features

  • HTTP forward proxy and HTTPS via CONNECT
  • Optional TLS interception (MITM) with a local CA
  • Runtime control directly in the TUI
  • Request/response log with details, filters, export (json, har), and session persistence
  • Policy type open_editor (manually edit responses)
  • Policy type static_response (serve static responses)

Requirements

  • Python >=3.13
  • Poetry 2.x (for development)

Installation

From the repository (recommended for development):

git clone <repo-url>
cd proxyscope
poetry install

Install from PyPI:

pip install proxyscope

Start

Default start:

poetry run proxyscope --host 127.0.0.1 --port 8080

With a static configuration file:

poetry run proxyscope --config ./runtime-config.json

Without TUI:

poetry run proxyscope --no-ui

Available CLI options:

  • --host <ip-or-hostname>
  • --port <port>
  • --config <path>
  • --mitm on|off
  • --certs-dir <path>
  • --no-ui

Use Proxy With A Client

Example with curl:

curl -x http://127.0.0.1:8080 http://httpbin.org/get
curl -x http://127.0.0.1:8080 https://httpbin.org/get

Screenshots

Overview

Runtime overview

Request Detail

Request detail view

Policies Sidebar

Policies sidebar

Regenerate screenshots:

poetry run python scripts/generate_readme_screenshots.py

Runtime Commands (TUI)

  • help, ?
  • clear
  • sites
  • loglevel <DEBUG|INFO|WARNING|ERROR>
  • filter [show|clear|host|method|status|text] ...
  • find <text>
  • find clear
  • export <json|har> <path>
  • session <save|load> <path>
  • mitm [show|on|off|certs-dir <path>]
  • whitelist [show|add|remove|clear] ...
  • cache [show|on|off|toggle]
  • config [show|save [path]|reload]
  • policy [show|add-editor|add-editor-prefix|remove-editor|clear-editor|add-static|add-static-prefix|set-priority|edit|remove|enable|disable] ...
  • quit, exit, q

Keyboard Shortcuts (TUI)

  • :: Open command prompt
  • Enter: Open request detail, open selected policy in the editor, or submit the command prompt
  • Tab / Shift+Tab: Cycle focus through panes in the current view
  • Shift+1: Open Requests view
  • Shift+2: Open Sites/Policies view
  • Shift+S: Open Sites tab
  • Shift+P: Open Policies tab
  • Shift+B: Close request detail
  • Shift+V: Toggle request detail width between 1/3 and 1/2
  • Shift+M: Create an editor policy from the selected request
  • Shift+R: Edit and resend the selected request
  • Shift+T: Follow the newest request at the top
  • Shift+A / Shift+U: Add/remove selected site to/from whitelist
  • Shift+D / Shift+E: Disable/enable selected policy
  • Shift+I: Open selected policy in external editor
  • Shift+X: Remove selected policy

Static Configuration (runtime-config.json)

The file can be loaded at startup via --config.
If a config_path is attached, many runtime changes are automatically persisted to this file.

Example:

{
  "schema_version": 1,
  "settings": {
    "log_level": "INFO",
    "log_whitelist": ["api.example.com", "service.internal"],
    "cache_invalidation_enabled": true,
    "mitm_enabled": true,
    "mitm_certs_dir": "certs"
  },
  "policy_shortcuts": [
    {
      "name": "health-static",
      "match": "GET https://service.internal/health",
      "priority": 20,
      "respond": {
        "status": 200,
        "headers": {
          "Cache-Control": "no-store"
        },
        "json": {
          "status": "ok",
          "source": "proxyscope"
        }
      }
    },
    {
      "name": "edit-login-response",
      "match": "POST https://api.example.com/v1/login*",
      "priority": 10,
      "action": "open_editor"
    }
  ]
}

policy_shortcuts is intended for demos and replay setups. A trailing * creates a prefix match. Static responses support respond.body or respond.json. When the config is saved, shortcuts are converted to the canonical typed policies format.

Files without schema_version use the previous format and are migrated automatically when next saved.

Start with file:

poetry run proxyscope --config ./runtime-config.json

MITM / Certificates

On startup, proxyscope automatically creates missing CA files under <mitm_certs_dir>/ca.
For HTTPS interception, the root certificate <mitm_certs_dir>/ca/mitm-ca.crt must be trusted by your client/browser.

Tests

poetry run python -m unittest discover -s tests -p "test_*.py" -v

Architecture And Quality Checks

The current architecture, module boundaries, and refactoring roadmap are documented under docs/architecture/.

Run the local quality gates:

poetry check
poetry run ruff format --check proxyscope tests scripts
poetry run ruff check proxyscope tests scripts
poetry run pyright
poetry run coverage run -m unittest discover -s tests -p "test_*.py"
poetry run coverage report
poetry build

License

MIT, see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

proxyscope-0.3.1.tar.gz (64.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

proxyscope-0.3.1-py3-none-any.whl (96.0 kB view details)

Uploaded Python 3

File details

Details for the file proxyscope-0.3.1.tar.gz.

File metadata

  • Download URL: proxyscope-0.3.1.tar.gz
  • Upload date:
  • Size: 64.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.2 CPython/3.13.12 Linux/6.6.87.2-microsoft-standard-WSL2

File hashes

Hashes for proxyscope-0.3.1.tar.gz
Algorithm Hash digest
SHA256 e5565d04589b59c9266a5b3e2ab3515083e0e425e98a0ae31064fc634a7fa8a1
MD5 5689719d60b6e4019fe6bd97b466b258
BLAKE2b-256 812ec61c11adb9dc903d5be6b19bcbe62bc2371df586921bf8c1f3a0c67f2e32

See more details on using hashes here.

File details

Details for the file proxyscope-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: proxyscope-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 96.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.2 CPython/3.13.12 Linux/6.6.87.2-microsoft-standard-WSL2

File hashes

Hashes for proxyscope-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 78771ab630540fb4c1f9336d213feefe570bbcb5546cea10e13d7784a5ac10e5
MD5 14d3d7bc83fcb37cacd1246693af9594
BLAKE2b-256 8c4fa533e0218b12284735c232a2ff9db2a2e40c0a9c1deada0a053a03efacd4

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