Your Own Global Anomalous Research Toolkit
Map-centric OSINT command center for UAP / UFO and related anomalous research: official disclosures, civilian report mirrors, live sensors, social and news feeds, prediction markets, and personal locations of interest, on one map.
Built with Next.js, TypeScript, Tailwind CSS, and Leaflet. Core feeds work with no API keys. Optional keys unlock denser context (thermal, vessels, ADS-B Exchange, X API refresh) for researchers who invest in those sources.
YOGART is a viewer. It does not own or generate the underlying data. Feeds belong to their providers and are credited in the UI and below.
Investigating anomalous phenomena usually means stitching together many public sources by hand: a civilian report here, ADS-B nearby, a fireball or thermal hotspot that same night, official disclosure records, news and social chatter, maybe space weather. That work is slow, easy to get wrong, and hard to hand to a peer for review with provenance intact.
There is still a large gap in open tooling that helps researchers:
- Correlate historical and real-time public data to the time and place of an event they are investigating
- Share that correlated view in a form others can import, check, and critique
YOGART aims to fill that gap. It is local-first and map-centric: honest attribution on every item, deconfliction flagged for human review (never auto-dismissed), and portable packs where they already exist (Locations of Interest import/export today). Broader shareable case packs and permalink views are on the roadmap.
- Quick start
- Features and how to use
- Optional API keys
- Data sources
- Contributing
- Architecture
- Credits and attribution
- Legal disclaimer
- License
Prerequisite: Node.js 22 (see .nvmrc).
npm install # or: npm ci
npm run devOpen http://localhost:3000.
Core features run without any keys. To enable optional feeds, create .env.local (see Optional API keys), then restart the dev server.
npm run build
npm startMulti-stage image, non-root user. No keys required for core features.
docker compose up --buildOpen http://localhost:3000. Stop with Ctrl+C or docker compose down.
docker build -t yogart .
docker run --rm -p 3000:3000 yogartPass optional keys with -e (for example -e FIRMS_MAP_KEY=...) or via docker-compose.yml. Map a different host port with -p 8080:3000.
The center of the app is a Leaflet map (CONUS default). Use the bottom MetricsBar tabs (Official | Social | Markets | Civilian | Alerts) to open the left rail. Re-click the active tab to collapse both rails for a full-bleed map; click any tab again to restore. Map position, zoom, basemap, layer visibility, and rail state persist in the browser.
Top-right chrome (when relevant): Air → LOIs → Layers → Basemap (Map | Satellite). Header controls include Filters, Sources, theme (DARK / LIGHT), and space-weather / flare chips when those feeds are live.
- Official — PURSUE disclosure CSV (local mirror), including NASA agency rows
- Civilian — merged NUFORC, GACUF, and MUFON local CSV mirrors (no live scrape)
- Alerts — client-side spatial/temporal clusters with fly-to on the cluster center
Open Filters in the header to search text, set UTC date bounds, filter by source, minimum credibility, coords-only, or flagged-for-review. Filters apply to panels, map report layers, clusters, and the Review rail.
Click a row to open the detail drawer (media when present, credibility, deconflict matches, attribution links) and fly to the map when coordinates exist. Credibility chips are descriptive (1–5), not verdicts. Review flags matches for you; YOGART never auto-dismisses a report.
Screenshot:
docs/screenshots/report-drawer.png— Report detail drawer
Open Layers and toggle nests as needed. Common research layers:
| Nest / layer | What you get | Notes |
|---|---|---|
| Fireballs | NASA CNEOS airbursts | Default on |
| Thermal | NASA FIRMS VIIRS hotspots | Needs FIRMS_MAP_KEY |
| Mil air / Civ air | Live ADS-B | Free via adsb.lol; optional ADSBX provider |
| Quakes | USGS M4.5+ (day) | Default off |
| Starlink | CelesTrak TLE positions | Default off |
| Vessels | AISStream marine traffic | Needs AISSTREAM_API_KEY |
| Infrastructure | Nuclear, silos, airports, ports, US bases by service, … | Local GeoJSON mirrors; mostly default off |
| Historical / LOIs | Memorial sites, OEM LOI, Personal LOI | See Locations of interest |
| Parks / public land | NPS + sample state parks | Default off |
| Allied / foreign bases | Non-US sample bases | Default off |
Each layer row has Size / Alpha sliders. Marker shapes in the legend match the map.
Screenshot:
docs/screenshots/layers.png— Layers panel with nests open
When Mil and/or Civ air layers are on, the Air chip opens the inspect panel: filter by query, altitude band, pool (All / Mil / Civ), and squawk interest; select a flight from the list or map; Follow across polls; Isolate and Labels; short client-side trails; optional altitude coloring and range rings; telemetry card for the selection.
Default air provider is adsb.lol (no key). Switch to ADSBX in the Air panel if you have configured ADSBX_API_KEY (RapidAPI). That path can also enrich selected-hex trail polling.
Screenshot:
docs/screenshots/air-inspect.png— Air panel with a selected aircraft
Social merges Reddit Atom, Google News RSS, curated outlet RSS, YouTube Atom, and X/Twitter (RSS by default). Section chips: All | Reddit | News | Video | X. Use Manage sources to add up to five extra Reddit subs, YouTube channel IDs, or X handles (stored in the browser; shipped seeds stay).
X automatic polling uses RSS only. If you set X_BEARER_TOKEN, you can press Refresh from X API for a manual API pull (never auto-polled, to control cost).
Markets lists relevant Polymarket outcomes from the public Gamma search API.
Screenshot:
docs/screenshots/social.png— Social / News panel
LOI (gold, read-only) ships an OEM CONUS pack. Personal LOI (teal) is editable in the browser (cap 1000), with create/edit drawer, multi YouTube/X links, Wikipedia media, and categories/tags.
Open LOIs to browse All | LOI | Personal LOI with search and filters. Select a pin to open the view card. From Manage LOIs you can Export / Import yogart-loi-pack JSON (merge or replace). That is the main share path today: export a pack, send it to a colleague, they import it.
Screenshot:
docs/screenshots/loi-browser.png— LOI browser
Screenshot:docs/screenshots/loi-view.png— LOI view card / pack export
Header Sources shows aggregate feed status. Open it for per-source age, poll interval, errors, and docs links. Missing optional keys show as unconfigured (not “down”). AISStream 429s show as rate limited.
Screenshot:
docs/screenshots/sources.png— Sources health dialog
| Today | Coming next (roadmap) |
|---|---|
| LOI pack import/export for peer handoff | Exportable case packs of filtered / flagged items |
| Local-first notes, filters, map session in your browser | Shareable permalink that restores map + chrome state |
YOGART is useful out of the box. Optional keys make it a denser research toolkit when you already have (or want) access to those upstream services. All keys are server-side via .env.local (never commit this file).
| Env var | Cost | What it unlocks |
|---|---|---|
FIRMS_MAP_KEY |
Free | NASA FIRMS thermal (VIIRS) map layer |
AISSTREAM_API_KEY |
Free tier | Marine vessels (AIS) map layer |
ADSBX_API_KEY |
Paid (RapidAPI) | ADS-B Exchange Community as Air provider + selected-hex enrich |
X_BEARER_TOKEN |
X developer access | Manual Refresh from X API only (RSS remains the automatic path) |
NITTER_BASE_URL or X_RSS_BASE_URL |
Optional | Override the default X RSS base (https://rss.gurify.com) |
In the repo root:
# Free
FIRMS_MAP_KEY=your_firms_map_key
AISSTREAM_API_KEY=your_aisstream_key
# Paid / developer (optional)
ADSBX_API_KEY=your_rapidapi_key
X_BEARER_TOKEN=your_x_bearer_token
# Optional X RSS override
# NITTER_BASE_URL=https://your-rss-host.example
# X_RSS_BASE_URL=https://your-rss-host.exampleRestart npm run dev (or recreate the Docker container) after changes. Check Sources in the header: newly configured feeds should leave unconfigured once the first successful poll lands.
- Open the NASA FIRMS MAP_KEY signup.
- Request a free map key (email delivery; follow NASA’s instructions).
- Set
FIRMS_MAP_KEYin.env.localand restart. - Enable Thermal under Layers (or rely on auto-on when the key is present and session allows).
FIRMS rate limits apply (see FIRMS docs). YOGART caches the Area CSV (CONUS VIIRS SNPP NRT, 2-day window).
- Create an account at AISStream.
- Generate an API key from their dashboard.
- Set
AISSTREAM_API_KEYin.env.localand restart. - Enable Vessels under the marine Layers nest.
YOGART opens a short WebSocket collect window over CONUS + Gulf bboxes. If you hit rate limits, Sources will show rate limited rather than treating the feed as hard-down.
Core air tracking uses adsb.lol with no key. ADSBX is for researchers who want Exchange Community coverage under RapidAPI’s terms.
- Open the ADS-B Exchange Community API on RapidAPI.
- Subscribe to a plan that fits your use (read RapidAPI and ADSBX terms; non-commercial limits often apply).
- Copy your RapidAPI key (not a separate “Exchange gateway” password).
- Set
ADSBX_API_KEYto that RapidAPI key in.env.localand restart. - In the Air panel, switch the provider from
adsb.loltoADSBX.
This is the RapidAPI Community product (adsbexchange-com1), not the commercial api-auth gateway. Attribute ADS-B Exchange in any work you publish from the feed.
Automatic X rows come from RSS (default host https://rss.gurify.com). A bearer token is optional and never used on the automatic poll.
- Create a developer app in the X Developer Portal and obtain an app Bearer Token.
- Set
X_BEARER_TOKENin.env.localand restart. - In the Social panel, use Refresh from X API when you want an explicit API pull.
Respect X API pricing and rate limits. Prefer RSS for routine monitoring.
If the default RSS host is down or you run your own Nitter-class / RSS bridge, set either env var to the base URL (no trailing path required beyond what your host expects). Leave unset to use the shipped default.
docker run --rm -p 3000:3000 \
-e FIRMS_MAP_KEY=... \
-e AISSTREAM_API_KEY=... \
-e ADSBX_API_KEY=... \
yogartOr define the same variables under environment: in docker-compose.yml.
Most endpoints are free and public. Civilian and PURSUE CSVs ship as local mirrors you can replace with your own lawful exports. Cache TTLs, stale-on-failure behavior, and per-source rules for implementers live in AGENTS.md.
| Source | Route | Key? | Notes |
|---|---|---|---|
| NASA CNEOS fireballs | /api/cneos |
No | SSD JSON API |
| NASA FIRMS thermal | /api/firms |
FIRMS_MAP_KEY |
CONUS VIIRS SNPP NRT |
| Social / News / X | /api/social |
Optional X | Reddit, Google News, outlets, YouTube, X RSS; extras via query params |
| X API refresh | POST /api/social/x-refresh |
X_BEARER_TOKEN |
Manual only |
| Official PURSUE | /api/official |
No | Local mirror (+ optional upstream refresh) |
| Polymarket | /api/polymarket |
No | Gamma public-search |
| adsb.lol military | /api/adsb |
No | Proxy; CONUS / viewport |
| adsb.lol civilian | /api/adsb-civ |
No | Multi-tile CONUS / viewport |
| ADSBX mil / civ / hex | /api/adsbx, /api/adsbx-civ, /api/adsbx/hex |
ADSBX_API_KEY |
RapidAPI Community |
| Starlink | /api/starlink |
No | CelesTrak TLE |
| USGS earthquakes | /api/disasters |
No | M4.5+ day |
| AISStream vessels | /api/ais |
AISSTREAM_API_KEY |
WebSocket snapshot |
| Solar flares | /api/solar-flares |
No | NOAA SWPC GOES |
| Space weather / aurora | /api/space-weather |
No | NOAA SWPC Kp, solar wind, OVATION |
| Schumann | /api/schumann, /api/schumann/image, /api/schumann/history |
No | Tomsk live image + local history sample |
| NUFORC / GACUF / MUFON | /api/nuforc, /api/gacuf, /api/mufon |
No | Local mirrors only |
| Layer | Provider | License |
|---|---|---|
| Dark / light basemap | CARTO | ODbL / CARTO |
| Satellite basemap | Esri World Imagery (toggle) | See Esri ToS |
| Country borders | Natural Earth | Public domain |
| Map engine | Leaflet | BSD-2-Clause |
Issues and pull requests are welcome. Prefer small, focused diffs that match existing style.
- Fork and branch from
main - Use Node.js 22;
npm installthennpm run dev - Keep secrets out of git (use
.env.local) - Before opening a PR, verify
npm run buildsucceeds - Attribution is required on every new rendered item and map popup. Never omit source credits.
- Domain behavior (map center, sources, keywords, colors, layer registry) lives in
src/domains/. New map layers: add aMapLayerId, amapLayersrow, mount the layer component, and wirevisible={visibility[id]}.
Coding conventions, API envelope rules, and the live product inventory for agents and humans are in AGENTS.md. Screenshot placeholders for docs are listed under docs/screenshots/.
No test framework yet; Vitest + Testing Library is the preferred direction when adding one.
| Path | Purpose |
|---|---|
src/domains/ |
Domain config (map, sources, keywords, colors, layers) |
src/app/api/ |
Polling proxies + in-memory TTL cache |
src/lib/ |
Fetcher, cache, parsers, hooks, geocode, deconflict, … |
src/components/map/ |
Map shell + layers |
src/components/panels/ |
Dashboard panels |
src/types/ |
Shared TypeScript types |
public/data/ |
Local CSV / GeoJSON / LOI pack mirrors |
Config-driven layout inspired by IRONSIGHT. Map center, sources, keywords, marker colors, and panel order come from src/domains/uap-domain.ts.
┌──────────────┬──────────────┬──────────────┬──────────────┐
│ Header │ Map │ Left panels │ Right panels │
│ (filters, │ (Leaflet) │ (Official, │ (Review / │
│ sources, │ │ Social, │ companion) │
│ theme) │ │ Markets, │ │
│ │ │ Civilian, │ │
│ │ │ Alerts) │ │
├──────────────┴──────────────┴──────────────┴──────────────┤
│ API routes (server cache + TTL, ApiEnvelope) │
│ /api/cneos /api/firms /api/social /api/official /api/adsb… │
├────────────────────────────────────────────────────────────┤
│ src/domains/uap-domain.ts │
└────────────────────────────────────────────────────────────┘
API routes return HTTP 200 with an ApiEnvelope: on upstream failure they return empty or last-good data, stale: true, and errors[]. The UI should degrade, not blank.
Descriptive only. Never auto-classify as deconflicted; flag for review. Deconflicted items use score 0 (neutral).
| Score | Meaning |
|---|---|
| 5 | Official report with corroboration |
| 4 | Multiple corroborating sources |
| 3 | Credible single source with evidence |
| 2 | Plausible but uncorroborated |
| 1 | Unverified / minimal information |
Matches against military and civilian ADS-B (and keyword checks for known mundane explanations). Never auto-dismiss. Show attribution and match details for user review.
YOGART only points at third-party feeds. Credit stays with the providers:
- Official: PURSUE / related U.S. public disclosure material; NASA agency rows via PURSUE
- Civilian: NUFORC, GACUF, MUFON (local mirrors of public sighting data)
- Air tracking: adsb.lol (ODbL 1.0); optional ADS-B Exchange via RapidAPI Community
- Thermal: NASA FIRMS
- Fireballs: NASA CNEOS
- Starlink: CelesTrak
- Earthquakes: USGS
- Vessels: AISStream
- Space weather / flares / aurora: NOAA SWPC
- Schumann spectrogram: Tomsk SOSRFF (see in-app attribution)
- Markets: Polymarket (Gamma API)
- News / social: Google News RSS (unofficial), Reddit Atom/RSS, curated outlet RSS, YouTube Atom, X/Twitter via RSS (and optional API)
- Maps: Leaflet, CARTO, © OpenStreetMap contributors, Natural Earth, Esri World Imagery (satellite toggle)
- Reference layers: local GeoJSON mirrors (nuclear, silos, airports, ports, bases, parks, memorials, LOI packs); see files under
public/data/and in-app SAMPLE notes where applicable
Open an issue if you want a source removed or attribution changed.
This project is for educational and research use. It shows how to aggregate publicly available OSINT in a web app. It is not for commercial resale of data or anything that breaks applicable law or third-party terms.
Data comes from publicly accessible endpoints or user-supplied lawful mirrors. No paywalls are bypassed and no authentication is circumvented except where you supply your own API credentials for services you are entitled to use. The UI shows headlines, links, and public metadata, not full copyrighted articles.
Some sources use unofficial or undocumented public endpoints (for example Google News RSS and community tracking or RSS bridges). Those may violate a provider's Terms of Service, can change or break without notice, and are used here for non-commercial research. Use official APIs if you run this commercially or in production.
News, social posts, market data, tracks, map tiles, and other third-party content belong to their publishers and providers. This project claims no ownership of that content.
By using this software you agree that:
- You are responsible for complying with laws and third-party terms in your jurisdiction
- Authors and contributors are not liable for misuse, TOS violations, claims, or damages
- You will not use this software for commercial data redistribution, automated trading, or other use that violates provider terms
- The software is provided "as is" without warranty of any kind
Military and related aircraft data from adsb.lol under the Open Database License (ODbL 1.0). Optional ADSBX data is subject to RapidAPI and ADS-B Exchange terms.
Basemap tiles © CARTO, map data © OpenStreetMap contributors. Satellite imagery subject to Esri terms. Country boundaries from Natural Earth (public domain).
This project is not affiliated with, endorsed by, or sponsored by the data providers, news organizations, government agencies, or military entities whose data it aggregates.

