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 with animated data flow
- 24 AWS services with dedicated icons, colors, and role badges
- Edges represent real relationships — API integrations, event triggers, IAM policy inference, env var references
- Sequential left-to-right flow layout with START/END badges showing where data enters and exits
- Click any node to inspect its attributes, incoming/outgoing edges, and resource-specific tooltip
- Search, filter by service, highlight upstream/downstream blast radius, find shortest path
- Permission errors surfaced clearly — see exactly which IAM policies are missing
Supported services
| Service | Scanner |
|---|---|
| API Gateway | Dedicated — REST + HTTP APIs, multi-service integrations, Cognito authorizers |
| Lambda | Dedicated — functions, event source mappings, env var references, IAM policy inference |
| SQS | Dedicated — queues, attributes, dead letter queue edges |
| SNS | Dedicated — topics and subscriptions |
| EventBridge | Dedicated — rules and targets |
| DynamoDB | Dedicated — tables, streams, global table replicas |
| EC2 | Dedicated — instances, VPC, subnet, security group, instance profile edges |
| ECS | Dedicated — clusters, services, task definitions, load balancer edges |
| S3 | Dedicated — buckets and Lambda notification edges |
| RDS | Dedicated — DB instances and clusters |
| Step Functions | Dedicated |
| Kinesis | Dedicated |
| IAM | Dedicated — roles with full policy resolution |
| Cognito | Dedicated — user pools |
| CloudFront | Dedicated — distributions, S3/API GW/ELB origins, Lambda@Edge |
| Route 53 | Dedicated — hosted zones, record sets, alias target edges |
| ElastiCache | Dedicated — cache clusters |
| Redshift | Dedicated — clusters |
| Glue | Dedicated — jobs, crawlers, triggers |
| AppSync | Dedicated — GraphQL APIs |
| Secrets Manager | Dedicated |
| KMS | Dedicated |
| ELB | Discovered via CloudFront, Route 53, ECS edges |
| 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 buildcompletes 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
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 Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cloudwire-0.2.1.tar.gz.
File metadata
- Download URL: cloudwire-0.2.1.tar.gz
- Upload date:
- Size: 126.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6442b9aa4864d298f402a9d565af97fb91d0e9a3055fd12a062863eaabefc01f
|
|
| MD5 |
ecac6e9902ffce9537db394922dff6bc
|
|
| BLAKE2b-256 |
097125017a10186a9e61df9a9b0077aebe2aef3658c706b87f0a82eb251be51c
|
File details
Details for the file cloudwire-0.2.1-py3-none-any.whl.
File metadata
- Download URL: cloudwire-0.2.1-py3-none-any.whl
- Upload date:
- Size: 127.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
396ad00f0c5b8231724a2353b13040c51a8faefb6d3a3f01e1eda5c8bfaaec83
|
|
| MD5 |
560dd6edc6482d654ba20331970728dd
|
|
| BLAKE2b-256 |
b3c20612d9cece3369933deb83799b472106a439def1f3355a516b00bf79a322
|