Crucix: a self-hosted OSINT terminal that sweeps 27 feeds every 15 minutes
Your personal intelligence agent. Watches the world from multiple data sources and pings you when something changes.
At a glance
- What is it?
- Crucix is a Node.js dashboard that pulls satellite fire detection, flight tracking, radiation readings, conflict data and market prices into one local HUD. It installs with npm, needs Node 22, and is honest about what it cannot do.
- Who is it for?
- Adopt Crucix if you want a local, cloud-free view of open feeds and you are willing to register for free API keys and accept that unkeyed sources degrade. Skip it if you need guaranteed uptime, a hosted service, or per-source provenance for publication.
- Can I use it commercially?
- Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
- Is it still maintained?
- Yes. The repository last received commits 133 days ago.
- What is it written in?
- Mainly JavaScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 27, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What Crucix solves, and who actually needs it
Real-time open data about the world is not scarce. It is scattered. Fire detections live with NASA, radiation readings with Safecast and EPA RadNet, conflict events with ACLED, economic series with FRED and the EIA, satellite positions with CelesTrak, maritime traffic with AIS providers. Checking them individually is a job. Crucix is an attempt to make that job one browser tab.
The README frames the audience directly: researchers, journalists, traders, OSINT analysts, and people who think access to information should not depend on a budget. That is a wide net, and it is worth narrowing. The tool is most useful to someone who already knows which of those 27 feeds matter to them and wants them correlated rather than read one at a time. It is least useful to someone who wants a finished analytical product. Crucix aggregates and cross-correlates; it does not verify. A fire detection is a thermal anomaly, not a confirmed fire. A Telegram post is a post.
The pitch is local-first: no cloud, no telemetry, no subscriptions, just node server.mjs. The repository backs that up in a small way. The only runtime dependency in package.json is express, with discord.js as an optional dependency. Everything else is Node's own APIs, which is why the engine requires Node 22 or newer.
How the sweep engine and dashboard fit together
The architecture visible in the repository is a single Node process serving both an HTTP API and static dashboard assets. server.mjs is the entry point. apis/ holds the source integrations, dashboard/ holds the front end, lib/ holds shared code, and crucix.config.mjs is where the source list is configured. Dockerfile builds a node:22-alpine image, copies package files first for layer caching, runs npm install --production, and exposes 3117.
A sweep cycle queries all sources in parallel and the README says the initial sweep typically takes 30 to 60 seconds. The dashboard will look empty until that first update lands. After that, the server pushes updates over SSE rather than making the browser poll. The README states the cycle repeats every 15 minutes and that the interval is configurable through REFRESH_INTERVAL_MINUTES.
The correlation layer is the interesting part. Crucix computes a sweep delta showing what changed since the previous cycle, new signals, escalations and de-escalations with severity. It also produces cross-source signals that join satellite, economic, conflict and social domains. Without an LLM configured, the README says ideas are signal-correlated rather than generated. With one configured, the same panel produces trade ideas through the provider you select. That split matters: the LLM layer is additive, not load-bearing. The engine runs without it.
One design note worth flagging. The VISUALS FULL / VISUALS LITE toggle changes rendering only. The README is explicit that it does not remove data sources or reduce sweep coverage. On mobile, switching to LITE forces flat map mode, and the preference persists in browser local storage.
Installing Crucix and running a first sweep
The README gives a four-step quick start. Clone the repository, install dependencies, copy the environment template, start the server. Node 22 or newer and npm 10 or newer are required, per the engines field in package.json.
git clone https://github.com/calesthio/Crucix.git
cd Crucix
npm install
cp .env.example .env
npm run devThe dev script runs node --trace-warnings server.mjs. The README warns that on some systems, particularly PowerShell on Windows, npm's script runner can swallow errors and npm run dev exits with no output. If that happens, run Node directly.
node --trace-warnings server.mjsThe dashboard should come up at http://localhost:3117. Expect it to be empty at first. The README states the initial sweep queries all 27 sources in parallel and typically takes 30 to 60 seconds before the first data update arrives.
If the process still will not start, the repository ships a diagnostic script that checks the Node version, tests each module import individually, and verifies port availability.
node diag.mjsAPI keys are optional in the sense that sources without them degrade gracefully, but coverage is not uniform without them. The .env.example file lists keys for FRED, NASA FIRMS, EIA, AISStream, ACLED (now an email and password OAuth2 pair, since the README notes API keys were deprecated in September 2025), and Cloudflare Radar. Note the warning at the top of that file: do not put comments on the same line as values, because Docker's env_file treats inline comments as part of the value. That is a real footgun for anyone copying the template carelessly.
Docker is the shorter path if you already have a .env.
docker compose up -dThe compose file maps ${PORT:-3117} to the same port, mounts ./runs for sweep persistence, and sets restart: unless-stopped. The image includes a health check that polls http://localhost:3117/api/health every 60 seconds.
Where Crucix falls short
The most concrete limitation is the one the README states plainly: without API keys, sources degrade. A fresh clone with an empty .env is not the same product as a configured one, and the documentation does not enumerate what each missing key costs you. You will discover that by watching which panels stay empty.
Availability is another. Crucix depends on 27 third-party endpoints, most of them free and rate-limited, some of them government APIs with their own outages. There is no caching layer described in the README beyond the ./runs directory used by the Docker volume mount. When a source is down or slow, the sweep cycle is only as good as its slowest member, and the README does not document per-source timeouts or retry behaviour.
The LLM layer deserves scepticism. The .env.example lists nine providers including ollama for local models, which is the only configuration where the no-cloud claim holds end to end. Point LLM_PROVIDER at a hosted API and your prompts, which contain aggregated intelligence, leave your machine. That is a fair trade for many users, but it contradicts the framing if you do not notice it.
Finally, licence and scope. Crucix is AGPL-3.0-only. If you fork it and expose it as a network service, the AGPL's source-availability obligation applies to your modified version. That is not legal advice, but it is the reason some teams cannot touch AGPL code at all.
There is one non-technical caution the README raises itself: Crucix has not launched any token, coin, NFT, airdrop or presale, and any asset using the name is unaffiliated. Treat that as a standing warning about the project's name being used elsewhere.
Crucix compared with a general-purpose feed reader
The obvious alternative is not another intelligence dashboard. It is the thing most people already run: a feed reader plus a handful of bookmarked APIs and a script or two. FreshRSS, Miniflux or even a folder of RSS subscriptions will handle the news ticker portion of Crucix for free, with better reading ergonomics and per-item provenance.
The difference is what happens after ingestion. A feed reader gives you a list. Crucix geolocates events onto a globe, correlates them across domains, and computes a delta between sweeps so you see what changed rather than what exists. That delta panel is the feature a feed reader has no equivalent for. If your work involves noticing escalation, the correlation and delta layers are the reason to run this instead.
The trade is control. With a feed reader you choose every source and can cite it. With Crucix you get 27 sources chosen for you, merged into a shared display, and the README does not describe per-signal attribution back to an originating feed. For a journalist filing a story, that gap matters more than the globe does.
Editorial conclusion
Adopt Crucix if you want a local, cloud-free view of open feeds and you are willing to register for free API keys and accept that unkeyed sources degrade. Skip it if you need guaranteed uptime, a hosted service, or per-source provenance for publication. Before committing, run node diag.mjs and then node --trace-warnings server.mjs to confirm the stack starts on your machine, and read crucix.config.mjs to see which of the 27 sources are actually enabled in your copy.
Frequently asked questions
What is a good Crucix alternative?
A feed reader such as FreshRSS or Miniflux covers the news aggregation side and gives you per-item provenance, but it has no geolocation, no cross-source correlation and no sweep delta. Crucix's distinguishing feature is the delta panel showing escalations and de-escalations between 15-minute cycles.
Does Crucix need API keys to work?
No, but coverage suffers. The .env.example states that keys are optional and sources without them degrade gracefully. Keys are listed for FRED, NASA FIRMS, EIA, AISStream, ACLED and Cloudflare Radar, and the README does not say what each missing key removes.
What Node.js version does Crucix require?
Node.js 22 or newer and npm 10 or newer, per the engines field in package.json. The README notes the engine uses native fetch, top-level await and ESM. The repository also includes an .nvmrc file.
Which port does the Crucix dashboard run on?
3117 by default. The README says the dashboard opens at http://localhost:3117, and both .env.example and docker-compose.yml expose PORT with 3117 as the fallback value.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/calesthio-crucix)