[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-74325":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":30,"readmeContent":31,"aiSummary":32,"trendingCount":16,"starSnapshotCount":16,"syncStatus":33,"lastSyncTime":34,"discoverSource":35},74325,"Crucix","calesthio\u002FCrucix","calesthio","Your personal intelligence agent. Watches the world from multiple data sources and pings you when something changes.","https:\u002F\u002Fcrucix.live",null,"JavaScript",10214,1619,57,34,0,30,79,477,90,119.63,"GNU Affero General Public License v3.0",false,"master",true,[27,28,29],"ai","intelligence","osint","2026-06-12 04:01:14","\u003Cdiv align=\"center\">\n\n# Crucix\n\n**Your own intelligence terminal. 27 sources. One command. Zero cloud.**\n\n## [Visit The Live Site: crucix.live](https:\u002F\u002Fwww.crucix.live\u002F)\n\n[![Live Website](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flive-crucix.live-00d4ff?style=for-the-badge)](https:\u002F\u002Fwww.crucix.live\u002F)\n[![Open Demo](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fopen-live%20dashboard-0b1220?style=for-the-badge&logo=googlechrome&logoColor=white)](https:\u002F\u002Fwww.crucix.live\u002F)\n\n[![Node.js 22+](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fnode-22%2B-brightgreen)](#quick-start)\n[![License: AGPL v3](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-AGPLv3-blue.svg)](LICENSE)\n[![Dependencies](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdependencies-1%20(express)-orange)](#architecture)\n[![Sources](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FOSINT%20sources-27-cyan)](#data-sources-27)\n[![Docker](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdocker-ready-blue?logo=docker)](#docker)\n\n**Enter The Signal Network**\n\n[![Signal Wire](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSignal%20Wire-%40crucixmonitor-111111?style=for-the-badge&logo=x&logoColor=white)](https:\u002F\u002Fx.com\u002Fcrucixmonitor)\n[![Ops Room](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FOps%20Room-Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https:\u002F\u002Fdiscord.gg\u002FChVy7SF4)\n\n![Crucix Dashboard](docs\u002Fdashboard.png)\n\n\u003Cdetails>\n\u003Csummary>More screenshots\u003C\u002Fsummary>\n\n| Boot Sequence | World Map |\n|:---:|:---:|\n| ![Boot](docs\u002Fboot.png) | ![Map](docs\u002Fmap.png) |\n\n| 3D Globe View |\n|:---:|\n| ![Globe](docs\u002Fglobe.png) |\n\n\u003C\u002Fdetails>\n\n\u003C\u002Fdiv>\n\n> **Live website:** [https:\u002F\u002Fwww.crucix.live\u002F](https:\u002F\u002Fwww.crucix.live\u002F)\n> Explore the public demo first, then clone the repo to run Crucix locally.\n\nCrucix pulls satellite fire detection, flight tracking, radiation monitoring, satellite constellation tracking, economic indicators, live market prices, conflict data, sanctions lists, and social sentiment from 27 open-source intelligence feeds — in parallel, every 15 minutes — and renders everything on a single self-contained Jarvis-style dashboard.\n\nHook it up to an LLM and it becomes a **two-way intelligence assistant** — pushing multi-tier alerts to Telegram and Discord when something meaningful changes, responding to commands like `\u002Fbrief` and `\u002Fsweep` from your phone, and generating actionable trade ideas grounded in real cross-domain data. Your own analyst that watches the world while you sleep.\n\nTry the live demo first at [https:\u002F\u002Fwww.crucix.live\u002F](https:\u002F\u002Fwww.crucix.live\u002F), then clone the repo when you want the full local stack.\n\nNo cloud. No telemetry. No subscriptions. Just `node server.mjs` and you're running.\n\n## Token \u002F Asset Warning\n\n> [!WARNING]\n> **Crucix has not launched any official token, coin, NFT, airdrop, presale, or other blockchain-based asset.**\n> Any token or digital asset using the Crucix name, logo, or branding is not affiliated with or endorsed by Crucix.\n> Do not buy it, promote it, connect a wallet to claim it, sign transactions, or send funds based on third-party posts, DMs, or websites.\n\n---\n\n## Why This Exists\n\nMost of the world's real-time intelligence — satellite imagery, radiation levels, conflict events, economic indicators, flight tracking, maritime activity — is publicly available. It's just scattered across dozens of government APIs, research institutions, and open data feeds that nobody has time to check individually.\n\nCrucix brings it all into one place. Not behind a paywall, not locked in an enterprise platform, not requiring a security clearance. Just open data, aggregated and cross-correlated on your own machine, updated every 15 minutes.\n\nIt was built for anyone who wants to understand what's actually happening in the world right now — researchers, journalists, traders, OSINT analysts, or just curious people who believe access to information shouldn't depend on your budget.\n\n---\n\n## Quick Start\n\n```bash\n# 1. Clone the repo\ngit clone https:\u002F\u002Fgithub.com\u002Fcalesthio\u002FCrucix.git\ncd Crucix\n\n# 2. Install dependencies (just Express)\nnpm install\n\n# 3. Copy env template and add your API keys (see below)\ncp .env.example .env\n\n# 4. Start the dashboard\nnpm run dev\n```\n\n> **If `npm run dev` fails silently** (exits with no output), run Node directly instead:\n> ```bash\n> node --trace-warnings server.mjs\n> ```\n> This bypasses npm's script runner, which can swallow errors on some systems (particularly PowerShell on Windows). You can also run `node diag.mjs` to diagnose the exact issue — it checks your Node version, tests each module import individually, and verifies port availability. See [Troubleshooting](#troubleshooting) for more.\n\nThe dashboard opens automatically at `http:\u002F\u002Flocalhost:3117` and immediately begins its first intelligence sweep. This initial sweep queries all 27 sources in parallel and typically takes 30–60 seconds — the dashboard will appear empty until the sweep completes and pushes the first data update. After that, it auto-refreshes every 15 minutes via SSE (Server-Sent Events). No manual page refresh needed.\n\n**Requirements:** Node.js 22+ (uses native `fetch`, top-level `await`, ESM)\n\n### Docker\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fcalesthio\u002FCrucix.git\ncd Crucix\ncp .env.example .env    # add your API keys\ndocker compose up -d\n```\n\nDashboard at `http:\u002F\u002Flocalhost:3117`. Sweep data persists in `.\u002Fruns\u002F` via volume mount. Includes a health check endpoint.\n\n---\n\n## What You Get\n\n### Live Dashboard\nA self-contained Jarvis-style HUD with:\n- **3D WebGL globe** (Globe.gl) with atmosphere glow, star field, and smooth rotation — plus a classic flat map toggle\n- **9 marker types** across both views: fire detections, air traffic, radiation sites, maritime chokepoints, SDR receivers, OSINT events, health alerts, geolocated news, conflict events\n- **Animated 3D flight corridor arcs** between air traffic hotspots and global hubs\n- **Region filters** (World, Americas, Europe, Middle East, Asia Pacific, Africa) — rotates the globe or zooms the flat map\n- **Live market data** — indexes, crypto, energy, commodities via Yahoo Finance (no API key needed)\n- **Risk gauges** — VIX, high-yield spread, supply chain pressure index\n- **OSINT feed** — English-language posts from 17 Telegram intelligence channels (expandable)\n- **News ticker** — merged RSS + GDELT headlines + Telegram posts, auto-scrolling\n- **Sweep delta** — live panel showing what changed since last sweep (new signals, escalations, de-escalations with severity)\n- **Cross-source signals** — correlated intelligence across satellite, economic, conflict, and social domains\n- **Nuclear watch** — real-time radiation readings from Safecast + EPA RadNet\n- **Space watch** — CelesTrak satellite tracking: recent launches, ISS, military constellations, Starlink\u002FOneWeb counts\n- **Leverageable ideas** — AI-generated trade ideas (with LLM) or signal-correlated ideas (without)\n\n### Performance Modes\nThe `VISUALS FULL` \u002F `VISUALS LITE` button in the top bar only changes rendering behavior - it does **not** remove data sources or reduce sweep coverage.\n\nWhen you switch to **VISUALS LITE**, the dashboard:\n- Disables decorative background effects such as the radial\u002Fgrid overlays and scanlines\n- Removes expensive blur\u002Fbackdrop-filter effects on panels and overlays\n- Stops non-essential animations like the logo ring blink, conflict rings, and corridor flow effects\n- Disables globe auto-rotation and turns off animated flight-arc dashes\n- Converts the horizontal news ticker and OSINT stream into static, scrollable lists instead of continuously animated marquees\n\nMobile-specific behavior:\n- On mobile, `VISUALS LITE` also forces the dashboard into **flat map mode** if you are currently on the globe\n- Future mobile loads will continue to start flat while low-perf mode is enabled\n\nThe preference is saved in browser local storage, so the UI will remember your last setting.\n\n### Auto-Refresh\nThe server runs a sweep cycle every 15 minutes (configurable). Each cycle:\n1. Queries all 27 sources in parallel (~30s)\n2. Synthesizes raw data into dashboard format\n3. Computes delta from previous run (what changed, escalated, de-escalated) — visible in the **Sweep Delta** panel on the dashboard\n4. Generates LLM trade ideas (if configured)\n5. Evaluates breaking news alerts — multi-tier (FLASH \u002F PRIORITY \u002F ROUTINE) with semantic dedup. Sends to Telegram and\u002For Discord if configured. Works with LLM evaluation or falls back to rule-based alerting when LLM is unavailable.\n6. Pushes update to all connected browsers via SSE\n\n### Telegram Bot (Two-Way)\nCrucix doubles as an interactive Telegram bot. Beyond sending alerts, it responds to commands directly from your chat:\n\n| Command | What It Does |\n|---------|-------------|\n| `\u002Fstatus` | System health, last sweep time, source status, LLM status |\n| `\u002Fsweep` | Trigger a manual sweep cycle |\n| `\u002Fbrief` | Compact text summary of the latest intelligence (direction, key metrics, top OSINT) |\n| `\u002Fportfolio` | Portfolio status (if Alpaca connected) |\n| `\u002Falerts` | Recent alert history with tiers |\n| `\u002Fmute` \u002F `\u002Fmute 2h` | Silence alerts for 1h (or custom duration) |\n| `\u002Funmute` | Resume alerts |\n| `\u002Fhelp` | Show all available commands |\n\nThis requires `TELEGRAM_BOT_TOKEN` and `TELEGRAM_CHAT_ID` in `.env`. The bot polls for messages every 5 seconds (configurable via `TELEGRAM_POLL_INTERVAL`).\n\n### Discord Bot (Two-Way)\n\nCrucix also supports Discord as a full-featured bot with slash commands and rich embed alerts. It mirrors the Telegram bot's capabilities with Discord-native formatting.\n\n| Command | What It Does |\n|---------|-------------|\n| `\u002Fstatus` | System health, last sweep time, source status, LLM status |\n| `\u002Fsweep` | Trigger a manual sweep cycle |\n| `\u002Fbrief` | Compact text summary of the latest intelligence |\n| `\u002Fportfolio` | Portfolio status (if Alpaca connected) |\n\nAlerts are delivered as rich embeds with color-coded sidebars: red for FLASH, yellow for PRIORITY, blue for ROUTINE. Each embed includes signal details, confidence scores, and cross-domain correlations.\n\n**Setup requires:** `DISCORD_BOT_TOKEN`, `DISCORD_CHANNEL_ID`, and optionally `DISCORD_GUILD_ID` for instant slash command registration. See [API Keys Setup](#api-keys-setup) for details.\n\n**Webhook fallback:** If you don't want to run a full bot, set `DISCORD_WEBHOOK_URL` instead. This enables one-way alerts (no slash commands) with zero dependencies — no `discord.js` needed.\n\n**Optional dependency:** The full bot requires `discord.js`. Install it with `npm install discord.js`. If it's not installed, Crucix automatically falls back to webhook-only mode.\n\n### Optional LLM Layer\nConnect any of 8 LLM providers for enhanced analysis:\n- **AI trade ideas** — quantitative analyst producing 5-8 actionable ideas citing specific data\n- **Smarter alert evaluation** — LLM classifies signals into FLASH\u002FPRIORITY\u002FROUTINE tiers with cross-domain correlation and confidence scoring\n- Providers: Anthropic Claude, OpenAI, Google Gemini, OpenRouter (Unified API), OpenAI Codex (ChatGPT subscription), MiniMax, Mistral, Grok\n- Graceful fallback — when LLM is unavailable, a rule-based engine takes over alert evaluation. LLM failures never crash the sweep cycle.\n\n---\n\n## API Keys Setup\n\nCopy `.env.example` to `.env` at the project root:\n\n```bash\ncp .env.example .env\n```\n\n### Required for Best Results (all free)\n\n| Key | Source | How to Get |\n|-----|--------|------------|\n| `FRED_API_KEY` | Federal Reserve Economic Data | [fred.stlouisfed.org](https:\u002F\u002Ffred.stlouisfed.org\u002Fdocs\u002Fapi\u002Fapi_key.html) — instant, free |\n| `FIRMS_MAP_KEY` | NASA FIRMS (satellite fire data) | [firms.modaps.eosdis.nasa.gov](https:\u002F\u002Ffirms.modaps.eosdis.nasa.gov\u002Fapi\u002Farea\u002F) — instant, free |\n| `EIA_API_KEY` | US Energy Information Administration | [api.eia.gov](https:\u002F\u002Fwww.eia.gov\u002Fopendata\u002Fregister.php) — instant, free |\n\nThese three unlock the most valuable economic and satellite data. Each takes about 60 seconds to register.\n\n### Optional (enable additional sources)\n\n| Key | Source | How to Get |\n|-----|--------|------------|\n| `ACLED_EMAIL` + `ACLED_PASSWORD` | Armed conflict event data | [acleddata.com\u002Fregister](https:\u002F\u002Facleddata.com\u002Fregister\u002F) — free, OAuth2 |\n| `AISSTREAM_API_KEY` | Maritime AIS vessel tracking | [aisstream.io](https:\u002F\u002Faisstream.io\u002F) — free |\n| `ADSB_API_KEY` | Unfiltered flight tracking | [RapidAPI](https:\u002F\u002Frapidapi.com\u002Fadsbexchange\u002Fapi\u002Fadsbexchange-com1) — ~$10\u002Fmo |\n\n### LLM Provider (optional, for AI-enhanced ideas)\n\nSet `LLM_PROVIDER` to one of: `anthropic`, `openai`, `gemini`, `codex`, `openrouter`, `minimax`, `mistral`, `grok`\n\n| Provider | Key Required | Default Model |\n|----------|-------------|---------------|\n| `anthropic` | `LLM_API_KEY` | claude-sonnet-4-6 |\n| `openai` | `LLM_API_KEY` | gpt-5.4 |\n| `gemini` | `LLM_API_KEY` | gemini-3.1-pro |\n| `openrouter` | `LLM_API_KEY` | openrouter\u002Fauto |\n| `codex` | None (uses `~\u002F.codex\u002Fauth.json`) | gpt-5.3-codex |\n| `minimax` | `LLM_API_KEY` | MiniMax-M2.5 |\n| `mistral` | `LLM_API_KEY` | mistral-large-latest |\n| `grok` | `LLM_API_KEY` | grok-4-latest |\n\nFor Codex, run `npx @openai\u002Fcodex login` to authenticate via your ChatGPT subscription.\n\n### Telegram Bot + Alerts (optional)\n\n| Key | How to Get |\n|-----|------------|\n| `TELEGRAM_BOT_TOKEN` | Create via [@BotFather](https:\u002F\u002Ft.me\u002FBotFather) on Telegram |\n| `TELEGRAM_CHAT_ID` | Get via [@userinfobot](https:\u002F\u002Ft.me\u002Fuserinfobot) |\n| `TELEGRAM_CHANNELS` | *(Optional)* Comma-separated extra channel IDs to monitor beyond the 17 built-in channels |\n| `TELEGRAM_POLL_INTERVAL` | *(Optional)* Bot command polling interval in ms (default: 5000) |\n\n### Discord Bot + Alerts (optional)\n\n| Key | How to Get |\n|-----|------------|\n| `DISCORD_BOT_TOKEN` | Create at [Discord Developer Portal](https:\u002F\u002Fdiscord.com\u002Fdevelopers\u002Fapplications) → Bot → Token |\n| `DISCORD_CHANNEL_ID` | Right-click channel in Discord (Developer Mode on) → Copy Channel ID |\n| `DISCORD_GUILD_ID` | *(Optional)* Right-click server → Copy Server ID. Enables instant slash command registration (otherwise takes up to 1 hour for global commands) |\n| `DISCORD_WEBHOOK_URL` | *(Optional)* Channel Settings → Integrations → Webhooks → New Webhook → Copy URL. Use this for alert-only mode without a bot |\n\n**Discord bot setup:**\n1. Go to [Discord Developer Portal](https:\u002F\u002Fdiscord.com\u002Fdevelopers\u002Fapplications) and create a new application\n2. Go to **Bot** → click **Reset Token** → copy the token to `DISCORD_BOT_TOKEN`\n3. Under **Privileged Gateway Intents**, enable **Message Content Intent**\n4. Go to **OAuth2** → **URL Generator** → select `bot` + `applications.commands` scopes → select `Send Messages` + `Embed Links` permissions\n5. Copy the generated URL and open it in your browser to invite the bot to your server\n6. Install the dependency: `npm install discord.js`\n\nAlerts work with or without an LLM on both Telegram and Discord. With an LLM configured, signal evaluation is richer and more context-aware. Without one, a deterministic rule engine evaluates signals based on severity, cross-domain correlation, and signal counts.\n\n### Without Any Keys\n\nCrucix 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.\n\n---\n\n## Architecture\n\n```\ncrucix\u002F\n├── server.mjs                 # Express dev server (SSE, auto-refresh, LLM, bot commands)\n├── crucix.config.mjs          # Configuration with env var overrides + delta thresholds\n├── diag.mjs                   # Diagnostic script — run if server fails to start\n├── .env.example               # All documented env vars\n├── package.json               # Runtime: express | Optional: discord.js\n├── docs\u002F                      # Screenshots for README\n│\n├── apis\u002F\n│   ├── briefing.mjs           # Master orchestrator — runs all 27 sources in parallel\n│   ├── save-briefing.mjs      # CLI: save timestamped + latest.json\n│   ├── BRIEFING_PROMPT.md     # Intelligence synthesis protocol\n│   ├── BRIEFING_TEMPLATE.md   # Briefing output structure\n│   ├── utils\u002F\n│   │   ├── fetch.mjs          # safeFetch() — timeout, retries, abort, auto-JSON\n│   │   └── env.mjs            # .env loader (no dotenv dependency)\n│   └── sources\u002F               # 27 self-contained source modules\n│       ├── gdelt.mjs          # Each exports briefing() → structured data\n│       ├── fred.mjs           # Can run standalone: node apis\u002Fsources\u002Ffred.mjs\n│       ├── space.mjs          # CelesTrak satellite tracking\n│       ├── yfinance.mjs       # Yahoo Finance — free live market data\n│       └── ...                # 23 more\n│\n├── dashboard\u002F\n│   ├── inject.mjs             # Data synthesis + standalone HTML injection\n│   └── public\u002F\n│       └── jarvis.html        # Self-contained Jarvis HUD\n│\n├── lib\u002F\n│   ├── llm\u002F                   # LLM abstraction (8 providers, raw fetch, no SDKs)\n│   │   ├── provider.mjs       # Base class\n│   │   ├── anthropic.mjs      # Claude\n│   │   ├── openai.mjs         # GPT\n│   │   ├── gemini.mjs         # Gemini\n│   │   ├── grok.mjs           # Grok\n│   │   ├── openrouter.mjs     # OpenRouter (Unified API)\n│   │   ├── codex.mjs          # Codex (ChatGPT subscription)\n│   │   ├── minimax.mjs        # MiniMax (M2.5, 204K context)\n│   │   ├── mistral.mjs        # Mistral AI\n│   │   ├── ideas.mjs          # LLM-powered trade idea generation\n│   │   └── index.mjs          # Factory: createLLMProvider()\n│   ├── delta\u002F                 # Change tracking between sweeps\n│   │   ├── engine.mjs         # Delta computation — semantic dedup, configurable thresholds, severity scoring\n│   │   ├── memory.mjs         # Hot memory (3 runs, atomic writes) + cold storage (daily archives)\n│   │   └── index.mjs          # Re-exports\n│   └── alerts\u002F\n│       ├── telegram.mjs       # Multi-tier alerts (FLASH\u002FPRIORITY\u002FROUTINE) + two-way bot commands\n│       └── discord.mjs        # Discord bot (slash commands, rich embeds) + webhook fallback\n│\n└── runs\u002F                      # Runtime data (gitignored)\n    ├── latest.json            # Most recent sweep output\n    └── memory\u002F                # Delta memory (hot.json + cold\u002FYYYY-MM-DD.json)\n```\n\n### Design Principles\n- **Pure ESM** — every file is `.mjs` with explicit imports\n- **Minimal dependencies** — Express is the only runtime dependency. `discord.js` is optional (for Discord bot). LLM providers use raw `fetch()`, no SDKs.\n- **Parallel execution** — `Promise.allSettled()` fires all 27 sources simultaneously\n- **Graceful degradation** — missing keys produce errors, not crashes. LLM failures don't kill sweeps.\n- **Each source is standalone** — run `node apis\u002Fsources\u002Fgdelt.mjs` to test any source independently\n- **Self-contained dashboard** — the HTML file works with or without the server\n\n---\n\n## Data Sources (27)\n\n### Tier 1: Core OSINT & Geopolitical (11)\n\n| Source | What It Tracks | Auth |\n|--------|---------------|------|\n| **GDELT** | Global news events, conflict mapping (100+ languages) | None |\n| **OpenSky** | Real-time ADS-B flight tracking across 6 hotspot regions | None |\n| **NASA FIRMS** | Satellite fire\u002Fthermal anomaly detection (3hr latency) | Free key |\n| **Maritime\u002FAIS** | Vessel tracking, dark ships, sanctions evasion | Free key |\n| **Safecast** | Citizen-science radiation monitoring near 6 nuclear sites | None |\n| **ACLED** | Armed conflict events: battles, explosions, protests | Free (OAuth2) |\n| **ReliefWeb** | UN humanitarian crisis tracking | None |\n| **WHO** | Disease outbreaks and health emergencies | None |\n| **OFAC** | US Treasury sanctions (SDN list) | None |\n| **OpenSanctions** | Aggregated global sanctions (30+ sources) | Partial |\n| **ADS-B Exchange** | Unfiltered flight tracking including military | Paid |\n\n### Tier 2: Economic & Financial (7)\n\n| Source | What It Tracks | Auth |\n|--------|---------------|------|\n| **FRED** | 22 key indicators: yield curve, CPI, VIX, fed funds, M2 | Free key |\n| **US Treasury** | National debt, yields, fiscal data | None |\n| **BLS** | CPI, unemployment, nonfarm payrolls, PPI | None |\n| **EIA** | WTI\u002FBrent crude, natural gas, inventories | Free key |\n| **GSCPI** | NY Fed Global Supply Chain Pressure Index | None |\n| **USAspending** | Federal spending and defense contracts | None |\n| **UN Comtrade** | Strategic commodity trade flows between major powers | None |\n\n### Tier 3: Weather, Environment, Tech, Social, SIGINT (7)\n\n| Source | What It Tracks | Auth |\n|--------|---------------|------|\n| **NOAA\u002FNWS** | Active US weather alerts | None |\n| **EPA RadNet** | US government radiation monitoring | None |\n| **USPTO Patents** | Patent filings in 7 strategic tech areas | None |\n| **Bluesky** | Social sentiment on geopolitical\u002Fmarket topics | None |\n| **Reddit** | Social sentiment from key subreddits | OAuth |\n| **Telegram** | 17 curated OSINT\u002Fconflict\u002Ffinance channels (web scraping, expandable via config) | None |\n| **KiwiSDR** | Global HF radio receiver network (~600 receivers) | None |\n\n### Tier 4: Space & Satellites (1)\n\n| Source | What It Tracks | Auth |\n|--------|---------------|------|\n| **CelesTrak** | Satellite launches, ISS tracking, military constellations, Starlink\u002FOneWeb counts | None |\n\n### Tier 5: Live Market Data (1)\n\n| Source | What It Tracks | Auth |\n|--------|---------------|------|\n| **Yahoo Finance** | Real-time prices: SPY, QQQ, BTC, Gold, WTI, VIX + 9 more | None |\n\n---\n\n## npm Scripts\n\n| Script | Command | Description |\n|--------|---------|-------------|\n| `npm run dev` | `node --trace-warnings server.mjs` | Start dashboard with auto-refresh |\n| `npm run sweep` | `node apis\u002Fbriefing.mjs` | Run a single sweep, output JSON to stdout |\n| `npm run inject` | `node dashboard\u002Finject.mjs` | Inject latest data into static HTML |\n| `npm run brief:save` | `node apis\u002Fsave-briefing.mjs` | Run sweep + save timestamped JSON |\n| `npm run diag` | `node diag.mjs` | Run diagnostics (Node version, imports, port check) |\n\n---\n\n## Configuration\n\nAll settings are in `.env` with sensible defaults:\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `PORT` | `3117` | Dashboard server port |\n| `REFRESH_INTERVAL_MINUTES` | `15` | Auto-refresh interval |\n| `LLM_PROVIDER` | disabled | `anthropic`, `openai`, `gemini`, `codex`, `openrouter`, `minimax`, `mistral`, or `grok` |\n| `LLM_API_KEY` | — | API key (not needed for codex) |\n| `LLM_MODEL` | per-provider default | Override model selection |\n| `TELEGRAM_BOT_TOKEN` | disabled | For Telegram alerts + bot commands |\n| `TELEGRAM_CHAT_ID` | — | Your Telegram chat ID |\n| `TELEGRAM_CHANNELS` | — | Extra channel IDs to monitor (comma-separated) |\n| `TELEGRAM_POLL_INTERVAL` | `5000` | Bot command polling interval (ms) |\n| `DISCORD_BOT_TOKEN` | disabled | For Discord alerts + slash commands |\n| `DISCORD_CHANNEL_ID` | — | Discord channel for alerts |\n| `DISCORD_GUILD_ID` | — | Server ID (instant slash command registration) |\n| `DISCORD_WEBHOOK_URL` | — | Webhook URL (alert-only fallback, no bot needed) |\n\nDelta engine thresholds (how sensitive the system is to changes between sweeps) can be customized in `crucix.config.mjs` under the `delta.thresholds` section. The defaults are tuned to filter out noise while catching meaningful moves.\n\n---\n\n## API Endpoints\n\nWhen running `npm run dev`:\n\n| Endpoint | Description |\n|----------|-------------|\n| `GET \u002F` | Jarvis HUD dashboard |\n| `GET \u002Fapi\u002Fdata` | Current synthesized intelligence data (JSON) |\n| `GET \u002Fapi\u002Fhealth` | Server status, uptime, source count, LLM status |\n| `GET \u002Fevents` | SSE stream for live push updates |\n\n---\n\n## Troubleshooting\n\n### `npm run dev` exits silently (no output, no error)\n\nThis is a known issue where npm's script runner can swallow errors, particularly on Windows PowerShell. Try these in order:\n\n**1. Run Node directly (bypasses npm):**\n```bash\nnode --trace-warnings server.mjs\n```\nThis is functionally identical to `npm run dev` but gives you full error output.\n\n**2. Run the diagnostic script:**\n```bash\nnode diag.mjs\n```\nThis tests every import one by one, checks your Node.js version, and verifies port 3117 is available. It will tell you exactly what's failing.\n\n**3. Check if port 3117 is already in use:**\n\nA previous Crucix instance may still be running in the background.\n\n```powershell\n# Windows PowerShell\nnetstat -ano | findstr 3117\ntaskkill \u002FF \u002FPID \u003Cthe_PID_from_above>\n\n# Or kill all Node processes\ntaskkill \u002FF \u002FIM node.exe\n```\n\n```bash\n# macOS \u002F Linux\nlsof -ti:3117 | xargs kill\n```\n\nThen try starting again. You can also change the port by setting `PORT=3118` in your `.env` file.\n\n**4. Check Node.js version:**\n```bash\nnode --version\n```\nCrucix requires Node.js 22 or later. If you have an older version, download the latest LTS from [nodejs.org](https:\u002F\u002Fnodejs.org\u002F).\n\n### Dashboard shows empty panels after first start\n\nThis is normal — the first sweep takes 30–60 seconds to query all 27 sources. The dashboard will populate automatically once the sweep completes. Check the terminal for sweep progress logs.\n\n### Some sources show errors\n\nExpected behavior. Sources that require API keys will return structured errors if the key isn't set. The rest of the sweep continues normally. Check the Source Integrity section in the dashboard (or the server logs) to see which sources failed and why. The 3 most impactful free keys to add are `FRED_API_KEY`, `FIRMS_MAP_KEY`, and `EIA_API_KEY`.\n\nOpenSky can also return `HTTP 429` when its public hotspots are queried too aggressively. Crucix does not try to evade that limit. Instead, it surfaces the throttle\u002Ferror in source health and preserves the most recent non-empty air traffic snapshot from `runs\u002F` so the dashboard flight layer does not suddenly go blank on a throttled sweep.\n\n### Telegram bot not responding to commands\n\nMake sure both `TELEGRAM_BOT_TOKEN` and `TELEGRAM_CHAT_ID` are set in `.env`. The bot only responds to messages from the configured chat ID (security measure). You should see `[Crucix] Telegram alerts enabled` and `[Crucix] Bot command polling started` in the server logs on startup. If not, double-check your token with `curl https:\u002F\u002Fapi.telegram.org\u002Fbot\u003CYOUR_TOKEN>\u002FgetMe`.\n\n### Discord bot not responding to slash commands\n\nCheck these in order:\n1. Make sure `DISCORD_BOT_TOKEN` and `DISCORD_CHANNEL_ID` are set in `.env`\n2. Verify `discord.js` is installed: `npm ls discord.js`. If missing, run `npm install discord.js`\n3. If slash commands don't appear, set `DISCORD_GUILD_ID` — without it, global commands can take up to 1 hour to propagate. Guild-specific commands register instantly\n4. Confirm the bot was invited with `bot` + `applications.commands` scopes and has `Send Messages` + `Embed Links` permissions in the target channel\n5. Check server logs for `[Discord] Bot logged in as ...` on startup. If you see `[Discord] discord.js not installed`, install it and restart\n6. **Webhook-only fallback:** If you just want alerts without slash commands, set `DISCORD_WEBHOOK_URL` instead of the bot token. No `discord.js` needed.\n\n---\n\n## Screenshots\n\nThe `docs\u002F` folder contains dashboard screenshots referenced by this README:\n\n| File | Description |\n|------|-------------|\n| `docs\u002Fdashboard.png` | Full dashboard — hero image at the top of this README |\n| `docs\u002Fboot.png` | Cinematic boot sequence animation |\n| `docs\u002Fmap.png` | D3 world map with marker types and flight arcs |\n| `docs\u002Fglobe.png` | 3D WebGL globe view with atmosphere glow and markers |\n\nTo update them: run the dashboard, wait for a sweep to complete, then use your browser's DevTools (`F12` → `Ctrl+Shift+P` → \"Capture full size screenshot\") or a tool like [LICEcap](https:\u002F\u002Fwww.cockos.com\u002Flicecap\u002F) for GIFs.\n\n---\n\n## Contributing\n\nFound a bug? Want to add a 28th source? PRs welcome. Each source is a standalone module in `apis\u002Fsources\u002F` — just export a `briefing()` function that returns structured data and add it to the orchestrator in `apis\u002Fbriefing.mjs`.\n\nIf you find this useful, a star helps others find it too.\n\nFor contribution guidelines, review expectations, and source-add rules, see `CONTRIBUTING.md`. For security reports, see `SECURITY.md`.\n\n## Contact\n\nFor partnerships, integrations, or other non-issue inquiries, you can reach me at `celesthioailabs@gmail.com`.\n\nFor bugs and feature requests, please use GitHub Issues so discussion stays visible and actionable.\n\n---\n\n## Star History\n\n\u003Ca href=\"https:\u002F\u002Fwww.star-history.com\u002F?repos=calesthio%2FCrucix&type=date&legend=top-left\">\n  \u003Cpicture>\n    \u003Csource media=\"(prefers-color-scheme: dark)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fimage?repos=calesthio\u002FCrucix&type=date&theme=dark&legend=top-left\" \u002F>\n    \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fimage?repos=calesthio\u002FCrucix&type=date&legend=top-left\" \u002F>\n    \u003Cimg alt=\"Star History Chart\" src=\"https:\u002F\u002Fapi.star-history.com\u002Fimage?repos=calesthio\u002FCrucix&type=date&legend=top-left\" \u002F>\n  \u003C\u002Fpicture>\n\u003C\u002Fa>\n\n---\n\n## License\n\nAGPL-3.0\n","Crucix 是一个个人智能终端，从27个开源情报源收集数据，并在检测到变化时通知用户。它使用JavaScript编写，核心功能包括实时监控卫星火灾、航班追踪、辐射监测等多种信息源，每15分钟更新一次，并通过Telegram和Discord推送多层级警报。此外，Crucix支持与语言模型集成，成为双向智能助手，响应如\u002Fbrief和\u002Fsweep等命令，生成基于跨领域真实数据的可操作建议。适用于需要持续关注全球动态并快速响应的专业人士或组织，无需云端服务，只需本地运行即可开始工作。",2,"2026-06-11 03:49:56","high_star"]