{"id":51135163,"url":"https://github.com/naimjeem/cloud-village","last_synced_at":"2026-06-25T17:01:40.318Z","repository":{"id":357576408,"uuid":"1235872351","full_name":"naimjeem/cloud-village","owner":"naimjeem","description":"Interactive 3D cloud architecture map. Renders services as buildings in a stylized village.","archived":false,"fork":false,"pushed_at":"2026-05-13T10:34:05.000Z","size":10447,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-13T12:06:19.249Z","etag":null,"topics":["aws","azure","cloud","cloudflare","database","docker","gcp","kubernetes","storage","vpc"],"latest_commit_sha":null,"homepage":"https://github.com/naimjeem/cloud-village","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/naimjeem.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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-05-11T18:30:09.000Z","updated_at":"2026-05-13T10:34:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/naimjeem/cloud-village","commit_stats":null,"previous_names":["naimjeem/cloud-village"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/naimjeem/cloud-village","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naimjeem%2Fcloud-village","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naimjeem%2Fcloud-village/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naimjeem%2Fcloud-village/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naimjeem%2Fcloud-village/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/naimjeem","download_url":"https://codeload.github.com/naimjeem/cloud-village/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naimjeem%2Fcloud-village/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34784113,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-25T02:00:05.521Z","response_time":101,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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","azure","cloud","cloudflare","database","docker","gcp","kubernetes","storage","vpc"],"created_at":"2026-06-25T17:01:39.454Z","updated_at":"2026-06-25T17:01:40.301Z","avatar_url":"https://github.com/naimjeem.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Cloud Village\n\n\u003e Interactive 3D cloud architecture map. Renders services as buildings in a stylized village. Live-scan AWS / Cloudflare / Azure / GCP / Docker. Watch traffic flow as particles along roads, alerts pulse buildings, day-night cycle, soft shadows, bloom.\n\n![status](https://img.shields.io/badge/status-alpha-yellow)\n![license](https://img.shields.io/badge/license-MIT-blue)\n![stack](https://img.shields.io/badge/stack-React%20%2B%20three.js%20%2B%20Go-1f6feb)\n\n![Cloud Village intro](docs/cloud-village.png)\n\n![Cloud Village 2d](docs/cloud-village-2d.png)\n\n\u003e 📽 [Full 1080p MP4](docs/cloud-village-intro.mp4) · [Static poster](docs/cloud-village.png)\n\n---\n\n## Features\n\n- **3D village** — services rendered as houses, vaults, silos, towers, gates. Per-kind PBR materials, soft shadows, bloom, HDRI lighting.\n- **2D architecture view** — toggleable SVG diagram for a flat overview. Pan, wheel-zoom (cursor-anchored), fit-to-screen. Buildings → rounded rects colored by kind with health-colored border + kind emoji; connections → curved quadratic paths, protocol-colored, arrowheads, traffic-scaled stroke width.\n- **Day / night cycle** — dawn → day → dusk → night with stars, lamp glow, fog, lerped lighting. Manual or auto-advance (12 s per phase).\n- **Architecture-driven weather** — sky reflects fleet state: ☀ clear (all healthy) → ☁ cloudy (degraded or traffic spike) → 🌧 rain (≥30% degraded or 3+ alerts) → ⛈ storm (any down / firing critical). 3D rain particles, animated cloud cover, lightning flashes. 2D mode gets canvas rain streaks, drifting cloud blobs, flash overlay. Auto by default; manual override via toolbar.\n- **Five sources** — mock demo, JSON upload, Terraform `tfstate`, source-tree generator, or **live cloud scan** via the Go backend.\n- **Live metrics** — polls backend every 4 s for CloudWatch alarms + ALB request rates → drives health states, edge particles, deduped alerts.\n- **Animated traffic** — request / response / event particles arc along edges. Road color thickens + shifts brown → red as traffic rises, decays over time.\n- **Click-to-inspect panel** — incoming / outgoing connections, replayable flows, alert triggers, health override, metadata view.\n- **Metrics panel** — toggleable in-app dashboard (📊 Panel). Tabs: summary (counts + health distribution + top kinds), components (sortable by traffic / health / name / kind), edges (top traffic), alerts (severity-coded, click-to-focus). Provider-agnostic — reads live store state so it works for demo, AWS, Azure, GCP, Cloudflare, Docker.\n- **Friendlier labels** — building name pills strip scanner prefixes (`ctr_`, `arn:aws:`, …), convert underscores to spaces, truncate to 22 chars with full name in tooltip. Health dot + kind emoji inline. Legend grouped into Buildings / Health / Traffic with hover descriptions; collapsible.\n- **Responsive toolbar** — grouped sections on desktop (playback · data · view+atmosphere · telemetry); under 760 px the bar collapses behind a ☰ hamburger and Legend starts minimised, keeping mobile viewports clean.\n- **Settings UI** — store provider credentials (AWS keys, Cloudflare token, Azure service principal, GCP service account JSON) in browser `localStorage`. Used as scan-time overrides.\n\n---\n\n## Quick start\n\n```sh\nnpm install\nnpm run dev                          # frontend  → http://localhost:5173\ncd backend \u0026\u0026 go run .               # backend   → http://localhost:8787  (optional, needed for ☁ Live scan / 📈 Live metrics)\n```\n\nRequirements: **Node 18+**, **Go 1.22+**.\n\nFirst load shows a mock SaaS village. Try ☁ Live scan, 📂 JSON, or generate from a real project.\n\n---\n\n## Generate village from any project\n\n```sh\nnpm run generate -- /path/to/project\n# writes /path/to/project/village.json\n\nnpm run generate -- /path/to/project -o /tmp/out.json\nnpm run generate -- . --skip k8s,serverless\n```\n\nParsers (run by default):\n\n| Parser | Reads | Produces |\n|--------|-------|----------|\n| **compose** | `docker-compose.yml` / `compose.yml` | service per `services.*`, edges from `depends_on`, kind from image |\n| **pkg** | every `package.json` | compute node, externals inferred from deps (`pg`, `redis`, `mongoose`, `@aws-sdk/*`, `stripe`, `resend`, `openai`, …) |\n| **env** | every `.env*` | externals from var names (`DATABASE_URL`, `REDIS_URL`, `STRIPE_*_KEY`, `OPENAI_API_KEY`, …) |\n| **serverless** | `serverless.yml` | Lambda fn + DDB/S3/SQS/SNS resources + edges |\n| **k8s** | yaml under `k8s/` `kube/` `manifests/` `deploy/` `charts/` `kustomize/` | Deployment / Service / StatefulSet / Job, Service→Deployment edges by `app` label |\n\nOutput is auto-laid-out (grid by kind, hubs centered by connection degree). Load via 📂 JSON.\n\n---\n\n## Loading architecture\n\n| Source | Trigger | Description |\n|--------|---------|-------------|\n| Demo | default on first run | Mock SaaS village |\n| Source-gen | `npm run generate -- \u003cpath\u003e` | Auto-build from project source (compose, package.json, .env, serverless, k8s) |\n| JSON | **📂 JSON** | Upload `VillageConfig` JSON. Schema below. |\n| Terraform | **🧱 tfstate** | Upload `terraform.tfstate`. Extracts AWS resources, infers edges from IAM policies + ALB target groups + dependencies. |\n| Live cloud | **☁ Live scan** | Calls backend `/api/scan` for AWS / Cloudflare / Docker / Azure / GCP. Creds come from **⚙ Settings** + backend env. |\n\nLast loaded village persists in `localStorage` (`cloud-village:lastVillage`).\n\n### JSON schema\n\n```json\n{\n  \"name\": \"string\",\n  \"components\": [\n    {\n      \"id\": \"...\", \"name\": \"...\",\n      \"kind\": \"compute|storage|database|queue|gateway|cdn|monitoring|auth|cache|external\",\n      \"provider\": \"aws|gcp|azure|cloudflare|docker|generic\",\n      \"position\": [x, z], \"health\": \"healthy|degraded|down\",\n      \"meta\": { \"any\": \"string|number\" }\n    }\n  ],\n  \"connections\": [\n    { \"id\": \"...\", \"from\": \"id\", \"to\": \"id\", \"protocol\": \"http|grpc|sql|event|tcp\", \"label\": \"optional\" }\n  ]\n}\n```\n\nComponents with `position: [0, 0]` (or missing) get an auto-layout slot based on `kind` columns and connection degree.\n\n---\n\n## Building map\n\n| Cloud kind | Building |\n|------------|----------|\n| compute    | house + pitched roof + lit windows |\n| storage    | banded silo |\n| database   | stacked vault discs + pulse beacon |\n| queue      | post office + flag |\n| gateway    | arched town gate w/ banners |\n| cdn        | radio tower + dish + beacon |\n| monitoring | watchtower + searchlight |\n| auth       | guardhouse + lantern |\n| cache      | well |\n| external   | signpost / traveler |\n\n---\n\n## UI controls (toolbar)\n\nThe toolbar is split into colour-coded groups. On viewports under 760 px the entire bar collapses behind a **☰ hamburger** that shows only the brand + health badges; tap it to expand the full menu.\n\n**Brand / status (left)** — village name, component count, health chips (green / amber / red), live alert badge.\n\n**Playback** (icon-only buttons with tooltips)\n\n| Icon | Action |\n|------|--------|\n| ⏸ / ▶ | Pause / resume all animation (also `Space`) |\n| ⚡ | Replay flows on every edge |\n| ⚠ | Spawn a random alert |\n| ↺ | Reload mock village |\n\n**Data** (icon-only on mobile)\n\n| Button | Action |\n|--------|--------|\n| ⤓ Data ▾ | Dropdown: load JSON, load Terraform `tfstate`, export current village |\n| ☁ Live scan | Open scan modal (live cloud scan via backend) |\n| ⚙ | Provider credentials modal |\n\n**View + atmosphere**\n\n| Button | Action |\n|--------|--------|\n| 🏘 3D / 🗺 2D | Segmented switch between 3D village and 2D architecture |\n| 🌅 / 🌞 / 🌆 / 🌙 phase | Cycle time-of-day. ⟳ side button toggles auto-cycle (12 s per phase) |\n| ☀ / ☁ / 🌧 / ⛈ weather | Cycle weather mode. ⟳ side button re-engages auto-derivation from fleet health |\n\n**Telemetry (right)**\n\n| Button | Action |\n|--------|--------|\n| 📈 Live | Toggle backend metrics polling (4 s). Pulsing dot indicates active polling |\n| 📊 Panel | Toggle in-app metrics dashboard (summary / components / edges / alerts) |\n\n### Keyboard\n\n| Key | Action |\n|-----|--------|\n| `/` | Focus search bar |\n| `Esc` | Deselect / clear search |\n| `Space` | Pause / resume animation |\n\n---\n\n## Animations\n\n- **Request / response / event particles** arc along edges (blue / green / yellow).\n- **Critical alerts** pulse the building red + slide a toast in (auto-dismiss 6 s, deduped 60 s window).\n- **Health states** — green (healthy) / amber (degraded) / red (down) emissive glow.\n- **Traffic heatmap** — roads thicken + shift brown → orange → red based on recent flow count, decays exponentially.\n- **Day / night** — sun pos / color / intensity, hemisphere + ambient colors, fog, exposure, sky turbidity, bloom threshold, star field, lamp emissive — all lerp between phases. Auto-cycle: 12 s per phase.\n- **Postprocessing** — Bloom + HueSaturation + BrightnessContrast + Vignette + ACES filmic tonemap + SMAA.\n- **Live metrics mode** — client polls `/api/metrics` every 4 s. Falls back to client-side simulator only if no real scan has run.\n\n---\n\n## Architecture-driven weather\n\nThe sky is a glanceable health gauge — operators can read the overall fleet state without opening any panel. Auto-derivation samples store state every 2 s ([src/hooks/useWeatherAuto.ts](src/hooks/useWeatherAuto.ts)).\n\n| Mode | Triggers (first match wins) |\n|------|-----------------------------|\n| ⛈ Storm | any component `health === 'down'` **OR** any active alert with `severity === 'critical'` |\n| 🌧 Rain | ≥30 % components `degraded` **OR** ≥3 active alerts |\n| ☁ Cloudy | any component `degraded` **OR** any active alert **OR** sustained edge traffic |\n| ☀ Clear | fully healthy and quiet |\n\n3D scene effects ([src/scene/WeatherSystem.tsx](src/scene/WeatherSystem.tsx))\n\n- **Rain** rendered as instanced `lineSegments` (rain 220 drops / storm 420). Position updates throttled to 30 Hz to cap GPU upload.\n- **Storm lightning** randomly spikes the directional-light intensity every 3–12 s, decays back over ~300 ms.\n- **Fog + sun** lerp to per-mode tint (cloudy → grey, rain → blue-grey, storm → dark navy) and dim (cloudy 0.78×, rain 0.55×, storm 0.35×).\n- **Cloud sprites** get heavier opacity + darker tint per mode.\n\n2D-view effects ([src/ui/WeatherOverlay.tsx](src/ui/WeatherOverlay.tsx))\n\n- Canvas rain streaks with slant + slight perspective (rain 50 / storm 110), capped at 30 fps.\n- Drifting cloud blobs (cloudy +).\n- Full-screen tint per mode + lightning flash overlay synchronised to storm strikes.\n\nManual override via the toolbar weather chip flips `weatherAuto` off so the sky stays put while investigating; the ⟳ Auto side button re-engages derivation.\n\n---\n\n## Metrics panel\n\nOpen with **📊 Panel** on the toolbar. Side panel docked right; auto-shifts left when an inspect panel is open so both fit side-by-side.\n\n| Tab | Shows |\n|-----|-------|\n| Summary | Component count, connection count, active-edge count, alert count, health distribution bar (healthy / degraded / down), top kinds breakdown |\n| Components | All components in a sortable table (traffic / health / name / kind). Click a row → focuses the building and opens InspectPanel |\n| Edges | Top 20 connections by current traffic, from → to + protocol + rate |\n| Alerts | Recent alerts feed, severity-colored, timestamped. Click → focus the offending component |\n\nPanel reads directly from the live store (`village`, `alerts`, `edgeTraffic`), so it is **provider-agnostic**: works with demo data, JSON uploads, Terraform state, or any of the live scanners (AWS, Azure, GCP, Cloudflare, Docker). When 📈 Live metrics is on, numbers update every 4 s automatically.\n\n`backend/internal/metrics/docker.go` is what feeds the panel for local Docker setups: container `running`/`exited`/`dead` → health, CPU% ≥ 85 → degraded, ≥ 99 → down with critical alert, and network (rx+tx) bytes/sec scaled into edge rates. Same `Snapshot` shape as the AWS adapter, no external service required.\n\n---\n\n## Backend\n\nGo module at `backend/` exposing a small HTTP API.\n\n```\nbackend/main.go                       # chi router, /health /api/scan /api/metrics\nbackend/internal/village/types.go     # VillageConfig / Component / Connection\nbackend/internal/scan/aws.go          # AWS SDK Go v2 (ECS, Lambda, DDB, ALB, S3, ECR, SQS, SNS, SFN, CloudFront, APIGW, CWLogs)\nbackend/internal/scan/cloudflare.go   # Cloudflare REST API\nbackend/internal/scan/docker.go       # Local Docker engine via docker SDK\nbackend/internal/scan/azure.go        # Azure Resource Manager SDK\nbackend/internal/scan/gcp.go          # GCP Cloud Asset Inventory (REST + google ADC)\nbackend/internal/metrics/aws.go       # CloudWatch alarms + ALB RequestCountPerTarget\nbackend/internal/metrics/docker.go    # Local Docker container CPU%, net rx/tx, run state\nbackend/internal/metrics/handler.go   # /api/metrics provider switch\n```\n\nEndpoints:\n\n- `GET  /health` — `{ok: true}`\n- `POST /api/scan` — body `{ provider, ... }` → `VillageConfig`\n- `GET  /api/metrics?provider=aws` — CloudWatch alarms + ECS health + ALB request rate\n- `GET  /api/metrics?provider=docker` — local Docker container CPU%, network rx+tx, run state (no external service)\n\n### Docker live metrics (local, zero external dependencies)\n\nAfter running a Docker scan, toggle **📈 Live metrics**. Each 4 s poll reads from the local Docker socket and reports:\n\n- **Health** — container `running` → healthy, `exited`/`dead` → down, else degraded. CPU ≥ 85% downgrades to degraded; ≥ 99% to down.\n- **Edge rates** — sum of (rx + tx) bytes/sec for the two endpoints of each connection, scaled into a request-rate proxy.\n- **Alerts** — high-CPU per container (`warning` ≥ 85%, `critical` ≥ 99%).\n\nAll data comes from `/var/run/docker.sock`. No Prometheus, no exporter, no third-party service.\n\n### Credential resolution\n\n| Provider | Precedence (highest first) |\n|----------|----------------------------|\n| **AWS** | ⚙ Settings static keys → ⚙ Settings profile → scan-body keys/profile → SDK default chain (env vars, `~/.aws/credentials`, SSO, IMDS) |\n| **Cloudflare** | ⚙ Settings API token → scan-body token → `CLOUDFLARE_API_TOKEN` env |\n| **Docker** | ⚙ Settings socket path → scan-body socket → `/var/run/docker.sock` |\n| **Azure** | ⚙ Settings service principal (`tenantId` + `clientId` + `clientSecret`) → `DefaultAzureCredential` (env, `az login`, managed identity) |\n| **GCP** | ⚙ Settings service-account JSON → Application Default Credentials (`gcloud auth application-default login`) |\n\nCredentials entered in ⚙ Settings are stored in browser `localStorage` (key `cloud-village-creds`) in plaintext. Use read-only credentials only. For shared machines, prefer shell env vars on the backend.\n\n### AWS IAM read-only perms\n\n```\necs:List*, ecs:Describe*\nlambda:ListFunctions\ndynamodb:ListTables, dynamodb:DescribeTable\nelasticloadbalancing:Describe*\ns3:ListAllMyBuckets\necr:DescribeRepositories\nsqs:ListQueues, sqs:GetQueueAttributes\nsns:ListTopics\nstates:ListStateMachines\ncloudfront:ListDistributions\napigateway:GET\nlogs:DescribeLogGroups\ncloudwatch:DescribeAlarms, cloudwatch:GetMetricData\n```\n\n### Resource → kind per provider\n\n| Provider | Mapping |\n|----------|---------|\n| AWS        | ECS / Lambda / SFN → compute, DDB → database, S3 / ECR → storage, SQS / SNS → queue, ALB / APIGW → gateway, CloudFront → cdn, CWLogs → monitoring |\n| Cloudflare | Worker / Pages → compute, KV → cache, R2 → storage, D1 → database, Queues → queue, Zones → gateway |\n| Docker     | postgres / mysql / mongo → database, redis → cache, rabbitmq / kafka → queue, nginx / traefik → gateway, prometheus / grafana → monitoring, others → compute |\n| Azure      | VM / App / AKS / Functions → compute, Storage / ACR → storage, SQL / Postgres / MySQL / Cosmos → database, ServiceBus / EventHub → queue, LB / AppGW / APIM → gateway, CDN → cdn, Insights → monitoring, KeyVault → auth, Redis → cache |\n| GCP        | GCE / GKE / CloudRun / Functions → compute, GCS / AR → storage, SQL / Spanner → database, PubSub / Tasks → queue, LB / APIGW → gateway, Memorystore → cache, Secret / IAM → auth |\n\n---\n\n## Tech stack\n\n- **Frontend** — React 18, TypeScript, Vite\n- **3D** — three.js via `@react-three/fiber`, `@react-three/drei`, `@react-three/postprocessing`\n- **State** — `zustand`\n- **Backend** — Go 1.22+, `chi` router, AWS SDK Go v2, Azure SDK, Docker SDK, `golang.org/x/oauth2/google`\n\n---\n\n## Security\n\n- ⚙ Settings stores credentials in browser `localStorage` in plaintext. Anyone with access to the browser, browser extension permissions, or via XSS can read them. **Use read-only credentials only.**\n- Never paste production write-capable keys.\n- Backend forwards credentials directly to provider SDKs — it does not log or persist them.\n- For shared / multi-user setups, prefer backend env vars or SSO-issued temporary credentials over the ⚙ Settings dialog.\n- IAM perms in this README are read-only by design. Audit before granting.\n\n---\n\n## Roadmap\n\n- [x] Phase 1 — 3D village render + mock data\n- [x] Phase 2 — Click panel, health states\n- [x] Phase 3 — Particle flow animation + alerts\n- [x] Phase 4 — JSON config loader\n- [x] Phase 5 — Terraform `tfstate` parser\n- [x] Phase 6 — Live cloud scan backend (Go + chi + AWS SDK Go v2)\n- [x] Phase 7 — Cloudflare, Docker, Azure, GCP scanners\n- [x] Phase 8 — CloudWatch alarms + ALB request-rate metrics ingest\n- [x] Phase 9 — Realistic rendering pass (HDRI, bloom, soft shadows, day/night, props)\n- [x] Phase 10 — ⚙ Settings credential vault (per-provider)\n- [x] Phase 11 — Docker live metrics (local CPU% / network / state, no external service)\n- [x] Phase 11b — In-app Metrics Panel + 2D architecture view + 3D/2D toggle\n- [x] Phase 11c — Architecture-driven weather (clear / cloudy / rain / storm), auto-derived from fleet health\n- [x] Phase 11d — Toolbar redesign (grouped sections, segmented switch, Data dropdown, mobile hamburger, collapsible Legend)\n- [ ] Phase 11e — Azure Monitor / GCP Cloud Monitoring / Cloudflare Analytics metrics adapters\n- [ ] Phase 12 — Code-split bundle (lazy-load three.js + postprocessing)\n- [ ] Phase 13 — GLTF asset kit support (Quaternius / Kenney)\n- [ ] Phase 14 — Multi-account / multi-region AWS scan in one render\n\n---\n\n## Contributing\n\nPRs welcome. Keep parsers / scanners pure functions where possible. New backend providers go under `backend/internal/scan/\u003cname\u003e.go` and register in `main.go`. New frontend kinds go under `src/scene/Building.tsx` `buildingGeo()` switch.\n\n```sh\nnpm run dev                # frontend\ncd backend \u0026\u0026 go run .     # backend\n\n# type-check / vet before PR\nnpx tsc --noEmit -p tsconfig.json\ncd backend \u0026\u0026 go vet ./...\n```\n\n---\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\nBuilt by [Naimuddin Shahjalal Bhuyan](https://naimjeem.me).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnaimjeem%2Fcloud-village","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnaimjeem%2Fcloud-village","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnaimjeem%2Fcloud-village/lists"}