π Live Demo Β· π Docs Β· π¬ Discussions
Pan anywhere on the world, see live aircraft. Click a plane for everything we know about it. Set a home location, and Skylog will silently learn the regulars over your roof.
Every flight tracker on the internet is amnesic. Open Flightradar24, see a plane, click away β the app forgets it instantly. There's no concept of "your sky" because there's no concept of you.
Skylog inverts that:
- It's yours. No account, no tracker, no server. Your sky data lives only in your browser's IndexedDB.
- It remembers. Every aircraft Skylog renders gets saved with its callsigns, altitudes, and timestamps. After three days you'll discover that the 737 you keep hearing at 7 AM is the same airframe (UAL841) on the same daily route.
- It tracks specific flights. Paste a callsign, get a globally pinned flight + ETA to your home + a browser notification when it's 5 km out. The single-keystroke version of "is my partner's flight on time?".
- It's worldwide. Pan to Tokyo, Frankfurt, Dubai, Lagos β wherever the airplanes.live community has feeders, Skylog shows live traffic.
| Feature | Status | |
|---|---|---|
| π | Worldwide live aircraft map (every ADS-B-equipped plane in view) | β |
| π§ | Persistent memory β every plane Skylog sees is saved to your device | β |
| π | Pattern detection β finds your "regular visitors" by weekday + hour | β |
| π― | Track a flight by callsign β paste it, pin it, follow it globally | β |
| π | Browser notification when a tracked flight is within 5 km of home | β |
| π°οΈ | ISS + Celestrak satellite overlay with 90-min ground tracks | β |
| π | Daily digest: today vs yesterday, peak hour, top regulars | β |
| π | On-device acoustic model: estimate ground-level dB(A) of any pass | β |
| ποΈ | Searchable / sortable list of every aircraft in view | β |
| π | Region presets: jump to Europe, Asia, Middle East, Oceania, etc. | β |
| π± | Mobile responsive β works on phones | β |
| β¨οΈ | Keyboard-driven (f track flight, m memory, s satellites, ? help) |
β |
| π | Zero tracking. Zero cookies. Zero accounts. MIT licensed. | β |
| Skylog | FR24 | FlightAware | ADS-B Exchange | |
|---|---|---|---|---|
| Free | β | Limited | Limited | β |
| Open source | β | β | Some | Some |
| Self-hostable | β | β | β | Partial |
| No account required | β | β | β | β |
| No third-party tracker | β | β | β | β |
| Per-aircraft persistent memory | β | β | β | β |
| Pattern detection ("regulars over your house") | β | β | β | β |
| Track a flight by callsign | β | β | β | β |
| Browser-native push alerts | β | App-only | App-only | β |
| Satellite overlay | β | β | β | β |
| Ground-level loudness estimate | β | β | β | β |
| Worldwide coverage | Community feed | Comprehensive | Comprehensive | Comprehensive |
Skylog isn't trying to win on raw data quantity. It's trying to win on knowing about your sky.
git clone https://github.com/vnmoorthy/Skylog.git
cd Skylog
pnpm install
pnpm devOpen http://localhost:5173. That's it. No env vars. No accounts. No databases to provision.
Or skip the local install and try the live demo.
The main branch auto-deploys to GitHub Pages on push (see .github/workflows/deploy.yml). Fork the repo, enable Pages with source "GitHub Actions", and your fork is live at https://YOU.github.io/Skylog/ within minutes. No backend infra. No costs.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β BROWSER β
β β
β βββββββββββ bbox poll ββββββββββββββββββββββββ β
β β MapLibreβ βββββββββββββββββΆ β airplanes.live API β β
β β canvas β βββββ states ββββ β (no auth, CORS-ok) β β
β βββββββ¬ββββ ββββββββββββββββββββββββ β
β β rAF dead-reckoning β
β β at 10 Hz between polls β
β βΌ β
β ββββββββββββββββ β
β β React UI β sightings βββββββββββββββββββββ β
β β - FlightCardβ βββββββββββββΆ β IndexedDB β β
β β - DigestCardβ βββ memory ββ β (Dexie schema) β β
β β - Memory β βββββββββββββββββββββ β
β ββββββββββββββββ β
β β
β ββββββββββββββββ ββββββββββββββββββββ β
β β TLE worker β ββ β Celestrak (TLE) β satellite.js β
β β (sat orbits) β ββββββββββββββββββββ SGP4 client-side β
β ββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Stack: Vite Β· React 18 Β· TypeScript strict Β· Tailwind Β· Zustand Β· Dexie Β· MapLibre GL Β· D3 scales Β· satellite.js Β· Web Worker for the home-radius pass logger.
Data sources:
- airplanes.live β community ADS-B network, CORS-safe, no key needed
- Celestrak β TLEs for satellite propagation
- CARTO β dark basemap tiles
- OpenSky aircraft DB β bundled aircraft type / operator metadata
This is the differentiator. Every aircraft that enters your viewport is folded into IndexedDB:
interface AircraftSighting {
icao24: string;
lastCallsign: string | null;
callsigns: readonly string[]; // every distinct callsign used
registration: string | null;
typecode: string | null;
operator: string | null;
firstSeenAt: number; // unix-ms
lastSeenAt: number;
sightingCount: number; // total polls including this aircraft
dayCount: number; // distinct UTC days seen
maxAltitudeM: number | null;
minAltitudeM: number | null;
recentDays: string; // CSV of last 30 YYYY-MM-DD
recentTimes: string; // CSV of last 100 timestamps
}The recentTimes slice powers dominantPattern(): bucket sightings by (weekday, hour) and surface any cluster of 3+ as a "regular visitor". After a week of leaving a tab open, the memory drawer reads:
Regular visitors over your sky: CMP809 β Tuesdays around 07:00, Γ7 sightings OCN642 β Tuesdays around 07:00, Γ6 sightings BAW185 β Saturdays around 13:00, Γ4 sightings
That's not data Flightradar24 will ever show you, because Flightradar24 doesn't know what your sky looks like.
For each aircraft sample, Skylog estimates ground-level A-weighted SPL using:
- Inverse-square law for geometric spreading:
L(r) = L_src - 20Β·logββ(r/1m) - ISO 9613-2:1996 Β§7.2 atmospheric absorption:
Ξ± β 0.005 dB/mat 10Β°C / 60% RH for broadband aircraft noise (~500β1000 Hz)
Combined: L_observed = L_source - 20Β·logββ(r_slant) - Ξ±Β·r_slant
Source levels are calibrated per ICAO aircraft category (HEAVY=140 dB, LARGE=135, SMALL=125, LIGHT=105, ROTORCRAFT=130) against published FAA flyover data. Constants and citations: src/lib/acoustics.ts.
A 737 at 3,000 ft directly overhead β ~71 dB. Roughly the volume of a vacuum cleaner in the next room.
What the model deliberately doesn't do: ground reflection, directivity, thrust modulation, per-frequency absorption, weather. The goal is to distinguish a 747 from a Cessna at a glance, not to replace a certified noise meter.
| Key | Action |
|---|---|
f |
Track a specific flight by callsign |
m |
Open the aircraft memory drawer |
s |
Toggle satellite overlay |
l |
Toggle the in-view aircraft list |
h |
Open home setup |
t |
Open the pass timeline (requires home) |
? |
Show this help |
esc |
Close the active panel |
pnpm install
pnpm dev # vite dev server on :5173
pnpm typecheck # tsc -b --noEmit
pnpm test # 101 unit tests
pnpm build # production build
pnpm preview # serve the production build
pnpm build:data # optional: pre-fetch OpenSky aircraft DB for richer detail panelStrict TypeScript throughout, no any. Coverage focuses on src/lib/ (geo math, acoustics, callsign parsing, dead-reckoning, sightings).
These are open issues β PRs welcome:
- Mobile installable PWA + offline support
- Time-machine: scrub backward through the last few minutes
- Webhook notifications (Discord, Slack) for tracked flights
- Public "share your sky" URL with stats
- Pluggable data sources (OpenSky direct via reverse proxy, ADS-B Exchange API)
- Plane fact cards (Wikipedia / aviation-trivia integration)
- Multi-home support
- Light theme
See issues with the good-first-issue label for places to start contributing.
PRs welcome. Read CONTRIBUTING.md first. The codebase is small and well-tested β adding a feature or fixing a bug should be straightforward.
MIT. Use it for whatever you want.
Skylog stands on the shoulders of:
- airplanes.live β the live ADS-B feed
- OpenSky Network β aircraft metadata DB
- Celestrak β satellite TLE feed
- CARTO β dark basemap
- MapLibre GL β the open-source vector map renderer
- satellite.js β SGP4 orbital propagator
- Dexie β wonderful IndexedDB wrapper
Built because I wanted to know which plane keeps waking me up at 3 AM.
If Skylog is useful to you, β star this repo so others find it.