This is an extract of the data from Shadow Fleet section of the Ukrainian Government's War Sanctions website, served up as a Portolan / STAC catalog.
# GUR Shadow Fleet Catalog
A cloud-native catalog of Russia's maritime sanctions-evasion (“shadow”) fleet, built from Ukraine's Defence Intelligence (GUR) War & Sanctions portal.
Base URL: https://data.source.coop/cholmes/gur-shadow-fleet/
Root catalog: https://data.source.coop/cholmes/gur-shadow-fleet/catalog.json
Portolan browser: https://browser.portolan-sdi.org/#/external/data.source.coop/cholmes/gur-shadow-fleet/catalog.json
Source: https://war-sanctions.gur.gov.ua/en/transport/shadow-fleet
## What this is
Ukraine's Defence Intelligence (GUR) tracks the ~1,400 ageing tankers that move sanctioned Russian and Iranian oil outside Western oversight — the "shadow fleet". This catalog mirrors that registry as five linked, cloud-native tables. No open license is asserted; all rights remain with GUR (see RIGHTS.md). The masters table holds personal data.
## Collections
- `vessels/vessels.parquet` (GeoParquet, 1,404 rows) — The core registry: one row per shadow-fleet tanker.
- `ports/ports.parquet` (GeoParquet + PMTiles, 1,244 rows) — Ports and terminals visited by shadow-fleet vessels.
- `visits/visits.parquet` (GeoParquet + PMTiles, 19,678 rows) — The vessel↔port edge list: one row per recorded port call.
- `companies/companies.parquet` (Parquet, 1,518 rows) — Ownership & management companies tied to the fleet.
- `masters/masters.parquet` (Parquet, 534 rows) — Ship masters (captains) named in connection with the fleet.
## Joins
- visits.imo → vessels.imo (many-to-one)
- visits.port_id → ports.port_id (many-to-one)
- masters.vessel_gur_id → vessels.gur_id (many-to-one)
- json_extract_string(vessels.ship_owner,'$.company_imo') → companies.company_imo (also commercial_manager, safety_manager)
## Query (DuckDB)
```sql
INSTALL spatial; LOAD spatial;
SELECT name, imo, flag_current, dwt, category
FROM read_parquet('https://data.source.coop/cholmes/gur-shadow-fleet/vessels/vessels.parquet')
WHERE sanctioned_eu
ORDER BY dwt DESC LIMIT 10;
```
Each collection folder has its own llms.txt with a schema summary and example query.