Russian ghost ships to steal grain in Ukraine
Context
This investigation identifies vessels linked to grain extraction from occupied Ukrainian territories and documents evasion patterns such as disabling tracking systems. I contributed to the spatial evidence layer, mapping routes, port calls, and movements to support a verifiable cross-border narrative.
My role
- Data analysis
- Cartography
- Frontend development
I led the spatial evidence layer, mapping routes, port calls, and vessel movement patterns to support a verifiable cross-border narrative on sanctions evasion.
Data and methodology
The project was developed with correspondent Andrés Mourenza, who worked with local ship-monitoring sources tracking bulk carriers around the Bosphorus and Black Sea corridor.
Those observations were cross-checked against MarineTraffic route data to distinguish suspicious behavior, including segments where transponders were disabled near loading zones.
Key decisions
- We used the Nadezhda route as the narrative entry point to make the investigative mechanism understandable before expanding to the broader pattern.
- The story combined a VanillaJS + Mapbox scrollytelling structure to guide readers through each operational stage of the route and concealment behavior.
- For better performance control, I used georeferenced satellite images directly in Mapbox instead of server-side tiled GeoTIFF layers, loading only the imagery required for each step.
Result
The final piece connected sanctions discourse with concrete maritime evidence, showing how tracking gaps and route choreography can support illicit grain logistics.
Impact and learnings
- A key internal output was an analysis tool I built for the reporting workflow: it allowed non-GIS users to filter vessels, scrub route timelines with a slider, and replay trajectories at different speeds to validate hypotheses.
- Although not published, that internal tool was decisive for narrowing candidate ships and improving confidence in the final investigative findings.