Skip to content

Repository files navigation

YOGART Logo YOGART

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.

Mission

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:

  1. Correlate historical and real-time public data to the time and place of an event they are investigating
  2. 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.

Table of contents

Quick start

Prerequisite: Node.js 22 (see .nvmrc).

npm install   # or: npm ci
npm run dev

Open 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 start

Docker

Multi-stage image, non-root user. No keys required for core features.

docker compose up --build

Open http://localhost:3000. Stop with Ctrl+C or docker compose down.

docker build -t yogart .
docker run --rm -p 3000:3000 yogart

Pass optional keys with -e (for example -e FIRMS_MAP_KEY=...) or via docker-compose.yml. Map a different host port with -p 8080:3000.

Features and how to use

Map workspace

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): AirLOIsLayersBasemap (Map | Satellite). Header controls include Filters, Sources, theme (DARK / LIGHT), and space-weather / flare chips when those feeds are live.

Reports: Official, Civilian, Alerts

  • 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

Live context on the map

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

Air inspect

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 and Markets

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

Locations of interest

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

Sources health

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

Sharing today vs next

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

Optional API keys

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).

Summary

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)

Configure .env.local

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.example

Restart 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.

How to acquire each key

FIRMS_MAP_KEY (free) — thermal hotspots

  1. Open the NASA FIRMS MAP_KEY signup.
  2. Request a free map key (email delivery; follow NASA’s instructions).
  3. Set FIRMS_MAP_KEY in .env.local and restart.
  4. 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).

AISSTREAM_API_KEY (free tier) — marine vessels

  1. Create an account at AISStream.
  2. Generate an API key from their dashboard.
  3. Set AISSTREAM_API_KEY in .env.local and restart.
  4. 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.

ADSBX_API_KEY (paid RapidAPI) — ADS-B Exchange Community

Core air tracking uses adsb.lol with no key. ADSBX is for researchers who want Exchange Community coverage under RapidAPI’s terms.

  1. Open the ADS-B Exchange Community API on RapidAPI.
  2. Subscribe to a plan that fits your use (read RapidAPI and ADSBX terms; non-commercial limits often apply).
  3. Copy your RapidAPI key (not a separate “Exchange gateway” password).
  4. Set ADSBX_API_KEY to that RapidAPI key in .env.local and restart.
  5. In the Air panel, switch the provider from adsb.lol to ADSBX.

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.

X_BEARER_TOKEN (developer) — manual X API refresh

Automatic X rows come from RSS (default host https://rss.gurify.com). A bearer token is optional and never used on the automatic poll.

  1. Create a developer app in the X Developer Portal and obtain an app Bearer Token.
  2. Set X_BEARER_TOKEN in .env.local and restart.
  3. 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.

NITTER_BASE_URL / X_RSS_BASE_URL (optional)

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 and keys

docker run --rm -p 3000:3000 \
  -e FIRMS_MAP_KEY=... \
  -e AISSTREAM_API_KEY=... \
  -e ADSBX_API_KEY=... \
  yogart

Or define the same variables under environment: in docker-compose.yml.

Data sources

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.

Live via API routes

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

Map basemap

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

Contributing

Issues and pull requests are welcome. Prefer small, focused diffs that match existing style.

  1. Fork and branch from main
  2. Use Node.js 22; npm install then npm run dev
  3. Keep secrets out of git (use .env.local)
  4. Before opening a PR, verify npm run build succeeds
  5. Attribution is required on every new rendered item and map popup. Never omit source credits.
  6. Domain behavior (map center, sources, keywords, colors, layer registry) lives in src/domains/. New map layers: add a MapLayerId, a mapLayers row, mount the layer component, and wire visible={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.

Useful paths

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

Architecture

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.

Credibility (1–5)

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

Deconfliction

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.

Credits and attribution

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.

Legal disclaimer

Purpose and scope

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 sources

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.

Unofficial endpoints

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.

Third-party content

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.

User responsibility

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

ADS-B attribution

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.

Map attribution

Basemap tiles © CARTO, map data © OpenStreetMap contributors. Satellite imagery subject to Esri terms. Country boundaries from Natural Earth (public domain).

No endorsement

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.

License

MIT