Skip to main content

Scan and visualize your AWS infrastructure as an interactive graph

Project description

cloudwire

Scan your AWS account and visualize resource dependencies as an interactive graph — directly in your browser, running entirely on your local machine.

No data leaves your system. AWS credentials never leave your terminal. The graph is built locally using your existing credential chain (~/.aws/credentials, aws sso login, saml2aws, aws-vault — all work out of the box).


Install

pip install cloudwire
cloudwire

That's it. The browser opens automatically at http://localhost:8080.

Requirements: Python 3.9+ and valid AWS credentials configured locally.


What it looks like

  • Dark hacker-aesthetic graph canvas
  • Nodes represent AWS resources — Lambda functions, SQS queues, API Gateways, RDS instances, S3 buckets, and more
  • Edges represent relationships and data flow between resources
  • Click any node to inspect its attributes and connected resources
  • Search, filter by service, highlight upstream/downstream blast radius

Supported services

Service Scanner
API Gateway Dedicated
Lambda Dedicated (with state)
SQS Dedicated
SNS Dedicated
EventBridge Dedicated
DynamoDB Dedicated (with state)
EC2 Dedicated (with state)
ECS Dedicated
S3 Dedicated
RDS Dedicated (with state)
Step Functions Dedicated
Kinesis Dedicated
IAM Dedicated
Cognito Dedicated
CloudFront Dedicated (with state)
ElastiCache Dedicated (with state)
Glue Dedicated
AppSync Dedicated
Everything else Generic (tagged resources only)

Project structure

cloudwire/                        # Python package (the distributable unit)
├── __init__.py                 # Package version
├── cli.py                      # `cloudwire` CLI entry point (click)
├── static/                     # Built React app (populated by `make build`)
│   ├── index.html
│   └── assets/
└── app/                        # FastAPI backend
    ├── main.py                 # App factory, API routes (/api/*), static serving
    ├── models.py               # Pydantic request/response models
    ├── scanner.py              # boto3 AWS scanner — one function per service
    ├── scan_jobs.py            # Async job store with progress tracking
    └── graph_store.py          # networkx graph with thread-safe mutations

frontend/                       # React + Vite source (compiled into cloudwire/static/)
├── src/
│   ├── pages/CloudWirePage.jsx # Main page — orchestrates all state
│   ├── components/
│   │   ├── graph/              # GraphCanvas, GraphNode, GraphEdge, Minimap, Legend
│   │   └── layout/             # TopBar, ServiceSidebar, InspectorPanel
│   ├── hooks/
│   │   ├── useScanPolling.js   # Scan lifecycle, polling, graph data state
│   │   └── useGraphViewport.js # Pan/zoom viewport state
│   ├── lib/
│   │   ├── graphTransforms.js  # Layout algorithms (circular, flow, swimlane)
│   │   ├── serviceVisuals.jsx  # Service icon + color map
│   │   └── awsRegions.js       # AWS region list
│   └── styles/graph.css        # All UI styles
├── vite.config.js              # base: "./", outDir: ../cloudwire/static, dev proxy
└── package.json

.github/workflows/publish.yml   # CI: build + publish to PyPI on version tag push
pyproject.toml                  # Package metadata, dependencies, entry point
Makefile                        # make build / make dev / make clean
.python-version                 # Pins Python 3.11 for consistent builds

Contributing

Prerequisites

  • Python 3.9+ (3.11 recommended)
  • Node.js 18+
  • AWS credentials configured (any method)

Set up the dev environment

git clone https://github.com/hisingh_gwre/cloudwire
cd cloudwire

# Python
python3 -m venv .venv
source .venv/bin/activate
pip install -e .

# Frontend
cd frontend && npm install

Run in development mode

make dev

This starts the FastAPI backend on :8000 (with --reload) and the Vite dev server on :5173 concurrently. The Vite dev server proxies all /api/* requests to the backend — no CORS config needed.

Making changes

Area Where to edit
Add a new AWS service scanner cloudwire/app/scanner.py → add a _scan_<service> method and register it in self.service_scanners
Change graph layout frontend/src/lib/graphTransforms.js
Add a new UI component frontend/src/components/
Change API routes cloudwire/app/main.py — all routes are under the /api prefix
Change CLI options cloudwire/cli.py

Before opening a PR

  • Run a scan against a real (or mocked) AWS account and confirm the graph renders
  • Make sure make build completes without errors
  • Keep PRs focused — one feature or fix per PR

Code style

  • Python: standard library imports first, then third-party, then local. No formatter enforced yet.
  • JavaScript: no linter enforced yet. Match the style of the surrounding file.

Links

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

cloudwire-0.1.0.tar.gz (96.8 kB view details)

Uploaded Source

Built Distribution

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

cloudwire-0.1.0-py3-none-any.whl (97.3 kB view details)

Uploaded Python 3

File details

Details for the file cloudwire-0.1.0.tar.gz.

File metadata

  • Download URL: cloudwire-0.1.0.tar.gz
  • Upload date:
  • Size: 96.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for cloudwire-0.1.0.tar.gz
Algorithm Hash digest
SHA256 a8cde10b9776b5630c3aea4f154019160aa98c6293dc79d518248fbc990a0f15
MD5 d235bb8f270c200d393aeee801365f8b
BLAKE2b-256 7996e3224d7db143c64b6273dd9b89620b1c88ef04d7416822ddcbcf9366c7c2

See more details on using hashes here.

File details

Details for the file cloudwire-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: cloudwire-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 97.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for cloudwire-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 51a68d125a4f50b58e9d01c58736450cee2c0b19d05a898db0be57b03ba51ee8
MD5 8a5f5572d9ff0317290566055b5d6d69
BLAKE2b-256 b3da1af8c8c73d3117a4652cd9cc7bacb579b2f5aa6e6f1d72e9777127880755

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