{"id":45905067,"url":"https://github.com/kewonit/aeris","last_synced_at":"2026-04-12T07:11:12.037Z","repository":{"id":338393732,"uuid":"1157310384","full_name":"kewonit/aeris","owner":"kewonit","description":"Aeris is a real-time 3D flight radar for the web","archived":false,"fork":false,"pushed_at":"2026-04-06T21:49:23.000Z","size":4448,"stargazers_count":281,"open_issues_count":2,"forks_count":17,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-06T23:24:26.926Z","etag":null,"topics":["maps","nexjts16","openskynetwork"],"latest_commit_sha":null,"homepage":"https://aeris.edbn.me","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kewonit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","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-02-13T17:12:21.000Z","updated_at":"2026-04-06T14:27:52.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kewonit/aeris","commit_stats":null,"previous_names":["kewonit/aeris"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kewonit/aeris","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kewonit%2Faeris","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kewonit%2Faeris/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kewonit%2Faeris/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kewonit%2Faeris/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kewonit","download_url":"https://codeload.github.com/kewonit/aeris/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kewonit%2Faeris/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31707066,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-12T06:22:27.080Z","status":"ssl_error","status_checked_at":"2026-04-12T06:21:52.710Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["maps","nexjts16","openskynetwork"],"created_at":"2026-02-28T02:00:38.298Z","updated_at":"2026-04-12T07:11:12.029Z","avatar_url":"https://github.com/kewonit.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"# Aeris\n\nReal-time 3D flight tracking — altitude-aware, visually stunning.\n\nAeris renders live air traffic over the world's busiest airspaces on a premium dark-mode map. Flights are separated by altitude in true 3D: low altitudes glow cyan, high altitudes shift to gold. Select a city, and the camera glides to that airspace with spring-eased animation.\n\n[Live Demo](https://aeris.edbn.me)\n\n\u003cimg width=\"1280\" height=\"832\" alt=\"aeris - 1\" src=\"https://github.com/user-attachments/assets/3fe48868-f8cd-48af-81d6-395c1fce8a2a\" /\u003e\n\n\u003cimg width=\"2559\" height=\"1380\" alt=\"Screenshot 2026-02-15 112222\" src=\"https://github.com/user-attachments/assets/9d1f50ed-be4e-4ef5-95ac-257e9129f8c8\" /\u003e\n\n\u003cimg width=\"2555\" height=\"1387\" alt=\"image\" src=\"https://github.com/user-attachments/assets/a1d2f673-dfdc-4c82-8ee2-7629d91ad94b\" /\u003e\n\n## Stack\n\n| Layer     | Technology                                                       |\n| --------- | ---------------------------------------------------------------- |\n| Framework | Next.js 16 (App Router, Turbopack)                               |\n| Language  | TypeScript                                                       |\n| Styling   | Tailwind CSS v4                                                  |\n| Map       | MapLibre GL JS                                                   |\n| WebGL     | Deck.gl 9 (ScenegraphLayer, IconLayer, PathLayer, MapboxOverlay) |\n| Animation | Motion (Framer Motion)                                           |\n| Data      | Airplanes.live / adsb.lol / OpenSky (3-tier fallback)            |\n| Hosting   | Vercel                                                           |\n\n## Getting Started\n\n```bash\npnpm install\ncp .env.example .env.local\npnpm dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000).\n\n## Architecture\n\n```\nsrc/\n├── app/\n│   ├── globals.css            Tailwind config, theme vars\n│   ├── layout.tsx             Root layout (Inter font)\n│   ├── page.tsx               Entry — renders \u003cFlightTracker /\u003e\n│   └── api/flights/route.ts   adsb.lol reverse proxy (CORS workaround + rate limit)\n├── components/\n│   ├── flight-tracker.tsx     Orchestrator — state, camera, layers, UI\n│   ├── map/\n│   │   ├── map.tsx            MapLibre GL wrapper with React context\n│   │   ├── flight-layers.tsx  Deck.gl overlay — icons, trails, shadows, animation\n│   │   ├── aircraft-model-mapping.ts  ADS-B category → 3D model key + bucketing\n│   │   └── aircraft-model-layers.ts   Builds per-model ScenegraphLayers\n│   └── ui/\n│       ├── altitude-legend.tsx\n│       ├── control-panel.tsx  Tabbed dialog — search, map style, settings\n│       ├── flight-card.tsx    Hover card with flight details\n│       ├── scroll-area.tsx    Custom scrollbar\n│       ├── slider.tsx         Orbit speed slider (Radix)\n│       └── status-bar.tsx     Live status indicator\n├── hooks/\n│   ├── use-flights.ts         Adaptive polling hook with credit-aware throttling\n│   ├── use-settings.tsx       Settings context with localStorage persistence\n│   └── use-trail-history.ts   Trail accumulation + Catmull-Rom smoothing\n└── lib/\n    ├── cities.ts              Curated aviation hub presets\n    ├── flight-api.ts          Barrel re-export for the 3-tier flight client\n    ├── flight-api-client.ts   airplanes.live → adsb.lol → OpenSky fallback chain\n    ├── flight-api-parsing.ts  readsb JSON → FlightState normalization\n    ├── flight-api-types.ts    Shared types for ADS-B providers\n    ├── flight-utils.ts        Altitude→color, unit conversions\n    ├── map-styles.ts          Map style definitions\n    ├── opensky.ts             OpenSky API client + types (Tier 3 fallback)\n    └── utils.ts               cn() utility\n```\n\n## Design\n\n- **Dark-first**: CARTO Dark Matter base map, theme-aware UI\n- **3D depth**: 55° pitch, altitude-based z-displacement via Deck.gl\n\n## Aircraft Models\n\nAeris renders 14 distinct aircraft silhouettes based on ADS-B emitter category and ICAO type code:\n\n| Model Key       | Represents                      | Assignment                                     |\n| --------------- | ------------------------------- | ---------------------------------------------- |\n| `narrowbody`    | A320, B737 family               | Category 3 (Small), 4 (Large), 5 (High vortex) |\n| `widebody-2eng` | A330, A350, B777, B787          | Category 6 (Heavy)                             |\n| `widebody-4eng` | A380, B747, A340                | —                                              |\n| `a380`          | Airbus A380                     | Type codes A38x                                |\n| `b737`          | Boeing 737 family               | Type codes B73x, B3xM                          |\n| `regional-jet`  | CRJ, E-Jets, Fokker             | —                                              |\n| `light-prop`    | Cessna, Piper, Cirrus           | Category 2 (Light), 12 (Ultralight)            |\n| `turboprop`     | ATR, Dash-8, Saab               | —                                              |\n| `helicopter`    | All rotorcraft                  | Category 8 (Rotorcraft)                        |\n| `bizjet`        | Gulfstream, Citation, Learjet   | —                                              |\n| `glider`        | Sailplanes                      | Category 9 (Glider)                            |\n| `fighter`       | Military fast-movers            | Category 7 (High-perf)                         |\n| `drone`         | UAVs                            | Category 14 (UAV)                              |\n| `generic`       | Fallback for unknown categories | Category 0, 1, default                         |\n\nModels are optimised GLB files (no Draco compression — avoids external WASM decoder dependency) served from Cloudinary CDN (local backups in `public/models/aircraft/`). A second-tier mapping from ICAO type codes (A320, B738, etc.) refines the assignment when type data is available via the readsb feed.\n\n- **Smooth animation**: Catmull-Rom spline trails, per-frame interpolation between polls\n- **Glassmorphism**: `backdrop-blur-2xl`, `bg-black/60`, `border-white/[0.08]`\n- **Spring physics**: All UI transitions use spring easing\n- **Responsive**: Desktop sidebar dialog, mobile bottom-sheet with thumb-zone tab bar\n- **API efficiency**: Adaptive polling (30 s → 5 min) based on remaining credits, Page Visibility pause, grid-snapped cache\n- **Persistence**: Settings + map style in localStorage, `?city=IATA` URL deep links\n\n## Environment Variables\n\n| Variable            | Required | Description                     |\n| ------------------- | -------- | ------------------------------- |\n| `NEXT_PUBLIC_GA_ID` | No       | Google Analytics measurement ID |\n\nNo API keys are needed. Flight data comes from public ADS-B APIs with a built-in 3-tier fallback chain (airplanes.live → adsb.lol → OpenSky).\n\n## License\n\nAGPL-3.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkewonit%2Faeris","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkewonit%2Faeris","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkewonit%2Faeris/lists"}