Action Required
12-28-25
AIS_Tracker
Built this the other day and it’s been useful thus far for a side project… enjoy team
Arsenal Ship Tracker
Maritime gray zone monitoring system for tracking vessels suspected of civilian-to-military conversion, containerized weapons systems, and dual-use activity.
Overview
This proof-of-concept tracker monitors vessels such as ZHONG DA 79, a Chinese container feeder converted into an arsenal ship carrying 60+ containerized missiles, CIWS, and radar while retaining civilian classification.
Features
Core Tracking
VesselFinder-style UI - Full-screen dark map with slide-in panels
Live AIS streaming - Real-time vessel positions via aisstream.io WebSocket
Ship markers with heading - Vessel icons rotate based on course
Viewport-optimized rendering - Handles 10,000+ live vessels without browser lag
Vessel Management
Add/Edit/Delete vessels - Full CRUD operations with UI forms
Track live vessels - Add any AIS vessel to your tracking database
Photo upload - Attach vessel images with base64 storage
Comprehensive vessel forms - Track weapons config, classification, threat levels
Intelligence Features
AI-powered vessel analysis - OpenAI integration for strategic intelligence
Automated search query generation - AI generates OSINT search queries
BLUF assessments - Bottom Line Up Front risk analysis (LOW/MODERATE/HIGH/CRITICAL)
News correlation - Automated news search and vessel correlation
OSINT integration - Link to news articles and intelligence reports
Geospatial
Shipyard geofences - Monitor vessel proximity to facilities of interest
Position tracking - Historical vessel track display
Bounding box configuration - Define AIS streaming areas via UI
Quick Start
# Install dependencies
pip install -r requirements.txt
# Initialize database with seed data
python3 server.py init
# Start live AIS streaming (in separate terminal)
python3 stream_area.py
# Start the web server
python3 server.py
# Open http://localhost:8080 in browserEnvironment Variables
# Required for AI intelligence features
export OPENAI_API_KEY=”your-openai-api-key”
# Required for live AIS streaming
export AISSTREAM_API_KEY=”your-aisstream-api-key”Components
FileDescriptionserver.pyREST API server with vessel intel & news searchvessel_intel.pyAI-powered vessel intelligence analysisstream_area.pyLive AIS streaming from aisstream.ioschema.sqlSQLite database schema + seed datastatic/index.htmlVesselFinder-style interactive dashboarddocs/index.htmlStatic GitHub Pages demo versionrequirements.txtPython dependencies (openai)ais_ingest.pyAIS data ingestion moduleais_config.jsonAIS source configuration (auto-created)
API Endpoints
Vessel Operations
MethodEndpointDescriptionGET/api/vesselsAll vessels with latest positionGET/api/vessels/:idSingle vessel detailsGET/api/vessels/:id/track?days=90Position historyGET/api/vessels/:id/eventsEvent timelinePOST/api/vesselsAdd vesselPUT/api/vessels/:idUpdate vesselDELETE/api/vessels/:idDelete vesselPOST/api/vessels/:id/positionLog positionPOST/api/vessels/:id/eventLog eventPOST/api/track-vesselAdd live vessel to tracking
Intelligence Operations
MethodEndpointDescriptionPOST/api/vessel-intelFull AI analysis with news searchPOST/api/vessel-blufQuick BLUF risk assessmentPOST/api/search-newsSearch Google News for vesselGET/api/osint?vessel_id=1OSINT reportsPOST/api/osintAdd OSINT report
Other Endpoints
MethodEndpointDescriptionGET/api/shipyardsMonitored facilitiesGET/api/events?severity=critical&limit=50All events (filterable)GET/api/alertsUnacknowledged alertsGET/api/watchlistWatchlist with vessel detailsGET/api/statsDashboard statisticsGET/api/live-vesselsLive AIS streaming vesselsPOST/api/alerts/:id/acknowledgeAcknowledge alertPOST/api/save-configSave AIS bounding box configPOST/api/upload-photo/:idUpload vessel photo
Example API Calls
# Get all vessels
curl http://localhost:8080/api/vessels
# Full AI analysis for a vessel
curl -X POST http://localhost:8080/api/vessel-intel \
-H “Content-Type: application/json” \
-d ‘{”vessel”: {”name”: “ZHONG DA 79”, “mmsi”: “413000000”, “vessel_type”: “Container Feeder”, “flag_state”: “China”}}’
# Quick BLUF assessment
curl -X POST http://localhost:8080/api/vessel-bluf \
-H “Content-Type: application/json” \
-d ‘{”vessel”: {”name”: “ZHONG DA 79”, “classification”: “confirmed”, “threat_level”: “critical”}}’
# Add position update
curl -X POST http://localhost:8080/api/vessels/1/position \
-H “Content-Type: application/json” \
-d ‘{”latitude”: 31.24, “longitude”: 121.49, “source”: “manual”}’
# Update vessel
curl -X PUT http://localhost:8080/api/vessels/1 \
-H “Content-Type: application/json” \
-d ‘{”threat_level”: “critical”, “intel_notes”: “Updated intelligence”}’AI Intelligence Features
The vessel intelligence module (vessel_intel.py) provides:
Search Plan Generation
AI generates targeted OSINT search queries based on vessel data:
Direct queries (vessel name, MMSI, IMO)
Operator queries (owner, flag state)
Risk queries (incidents, security events)
Context queries (geopolitical factors)
Strategic Analysis
Complete vessel analysis with structured output:
State logistics and civil-military fusion assessment
Construction origin and flag state significance
Operational patterns and security implications
Dual-use and rapid-mobilization potential
News coverage analysis
Risk Levels
LOW - No significant concerns
MODERATE - Some factors warrant monitoring
HIGH - Significant security implications
CRITICAL - Immediate attention required
Demo Data
The tracker includes comprehensive demo data for ZHONG DA 79:
{
“description”: “Tracked vessels for OSINT correlation”,
“vessels”: [
{
“id”: 1,
“name”: “ZHONG DA 79”,
“mmsi”: “413000000”,
“flag_state”: “China”,
“vessel_type”: “Container Feeder”,
“aliases”: [”ZHONGDA 79”, “ZHONGDA79”, “ZHONG DA79”],
“keywords”: [”arsenal ship”, “containerized missile”, “VLS”, “CIWS”, “Type 1130”],
“related_locations”: [”Shanghai”, “Longhai”, “Fujian”, “Huangpu River”, “Hudong-Zhonghua”]
}
]
}Architecture
┌─────────────────────────────────────────────────────────────┐
│ Arsenal Ship Tracker │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ AIS Stream │ │ OpenAI │ │ OSINT │ │
│ │ (aisstream) │ │ Analysis │ │ Reports │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ └────────────────┬┴─────────────────┘ │
│ │ │
│ ┌──────▼──────┐ │
│ │ Ingestion │ │
│ │ Layer │ │
│ └──────┬──────┘ │
│ │ │
│ ┌────────────────┼────────────────┐ │
│ │ │ │ │
│ ┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐ │
│ │ Live Vessel │ │ Geofence │ │ AI │ │
│ │ Tracking │ │ Detection │ │ Analysis │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ └────────────────┼────────────────┘ │
│ │ │
│ ┌──────▼──────┐ │
│ │ SQLite │ │
│ │ Database │ │
│ └──────┬──────┘ │
│ │ │
│ ┌──────▼──────┐ │
│ │ REST API │ │
│ │ Server │ │
│ └──────┬──────┘ │
│ │ │
│ ┌──────▼──────┐ │
│ │ Dashboard │ │
│ │ (Web) │ │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Key Intelligence: ZHONG DA 79
AttributeValueVessel TypeContainer FeederLength97 metersFlag StateChinaClassificationConfirmed Arsenal ShipVLS Cells48-60 (containerized)CIWSType 1130 30mmDecoysType 726Possible MissilesCJ-10, YJ-18, YJ-21Refit LocationLonghai Shipyard (Apr-Aug 2025)Current LocationShanghai Huangpu RiverPLAN RegistryNOT LISTED (civilian status)




Impressive build, the API structuer is really clean for what could've been a messy intel aggregation problem. The BLUF risk scoring automation is smart, I worked on similiar threat assessment systems and manual triage was always the bottleneck. Curious how the geofence alerts perform at scale with 10k+ vessels.