
Your own intelligence terminal. 27 sources. One command. Zero cloud. Crucix 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. Hook 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 /brief and /sweep from your phone, and generating actionable trade ideas grounded in real cross-domain data. Your own analyst that watches the world while you sleep.
Your own intelligence terminal. 27 sources. One command. Zero cloud.
Enter The Signal Network

| Boot Sequence | World Map |
|---|---|
![]() | ![]() |
| 3D Globe View |
|---|
![]() |
Live website: https://www.crucix.live/ Explore the public demo first, then clone the repo to run Crucix locally.
Crucix 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.
Hook 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 /brief and /sweep from your phone, and generating actionable trade ideas grounded in real cross-domain data. Your own analyst that watches the world while you sleep.
Try the live demo first at https://www.crucix.live/, then clone the repo when you want the full local stack.
No cloud. No telemetry. No subscriptions. Just node server.mjs and you're running.
[!WARNING] Crucix has not launched any official token, coin, NFT, airdrop, presale, or other blockchain-based asset. Any token or digital asset using the Crucix name, logo, or branding is not affiliated with or endorsed by Crucix. 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.
Most 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.
Crucix 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.
It 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.
# 1. Clone the repo
git clone https://github.com/calesthio/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
If
npm run devfails silently (exits with no output), run Node directly instead:node --trace-warnings server.mjsThis bypasses npm's script runner, which can swallow errors on some systems (particularly PowerShell on Windows). You can also run
node diag.mjsto diagnose the exact issue — it checks your Node version, tests each module import individually, and verifies port availability. See Troubleshooting for more.
The dashboard opens automatically at http://localhost: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.
Requirements: Node.js 22+ (uses native fetch, top-level await, ESM)
git clone https://github.com/calesthio/Crucix.git
cd Crucix
cp .env.example .env # add your API keys
docker compose up -d
Dashboard at http://localhost:3117. Sweep data persists in ./runs/ via volume mount. Includes a health check endpoint.
A self-contained Jarvis-style HUD with:
The VISUALS FULL / VISUALS LITE button in the top bar only changes rendering behavior - it does not remove data sources or reduce sweep coverage.
When you switch to VISUALS LITE, the dashboard:
Mobile-specific behavior:
VISUALS LITE also forces the dashboard into flat map mode if you are currently on the globeThe preference is saved in browser local storage, so the UI will remember your last setting.
The server runs a sweep cycle every 15 minutes (configurable). Each cycle:
Crucix doubles as an interactive Telegram bot. Beyond sending alerts, it responds to commands directly from your chat:
| Command | What It Does |
|---|---|
/status | System health, last sweep time, source status, LLM status |
/sweep | Trigger a manual sweep cycle |
/brief | Compact text summary of the latest intelligence (direction, key metrics, top OSINT) |
/portfolio | Portfolio status (if Alpaca connected) |
/alerts | Recent alert history with tiers |
/mute / /mute 2h | Silence alerts for 1h (or custom duration) |
/unmute | Resume alerts |
/help | Show all available commands |
This requires TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID in .env. The bot polls for messages every 5 seconds (configurable via TELEGRAM_POLL_INTERVAL).
Crucix 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.
| Command | What It Does |
|---|---|
/status | System health, last sweep time, source status, LLM status |
/sweep | Trigger a manual sweep cycle |
/brief | Compact text summary of the latest intelligence |
/portfolio | Portfolio status (if Alpaca connected) |
Alerts 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.
Setup requires: DISCORD_BOT_TOKEN, DISCORD_CHANNEL_ID, and optionally DISCORD_GUILD_ID for instant slash command registration. See API Keys Setup for details.
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.
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.
Connect any of 8 LLM providers for enhanced analysis:
Copy .env.example to .env at the project root:
cp .env.example .env
| Key | Source | How to Get |
|---|---|---|
FRED_API_KEY | Federal Reserve Economic Data | fred.stlouisfed.org — instant, free |
FIRMS_MAP_KEY | NASA FIRMS (satellite fire data) | firms.modaps.eosdis.nasa.gov — instant, free |
EIA_API_KEY | US Energy Information Administration | api.eia.gov — instant, free |
These three unlock the most valuable economic and satellite data. Each takes about 60 seconds to register.
| Key | Source | How to Get |
|---|---|---|
ACLED_EMAIL + ACLED_PASSWORD | Armed conflict event data | acleddata.com/register — free, OAuth2 |
AISSTREAM_API_KEY | Maritime AIS vessel tracking | aisstream.io — free |
ADSB_API_KEY | Unfiltered flight tracking | RapidAPI — ~$10/mo |
Set LLM_PROVIDER to one of: anthropic, openai, gemini, codex, openrouter, minimax, mistral, grok
| Provider | Key Required | Default Model |
|---|---|---|
anthropic | LLM_API_KEY | claude-sonnet-4-6 |
openai | LLM_API_KEY | gpt-5.4 |
gemini | LLM_API_KEY | gemini-3.1-pro |
openrouter | LLM_API_KEY | openrouter/auto |
codex | None (uses ~/.codex/auth.json) | gpt-5.3-codex |
minimax | LLM_API_KEY | MiniMax-M2.5 |
mistral | LLM_API_KEY | mistral-large-latest |
grok | LLM_API_KEY | grok-4-latest |
For Codex, run npx @openai/codex login to authenticate via your ChatGPT subscription.
| Key | How to Get |
|---|---|
TELEGRAM_BOT_TOKEN | Create via @BotFather on Telegram |
TELEGRAM_CHAT_ID | Get via @userinfobot |
TELEGRAM_CHANNELS | (Optional) Comma-separated extra channel IDs to monitor beyond the 17 built-in channels |
TELEGRAM_POLL_INTERVAL | (Optional) Bot command polling interval in ms (default: 5000) |
| Key | How to Get |
|---|---|
DISCORD_BOT_TOKEN | Create at Discord Developer Portal → Bot → Token |
DISCORD_CHANNEL_ID | Right-click channel in Discord (Developer Mode on) → Copy Channel ID |
DISCORD_GUILD_ID | (Optional) Right-click server → Copy Server ID. Enables instant slash command registration (otherwise takes up to 1 hour for global commands) |
DISCORD_WEBHOOK_URL | (Optional) Channel Settings → Integrations → Webhooks → New Webhook → Copy URL. Use this for alert-only mode without a bot |
Discord bot setup:
DISCORD_BOT_TOKENbot + applications.commands scopes → select Send Messages + Embed Links permissionsnpm install discord.jsAlerts 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.
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.
crucix/
├── server.mjs # Express dev server (SSE, auto-refresh, LLM, bot commands)
├── crucix.config.mjs # Configuration with env var overrides + delta thresholds
├── diag.mjs # Diagnostic script — run if server fails to start
├── .env.example # All documented env vars
├── package.json # Runtime: express | Optional: discord.js
├── docs/ # Screenshots for README
│
├── apis/
│ ├── briefing.mjs # Master orchestrator — runs all 27 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/ # 27 self-contained source modules
│ ├── gdelt.mjs # Each exports briefing() → structured data
│ ├── fred.mjs # Can run standalone: node apis/sources/fred.mjs
│ ├── space.mjs # CelesTrak satellite tracking
│ ├── 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 (8 providers, raw fetch, no SDKs)
│ │ ├── provider.mjs # Base class
│ │ ├── anthropic.mjs # Claude
│ │ ├── openai.mjs # GPT
│ │ ├── gemini.mjs # Gemini
│ │ ├── grok.mjs # Grok
│ │ ├── openrouter.mjs # OpenRouter (Unified API)
│ │ ├── codex.mjs # Codex (ChatGPT subscription)
│ │ ├── minimax.mjs # MiniMax (M2.5, 204K context)
│ │ ├── mistral.mjs # Mistral AI
│ │ ├── ideas.mjs # LLM-powered trade idea generation
│ │ └── index.mjs # Factory: createLLMProvider()
│ ├── delta/ # Change tracking between sweeps
│ │ ├── engine.mjs # Delta computation — semantic dedup, configurable thresholds, severity scoring
│ │ ├── memory.mjs # Hot memory (3 runs, atomic writes) + cold storage (daily archives)
│ │ └── index.mjs # Re-exports
│ └── alerts/
│ ├── telegram.mjs # Multi-tier alerts (FLASH/PRIORITY/ROUTINE) + two-way bot commands
│ └── discord.mjs # Discord bot (slash commands, rich embeds) + webhook fallback
│
└── runs/ # Runtime data (gitignored)
├── latest.json # Most recent sweep output
└── memory/ # Delta memory (hot.json + cold/YYYY-MM-DD.json)
.mjs with explicit importsdiscord.js is optional (for Discord bot). LLM providers use raw fetch(), no SDKs.Promise.allSettled() fires all 27 sources simultaneouslynode apis/sources/gdelt.mjs to test any source independently| 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 |
| 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 |
| 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 |
| Social sentiment from key subreddits | OAuth | |
| Telegram | 17 curated OSINT/conflict/finance channels (web scraping, expandable via config) | None |
| KiwiSDR | Global HF radio receiver network (~600 receivers) | None |
| Source | What It Tracks | Auth |
|---|---|---|
| CelesTrak | Satellite launches, ISS tracking, military constellations, Starlink/OneWeb counts | None |
| Source | What It Tracks | Auth |
|---|---|---|
| Yahoo Finance | Real-time prices: SPY, QQQ, BTC, Gold, WTI, VIX + 9 more | None |
| Script | Command | Description |
|---|---|---|
npm run dev | node --trace-warnings 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 |
npm run diag | node diag.mjs | Run diagnostics (Node version, imports, port check) |
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, codex, openrouter, minimax, mistral, or grok |
LLM_API_KEY | — | API key (not needed for codex) |
LLM_MODEL | per-provider default | Override model selection |
TELEGRAM_BOT_TOKEN | disabled | For Telegram alerts + bot commands |
TELEGRAM_CHAT_ID | — | Your Telegram chat ID |
TELEGRAM_CHANNELS | — | Extra channel IDs to monitor (comma-separated) |
TELEGRAM_POLL_INTERVAL | 5000 | Bot command polling interval (ms) |
DISCORD_BOT_TOKEN | disabled | For Discord alerts + slash commands |
DISCORD_CHANNEL_ID | — | Discord channel for alerts |
DISCORD_GUILD_ID | — | Server ID (instant slash command registration) |
DISCORD_WEBHOOK_URL | — | Webhook URL (alert-only fallback, no bot needed) |
Delta 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.
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 |
npm run dev exits silently (no output, no error)This is a known issue where npm's script runner can swallow errors, particularly on Windows PowerShell. Try these in order:
1. Run Node directly (bypasses npm):
node --trace-warnings server.mjs
This is functionally identical to npm run dev but gives you full error output.
2. Run the diagnostic script:
node diag.mjs
This 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.
3. Check if port 3117 is already in use:
A previous Crucix instance may still be running in the background.
# Windows PowerShell
netstat -ano | findstr 3117
taskkill /F /PID <the_PID_from_above>
# Or kill all Node processes
taskkill /F /IM node.exe
# macOS / Linux
lsof -ti:3117 | xargs kill
Then try starting again. You can also change the port by setting PORT=3118 in your .env file.
4. Check Node.js version:
node --version
Crucix requires Node.js 22 or later. If you have an older version, download the latest LTS from nodejs.org.
This 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.
Expected 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.
OpenSky 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/error in source health and preserves the most recent non-empty air traffic snapshot from runs/ so the dashboard flight layer does not suddenly go blank on a throttled sweep.
Make 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://api.telegram.org/bot<YOUR_TOKEN>/getMe.
Check these in order:
DISCORD_BOT_TOKEN and DISCORD_CHANNEL_ID are set in .envdiscord.js is installed: npm ls discord.js. If missing, run npm install discord.jsDISCORD_GUILD_ID — without it, global commands can take up to 1 hour to propagate. Guild-specific commands register instantlybot + applications.commands scopes and has Send Messages + Embed Links permissions in the target channel[Discord] Bot logged in as ... on startup. If you see [Discord] discord.js not installed, install it and restartDISCORD_WEBHOOK_URL instead of the bot token. No discord.js needed.The docs/ folder contains dashboard screenshots referenced by this README:
| File | Description |
|---|---|
docs/dashboard.png | Full dashboard — hero image at the top of this README |
docs/boot.png | Cinematic boot sequence animation |
docs/map.png | D3 world map with marker types and flight arcs |
docs/globe.png | 3D WebGL globe view with atmosphere glow and markers |
To 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 for GIFs.
Found a bug? Want to add a 28th source? PRs welcome. Each source is a standalone module in apis/sources/ — just export a briefing() function that returns structured data and add it to the orchestrator in apis/briefing.mjs.
If you find this useful, a star helps others find it too.
For contribution guidelines, review expectations, and source-add rules, see CONTRIBUTING.md. For security reports, see SECURITY.md.
For partnerships, integrations, or other non-issue inquiries, you can reach me at celesthioailabs@gmail.com.
For bugs and feature requests, please use GitHub Issues so discussion stays visible and actionable.
AGPL-3.0
“Hey HN, I built this because I was constantly checking multiple sources to understand what’s happening globally — conflict events, satellite signals, macro indicators, flight activity, etc. A lot of this data is publicly…”
“Crucix, the Twiceborn - Mortal Shell Guide - IGN — IGN”
“Mortal Shell: How To Beat Crucix, The Twiceborn | Eternal Narthex Walkthrough - gameranx.com — gameranx.com”
“Mortal Shell boss guide: Crucix the Twiceborn - Prima Games — Prima Games”
AI
Companies use AI to filter candidates. I just gave candidates AI to choose companies. Career-Ops (career-ops.org, also known as careerops) turns any AI coding CLI into a full job search command center. Instead of manually tracking applications in a spreadsheet, you get an AI-powered pipeline that: Career-ops is agentic: Claude Code navigates career pages with Playwright, evaluates fit by reasoning about your CV vs the job description (not keyword matching), and adapts your resume per listing.
AI
CLI-Anything: Bridging the Gap Between AI Agents and the World's Software 🌐 CLI-Hub: pip install cli-anything-hub then cli-hub install — browse, install, and manage all community-built CLIs. Want to add your own? Open a PR — the hub updates instantly. 🎬 See Demos: Watch AI agents use generated CLIs plus preview, live preview, and trajectory loops to produce real artifacts — CAD builds, 3D scenes, diagrams, gameplay, subtitles, and more.
AI
A self-hosted AI workspace -- meant to be the self-hosted version of the UI experience you get from ChatGPT and Claude. But with more jank and fun. Running on your own hardware, with your own data -- local-first, privacy-first, and no trojan. A full, hover-to-play tour lives on the landing page (docs/index.html). Defaults work out of the box: clone, run, then configure models/search/email inside Settings. Only edit .env for deployment-level overrides like APPBIND, APPPORT, AUTHENABLED, DATABASEURL, or a pre-seeded admin password.
AI
Most AI material teaches in scattered pieces. A paper here, a fine-tuning post there, a flashy agent demo somewhere else. The pieces rarely line up. You ship a chatbot but can't explain its loss curve. You hook a function to an agent but can't say what attention does inside the model that's calling it. This curriculum is the spine. 20 phases, 503 lessons, four languages: Python, TypeScript, Rust, Julia. Linear algebra at one end, autonomous swarms at the other. Every algorithm gets built from raw math first. Backprop. Tokenizer. Attention. Agent loop. By the time PyTorch shows up, you already know what it's doing under the hood. Each lesson runs the same loop: read the problem, derive the math, write the code, run the test, keep the artifact. No five-minute videos, no copy-paste deploys,