A real-time intelligence monitoring system for tracking Iran-Israel geopolitical conflict events with automated data ingestion, analysis, and visualization.
OSINT Conflict Monitor is a sophisticated open-source intelligence (OSINT) platform designed to:
- Aggregate conflict event data from multiple trusted sources (RSS feeds, GDELT, ACLED, news agencies)
- Analyze events for patterns, escalation signals, and anomalies
- Visualize geopolitical events on interactive maps
- Track source reliability and verification status
- Forecast escalation risks through data-driven analysis
- Real-time situational awareness for conflict zones
- Intelligence analysis and pattern detection
- Media monitoring and disinformation tracking
- Risk assessment and escalation forecasting
- Source reliability assessment
SAIG/
βββ backend/ # Node.js/Express API server
β βββ src/
β β βββ server.js # Main server entry point
β β βββ config/ # Configuration management
β β βββ database/ # SQLite database layer (sql.js)
β β β βββ setup.js # Schema and initialization
β β β βββ queries.js # Query builders and helpers
β β βββ api/
β β β βββ routes/ # Express route handlers
β β β β βββ events.js
β β β β βββ dashboard.js
β β β β βββ analysis.js
β β β β βββ sources.js
β β β βββ middleware/ # CORS, rate limiting, error handling
β β βββ ingestion/ # Data collection pipeline
β β β βββ manager.js # Orchestration and scheduling
β β β βββ processors/ # Event normalization
β β β β βββ normalizer.js
β β β β βββ deduplicator.js
β β β β βββ scorer.js
β β β β βββ entityExtractor.js
β β β βββ sources/ # Data source connectors
β β β βββ rssFeeds.js # RSS parser
β β β βββ gdeltCollector.js # GDELT API
β β β βββ acledCollector.js # ACLED API
β β βββ analysis/ # Intelligence analysis
β β β βββ escalation.js # Escalation index calculation
β β β βββ trends.js # Temporal trend analysis
β β β βββ patterns.js # Anomaly detection
β β βββ utils/
β β βββ constants.js # Actor/location/source definitions
β β βββ logger.js # Winston logging
β β βββ keepalive.js # Keep-alive for serverless
β βββ data/ # SQLite database files
β βββ logs/ # Application logs
β βββ package.json
β
βββ osint-monitor/ # React/Vite frontend
βββ src/
β βββ main.jsx # React entry point
β βββ App.jsx # Main router
β βββ index.css # Tailwind + custom styles
β βββ components/
β β βββ Layout/
β β β βββ Header.jsx # Navigation
β β β βββ Layout.jsx # Main layout wrapper
β β βββ Dashboard/ # Dashboard page
β β β βββ Dashboard.jsx
β β β βββ StatsPanel.jsx
β β β βββ HotTopics.jsx
β β β βββ HeadlinesFeed.jsx
β β β βββ TrendChart.jsx
β β βββ EventFeed/ # Event listing and details
β β β βββ EventFeed.jsx
β β β βββ EventCard.jsx
β β β βββ EventDetail.jsx
β β β βββ EventFilters.jsx
β β βββ MapView/ # Leaflet map visualization
β β β βββ ConflictMap.jsx
β β βββ Analysis/ # Trend analysis page
β β β βββ TrendView.jsx
β β βββ Sources/ # Source reliability tracker
β β βββ SourceTracker.jsx
β βββ services/
β β βββ api.js # API client
β βββ hooks/
β β βββ useEvents.js # Events data hook
β βββ utils/
β β βββ scoring.js # Severity/confidence calculations
β β βββ filters.js # Event filtering utilities
β βββ data/
β βββ mockEvents.js # Sample event data
βββ index.html
βββ vite.config.js
βββ package.json
- Node.js >= 18.0.0
- npm or yarn
- Git
cd backend
# Install dependencies
npm install
# Create .env file
echo "NODE_ENV=development" > .env
echo "PORT=3001" >> .env
echo "LOG_LEVEL=info" >> .env
echo "GDELT_FETCH_INTERVAL_MINUTES=30" >> .env
echo "RSS_FETCH_INTERVAL_MINUTES=15" >> .env
# Start development server with auto-reload
npm run dev
# Or run in production mode
npm startBackend runs on: http://localhost:3001
cd osint-monitor
# Install dependencies
npm install
# Start development server
npm run dev
# Build for production
npm run buildFrontend runs on: http://localhost:5173
# Server
NODE_ENV=development
PORT=3001
LOG_LEVEL=info
# CORS
CORS_ORIGIN=http://localhost:5173,http://localhost:3000
# Database
DB_PATH=./data/osint.db
# GDELT Project (free, no API key required)
GDELT_API_URL=https://api.gdeltproject.org/api/v2/doc/doc
GDELT_FETCH_INTERVAL_MINUTES=30
# ACLED (requires registration: https://acleddata.com/)
ACLED_API_URL=https://api.acleddata.com/acled/read
ACLED_API_KEY=your_key_here
ACLED_EMAIL=your_email_here
# RSS Feeds
RSS_FETCH_INTERVAL_MINUTES=15- Multi-source ingestion from RSS feeds, GDELT, ACLED
- Automated scheduling with node-cron (every 15-30 minutes)
- Deduplication using content hashing
- Normalization to standard event schema
- Reliability scoring based on source type
Supported Sources:
- Major news agencies (Reuters, AP, BBC, CNN)
- Regional outlets (Al Arabiya, Haaretz, Times of Israel)
- Specialist sources (GDELT, ACLED, Defense One)
- Government releases (White House, CENTCOM)
{
id: string, // Unique identifier
event_datetime_utc: string, // ISO 8601 timestamp
source_name: string, // Source name
source_url: string, // Original URL
source_type: string, // news_agency, government, etc.
claim_text: string, // Full event description
country: string, // Primary country
location_text: string, // Human-readable location
lat: number, // Latitude
lng: number, // Longitude
actor_1: string, // Primary actor
actor_2: string, // Secondary actor
event_type: string, // airstrike, missile_attack, etc.
domain: string, // military, diplomatic, cyber, etc.
severity_score: 1-10, // Calculated severity
confidence_score: 1-10, // Source reliability
verification_status: string, // verified, unverified, rumor
tags: string[], // Categorization tags
raw_data: object, // Original source data
content_hash: string, // SHA-256 for deduplication
last_updated_at: string // Last modification time
}- Calculates real-time escalation risk (0-100)
- Considers:
- Event frequency trends (24h vs 7-day baseline)
- High-severity event concentration
- Multi-domain activity
- Actor count and type
- Output: Risk level (minimal, low, medium, high, critical)
- Event distribution by actor, type, country, domain
- Temporal patterns over configurable period (7-90 days)
- Geographic hotspot identification
- Topic clustering and trending
- Frequency spikes: Unusual event clustering
- Multi-actor convergence: 5+ actors in 24 hours
- New domain activity: First-time cyber/diplomatic events
- Information fog: High ratio of unverified reports
- Real-time stats (total events, 24h/48h counts)
- Verification breakdown (verified/unverified/rumor)
- Hot topics trending in 72h window
- Escalation index gauge
- 7-day event trend chart
- Filterable event list
- Advanced filtering by country, domain, actor, severity, verification
- Full-text search
- Detailed event inspector
- Related events linking
- Leaflet-based interactive map
- Cluster markers by severity
- Regional grouping and filtering
- Event detail popups
- Geolocated event list panel
- Actor activity timelines
- Event type distribution
- Domain breakdown (pie chart)
- Escalation signals (high/medium/low)
- Anomaly detection panel
- Source reliability scoring methodology
- Type breakdown (news agencies, state media, OSINT)
- Individual source profiles
- Event contribution tracking
- Ingestion logs
Severity Levels:
- 9-10: Critical (active combat, casualties)
- 7-8: High (attacks, interceptions)
- 5-6: Medium (deployments, statements)
- 3-4: Low (warnings, tensions)
- 1-2: Minimal (diplomatic activity)
Verification Status:
- Verified: Tier 1-2 sources, independent confirmation
- Unverified: Medium reliability sources
- Rumor: Low reliability, social media, requires corroboration
Confidence Score:
- Based on source reliability tier (1-10)
- Adjusted for reporting consistency
- Considers geographic data availability
GET /api/dashboard
Returns: stats, timeline, hotTopics, escalation, anomalies, recentEvents
GET /api/events
Query params: limit, offset, sortBy, sortOrder, country, domain, eventType,
verification, minSeverity, sourceType, search, actor
Returns: paginated events with total count
GET /api/events/:id
Returns: detailed event with related events
GET /api/events/filters
Returns: available filter options
GET /api/analysis/escalation
Returns: escalationIndex, level, signals, reasoning
GET /api/analysis/trends?days=14
Returns: byActor, byEventType, byCountry, temporal patterns
GET /api/analysis/anomalies
Returns: detected signals with level and description
GET /api/sources
Returns: active sources with reliability scores and event counts
GET /api/sources/ingestion-logs
Query params: limit
Returns: ingestion history and statistics
SQLite Database (sql.js in-memory with disk persistence)
- events: Core event data (indexed by datetime, country, domain, severity)
- sources: Data source registry with reliability scores
- ingestion_log: Ingestion cycle history and statistics
idx_events_datetime- Fast temporal queriesidx_events_country- Geographic filteringidx_events_domain- Domain classificationidx_events_severity- Risk analysisidx_events_content_hash- Deduplication
- React 19 - Component framework
- Vite 8 - Build tool
- Tailwind CSS 4 - Styling
- Recharts - Data visualization
- Leaflet - Map rendering
- Lucide React - Icons
- date-fns - Date utilities
- React Router - Navigation
- Dark theme with blue accent colors
- Responsive grid layouts (mobile-first)
- Glow effects for emphasis
- Severity-based color coding
- Real-time animations
useEvents() - Fetches dashboard data, manages stats, handles refreshgetSeverityLabel(score) - Returns "Critical", "High", etc.
getSeverityColor(score) - Returns Tailwind color classes
getVerificationColor(status) - Returns color for verification status
calculateEscalationIndex(events) - Calculates risk levelRSS Feeds / GDELT / ACLED
β
[Ingestion Manager] (scheduled every 15-30 min)
β
[Normalizer] (standardize schema)
β
[Deduplicator] (SHA-256 content hash)
β
[Scorer] (calculate severity, confidence)
β
[Entity Extractor] (identify actors, locations)
β
SQLite Database
β
[Analysis Engines]
ββ Escalation Index
ββ Trend Analysis
ββ Anomaly Detection
β
REST API (/api/*)
β
React Frontend
ββ Dashboard
ββ Event Feed
ββ Map View
ββ Trends
ββ Sources
- CORS protection - Configurable allowed origins
- Helmet.js - HTTP security headers
- Rate limiting - API request throttling
- Input validation - SQL injection prevention via parameterized queries
- Error handling - Centralized error middleware
- Logging - Winston with sensitive data masking
- ES6 modules throughout
- Arrow functions preferred
- Consistent naming: camelCase for variables, PascalCase for components
- Comments for complex logic
- No console.log - use logger instead
# Watch mode
npm run dev
# Check logs
tail -f logs/combined.log
# Manual ingestion (testing)
curl -X POST http://localhost:3001/api/ingest# Hot reload
npm run dev
# Lint
npm run lint
# Build
npm run build- Create connector in
backend/src/ingestion/sources/yourSource.js - Implement
async function fetch...Data()returning normalized events - Register in
backend/src/ingestion/manager.jsregisterSources() - Add source to
backend/src/utils/constants.jsSOURCE_RELIABILITY
- Create analyzer in
backend/src/analysis/yourAnalysis.js - Export function receiving database queries
- Register in
backend/src/api/routes/analysis.js - Call from frontend via
/api/analysis/yourEndpoint
# Check port 3001 is free
netstat -tuln | grep 3001
# Check Node version
node --version # Should be >= 18
# Check logs
tail -f logs/error.log# Database file is corrupted
rm backend/data/osint.db*
# Restart backend - will reinitialize
npm run dev# Check ingestion is running
curl http://localhost:3001/api/health
# Manual ingestion trigger
curl -X POST http://localhost:3001/api/ingest
# Check ingestion logs
curl http://localhost:3001/api/sources/ingestion-logs- Verify backend is running:
curl http://localhost:3001 - Check CORS origin in
.env - Check browser console for exact errors
cd osint-monitor
npm install
npm run build
# Connect to Vercel via CLI or GitHub# Create new Web Service
# Connect GitHub repository
# Set NODE_ENV=production
# Set PORT (Render assigns automatically)
# Database persists in ./data directoryFROM node:18-alpine
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3001
CMD ["npm", "start"]- GDELT Project: https://www.gdeltproject.org/
- ACLED Data: https://acleddata.com/
- Leaflet Maps: https://leafletjs.com/
- Recharts: https://recharts.org/
- Express.js: https://expressjs.com/
- React: https://react.dev/
- Create feature branch:
git checkout -b feature/your-feature - Make changes following code guidelines
- Test thoroughly (backend + frontend)
- Commit with clear messages:
git commit -m "feat: add feature" - Push and create pull request
For issues, questions, or suggestions:
- Check existing GitHub issues
- Review logs in
backend/logs/ - Inspect browser console for frontend errors
Last Updated: March 2026 Version: 1.0.0 Status: Active Development