[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-82995":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":9,"rankLanguage":9,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":9,"pushedAt":9,"updatedAt":34,"readmeContent":35,"aiSummary":36,"trendingCount":15,"starSnapshotCount":15,"syncStatus":37,"lastSyncTime":38,"discoverSource":39},82995,"skylight","cpaczek\u002Fskylight","cpaczek","Project the aircraft passing overhead onto your ceiling in real time, from an RTL-SDR — with a live sky layer (sun, moon, stars, ISS) and where each plane is headed.",null,"TypeScript",2571,278,36,7,0,63,1487,351,29.34,"MIT License",false,"main",true,[25,26,27,28,29,30,31,32,33],"ads-b","aircraft","art-installation","flight-tracker","projector","raspberry-pi","react","rtl-sdr","typescript","2026-06-12 02:04:30","\u003Ch1 align=\"center\">Skylight\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  \u003Cem>Project the aircraft passing overhead onto your ceiling, in real time — an X-ray through the roof.\u003C\u002Fem>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fskylightceiling.com\">\u003Cb>🛰️ Get notified when I launch on a crowdfunding platform → skylightceiling.com\u003C\u002Fb>\u003C\u002Fa>\n  \u003Cbr>\u003Csub>A ready-made kit is coming. Join the waitlist for early access &amp; launch pricing.\u003C\u002Fsub>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fskylight.png\" alt=\"Skylight projected on a ceiling: aircraft, trails, SFO runways and the night sky\" width=\"100%\">\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n\n\nhttps:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F9256b0eb-cc27-4388-9a4f-0a6c05468304\n\n\n\u003C\u002Fp>\n\nSkylight decodes ADS-B from a cheap RTL-SDR radio and renders the planes physically\nflying over you onto a ceiling-pointed projector. A jet you'd hear overhead glides\nacross your ceiling at the same moment — labeled with its airline, type, and where it's\nheaded. Pure-black background so the projector's rectangle disappears and only the\naircraft (and stars) are lit.\n\nIt also draws the **real sky** behind the planes — sun, moon, bright stars and\nconstellations, and live **satellites including the ISS** — all at their true positions\nfor your location and time. Tune everything from your phone.\n\n> Reference build is centered on **San Francisco International (SFO)**, but it works\n> anywhere — set your coordinates (and swap the runway data) and you're flying.\n\n## Features\n\n- **Real-time overhead aircraft** from a local RTL-SDR (sub-second), or from a free web\n  API with zero code changes — handy for trying it with no radio.\n- **Type-aware glyphs** in a luminous, swept-wing style: widebodies tower over regional\n  jets, **helicopters spin their rotors**, turboprops and GA aircraft spin their props.\n- **Smooth motion** — interpolates the ~1 Hz fixes to 60 fps by rendering slightly in\n  the past and tweening between real positions (no teleporting).\n- **Comet trails**, altitude-graded color, and range rings + compass for orientation.\n- **The airport** (runways) drawn at its true position, so you watch departures and\n  arrivals line up with the runway.\n- **Window to elsewhere** — each routed flight shows its destination **city, local time\n  there, and miles-to-go**, plus a faint great-circle arc toward where it's headed.\n- **Live sky layer** — sun, moon (with phase), bright stars + constellation lines, and\n  **satellites \u002F ISS** computed from TLEs. Scrub time forward\u002Fback from your phone, or\n  jump straight to the next ISS pass.\n- **Phone control panel** — every setting (rotation, theme, palette, filters, sky\n  toggles, …) is live-tunable over your LAN and persists across reboots.\n- **Appliance-ready** — boots straight to a full-screen kiosk on a Raspberry Pi 5.\n\n## Hardware\n\n| Part | Suggested | Notes |\n|---|---|---|\n| Receiver | **RTL-SDR Blog V4 + dipole** | The included dipole is plenty — planes are nearly overhead. |\n| Compute | **Raspberry Pi 5 (8 GB)** | Decode + render. Active cooling for 24\u002F7. |\n| Projector | A 1080p projector pointed up | Laser (e.g. Optoma GT2100HDR) gives the deepest blacks, but it's overkill — see the budget tip below. |\n| Display link | micro-HDMI → HDMI | The Pi 5 uses **micro**-HDMI (not mini). |\n| Mount | Rotating 1\u002F4-20 stand, pointed up | Lower the stand for a bigger image; tape **+ a safety tether**. |\n\n> **💡 Budget tip — you don't need an expensive projector.** The pricey laser short-throw\n> is only worth it if you want the image visible in a **lit** room. If you're happy viewing\n> it in a **dim\u002Fdark** room (the intended vibe), a cheap **native-1080p LED** projector like\n> the **[Yaber Buffalo Pro U9](https:\u002F\u002Fwww.projectorcentral.com\u002FYaber-Pro_U9.htm) (~$150)**\n> works great:\n> - **No short-throw needed** — from the floor under an ~8 ft ceiling, even a 1.35:1 throw\n>   gives a ~5.5 ft image.\n> - **Low brightness is fine** (even better) — the content is sparse-on-black, so 200–400\n>   lumens in a dark room actually looks *deeper*.\n> - Just verify it's **native 1920×1080** (not \"1080p supported\"), has a **quiet fan**, and\n>   an **HDMI input that shows on power-on**.\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fsetup.jpg\" alt=\"The build: short-throw projector pointing up at the ceiling, RTL-SDR dipole antenna on the cabinet\" width=\"320\">\n  \u003Cbr>\u003Cem>The build — short-throw projector pointing up, RTL-SDR dipole on the cabinet.\u003C\u002Fem>\n\u003C\u002Fp>\n\nYou don't need any of this to try it — see Quick start.\n\n## Quick start (local, no radio)\n\nRuns entirely on your computer against a free public ADS-B API.\n\n```bash\npnpm install\nDATA_SOURCE=api pnpm dev\n```\n\n- **Display:** http:\u002F\u002Flocalhost:5173\u002F\n- **Control panel:** http:\u002F\u002Flocalhost:5173\u002Fcontrol.html (or from your phone: `http:\u002F\u002F\u003Cyour-ip>:5173\u002Fcontrol.html`)\n\nSet your location in the control panel area is coming; for now set `centerLat` \u002F\n`centerLon` in [`shared\u002Fsrc\u002Fconfig.ts`](shared\u002Fsrc\u002Fconfig.ts) (defaults to SFO).\n\n### With a radio (locally)\n\n```bash\nscripts\u002Finstall-rtlsdr-fedora.sh    # rtl-sdr-blog driver + blacklist DVB-T (Fedora; see script for Debian)\nscripts\u002Frun-dump1090-local.sh       # decode + serve aircraft.json on :8080\nDATA_SOURCE=radio pnpm dev\n```\n\n## Raspberry Pi appliance\n\nFull walkthrough in [`pi-setup\u002FREADME.md`](pi-setup\u002FREADME.md): flash + headless\nprovision the SD card, install the driver + decoder + app, and set up the boot-to-kiosk\ndisplay. Once it's running, push updates from your dev machine with:\n\n```bash\nPI_HOST=skylight.local .\u002Fscripts\u002Fdeploy-to-pi.sh\n```\n\n## Configuration\n\n`Config` ([`shared\u002Fsrc\u002Fconfig.ts`](shared\u002Fsrc\u002Fconfig.ts)) is the single source of truth,\npersisted to `server\u002Fdata\u002Fconfig.json` and live-editable from the control panel. Key\nfields:\n\n| | |\n|---|---|\n| `centerLat` \u002F `centerLon` | **Your location** — where you're looking up. |\n| `radiusMiles` | How far out to show (default 3 — \"what you could realistically see\"). |\n| `rotationDeg` \u002F `mirrorX` | Calibration for the looking-up flip (tune against a real pass). |\n| `theme` | `ambient` · `telemetry` · `focus`. |\n| `showStars` \u002F `showSun` \u002F `showMoon` \u002F `showSatellites` | Sky layer toggles. |\n| `skyTimeOffsetMin` | Scrub the sky clock for testing (0 = live). |\n| `showDestArc` \u002F `showRouteDetail` | \"Window to elsewhere\". |\n\n**Using it somewhere other than SFO:** set `centerLat`\u002F`centerLon`, and replace the\nrunway geometry in [`web\u002Fsrc\u002Fdisplay\u002Fairports.ts`](web\u002Fsrc\u002Fdisplay\u002Fairports.ts) with your\nlocal airport (coordinates from [OurAirports](https:\u002F\u002Fourairports.com\u002Fdata\u002F)). Stars,\nsun, moon, and satellites are computed for your coordinates automatically.\n\n### Server environment\n\n| Env | Default | Meaning |\n|---|---|---|\n| `DATA_SOURCE` | `radio` | `radio` (dump1090) or `api` (airplanes.live) |\n| `AIRCRAFT_JSON_URL` | `http:\u002F\u002Flocalhost:8080\u002Faircraft.json` | dump1090 feed |\n| `SUPPLEMENT_API` | `1` | When on radio, merge the API too (keeps landing aircraft alive) |\n| `PORT` \u002F `HOST` | `3000` \u002F `0.0.0.0` | HTTP + WebSocket |\n\n## Architecture\n\n```\nRTL-SDR ──USB──> dump1090-fa ──> aircraft.json (:8080)\n                                      │ poll ~1 Hz  (+ API supplement)\n                                      ▼\n                         server\u002F  (Node · Express · ws)\n                         • normalize + enrich (airline\u002Ftype tables + adsbdb routes)\n                         • proxy satellite TLEs (Celestrak)\n                         • persist config, broadcast over WebSocket\n                         ├──────────────────────┬───────────────────────┐\n                         ▼                      ▼                       ▼\n                   Display (\u002F)            Control (\u002Fcontrol)        REST \u002Fapi\u002F*\n                   canvas renderer +      phone settings UI\n                   sky engine → projector (live, two-way)\n```\n\n- **`shared\u002F`** — TypeScript types, config schema, and pure geo\u002Fprojection math.\n- **`server\u002F`** — polls the radio (primary) and API (supplement), enriches aircraft,\n  proxies TLEs, persists config, and pushes everything over a WebSocket.\n- **`web\u002F`** — Vite + React, two pages: the **display** (`\u003Ccanvas>` renderer + celestial\n  engine) and the mobile **control panel**.\n\n**Stack:** TypeScript · React · Vite · Express · ws · pnpm workspaces ·\n[astronomy-engine](https:\u002F\u002Fgithub.com\u002Fcosinekitty\u002Fastronomy) ·\n[satellite.js](https:\u002F\u002Fgithub.com\u002Fshashwatak\u002Fsatellite-js).\n\n## Credits & data\n\n- ADS-B decode: [dump1090-fa](https:\u002F\u002Fgithub.com\u002Fflightaware\u002Fdump1090) · RTL-SDR Blog\n  [drivers](https:\u002F\u002Fgithub.com\u002Frtlsdrblog\u002Frtl-sdr-blog)\n- Routes \u002F aircraft enrichment: [adsbdb](https:\u002F\u002Fwww.adsbdb.com\u002F) ·\n  fallback feed: [airplanes.live](https:\u002F\u002Fairplanes.live\u002F)\n- Satellite elements: [Celestrak](https:\u002F\u002Fcelestrak.org\u002F) · airport data:\n  [OurAirports](https:\u002F\u002Fourairports.com\u002F)\n\n## License\n\n[MIT](LICENSE) — be excellent, point it at the sky.\n","Skylight 是一个将头顶飞过的飞机实时投影到天花板上的项目，同时展示真实的天空背景（包括太阳、月亮、星星和国际空间站）。它利用RTL-SDR接收器解码ADS-B信号，并通过投影仪在天花板上显示飞行中的飞机及其目的地。技术特点包括：TypeScript编写，支持实时数据更新与平滑动画效果，以及通过手机进行控制面板的调整。该项目适用于航空爱好者、教育机构或任何希望以独特方式观察空中交通的场景。",2,"2026-06-11 04:09:49","CREATED_QUERY"]