26-source OSINT intelligence engine with live Jarvis dashboard, auto-refresh via SSE, optional LLM layer (4 providers), delta/memory system, and Telegram breaking news alerts. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
269 lines
12 KiB
Markdown
269 lines
12 KiB
Markdown
# Crucix
|
|
|
|
**Local intelligence engine. 26 OSINT sources. One command. Zero cloud dependency.**
|
|
|
|
Crucix aggregates open-source intelligence from 26 data sources in parallel — satellite fire detection, flight tracking, radiation monitoring, economic indicators, live market prices, conflict data, sanctions lists, social sentiment, and more — and renders it as a real-time Jarvis-style dashboard that auto-refreshes every 15 minutes.
|
|
|
|
Everything runs on your machine. No telemetry, no SaaS, no subscriptions required for core functionality.
|
|
|
|
---
|
|
|
|
## Quick Start
|
|
|
|
```bash
|
|
# 1. Clone the repo
|
|
git clone https://github.com/YOUR_USERNAME/crucix.git
|
|
cd crucix
|
|
|
|
# 2. Install dependencies (just Express)
|
|
npm install
|
|
|
|
# 3. Copy env template and add your API keys (see below)
|
|
cp .env.example .env
|
|
|
|
# 4. Start the dashboard
|
|
npm run dev
|
|
```
|
|
|
|
The dashboard opens automatically at `http://localhost:3117`, runs the first intelligence sweep, and auto-refreshes every 15 minutes via SSE (Server-Sent Events). No manual page refresh needed.
|
|
|
|
**Requirements:** Node.js 22+ (uses native `fetch`, top-level `await`, ESM)
|
|
|
|
---
|
|
|
|
## What You Get
|
|
|
|
### Live Dashboard
|
|
A self-contained Jarvis-style HUD with:
|
|
- **D3 world map** with 7 marker types (fire detections, air traffic, radiation sites, maritime chokepoints, SDR receivers, OSINT events, health alerts, geolocated news)
|
|
- **Region filters** (World, Americas, Europe, Middle East, Asia Pacific, Africa) with smooth zoom transitions
|
|
- **Live market data** — indexes, crypto, energy, commodities via Yahoo Finance (no API key needed)
|
|
- **Risk gauges** — VIX, high-yield spread, supply chain pressure index
|
|
- **OSINT feed** — English-language posts from 12 Telegram intelligence channels
|
|
- **News ticker** — merged RSS + GDELT headlines + Telegram posts, auto-scrolling
|
|
- **Nuclear watch** — real-time radiation readings from Safecast + EPA RadNet
|
|
- **Leverageable ideas** — AI-generated trade ideas (with LLM) or signal-correlated ideas (without)
|
|
|
|
### Auto-Refresh
|
|
The server runs a sweep cycle every 15 minutes (configurable). Each cycle:
|
|
1. Queries all 26 sources in parallel (~30s)
|
|
2. Synthesizes raw data into dashboard format
|
|
3. Computes delta from previous run (what changed, escalated, de-escalated)
|
|
4. Generates LLM trade ideas (if configured)
|
|
5. Evaluates Telegram breaking news alerts (if configured)
|
|
6. Pushes update to all connected browsers via SSE
|
|
|
|
### Optional LLM Layer
|
|
Connect any of 4 LLM providers for enhanced analysis:
|
|
- **AI trade ideas** — quantitative analyst producing 5-8 actionable ideas citing specific data
|
|
- **Breaking news alerts** — Telegram notifications when critical signals emerge
|
|
- Providers: Anthropic Claude, OpenAI, Google Gemini, OpenAI Codex (ChatGPT subscription)
|
|
- Graceful fallback — LLM failures never crash the sweep cycle
|
|
|
|
---
|
|
|
|
## API Keys Setup
|
|
|
|
Copy `.env.example` to `.env` at the project root:
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
```
|
|
|
|
### Required for Best Results (all free)
|
|
|
|
| Key | Source | How to Get |
|
|
|-----|--------|------------|
|
|
| `FRED_API_KEY` | Federal Reserve Economic Data | [fred.stlouisfed.org](https://fred.stlouisfed.org/docs/api/api_key.html) — instant, free |
|
|
| `FIRMS_MAP_KEY` | NASA FIRMS (satellite fire data) | [firms.modaps.eosdis.nasa.gov](https://firms.modaps.eosdis.nasa.gov/api/area/) — instant, free |
|
|
| `EIA_API_KEY` | US Energy Information Administration | [api.eia.gov](https://www.eia.gov/opendata/register.php) — instant, free |
|
|
|
|
These three unlock the most valuable economic and satellite data. Each takes about 60 seconds to register.
|
|
|
|
### Optional (enable additional sources)
|
|
|
|
| Key | Source | How to Get |
|
|
|-----|--------|------------|
|
|
| `ACLED_EMAIL` + `ACLED_PASSWORD` | Armed conflict event data | [acleddata.com/register](https://acleddata.com/register/) — free, OAuth2 |
|
|
| `AISSTREAM_API_KEY` | Maritime AIS vessel tracking | [aisstream.io](https://aisstream.io/) — free |
|
|
| `ADSB_API_KEY` | Unfiltered flight tracking | [RapidAPI](https://rapidapi.com/adsbexchange/api/adsbexchange-com1) — ~$10/mo |
|
|
|
|
### LLM Provider (optional, for AI-enhanced ideas)
|
|
|
|
Set `LLM_PROVIDER` to one of: `anthropic`, `openai`, `gemini`, `codex`
|
|
|
|
| Provider | Key Required | Default Model |
|
|
|----------|-------------|---------------|
|
|
| `anthropic` | `LLM_API_KEY` | claude-sonnet-4-20250514 |
|
|
| `openai` | `LLM_API_KEY` | gpt-4o |
|
|
| `gemini` | `LLM_API_KEY` | gemini-2.0-flash |
|
|
| `codex` | None (uses `~/.codex/auth.json`) | gpt-5.2-codex |
|
|
|
|
For Codex, run `npx @openai/codex login` to authenticate via your ChatGPT subscription.
|
|
|
|
### Telegram Alerts (optional, requires LLM)
|
|
|
|
| Key | How to Get |
|
|
|-----|------------|
|
|
| `TELEGRAM_BOT_TOKEN` | Create via [@BotFather](https://t.me/BotFather) on Telegram |
|
|
| `TELEGRAM_CHAT_ID` | Get via [@userinfobot](https://t.me/userinfobot) |
|
|
|
|
### Without Any Keys
|
|
|
|
Crucix still works with zero API keys. 18+ sources require no authentication at all. Sources that need keys return structured errors and the rest of the sweep continues normally.
|
|
|
|
---
|
|
|
|
## Architecture
|
|
|
|
```
|
|
crucix/
|
|
├── server.mjs # Express dev server (SSE, auto-refresh, LLM orchestration)
|
|
├── crucix.config.mjs # Configuration with env var overrides
|
|
├── .env.example # All documented env vars
|
|
├── package.json # Single dependency: express
|
|
│
|
|
├── apis/
|
|
│ ├── briefing.mjs # Master orchestrator — runs all 26 sources in parallel
|
|
│ ├── save-briefing.mjs # CLI: save timestamped + latest.json
|
|
│ ├── BRIEFING_PROMPT.md # Intelligence synthesis protocol
|
|
│ ├── BRIEFING_TEMPLATE.md # Briefing output structure
|
|
│ ├── utils/
|
|
│ │ ├── fetch.mjs # safeFetch() — timeout, retries, abort, auto-JSON
|
|
│ │ └── env.mjs # .env loader (no dotenv dependency)
|
|
│ └── sources/ # 26 self-contained source modules
|
|
│ ├── gdelt.mjs # Each exports briefing() → structured data
|
|
│ ├── fred.mjs # Can run standalone: node apis/sources/fred.mjs
|
|
│ ├── yfinance.mjs # Yahoo Finance — free live market data
|
|
│ └── ... # 23 more
|
|
│
|
|
├── dashboard/
|
|
│ ├── inject.mjs # Data synthesis + standalone HTML injection
|
|
│ └── public/
|
|
│ └── jarvis.html # Self-contained Jarvis HUD
|
|
│
|
|
├── lib/
|
|
│ ├── llm/ # LLM abstraction (4 providers, raw fetch, no SDKs)
|
|
│ │ ├── provider.mjs # Base class
|
|
│ │ ├── anthropic.mjs # Claude
|
|
│ │ ├── openai.mjs # GPT
|
|
│ │ ├── gemini.mjs # Gemini
|
|
│ │ ├── codex.mjs # Codex (ChatGPT subscription)
|
|
│ │ ├── ideas.mjs # LLM-powered trade idea generation
|
|
│ │ └── index.mjs # Factory: createLLMProvider()
|
|
│ ├── delta/ # Change tracking between sweeps
|
|
│ │ ├── engine.mjs # Delta computation (new/escalated/de-escalated/removed)
|
|
│ │ ├── memory.mjs # Hot memory (3 runs) + cold storage (daily archives)
|
|
│ │ └── index.mjs # Re-exports
|
|
│ └── alerts/
|
|
│ └── telegram.mjs # Breaking news alerts via Telegram
|
|
│
|
|
└── runs/ # Runtime data (gitignored)
|
|
├── latest.json # Most recent sweep output
|
|
└── memory/ # Delta memory (hot + cold storage)
|
|
```
|
|
|
|
### Design Principles
|
|
- **Pure ESM** — every file is `.mjs` with explicit imports
|
|
- **Minimal dependencies** — Express is the only runtime dependency. LLM providers use raw `fetch()`, no SDKs.
|
|
- **Parallel execution** — `Promise.allSettled()` fires all 26 sources simultaneously
|
|
- **Graceful degradation** — missing keys produce errors, not crashes. LLM failures don't kill sweeps.
|
|
- **Each source is standalone** — run `node apis/sources/gdelt.mjs` to test any source independently
|
|
- **Self-contained dashboard** — the HTML file works with or without the server
|
|
|
|
---
|
|
|
|
## Data Sources (26)
|
|
|
|
### Tier 1: Core OSINT & Geopolitical (11)
|
|
|
|
| Source | What It Tracks | Auth |
|
|
|--------|---------------|------|
|
|
| **GDELT** | Global news events, conflict mapping (100+ languages) | None |
|
|
| **OpenSky** | Real-time ADS-B flight tracking across 6 hotspot regions | None |
|
|
| **NASA FIRMS** | Satellite fire/thermal anomaly detection (3hr latency) | Free key |
|
|
| **Maritime/AIS** | Vessel tracking, dark ships, sanctions evasion | Free key |
|
|
| **Safecast** | Citizen-science radiation monitoring near 6 nuclear sites | None |
|
|
| **ACLED** | Armed conflict events: battles, explosions, protests | Free (OAuth2) |
|
|
| **ReliefWeb** | UN humanitarian crisis tracking | None |
|
|
| **WHO** | Disease outbreaks and health emergencies | None |
|
|
| **OFAC** | US Treasury sanctions (SDN list) | None |
|
|
| **OpenSanctions** | Aggregated global sanctions (30+ sources) | Partial |
|
|
| **ADS-B Exchange** | Unfiltered flight tracking including military | Paid |
|
|
|
|
### Tier 2: Economic & Financial (7)
|
|
|
|
| Source | What It Tracks | Auth |
|
|
|--------|---------------|------|
|
|
| **FRED** | 22 key indicators: yield curve, CPI, VIX, fed funds, M2 | Free key |
|
|
| **US Treasury** | National debt, yields, fiscal data | None |
|
|
| **BLS** | CPI, unemployment, nonfarm payrolls, PPI | None |
|
|
| **EIA** | WTI/Brent crude, natural gas, inventories | Free key |
|
|
| **GSCPI** | NY Fed Global Supply Chain Pressure Index | None |
|
|
| **USAspending** | Federal spending and defense contracts | None |
|
|
| **UN Comtrade** | Strategic commodity trade flows between major powers | None |
|
|
|
|
### Tier 3: Weather, Environment, Tech, Social, SIGINT (7)
|
|
|
|
| Source | What It Tracks | Auth |
|
|
|--------|---------------|------|
|
|
| **NOAA/NWS** | Active US weather alerts | None |
|
|
| **EPA RadNet** | US government radiation monitoring | None |
|
|
| **USPTO Patents** | Patent filings in 7 strategic tech areas | None |
|
|
| **Bluesky** | Social sentiment on geopolitical/market topics | None |
|
|
| **Reddit** | Social sentiment from key subreddits | OAuth |
|
|
| **Telegram** | 12 curated OSINT/conflict channels (web scraping) | None |
|
|
| **KiwiSDR** | Global HF radio receiver network (~600 receivers) | None |
|
|
|
|
### Tier 4: Live Market Data (1)
|
|
|
|
| Source | What It Tracks | Auth |
|
|
|--------|---------------|------|
|
|
| **Yahoo Finance** | Real-time prices: SPY, QQQ, BTC, Gold, WTI, VIX + 9 more | None |
|
|
|
|
---
|
|
|
|
## npm Scripts
|
|
|
|
| Script | Command | Description |
|
|
|--------|---------|-------------|
|
|
| `npm run dev` | `node server.mjs` | Start dashboard with auto-refresh |
|
|
| `npm run sweep` | `node apis/briefing.mjs` | Run a single sweep, output JSON to stdout |
|
|
| `npm run inject` | `node dashboard/inject.mjs` | Inject latest data into static HTML |
|
|
| `npm run brief:save` | `node apis/save-briefing.mjs` | Run sweep + save timestamped JSON |
|
|
|
|
---
|
|
|
|
## Configuration
|
|
|
|
All settings are in `.env` with sensible defaults:
|
|
|
|
| Variable | Default | Description |
|
|
|----------|---------|-------------|
|
|
| `PORT` | `3117` | Dashboard server port |
|
|
| `REFRESH_INTERVAL_MINUTES` | `15` | Auto-refresh interval |
|
|
| `LLM_PROVIDER` | disabled | `anthropic`, `openai`, `gemini`, or `codex` |
|
|
| `LLM_API_KEY` | — | API key (not needed for codex) |
|
|
| `LLM_MODEL` | per-provider default | Override model selection |
|
|
| `TELEGRAM_BOT_TOKEN` | disabled | For breaking news alerts |
|
|
| `TELEGRAM_CHAT_ID` | — | Your Telegram chat ID |
|
|
|
|
---
|
|
|
|
## API Endpoints
|
|
|
|
When running `npm run dev`:
|
|
|
|
| Endpoint | Description |
|
|
|----------|-------------|
|
|
| `GET /` | Jarvis HUD dashboard |
|
|
| `GET /api/data` | Current synthesized intelligence data (JSON) |
|
|
| `GET /api/health` | Server status, uptime, source count, LLM status |
|
|
| `GET /events` | SSE stream for live push updates |
|
|
|
|
---
|
|
|
|
## License
|
|
|
|
MIT
|