Ralph Waldo Emerson once wrote: “I cannot remember the books I’ve read any more than the meals I have eaten; even so, they have made me.” The line has been making voracious readers feel less bad about themselves ever since, but it is also largely my approach with these side quests. Tinkering for tinkering’s sake, even in projects that have themselves failed, rarely is time wasted.
So when last month Times of Malta hopped on a boat to track sea slime, I realised my adventures with jellyfish might actually be useful for a more empirical approach.
This post is a bit about how we can use open source tools to simulate drift, and how I packaged it up in a relatively simple static webpage that refreshes twice daily.
Approach
Compared to jellyfish, surface contamination is easy: just model drift at the surface. If you have plausible source locations and information on the currents on a given day, you’re already almost there.
Wave and current information is most easily obtained through Copernicus Marine Environment Monitoring Service, which delivers a 4km resolution forecast of currents and waves for several days ahead.
For the drift modelling, we can depend on OpenDrift: an open-source Lagrangian particle-tracking simulator. This lets you release individual particles (representing fish larvae, marine litter, oil, or even search and rescue targets), and see simulations of their trajectories through time as they are acted on by ocean currents, winds, and waves.
For the purposes of the experimental forecast, we seed particles twice a day, and run 24 hour simulations on those. A particle is considered “beached” if it touches any part of the shore.
Wrapping it up as a service
I’ve been skimpy on the code because it’s in a repo that’s set to run twice daily via a GitHub action. The end result is a fairly basic .png plotted through Matplotlib and displayed in a really basic html.
The architecture of the thing is roughly:

But what is the Slime?
“Sea slime” is a broad category of organic slicks on the sea surface. Their sources can be completely natural like zooplankton blooms or sea snot.
But a common man-made source is often feed like sardines and herring being fed to farmed fish. This source becomes significant in peak feeding times for tuna: often summer and early autumn. The actual volume of feed involved here is enormous, in this really good ARTE documentary David Azzopardi explains that tuna eat about 6% of their body weight a day, amounting to 15 tonnes of feed per cage a day. For a single operator that might have 10 cages, you’re looking at a logistical operation to source and deliver offshore 150-200 tonnes of feed.
A key assumption of this map is that there will always be slime to be ‘drifted’. In reality a number of mitigation measures exist, like properly thawing the feed and deploying booms around the cages, besides the off months. But here we’ll be pessimistic and assume the worst.
And since we’re on the subject, I genuinely find the discourse around acquaculture to be perplexing. Demanding that the whole industry be shut down particularly when it is such an important part of our economy (and one that’s actually innovative and interesting to boot) is a bit bonkers. Let’s maybe try to identify the issues and come up with solutions instead?
As an aside, tuna ranching allows tiny Malta to be one of the handful of countries in the world with a trade surplus with Japan, the land of Toyota and Sony.
Fish Farm Locations
Tuna pen cages are ridiculously easy to pick out on SAR imagery, especially in Sentinel-1 VV mode. While the open water scatters the energy, the cage structures are metal with sharp angles, reflecting the radar signal. This produces bright spots against the darker background of the sea, making them roughly akin to the radio equivalent of finding a bright light in a pitch black night.

Tuna pen cages to the East of Marsascala/Marsaxlokk (top), and to the North of Armier (Bottom)
The empirical way to attribute source is to run a back trace from known landing positions using a zillion particles. I’m not doing this because I have no interest in attributing blame. But given these locations, we can also run drift forward to have a forecast!
Historical Performance
So how would this webpage have of fared over the past year and a half?
Well the dashboard itself would have of looked like this on the 14th of August (peak outbreak):
Alternatively, we can run it for the whole of 2024 and 2025 so far, showing a bit the most impacted areas:
And just like the jellyfish forecast, we don’t want it to be too sensitive (i.e. predict slime all the time).
Besides that, it’s a bit hard to verify performance other than trying to line them up with reports in media, which is why I’m slapping a big ‘experimental’ label on this thing.
Why Gozo Channel Makes this thing hard for some beaches
A major limitation of this as it currently stands is I’m not very confident CMEMS can handle currents around the Gozo Channel quite reliably. There are two main problems I see here.
First, 4km is a coarse enough resolution to be conflated with the land mask here, (which means we do not get some cells because CMEMS thinks they are land).
Second, CMEMS is a very broad large scale forecast. The Gozo Channel is quite a bit more complex with a shallow seabed and quirky coastal features. Coarse models like CMEMS often misses the nuanced eddies, flows, and coastal interactions that really matter.
Specialist high-resolution batymetric models that better capture these local dynamics are often used here. One good one is ROSARIO, run by Professor Aldo Drago, although last I checked querying data and getting something akin to CMEMS out is still not possible.
What this means is, for bays like Hondoq and Xatt l Ahmar are probably underrepresented in these statistics.