Open-source, self-hosted threat intelligence platform for analyst workflows.
Pulse Intelligence helps analysts and junior CTI teams track threat actors, campaigns, indicators, vulnerabilities, ATT&CK techniques, automated feeds, enrichment results, hunts, exports, and scheduled intelligence reports from one practical workspace.
Phases 1-7 of 8 are implemented. Phase 8 is hardening: large-table partitioning and deeper security review.
See HISTORY.md for the development timeline and public-release cleanup notes.
See ROADMAP.md for planned hardening and community work.
See CHANGELOG.md for release notes.
| Area | Technology |
|---|---|
| App | Next.js 16.3 App Router, React 19.2, Turbopack |
| Data | PostgreSQL 17, Prisma 7, @prisma/adapter-pg |
| Jobs | BullMQ, Redis-compatible server |
| Auth | Argon2id passwords, DB-backed session cookies, hashed API keys |
| UI | Tailwind CSS v4, lucide-react |
| Tests | Vitest, TypeScript, ESLint |
npm install
cp .env.example .env
# Fill DATABASE_URL, REDIS_URL, SESSION_SECRET, and any provider API keys.
# npm install runs prisma generate automatically; use npm run db:generate if needed.
npm run db:migrate
npm run db:seed
npm run db:seed:demo
npm run attack:sync -- --all
npm run feeds:install
npm run dev
Open http://localhost:3000.
Seed users:
| Role | |
|---|---|
admin@pulse.local |
ADMIN |
analyst@pulse.local |
ANALYST |
viewer@pulse.local |
READONLY |
Default password: PulseAdmin!2026
Set SEED_PASSWORD before npm run db:seed for anything beyond local development.
For Windows without Docker, native PostgreSQL plus Memurai works well. Docker Compose
includes Postgres and Redis services; the full profile also builds and runs the app
and worker from the Dockerfile. See DEPLOYMENT.md for both paths.
Use .env.example as the template. Important values:
| Variable | Purpose |
|---|---|
DATABASE_URL |
PostgreSQL connection string |
REDIS_URL |
Redis-compatible connection string |
SESSION_SECRET |
Random 32+ byte session secret |
VIRUSTOTAL_API_KEY |
Optional enrichment provider |
ABUSEIPDB_API_KEY / ABUSEIPDB_API_KEYS |
Optional enrichment provider |
OTX_API_KEY |
Optional enrichment provider and OTX pulse feed |
NVD_API_KEY |
Recommended for reliable CVE sync |
PUBLIC_API_RATE_LIMIT_PER_WINDOW |
Optional public API limit, default 120 |
PUBLIC_API_RATE_LIMIT_WINDOW_SECONDS |
Optional public API window, default 60 |
SEED_PASSWORD |
Overrides local seed password |
PULSE_DEMO_MODE=1 |
Public read-only demo mode using viewer@pulse.local |
Never commit .env, real provider keys, database dumps, or private investigation data.
Run the worker beside the web app:
npm run worker
The worker owns feed refresh, enrichment queue draining, scheduled hunts, and scheduled reports.
Use npm run worker -- --run-now to run every enabled feed immediately on startup.
npm run lint
npm run typecheck
npm run test
npm audit --audit-level=moderate
npm run build
CI also builds the Docker image and brings up the full docker compose --profile full
stack against real Postgres + Redis, asserting the app answers /api/health and the
worker reports ready.
Database-backed verification scripts:
npm run verify:enrichment -- --live
npm run verify:hunting
npm run verify:api
npm run verify:reports
Create scoped API keys from /settings. See docs/API.md for authentication,
rate limits, parameters, and examples.
Example integrations live in examples/.
Available read endpoints:
GET /api/healthGET /api/health?deep=1GET /api/v1/indicatorsGET /api/v1/indicators/:idGET /api/v1/indicators?format=csv|stix|misp|snort|zeekGET /api/v1/actorsGET /api/v1/actors/:idGET /api/v1/campaignsWhitelisted indicators are never returned by public API or export routes.
Public API responses include X-RateLimit-* headers, and exhausted keys receive 429
with Retry-After.
See docs/HUNTING.md for templates, ATT&CK-aware fields, SIEM query drafts,
alert semantics, and match exports.
Production needs two long-running processes:
npm run build
npm run start
npm run worker
Use a process manager such as systemd, pm2, or a platform supervisor. See
DEPLOYMENT.md for host setup, Cloudflare tunnel notes, environment variables,
and migration guidance.
For database operations, see docs/BACKUP_RESTORE.md.
Contributions are welcome. Start with CONTRIBUTING.md, open focused pull
requests, and include verification notes. Good first areas are feed parsers, API examples,
documentation, UI polish, and Phase 8 hardening.
Maintainer expectations are documented in MAINTAINERS.md. Program-review
context is available in docs/MAINTAINER_APPLICATION.md.
Security issues should follow SECURITY.md.