Real-time fraud detection, case management, and graph intelligence for community and regional banks.
v3.0 · Phase 3 Complete
2026-06-27
p.02
System Overview
BankGuard is a modular fraud detection platform for community and regional banks. Five ML analytical engines, three operational services, and one Command Center UI — all communicating over a NATS JetStream message bus. Banks connect via four depth levels (observe, monitor, alert, intercept) and receive real-time fraud scores, case queues, explainability, and regulatory document drafts.
Five NATS subjects: bankguard.fraud.score, bankguard.risk.customer.score, bankguard.compliance.score, bankguard.retention.score, bankguard.predictive.score. Each engine scores independently; results fan back to connector.
Receives bank transactions via REST (POST /api/v1/score), fetches velocity features from Redis, fans out to all 5 engines in parallel, merges results, applies rules, and returns a decision within 500ms for intercept depth. Also hosts step-up auth endpoints.
bankguard-registry— Node Registry + Health
Port: 4100Language: Node.jsStore: SQLite
Tracks all BankGuard service instances via heartbeat. Provides live cluster health over WebSocket. Command Center's topology view reads from registry.
Creates cases from NATS events when connector generates STEP_UP or DECLINE. Houses analyst workflow (assign, note, disposition), SAR/CTR draft management, SR 11-7 model governance, billing metering, and step-up challenge storage.
Stores declarative fraud rules in a JSON DSL. Serves active rules to connector via REST (fetched at startup + refreshed every 60s or on bankguard.rules.changed NATS event). Supports async simulation (backtest a new rule against historical data before activating). Exposes hit stats and per-rule FP rate.
Maintains an entity graph of accounts, customers, merchants, devices, IPs, and hashed PII nodes. Subscribes to bankguard.connector.transaction.new to upsert nodes and edges. Provides 1-hop and 2-hop neighborhood expansion. DFS ring detection finds fraud rings 3–8 hops long. Louvain community detection runs weekly.
bankguard-ui— Command Center
Port: 5000Language: Node.js + React/Vite/Tailwind
16-route Command Center SPA. Backend proxies /api/ui/* to all downstream services. Frontend provides overview, topology, nodes, events, alerts, security, cases, rules, graph, model governance, and billing views. Includes a guided demo tour with ElevenLabs TTS (Brian voice).
Maintains a real PostgreSQL banking schema (accounts, customers, transactions, fraud_alerts, SAR records). Generates realistic transaction patterns including fraud scenarios at configurable rates. Powers the live demo environment.
Bank → POST /bankguard-webhook → connector → 202 Accepted
→ async: process score → publish bankguard.case.new if STEP_UP/DECLINE
→ Bank polls GET /api/v1/result/:request_id for outcome
Intercept Depth — inline sync
Bank → POST /api/v1/score?depth=intercept
→ connector must respond in < 500ms
→ Bank holds the transaction pending the decision
→ Returns APPROVE or BLOCK with reason
→ Bank enforces the decision inline
Risk visibility without inline decision-making. BankGuard polls the bank's database directly. Bank gets a risk dashboard; no change to transaction processing. Fastest to set up; no webhook required.
Monitor
Polling every 1 minute
Near-real-time monitoring. Same as Observe but more frequent. Suitable for institutions that want risk signals without integrating into their core processing.
Alert
Webhook, async, HMAC-signed
Bank sends transaction data to BankGuard at the moment of processing (POST). BankGuard returns 202 immediately so bank processing is unblocked. BankGuard processes asynchronously; bank polls for outcome or receives callback. Best balance of security depth and implementation effort.
Intercept
Inline sync, < 500ms
Bank holds the transaction pending BankGuard's decision. BankGuard must respond within 500ms — hard real-time requirement. Returns APPROVE or BLOCK. Bank enforces inline. Highest security depth; most rigorous integration work.
Credentials AES-256-GCM; PII graph nodes SHA-256 hashed; tenant_id enforced at middleware; no cross-tenant data possible.
SR 11-7 Governance
Model cards per engine; PSI monitoring; 180-day validation cycle; drift alerts at 30-day warning.
Operational
All NATS subjects internal; bankguard-node has no external port; registry WebSocket internal only; zero-downtime rolling restarts.
p.13
Gaps & Planned Work
This section documents features referenced in BankGuard marketing and sales materials that are not yet implemented. Every claimed feature that is not listed as ✓ LIVE on the preceding pages is documented here.
Feature
Priority
Phase
Notes
CDC Streaming Ingestion (Debezium/Kafka)
MEDIUM
Phase 4
Sub-second latency for high-volume institutions; no bank-side code required
Published API SDK (JS/Python)
LOW
Phase 4
Programmatic access for institutional developers; not required for standard integration
GNN-Based Node Fraud Probability
LOW
Phase 4
Requires Python ML sidecar or NATS bridge; Louvain (✓ live) covers community-level detection
Auto-Filing to FinCEN
—
By design
Analyst review is required before filing. BankGuard drafts SARs and CTRs; filing is always a human action.
FinCEN Note
BankGuard intentionally does not auto-file regulatory documents. BSA regulations require human review before SAR submission. Auto-filing would be a compliance violation. The ✗ PLANNED marker reflects that no auto-filing is planned.
p.15
Topology: Docker
The Docker delivery model packages BankGuard as two separately deployable compose stacks. The server stack runs all scoring services in an isolated internal network with no direct internet access. The Connector is the only service that bridges to the external network on port 4299 — it is the single entry point for the bank's core system. The Command Center (UI) deploys via a separate compose file and can run on the same host or on the bank's own infrastructure.
p.16
Topology: PM2 · Bare Metal
The PM2 deployment model runs all services as native Node.js processes on a single server, managed by PM2. Every service binds to 127.0.0.1 (loopback) — nothing is directly reachable from the internet. Nginx terminates SSL on port 443 and proxies inbound requests via loopback to the Connector (:4299) or the UI (:5000). This is the current live deployment model on the AnswerPoint VPS.
p.14
Deployment Guide
BankGuard runs as a cluster of Node.js microservices managed by PM2. No Docker is required for the managed-hosted deployment model; each service starts directly on the server and communicates over an internal NATS message bus.
Prerequisites
Minimum
Notes
Node.js
v18.x LTS
Required by all services
PM2
v5.x
npm install -g pm2
NATS Server
v2.10+
Account-based isolation; config at /etc/nats/nats.conf
Nginx
1.20+
Reverse proxy for BankGuard UI and connector API
Disk
20 GB
Allows for model files and log rotation
Installation Steps
Copy service directories to /var/www/html/bankguard/.
Run npm install inside each service directory.
Copy .env.example to .env for each service and populate all values.
Start NATS: nats-server -c /etc/nats/nats.conf
Start all services: pm2 start ecosystem.config.js
Save PM2 state: pm2 save && pm2 startup
Configure Nginx to proxy /api/v1/ to :4299 and the UI to :5000.
Run the System Integrity Checker to confirm all engines are operational.
Post-Deployment Verification
After all services are running, execute the System Integrity Checker to confirm that every engine is
reachable, NATS connectivity is established, environment variables are fully populated, and the
connector can accept a live transaction:
node /var/www/html/bankguard/bankguard-check.js
All five sections should report PASS before the system accepts production traffic.
See the User Guide → System Integrity Check for output interpretation and common fixes.