Real-time aircraft sky preview for desktop — three view modes for monitor or ceiling projection (Phase 1).
| Mode | Renderer | Description |
|---|---|---|
| Dome | Three.js (@skyos/renderer) |
3D sky dome with GLB aircraft models, trails, horizon |
| Ceiling | Skylight Canvas (@skyos/skylight) |
2D ceiling projection (map or sky dome), stars, moon, ISS, runway overlay |
| Map | MapLibre (apps/desktop) |
Debug map with aircraft positions |
Ceiling mode is ported from skylight-main — Canvas 2D, altitude-colored glyphs, comet trails, and optional sky layer (stars, sun, moon, planets, satellites). Use the toolbar to switch 穹顶 / 平面 projection, rotate bearing, and mirror X/Y for projector calibration.
- Desktop: Tauri v2
- UI: React, TypeScript, Tailwind CSS v4, shadcn/ui (base-nova), Tabler icons
- Dome: Three.js (
@react-three/fiber) - Ceiling: Canvas 2D (
@skyos/skylight) —astronomy-engine,satellite.js - Backend: Rust (
sky-core,aircraft-provider,airport-data) - Stream: WebSocket v2
ws://127.0.0.1:9731/sky(typedsnapshot/config/tle) - Config:
@skyos/config(SkyConfig, merge, persistence at%APPDATA%/skyos/config.json) - TLE: Tauri
get_tlecommand (Celestrak cache for ISS / visual satellites) - Remote: optional LAN control SPA at
/control/(see below)
Requires Rust (Cargo on PATH), pnpm, and WebView2 (Windows).
pnpm install
pnpm devRuns tauri dev for the desktop app with hot reload.
If you see program not found: cargo, install Rust via rustup and open a new terminal.
Frontend-only (no aircraft data):
cd apps/desktop
pnpm devshadcn/ui lives in apps/desktop/src/components/ui/. Add more with:
cd apps/desktop
pnpm dlx shadcn@latest add <component>Two independent toggles in Data Sources → 内网遥控:
| Setting | Effect |
|---|---|
| 启用遥控页 | Binds HTTP/WS to 0.0.0.0, serves apps/remote at /control/, generates remoteAccessToken |
| 配置双向同步 | Allows patchConfig from control clients; when off, phone UI is read-only |
- Build the remote SPA:
pnpm --filter @skyos/remote build - In the desktop app, enable 启用遥控页 and copy the token
- On your phone (same Wi‑Fi), open the LAN URL shown in the status bar (e.g.
http://192.168.x.x:9731/control/) - Paste the token — full live-tune settings (no ceiling preview)
Allow inbound TCP on port 9731 in Windows Firewall if the phone cannot connect.
apps/desktop/ Tauri shell + React UI
apps/remote/ Mobile control SPA (mounted at /control/)
packages/config/ SkyConfig, merge, WS message types
packages/types/ Shared TypeScript types
packages/ui/ UI primitives
packages/renderer/ Dome scene + SkylightCeilingView wrapper
packages/skylight/ Skylight ceiling renderer (geo, celestial, Canvas)
packages/coordinates/ Lat/lon → ENU → projection math
crates/ Rust: sky-core, aircraft-provider, airport-data
See docs/architecture.md.
Live mode uses Airplanes.live (non-commercial). See docs/data-sources.md.
Copy GLB files into apps/desktop/public/models/ (airplane.glb + per-type files like b738.glb). See apps/desktop/public/models/README.md.
- Dome:
@skyos/coordinates+sky-core— lat/lon → ENU meters → unit sphere; azimuth/elevation UV for legacy helpers - Ceiling:
@skyos/skylight— map (flat ground plan) or sky (look-up dome with altitude-aware motion); runways drawn at true geographic position with reallengthMeters/widthMeters(OurAirports)
pnpm --filter @skyos/config test
pnpm --filter @skyos/renderer test
pnpm --filter @skyos/skylight test
pnpm --filter @skyos/coordinates test
cargo test -p aircraft-provider
cargo test -p skyos-desktop