Inspiration

When floating trash reaches a shoreline, we can see where it stopped. But where did it enter the water? And where could we collect the next piece before it reaches a vulnerable habitat?

Nemo connects those questions. Source tracing is our main purpose; prevention is the next decision. We began with an experiment we could see and understand: a green bottle cap representing floating trash, three possible entry regions, a webcam, a pump and a mesh collector.

Our goal is to help coastal teams investigate possible pollution pathways and choose collection plans worth testing. Today, Nemo is a working research prototype, not a validated worldwide pollution-source finder.

What it does

Nemo brings observation, modeling and explanation into one workspace, with three distinct evidence paths:

  1. Real camera observation: OpenCV finds a green cap in our tray. This verifies marker visibility, not source accuracy.
  2. Synthetic source investigation: saved simulated paths demonstrate how Nemo compares possible entry regions and handles uncertainty.
  3. Historical ocean research: real archived NOAA buoy positions test motion models and earlier/later position hypotheses.

These paths inform the same research goal without being presented as one completed physical experiment.

Nemo workflow: camera observation, synthetic source investigation and historical ocean research.

What are A, B and C?

They are candidate regions where an object could have entered the tank. Nemo simulates possible journeys from those regions and compares them with the saved observed path. In our synthetic example, C fits best under the declared assumptions. The support bars describe compatibility within those candidates, not a calibrated probability or proof of a polluter's identity.

The estimator can return Ranked, Unknown or Invalid. A cap first seen trapped at a collector may not reveal its earlier journey. Returning Unknown is useful: it tells the operator that another observation or a different experiment is needed.

Synthetic source example: C best matches the saved path within the declared candidate regions.

Our physical prototype

Our rig uses a Logitech C270 USB webcam, a clear tray, a Pond Boss 80 GPH pump, about three feet of 3/8-inch-inside-diameter tubing, a mesh collection pocket and reusable green caps. Megana measured the inside waterline as 35.56 × 22.86 cm. A person operates the pump using its separate original power cord; Nemo does not control it electronically.

Our physical prototype: overhead webcam, clear tray, pump, tubing, marker and mesh collector.

These hardware illustrations explain placement and tubing routes. Their arrows show intended circulation, not a measured flow field. The third illustrates an alternative without tubing.

Illustrative pump, tubing and mesh-catcher arrangement; arrows represent intended circulation.

Second view of the illustrative tubing route and return outlet.

Alternative hardware arrangement without tubing, with a different pump orientation.

The local detector uses color and shape checks to find our controlled green marker. It is not a general plastic classifier. Camera frames stay on the capture laptop. An estimated grid reuses saved geometry; unsupported alignment withholds centimetres. Independent alignment checks are required before positions can support measured trials. The pump's throughput rating is not the water velocity everywhere in the tray.

Real green-cap detection with an estimated grid. Camera frames remain local; current centimetre accuracy is unvalidated.

How the physics works

For tank source investigation, Nemo sends particles forward from each candidate region under declared drift, spreading and retention assumptions, then compares their histories with the observation. This tests possible journeys instead of assuming that one backward line reveals a unique origin.

The ocean walkthrough makes a different calculation visible. It starts with three permitted historical NOAA positions, connects them, and uses a causal Kalman filter to estimate position and velocity. The connected line is a visual estimate between fixes, not newly observed movement.

Three processed historical NOAA positions; motion between the dots is not directly observed.

updated state = predicted state + weighted measurement correction

The filter balances model and measurement uncertainty. It does not read reserved comparison positions to improve its answer. Its noise assumptions are not independently measured buoy accuracy or settings transferable to our centimetre-scale tank.

The Kalman stage combines permitted observations with a motion estimate.

The walkthrough's next rule is:

particle motion = modeled current(position, time) + fixed initial motion offset

The offset is filtered velocity minus modeled current at the final permitted observation, held fixed afterward. RK4 integrates that field forward and backward through the appropriate times. Purple explores earlier positions; teal projects later motion. Neither branch identifies the object's release time or proves a pollution source. Backward integration cannot undo mixing, beaching or capture.

Purple earlier-position hypotheses and teal later projections, separate from source-identification evidence.

Real data, including results that challenged us

We use archived NOAA Global Drifter Program positions, historical HYCOM currents, a saved PacIOOS ROMS current forecast and separate NOAA Coral Reef Watch heat-stress context. Buoys are not plastic. HYCOM's saved 15-metre depth limits its relevance to surface debris, while reef heat stress provides habitat context rather than source evidence.

Recorded NOAA movement and a free-running six-hour forecast. Their separation shows prediction error.

One frozen comparison evaluated five fixed models on six new-to-project historical buoy groups: 180 model-hour outcomes against 36 distinct later positions. Mean position error was about 1,573 m for last observed drift, 1,656 m for Kalman and 1,772 m for ridge velocity AR(1). The simple last-drift baseline performed best on this cohort. Reusing targets across methods does not create independent experiments.

Five fixed motion models across six historical buoy groups; lower position error is better for this study.

A separate retrospective reverse-current test missed earlier positions by 8.70 km on average, versus 2.20 km for last-drift extrapolation on two already-viewed targets. We kept this unfavorable result. Reversing a forward model alone does not validate pollution-source inference, and a tiny numerical round-trip error does not prove the recovered past is correct.

From a source question to a prevention experiment

The ocean comparison applies equal-length interception layouts to the same six hypothetical releases under changing currents. It predicts six reef-proxy entries without interception, two with layout A and four with B. Capture is idealized, and the receiving-area proxy was chosen after viewing the forecast. The result suggests a scenario to test, not measured reef protection.

Simulated reef-proxy entries: no interception 6/6, layout A 2/6 and layout B 4/6.

The Three.js tank scene renders saved geometry and representative paths. Users can orbit, switch layouts and scrub time while full-report counts stay fixed. Its stock 40 × 30 cm synthetic scene is separate from our 35.56 × 22.86 cm physical tray. Equipment and depth are schematic; this is a rehearsal, not a validated fluid simulation. The trial ledger distinguishes predictions, synthetic outcomes and reported physical trials, retaining unresolved or missing releases.

Schematic 3D tank rehearsal with saved paths, collector footprint and protected-zone proxy.

Chalk, Photon and Grok

Python computes the scientific results. Chalk helps explain them. A question is attached to the selected case. Our backend checks permissions and report identity, then exposes bounded evidence tools to a language model through Chalk Model Gateway. The returned explanation must satisfy its action contract and cite permitted evidence; stale or invalid output is rejected.

Here, Chalk explains why C fits the saved synthetic path and describes the candidate, release-window and transport assumptions. Citations and the tool trace connect its words to the report. A provider failure leaves the numerical evidence available and cannot upgrade Unknown to an accepted source.

Verified live Chalk explanation of the saved source report, with evidence citations and tool trace available.

Photon brings the same saved-case investigator into iMessage. We verified an actual delivered automatic reply to a natural source-evidence question. The authorized conversation is pinned to a saved case; it does not silently follow the live cap. A local worker handles messaging with durable inbox/outbox records and idempotent retries. Hosted Photon checks project authentication read-only.

Actual Photon question and delivered automatic reply about the saved synthetic source evidence.

Grok helped us challenge the implementation. We used it for physics research, model comparisons, causal filtering, RK4, reverse-source limitations and test design, with Cursor contributing to development. We checked suggestions against code, data and tests and retained reviews and corrections. Our Python backend executes the calculations.

Building, testing and learning

Python, FastAPI, Pydantic, OpenCV, NumPy, SciPy and SQLite support the services. Next.js, React and TypeScript provide the interface. GitHub Actions checks changes, and Render hosts the software demo; full webcam processing stays on the local companion.

Verification covered source states, evidence freshness, authentication, NOAA stages, trajectory toggles, frame/box identity, 3D playback, messaging retries and provider failure paths. Separate live checks obtained a Chalk explanation and a visible Photon reply. These software and integration checks do not establish physical prediction accuracy.

Our hardest practical challenge was getting usable evidence. Shadows, ripples, small camera shifts and cap retention affected recordings. We excluded unusable wet runs instead of treating trapped-cap jitter as water flow. No independently validated physical source or interception result has been established.

What's next

We will check current alignment, record separate flow-training and validation runs, freeze the method, and conduct blind known-source releases. The evaluator keeps the true source hidden until Nemo saves its answer. Correct, incorrect, Unknown, invalid and missing outcomes all remain visible. Interception predictions then need independent observed entry and mesh-retention outcomes.

Nemo's long-term purpose is practical: help teams investigate where pollution could enter the water and decide where collection equipment deserves a real test. Our prototype connects that decision to evidence people can inspect.

Explore Nemo

Built With

Share this project:

Updates

Submission history