Trending-skills crucix-intelligence-dashboard
Personal intelligence agent that aggregates 27 OSINT data sources into a self-hosted Jarvis-style dashboard with Telegram/Discord bots, LLM analysis, and real-time alerts.
git clone https://github.com/Aradotso/trending-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/Aradotso/trending-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/crucix-intelligence-dashboard" ~/.claude/skills/aradotso-trending-skills-crucix-intelligence-dashboard && rm -rf "$T"
skills/crucix-intelligence-dashboard/SKILL.mdCrucix Intelligence Dashboard
Skill by ara.so — Daily 2026 Skills collection.
Crucix is a self-hosted intelligence terminal that pulls from 27 open-source data feeds (satellite fire detection, flight tracking, radiation monitoring, conflict data, market prices, maritime AIS, economic indicators, and more) every 15 minutes, renders everything on a WebGL globe dashboard, and optionally pushes alerts to Telegram/Discord with LLM-enhanced analysis.
Installation
git clone https://github.com/calesthio/Crucix.git cd crucix npm install # installs Express (only hard dependency) cp .env.example .env # then edit .env with your API keys npm run dev # dashboard at http://localhost:3117
Docker:
cp .env.example .env docker compose up -d # sweep data persists in ./runs/ via volume mount
Requirements: Node.js 22+ (uses native
fetch, top-level await, ESM modules)
If
exits silently:npm run dev
node --trace-warnings server.mjs # bypasses npm script runner (useful on Windows PowerShell) node diag.mjs # diagnoses Node version, module imports, port availability
Environment Configuration (.env
)
.env# ── Core Free APIs (highly recommended) ────────────────────────────────────── FRED_API_KEY= # Federal Reserve economic data — fred.stlouisfed.org FIRMS_MAP_KEY= # NASA satellite fire detection — firms.modaps.eosdis.nasa.gov EIA_API_KEY= # US Energy Info Admin — eia.gov/opendata/register.php # ── Optional Data Sources ───────────────────────────────────────────────────── ACLED_EMAIL= # Armed conflict data — acleddata.com/register ACLED_PASSWORD= AISSTREAM_API_KEY= # Maritime vessel tracking — aisstream.io (free) ADSB_API_KEY= # Unfiltered flight tracking — RapidAPI (~$10/mo) # ── LLM Provider (pick one) ─────────────────────────────────────────────────── LLM_PROVIDER= # anthropic | openai | gemini | codex LLM_API_KEY= # not needed for codex (uses ~/.codex/auth.json) # ── Telegram Bot ───────────────────────────────────────────────────────────── TELEGRAM_BOT_TOKEN= # from @BotFather TELEGRAM_CHAT_ID= # from @userinfobot TELEGRAM_CHANNELS= # optional: extra channel IDs beyond 17 built-in TELEGRAM_POLL_INTERVAL= # ms between command polls, default 5000 # ── Discord Bot ─────────────────────────────────────────────────────────────── DISCORD_BOT_TOKEN= # Discord Developer Portal → Bot → Token DISCORD_CHANNEL_ID= # right-click channel → Copy Channel ID DISCORD_GUILD_ID= # optional: instant slash command registration DISCORD_WEBHOOK_URL= # optional: alert-only mode, no discord.js needed # ── Trading (optional) ──────────────────────────────────────────────────────── ALPACA_API_KEY= ALPACA_SECRET_KEY=
Key Commands
| Command | Description |
|---|---|
| Start dashboard with auto-reload |
| Start directly (bypasses npm script runner) |
| Diagnose setup issues |
| Run in background with Docker |
| Authenticate Codex LLM via ChatGPT subscription |
Telegram Bot Commands
Once
TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID are set, the bot responds to:
| Command | What It Does |
|---|---|
| System health, last sweep time, source/LLM status |
| Trigger a manual intelligence sweep immediately |
| Compact text summary: direction, key metrics, top OSINT |
| Portfolio status (requires Alpaca keys) |
| Recent alert history with tier labels |
/ | Silence alerts for 1h or custom duration |
| Resume alerts |
| List all commands |
Discord Bot Commands
Install
discord.js for full bot mode; otherwise Crucix auto-falls back to webhook-only:
npm install discord.js # optional: enables slash commands + rich embeds
Slash commands available:
/status, /sweep, /brief, /portfolio
Alert embeds are color-coded: 🔴 red = FLASH, 🟡 yellow = PRIORITY, 🔵 blue = ROUTINE.
Webhook-only mode (no
discord.js, no slash commands):
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/YOUR_ID/YOUR_TOKEN
LLM Provider Setup
Anthropic Claude
LLM_PROVIDER=anthropic LLM_API_KEY=$ANTHROPIC_API_KEY
OpenAI
LLM_PROVIDER=openai LLM_API_KEY=$OPENAI_API_KEY
Google Gemini
LLM_PROVIDER=gemini LLM_API_KEY=$GEMINI_API_KEY
OpenAI Codex (ChatGPT subscription — no API key needed)
npx @openai/codex login # authenticate once
LLM_PROVIDER=codex # LLM_API_KEY not required
LLM failures are non-fatal — Crucix automatically falls back to rule-based alert evaluation without crashing the sweep cycle.
Architecture & Data Flow
Each 15-minute sweep cycle:
- Parallel fetch — all 27 sources queried simultaneously (~30–60s)
- Synthesis — raw data normalized into dashboard format
- Delta computation — what changed, escalated, or de-escalated vs. previous run
- LLM analysis — 5–8 trade ideas generated (or rule-based fallback)
- Alert evaluation — FLASH / PRIORITY / ROUTINE tiering with semantic dedup
- Push — SSE update to all connected browsers + Telegram/Discord if configured
- Persistence — sweep written to
directory./runs/
Dashboard Features
- 3D WebGL globe (Globe.gl) with atmosphere, star field, rotation + flat map toggle
- 9 marker types: fires, aircraft, radiation, maritime chokepoints, SDR receivers, OSINT events, health alerts, geolocated news, conflict events
- Animated 3D flight arcs between air traffic hotspots
- Region filters: World, Americas, Europe, Middle East, Asia Pacific, Africa
- Live markets: indexes, crypto, energy, commodities (Yahoo Finance, no key needed)
- Risk gauges: VIX, high-yield spread, supply chain pressure index
- OSINT feed: 17 built-in Telegram intelligence channels
- Sweep Delta panel: live diff of what changed this cycle
- Nuclear watch: Safecast + EPA RadNet radiation readings
- Space watch: CelesTrak satellite tracking — ISS, Starlink, military constellations
Common Patterns
Minimal Setup (no API keys)
# Works out of the box — sources without keys still populate: # Yahoo Finance markets, CelesTrak satellites, GDELT news, RSS feeds, # OpenSky flight tracking (public tier), Safecast radiation npm run dev
Maximum Free Coverage
# Register all three free keys (~3 minutes total): FRED_API_KEY= # fred.stlouisfed.org — 60 sec signup FIRMS_MAP_KEY= # firms.modaps.eosdis.nasa.gov — 60 sec signup EIA_API_KEY= # eia.gov/opendata/register.php — 60 sec signup
Telegram Alerts Only (no LLM)
TELEGRAM_BOT_TOKEN=your_token_from_botfather TELEGRAM_CHAT_ID=your_chat_id_from_userinfobot # LLM_PROVIDER intentionally omitted — rule-based alerts still fire
Full Stack with LLM + Both Bots
FRED_API_KEY=... FIRMS_MAP_KEY=... EIA_API_KEY=... LLM_PROVIDER=anthropic LLM_API_KEY=... TELEGRAM_BOT_TOKEN=... TELEGRAM_CHAT_ID=... DISCORD_BOT_TOKEN=... DISCORD_CHANNEL_ID=... DISCORD_GUILD_ID=... # for instant slash command registration
Adding Extra Telegram OSINT Channels
# Comma-separated channel IDs beyond the 17 built-in channels TELEGRAM_CHANNELS=-1001234567890,-1009876543210
Troubleshooting
Dashboard empty after startup: Normal — the first sweep takes 30–60 seconds to query all 27 sources. Wait for it to complete before expecting data.
exits silently (especially Windows PowerShell):npm run dev
node --trace-warnings server.mjs # or run the diagnostic tool: node diag.mjs
Port already in use:
# Default port is 3117 — check if something else is using it: lsof -i :3117 # macOS/Linux netstat -ano | findstr :3117 # Windows
Telegram bot not receiving commands:
- Verify
andTELEGRAM_BOT_TOKEN
are both setTELEGRAM_CHAT_ID - Confirm the chat ID is your personal chat, not a group (use @userinfobot)
- Default poll interval is 5000ms — set
for faster responseTELEGRAM_POLL_INTERVAL=2000
Discord slash commands not appearing:
- Set
for instant registration (vs. up to 1 hour for global)DISCORD_GUILD_ID - Ensure the bot invite URL includes both
andbot
scopesapplications.commands - Check Message Content Intent is enabled in the Developer Portal
LLM errors crashing sweeps: They won't — LLM failures are caught and the sweep continues with rule-based fallback. Check logs for the specific provider error (invalid key, rate limit, etc.).
ACLED conflict data missing: ACLED uses OAuth2 with email/password — both
ACLED_EMAIL and ACLED_PASSWORD must be set together.
Sweep data persistence: All runs are saved to
./runs/. In Docker, this is volume-mounted so data survives container restarts.