{"id":49161142,"url":"https://github.com/davireisvieira/stackport","last_synced_at":"2026-05-09T02:25:33.385Z","repository":{"id":349444172,"uuid":"1202342914","full_name":"DaviReisVieira/stackport","owner":"DaviReisVieira","description":"Open-source universal AWS resource browser for LocalStack, MiniStack, Moto, and real AWS","archived":false,"fork":false,"pushed_at":"2026-04-26T21:23:00.000Z","size":5181,"stargazers_count":26,"open_issues_count":33,"forks_count":6,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-26T22:03:14.774Z","etag":null,"topics":["aws","aws-emulator","developer-tools","devtools","docker","fastapi","localstack","ministack","moto","react","resource-browser","s3-browser"],"latest_commit_sha":null,"homepage":"https://stackport.cloud","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DaviReisVieira.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-05T23:13:31.000Z","updated_at":"2026-04-26T21:22:55.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/DaviReisVieira/stackport","commit_stats":null,"previous_names":["davireisvieira/stackport"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/DaviReisVieira/stackport","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DaviReisVieira%2Fstackport","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DaviReisVieira%2Fstackport/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DaviReisVieira%2Fstackport/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DaviReisVieira%2Fstackport/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DaviReisVieira","download_url":"https://codeload.github.com/DaviReisVieira/stackport/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DaviReisVieira%2Fstackport/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32586188,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws","aws-emulator","developer-tools","devtools","docker","fastapi","localstack","ministack","moto","react","resource-browser","s3-browser"],"created_at":"2026-04-22T13:00:37.926Z","updated_at":"2026-05-03T22:02:46.022Z","avatar_url":"https://github.com/DaviReisVieira.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/DaviReisVieira/stackport/main/docs/images/stackport_logo.svg\" alt=\"StackPort — Universal AWS Resource Browser\" width=\"150\"/\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eStackPort\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\u003cstrong\u003eUniversal AWS resource browser for local emulators and real AWS accounts.\u003c/strong\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003eBrowse, inspect, and manage resources across 35 AWS services with dedicated UIs for S3, DynamoDB, Lambda, SQS, IAM, EC2, CloudWatch Logs, and Secrets Manager.\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/DaviReisVieira/stackport/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://github.com/DaviReisVieira/stackport/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://pypi.org/project/stackport/\"\u003e\u003cimg src=\"https://img.shields.io/pypi/v/stackport\" alt=\"PyPI Version\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://hub.docker.com/r/davireis/stackport\"\u003e\u003cimg src=\"https://img.shields.io/docker/pulls/davireis/stackport\" alt=\"Docker Pulls\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://hub.docker.com/r/davireis/stackport\"\u003e\u003cimg src=\"https://img.shields.io/docker/image-size/davireis/stackport/latest\" alt=\"Docker Image Size\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/DaviReisVieira/stackport/blob/master/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/DaviReisVieira/stackport\" alt=\"License\"\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/python-3.12-slim\" alt=\"Python\"\u003e\n  \u003ca href=\"https://github.com/DaviReisVieira/stackport/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/DaviReisVieira/stackport\" alt=\"GitHub stars\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n## Screenshots\n\n**Dashboard** — Service overview with resource counts and health status\n![StackPort Dashboard](https://raw.githubusercontent.com/DaviReisVieira/stackport/main/docs/images/dashboard.jpeg?v=1.0)\n\n**Lambda Browser** — Function list with config, aliases, versions, event sources, and invocation panel\n![Lambda Resources](https://raw.githubusercontent.com/DaviReisVieira/stackport/main/docs/images/lambda.jpeg?v=1.0)\n\n**S3 Browser** — File browser with upload, download, folder navigation, and tagging\n![S3 Browser](https://raw.githubusercontent.com/DaviReisVieira/stackport/main/docs/images/s3.jpeg?v=1.0)\n\n## Features\n\n- Browse and inspect resources across **35 AWS services**\n- **8 dedicated service UIs** for S3, DynamoDB, Lambda, SQS, IAM, EC2, CloudWatch Logs, and Secrets Manager\n- **Write operations** — upload/delete S3 objects, query DynamoDB, invoke Lambda, send/receive SQS messages\n- **Real AWS support** — connect to real AWS accounts with read-only mode by default\n- **Per-endpoint authentication** — default credentials, AWS profiles (SSO/AssumeRole), or static keys per endpoint\n- **Tag management** — unified tagging across 21 resource types\n- **CLI** — `stackport status`, `list`, `describe`, `export` with JSON/CSV/table output\n- **Real-time dashboard** with WebSocket-powered live updates\n- **Keyboard shortcuts** — 16 shortcuts for fast navigation (press `?` to view)\n- Single Docker image, works with MiniStack, LocalStack, Moto, or any AWS-compatible endpoint\n\n## Quick Start\n\n### With a local emulator (recommended)\n\n```bash\n# Start MiniStack (or LocalStack, Moto, etc.)\npip install ministack \u0026\u0026 ministack\n\n# Start StackPort\npip install stackport\nstackport\n# Open http://localhost:8080\n```\n\n### With real AWS\n\n```bash\n# Using AWS profile (read-only by default)\nAWS_PROFILE=my-profile stackport\n\n# Using explicit credentials\nAWS_ACCESS_KEY_ID=AKIA... AWS_SECRET_ACCESS_KEY=... AWS_REGION=us-west-2 stackport\n\n# Disable write operations (read-only mode)\nSTACKPORT_ALLOW_WRITES=false AWS_PROFILE=my-profile stackport\n```\n\nYou can also configure per-endpoint authentication from the Settings UI — select a profile, enter static credentials, or use the default credential chain per endpoint. See [Per-endpoint authentication](#per-endpoint-authentication) below.\n\nWhen connected to real AWS, StackPort shows a warning banner and operates in read-only mode unless writes are explicitly enabled.\n\n### Docker Compose (MiniStack + StackPort)\n\nThis example uses [MiniStack](https://github.com/Nahuel990/ministack) as the emulator, but you can swap it for LocalStack, Moto, or any AWS-compatible endpoint — just update `AWS_ENDPOINT_URL`.\n\n```bash\ncurl -O https://raw.githubusercontent.com/DaviReisVieira/stackport/main/examples/docker-compose.yml\ndocker compose up -d\n# Open http://localhost:8080\n```\n\n### Docker (standalone)\n\n```bash\ndocker run -p 8080:8080 -e AWS_ENDPOINT_URL=http://host.docker.internal:4566 davireis/stackport\n```\n\n### Other emulators\n\nStackPort works with any AWS-compatible endpoint — just set `AWS_ENDPOINT_URL`:\n\n```bash\n# LocalStack\nAWS_ENDPOINT_URL=http://localhost:4566 stackport\n\n# Moto\nAWS_ENDPOINT_URL=http://localhost:5000 stackport\n\n# MinIO (S3 only)\nAWS_ENDPOINT_URL=http://localhost:9000 stackport\n\n# Any custom endpoint\nAWS_ENDPOINT_URL=http://my-emulator:4566 stackport\n```\n\n### Multiple endpoints\n\nSwitch between multiple AWS endpoints from the UI. Configure named endpoints with `STACKPORT_ENDPOINTS`:\n\n```bash\n# Connect to a local emulator and a real AWS account (empty URL = real AWS)\nSTACKPORT_ENDPOINTS=\"local=http://localhost:4566,nprod=\" \\\n  AWS_PROFILE=nprod AWS_REGION=us-west-1 stackport\n```\n\n**Docker Compose (local + real AWS):**\n\n```bash\ncurl -O https://raw.githubusercontent.com/DaviReisVieira/stackport/main/examples/docker-compose.multi-endpoint.yml\ndocker compose -f docker-compose.multi-endpoint.yml up -d\n# Open http://localhost:8080\n```\n\nSee [`examples/docker-compose.multi-endpoint.yml`](examples/docker-compose.multi-endpoint.yml) for a full example with MiniStack + real AWS via profile.\n\nThe endpoint selector appears in the sidebar when more than one endpoint is configured. Each endpoint is health-checked independently, and all API requests, caches, and WebSocket subscriptions are scoped to the active endpoint.\n\n### Per-endpoint authentication\n\nEach endpoint can use its own AWS authentication method, configured from the Settings UI:\n\n| Auth Type | Description | Use Case |\n|-----------|-------------|----------|\n| **Default** | Uses `AWS_ACCESS_KEY_ID`/`AWS_SECRET_ACCESS_KEY` env vars or instance role | Local emulators, EC2/ECS deployments |\n| **AWS Profile** | Uses a named profile from `~/.aws/config` | SSO, AssumeRole, multiple accounts |\n| **Static Credentials** | Per-endpoint access key and secret | Service accounts, cross-account access |\n\n**Profile auth** supports SSO, AssumeRole, and credential_process — anything `boto3.Session(profile_name=...)` handles. If your SSO token expires, StackPort returns a 401 with instructions to run `aws sso login --profile \u003cname\u003e`.\n\n**Docker users:** mount your AWS config to use profiles inside the container:\n\n```yaml\nservices:\n  stackport:\n    image: davireis/stackport\n    volumes:\n      - ~/.aws:/root/.aws\n```\n\nYou can test connections before saving using the \"Test Connection\" button in the add/edit endpoint dialog.\n\n## Service Browsers\n\n### Dedicated UIs (8 services)\n\n| Service | Browse | Write Operations |\n|---------|--------|-----------------|\n| **S3** | Buckets, objects, folder navigation, search | Upload, download, delete, batch delete, create folders |\n| **DynamoDB** | Tables, schema, items | Query by partition/sort key, scan |\n| **Lambda** | Functions, config, aliases, versions, event sources | Invoke with JSON payload, download code |\n| **SQS** | Queues, messages, attributes | Send, receive, delete messages, purge queue |\n| **IAM** | Users, roles, groups, policies, trust policies | Read-only |\n| **EC2** | Instances, VPCs, subnets, security groups, volumes | Read-only |\n| **CloudWatch Logs** | Log groups, streams, events with time filtering | Read-only |\n| **Secrets Manager** | Secrets with value reveal, rotation status | Read-only |\n\n### Generic Resource Browser (27 services)\n\nAll other services use a searchable resource table with JSON detail view, pagination, and export (JSON/CSV).\n\n## Tag Management\n\nUnified tag read/write across 21 resource types:\n\nS3 buckets, DynamoDB tables, Lambda functions, SQS queues, IAM users/roles/policies, EC2 instances/security groups/volumes, CloudWatch log groups, Secrets Manager secrets, RDS instances/clusters, SNS topics, KMS keys, ECR repositories, CloudFormation stacks, Step Functions state machines, Kinesis streams, SSM parameters, ELB load balancers, ElastiCache clusters\n\n## CLI\n\n```bash\n# Show service availability and resource counts\nstackport status\nstackport status --output json\n\n# List resources for a service\nstackport list s3\nstackport list dynamodb --output csv\n\n# Get resource details\nstackport describe s3 buckets my-bucket\nstackport describe lambda functions my-func --output json\n\n# Export all resources\nstackport export lambda --format json\nstackport export ec2 --format csv\n```\n\nAll CLI commands accept `--endpoint URL` and `--region REGION` overrides.\n\n## Keyboard Shortcuts\n\nPress `?` anywhere to see all shortcuts.\n\n| Key | Action |\n|-----|--------|\n| `?` | Show shortcuts modal |\n| `b` | Toggle sidebar |\n| `g d` | Go to Dashboard |\n| `g r` | Go to Resources |\n| `/` | Focus search |\n| `j` / `k` | Navigate up/down in resource list |\n| `[` / `]` | Previous/next service |\n| `Enter` | Open selected resource |\n| `r` | Refresh current view |\n| `Esc` | Close panel / clear selection |\n\n## Configuration\n\n| Variable | Default | Description |\n|---|---|---|\n| `AWS_ENDPOINT_URL` | *(unset)* | AWS endpoint. Unset = real AWS via credential chain |\n| `AWS_REGION` | `us-east-1` | AWS region |\n| `AWS_ACCESS_KEY_ID` | *(unset)* | AWS access key. Unset = use credential chain |\n| `AWS_SECRET_ACCESS_KEY` | *(unset)* | AWS secret key. Unset = use credential chain |\n| `AWS_PROFILE` | *(unset)* | AWS named profile from `~/.aws/credentials` |\n| `STACKPORT_PORT` | `8080` | StackPort server port |\n| `STACKPORT_ALLOW_WRITES` | `true` | Enable write operations (POST/PUT/DELETE) |\n| `STACKPORT_S3_MAX_UPLOAD_MB` | `100` | Max S3 upload size per object (MiB) |\n| `STACKPORT_SERVICES` | *(35 services)* | Comma-separated list of services to probe |\n| `STACKPORT_PROBE_TIMEOUT` | `5` | Seconds before a service probe times out |\n| `STACKPORT_CACHE_TTL` | `5` | Seconds to cache service stats |\n| `STACKPORT_PROBE_WORKERS` | `10` | Max concurrent workers for service probing |\n| `STACKPORT_ENDPOINTS` | *(unset)* | Multiple endpoints: `local=http://localhost:4566,staging=http://...` |\n| `STACKPORT_DATA_DIR` | `~/.stackport` | Directory for persistent config (endpoints.json) |\n| `LOG_LEVEL` | `INFO` | Python log level (`DEBUG` shows healthcheck logs) |\n\n## Supported Services (35)\n\nACM, API Gateway, AppSync, Athena, CloudFormation, CloudFront, Cognito (IDP + Identity), DynamoDB, EC2, ECR, ECS, ElastiCache, EFS, ELB, EMR, EventBridge, Firehose, Glue, IAM, Kinesis, KMS, Lambda, CloudWatch Logs, CloudWatch Monitoring, RDS, Route 53, S3, Secrets Manager, SES, SNS, SQS, SSM, Step Functions, STS, WAFv2\n\n## Development\n\n```bash\ngit clone https://github.com/DaviReisVieira/stackport.git\ncd stackport\n\n# Backend\npip install -e .\nAWS_ENDPOINT_URL=http://localhost:4566 stackport\n\n# Frontend dev (with hot reload)\ncd ui \u0026\u0026 npm install \u0026\u0026 npm run dev\n\n# Build frontend for production\ncd ui \u0026\u0026 npm run build\n\n# Run tests\npython -m pytest tests/ -x --tb=short    # backend (362 tests)\ncd ui \u0026\u0026 npx vitest run                   # frontend (176 tests)\n\n# Typecheck \u0026 lint\ncd ui \u0026\u0026 npx tsc -b\ncd ui \u0026\u0026 npx eslint .\n```\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for full details.\n\n## Architecture\n\n```\nbackend/\n  main.py          FastAPI app, CORS, read-only middleware, SPA mount\n  config.py        All settings from environment variables\n  aws_client.py    Cached boto3 client factory\n  cache.py         Thread-safe TTL cache\n  websocket.py     Real-time probe loop for dashboard\n  routes/\n    stats.py       Service discovery with concurrent probing\n    resources.py   Generic list/detail for all services\n    endpoints.py   Endpoint CRUD, health checks, profile listing\n    tags.py        Unified tag management (21 types)\n    s3.py          S3 file browser with write ops\n    dynamodb.py    DynamoDB query/scan\n    lambda_svc.py  Lambda invoke/config/code\n    sqs.py         SQS send/receive/purge\n    iam.py         IAM users/roles/groups/policies\n    ec2.py         EC2 instances/VPCs/security groups\n    logs.py        CloudWatch log streams/events\n    secretsmanager.py  Secret value retrieval\n\nui/src/\n  pages/           Dashboard, ResourceBrowser, About\n  components/\n    service-views/ S3Browser, DynamoDBBrowser, LambdaBrowser, ...\n    ui/            shadcn/ui components (Radix-based)\n  hooks/           useFetch, useWebSocket, useKeyboardShortcuts, ...\n  lib/             API client, types, service icons, utils\n```\n\n## Star History\n\n\u003ca href=\"https://star-history.com/#DaviReisVieira/stackport\u0026Date\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=DaviReisVieira/stackport\u0026type=Date\u0026theme=dark\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=DaviReisVieira/stackport\u0026type=Date\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=DaviReisVieira/stackport\u0026type=Date\" width=\"100%\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n\n## Contributors\n\n\u003ca href=\"https://github.com/DaviReisVieira/stackport/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contrib.rocks/image?repo=DaviReisVieira/stackport\" alt=\"Contributors\" /\u003e\n\u003c/a\u003e\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavireisvieira%2Fstackport","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdavireisvieira%2Fstackport","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavireisvieira%2Fstackport/lists"}