Inspiration

Every year, billions of dollars worth of fish are caught illegally, devastating marine ecosystems and threatening coastal communities that depend on fishing. While vessel tracking exists through AIS (Automatic Identification System), we noticed a troubling pattern. Vessels intentionally disable their transponders when entering protected waters like the Galápagos Marine Reserve.

What surprised us was how little attention this gets. The data is there. Thousands of vessels go "dark" for hours or days near sensitive EEZ boundaries. But there's no accessible tool for researchers, journalists, or enforcement agencies to actually see and investigate these gaps. We built Fishy to fill that gap.

What it does

Fishy is a dark vessel monitoring platform that:

  • Visualizes global fishing activity using AIS data from Global Fishing Watch.
  • Detects AIS gaps, periods when vessels turn off their transponders, often indicating suspicion activity.
  • Predicts vessel positions during dark periods using an LSTM machine learning model.
  • Monitors EEZ boundaries with configurable buffer zones to catch vessels operating just outside protected waters.
  • Overlays SAR (radar) detections to identify "dark" vessels that aren't broadcasting AIS.
  • Users can select any EEZ region, scan vessels for AIS gaps, and generate probability clouds showing where a vessel likely traveled while dark.

How we built it

Frontend: Next.js with React, Tailwind CSS, and Mapbox GL for the interactive map interface. We used Global Fishing Watch's 4Wings API for real-time fishing effort tiles. Backend: Python FastAPI server hosting our prediction model.

ML Model: An LSTM neural network trained on historical vessel trajectories. Given a vessel's last known position, speed, and course before going dark, it predicts the likely path during the gap period, outputting a probability cloud visualization.

Data Pipeline:

  • Fetch vessel tracks from GFW API.
  • Detect AIS gaps (periods > 6 hours without transmission).
  • Build training sequences from gap events.
  • Train velocity predictor to estimate position after N hours.

Challenges we ran into

Data gathering was brutal. The Global Fishing Watch API has strict rate limits and complex authentication. We had to build a robust caching layer and learn to work with their specific data formats (4Wings tiles, vessel events API, gap detection endpoints). The prediction model went through multiple iterations. Our first attempts predicted absolute positions, which didn't scale with gap duration. A 1-hour gap and 24-hour gap would give similar predictions. We pivoted to a velocity-based approach (v3) that predicts degrees/hour, then multiplies by gap duration. This finally produced sensible results.

Accomplishments that we're proud of

Built a fully functional dark vessel detection pipeline from raw AIS data to visual predictions Integrated multiple GFW APIs (fishing effort, vessel events, gaps, SAR detections) into a cohesive interface. Created an intuitive UI that makes complex maritime data accessible to non-experts. Developed an ML model that produces reasonable position estimates for vessels during dark periods. And the tool works with any EEZ region worldwide, not just our test case (Galápagos).

What we learned

  • Maritime data is messy and fragmented. Vessels have multiple IDs, names change, and data quality varies wildly.
  • AIS gaps aren't always malicious (satellite coverage gaps, equipment failures), but patterns of intentional disabling are detectable.
  • Uncertainty visualization is an underappreciated UX challenge.
  • Rate limiting is a feature, not a bug — it forced us to build smarter caching. ## What's next for Fishy Improve the prediction model with more training data and features (weather, vessel type, historical patterns). Potentially adding more historical analysis data to show pattern of activity over time for specific fleets. integrating more data sources such as port records, catch reports, and satellite imagery.

Github Link: Fishy

Built With

  • heatmap
  • javascript
  • keras
  • languages:-typescript
  • lstm-neural-network-data-sources:-global-fishing-watch-api
  • mapbox-gl-js-backend-&-apis:-fastapi
  • probability
  • python-frontend:-next.js
  • react
  • rest-apis-machine-learning:-tensorflow
  • tailwind-css
  • uvicorn
Share this project:

Updates