The shore gateway and the mission portal are running now. Radio reception is demonstrated on hardware, and multi-hop routing has run between two devices on the bench. Sensor nodes are bench-tested on about six boards across several LoRa variants. The acoustic link is designed but not built, and a long-duration deployment has not happened yet.
Why OMEGA Exists.
Live ocean data is scarce. The instruments that gather it (official scientific moorings) are expensive, so there are very few of them. For most stretches of coast there is no real-time measurement at all: OMEGA pulls live Argo CTD casts via ERDDAP, which costs nothing next to building its own $20k floats.
The aim is to let a lab, harbor, school or sailing community monitor its own stretch of water. Local sensors can record temperature, air pressure and position, while public feeds provide a wider view. Putting both on the same map makes it easier to investigate a change without treating a forecast as a measurement.
Readings from OMEGA hardware carry a digital signature. A receiver can check which node signed a reading and whether the message changed in transit. That helps independent operators share data; it does not establish that a sensor is calibrated or that its measurement is correct.
What OMEGA Standardizes
The ocean is the least instrumented part of the planet, and the instruments that exist rarely compose. A moored buoy, a university glider, a harbor sensor, and a satellite product each produce readings in their own format, with their own identifiers, on their own server. Combining them is bespoke integration work that every group repeats, every time.
The constraint underneath is connectivity. Marine deployments lose their link routinely and for long periods, so an architecture that assumes an end to end path either fails or pushes operators toward expensive satellite backhaul. Cost follows from there: professional oceanographic instrumentation prices most potential contributors out of participating at all, including municipalities, small research groups, and community organizations.
OMEGA standardizes the observation, not the equipment. Every reading, whether it comes from a $40 ESP32 sensor or from a Copernicus model sample, is normalized into one self describing envelope carrying origin identity, sample time and position, typed measurements with units, and provenance. Metric names map to CF standard names, the shared vocabulary used across climate and forecast data, so two readings are semantically comparable and not merely transferable. A device joins the network by emitting that structure, and no OMEGA code has to run on the device itself.
Transport-agnostic delivery
Envelopes travel over the LoRa mesh, IP, and serial today. Bearer bindings for Wi-Fi HaLow, LoRaWAN, satellite, and a JANUS underwater acoustic link are specified and not yet exercised on hardware. Each medium has a normative bearer binding that fixes its framing and field mapping, so the envelope's meaning stays fixed while only its encoding changes.
Data travels as store-and-forward bundles
A reading is wrapped as a self contained bundle addressed to a logical destination and carried opportunistically toward home, including by physical carriers such as vessels or phones. No end to end path is ever required. Reliability comes from redundancy plus deduplication on a globally unique origin and sequence identifier.
Signed by the producer, checked at every hop
Per-node Ed25519 signatures let a receiving gateway establish who produced a reading without trusting whoever relayed it. That is what makes carriage through third party infrastructure acceptable, and it lets data cross organizational boundaries without an institutional trust relationship behind it.
One model covers sensing, vehicles, and acoustics. One identity scheme, envelope, storage model, and command vocabulary covers environmental sensors, autonomous surface vessels, ROVs, and acoustic links. Only the environmental sensors exist as hardware today. The single model is deliberate, so the vehicles and acoustic links arrive already compatible with the sensors that exist now.
The gateway is local first: the full system runs on a Raspberry Pi with no internet connection. Optional third party data providers are credential gated, and when one is unavailable it reports its absence and supplies no value, so a missing provider shows up as a gap in the response and never as a substituted number.
A reference gateway runs continuously, ingesting live data from roughly forty public sources including NOAA weather buoys, DART tsunami stations, tide gauges, marine forecasts, and space weather, alongside an archive of several hundred thousand normalized measurements. The observation envelope is published as a normative specification and a JSON Schema, with a conformance kit and client SDKs alongside it. An analysis layer provides spectral analysis, cross correlation, coherence, trend and changepoint detection, calibration drift monitoring, and model validation against measurements taken in the water. Correctness is enforced by 1,491 automated tests, and the deployed instance re-verifies its own published guarantees nightly, alerting only on failure.
Results from testing and analysis
Start with results. One came from an OMEGA board on the bench. The other two came from OMEGA's analysis code running over public NOAA and Copernicus data. Each one is written up in full on the pages that follow.
The Model Agrees With NOAA
OMEGA's science pipeline compared the Copernicus sea-surface-temperature model against 12 NOAA observing stations. The two agree at a correlation of 0.965 to 0.971, with an RMSE of 0.774 °C.
It Caught a Storm Turning
Running its own statistics over wave data at NOAA buoy 46013, OMEGA pinpointed the exact moment the sea state shifted (June 8, 2026, a 0.77 m drop in wave height), the kind of change a harbormaster cares about. See the detection →
It Resolved the Atmosphere's Twice-Daily Tide
The whole atmosphere rises and falls twice a day: a planet-scale "tide" of air. A $50 OMEGA barometer logged 104,939 readings, and the pipeline resolved that tide at its textbook 11.99-hour period, standing ~580,000× above the noise. See the spectrum →
The meaning of a reading is kept apart from how it travels.
In OMEGA, a reading means the same thing no matter how it reached you: by radio, by cable, or over the internet. The data's meaning (its envelope) is kept separate from the exact format it happens to travel in (its wire form).
That single decision is what makes OMEGA open: Adapters for an 8-channel receiver, SignalK, and The Things Network feed the same ingest contract with no protocol changes. The 8-channel receiver has run against live traffic. The envelope standardizes identity, time, location, and payload, while the format shifts to fit each link: a dense 84-byte packet over radio, plain JSON over the internet, other formats for specialized receivers.
Follow One Reading, Wave to Screen.
Follow one water-temperature reading on its journey, from a probe bobbing offshore to a 3D globe on someone's laptop. Four layers, each doing exactly one job and handing off cleanly to the next.
1. A probe takes the reading. A solar-charged buoy (an ESP32 microcontroller with GPS and sensors, sipping about 60 mA from a single 18650 cell) samples the water and writes the reading to its own flash first. It never waits on the network: at sea, waiting for a reply that never comes would hang the node, so the firmware makes no blocking network calls at all. Saltwater corrodes contacts, waves physically block radio, winter starves the solar panel; the firmware is written assuming all of it.
2. The mesh carries it ashore. The reading is packed into an 84-byte binary frame (it would be 283 bytes as plain JSON, a 70% cut), batched with its neighbors, and moved by store-and-forward: each node holds data until a real route appears (a relay on a headland, a passing node acting as a "data mule"), then hands it off. Urgency picks the radio: a critical alarm goes out instantly over whatever's fastest (cellular, Wi-Fi HaLow), while routine readings wait for the cheap, low-power LoRa link. If every native path fails, frames can even ride foreign open meshes like Meshtastic, under a firmware-enforced airtime guardrail that keeps it legal and polite.
3. The shore gateway makes sense of it. A Python service on a Raspberry-Pi-class box catches the frame, checks its cryptographic signature, and "inflates" those 84 bytes back into the full standard envelope. It lands in a single-file SQLite database running in write-ahead mode: bursts of packets can't lock it up, and the entire deployment's data is one file you can copy to a USB stick for a complete backup. The same gateway pulls NOAA buoys, tide gauges, and public marine models into the identical format, so public data and OMEGA's own hardware sit side by side, queryable the same way.
4. The globe shows it. In the browser, a 3D Earth: scrub time backward, slice the ocean by depth, click any buoy. Measurements render solid and sharp; forecasts render as soft, flowing particles; you can always tell them apart at a glance. And each layer keeps working when the one above it stops: if the portal goes down the gateway keeps buffering, and if the gateway goes down the buoys keep logging to flash.
Each layer only knows about its neighbor. That's why a dead laptop on shore never costs you a night of ocean data; the buoys and the gateway carry on alone until it returns.
Acoustic / JANUS Bearer (Designed, Not Deployed)
A software-defined, JANUS-interop acoustic bearer is scaffolded as an opt-in transport for subsurface relays (~11.5 kHz, under 5 km range, ~80 bps). The gateway and portal layers have the longest-running evidence, and the LoRa mesh has been demonstrated on the bench. The acoustic bearer has been exercised only in simulation.: it has only been exercised in simulation, and no ADCP, sonde, or acoustic-modem hardware has been deployed. It is presented here as a designed extension to the bearer-agnostic envelope, not as built infrastructure.
graph TD
subgraph Layer 1: Surface Mesh
B0[Sensor Probe] -->|UART| B1[Surface Buoy Relay]
B1 -->|TLV Encoding| B2[LoRa 900MHz SX1262 / LR1121]
B2 -->|CSMA-CA CSS| B3((Marine RF Link))
end
subgraph Layer 2: Mesh Transport
B3 -->|DTN Carry / Forward| T1[Binary TLV + Batching]
end
subgraph Layer 3: Shore Gateway
T1 -->|RF Reception| C1[Python ASGI Receiver]
C1 -->|Pub/Sub Queue| C2[Service Layer]
C2 -->|QC Range Math| C3[(SQLite WAL Database)]
end
subgraph Layer 4: Mission Portal
C3 -->|REST JSON| D1[FastAPI Routers]
D1 -->|WebSockets| D2[React DOM Client]
D2 -->|Throttle Hooks| D3[3D WebGL Digital Twin]
end
The map interface
One Reading's Full Path.
84-byte frames} -->|CSMA-CA| GW GW[Shore gateway
verify · store] -->|HTTP| UI((3D globe)) classDef default fill:#0a0f1d,stroke:#9aa2b1,stroke-width:1px,color:#9aa2b1; classDef node fill:#101529,stroke:#3b82f6,stroke-width:2px,color:#fff; class E1,E2,E3,GW,UI node;
The Hard Problems.
Each problem below came up in practice, and each one lists the fix that shipped.
Two Radios That Could Not Hear Each Other
The problem: the buoys use one LoRa chip (Semtech SX1262), the relays a newer one (LR1121). On paper they speak the same language; out of the box they decoded 0% of each other's frames: the chips default to subtly different sync words, checksums, and signal-inversion settings, and any one mismatch means dead air. The fix: force every radio onto the public 0x34 sync word, disable Low Data Rate Optimization, and align CRC and IQ-inversion across both chip families. That took the link from nothing to ~50% of frames decoding on the bench. About half of cross-family frames decode, and closing the rest is ongoing.
Fitting a Full Reading Into 84 Bytes
The problem: a marine radio link trickles a few hundred bits per second, and the law limits how long you may transmit. A reading as ordinary JSON is 283 bytes, too fat to send every few seconds. The fix: a custom binary format that carries the same reading in 84 bytes, plus batching that sends the first value in full and then only each tiny change from reading to reading, rebuilt losslessly on shore. The reading that arrives on shore is identical, at a fraction of the airtime.
Signing Numbers Two Computers Agree On
The problem: to sign a reading, sender and verifier must produce byte-identical text, but decimals break that. Python writes a coordinate as 1e-07, JavaScript as 0.0000001: the same number in different bytes, so the signature no longer verifies. The fix: ban decimals from the signed form entirely. Time in whole seconds, position in millionths of a degree, depth in millimeters: whole numbers only, reproduced identically by a $30 microcontroller and a cloud server. Full story in the trust model below.
No code waits on a reply
The problem: normal networking assumes a reply is coming. At sea, batteries die in cold water, waves block radio signals, and salt corrodes seals; nodes will vanish mid-conversation, and any code waiting on them hangs forever. The fix: a Delay Tolerant Network. No blocking calls anywhere in the firmware; data moves only when a route exists. The node uses whatever brief connectivity windows it gets, and a long silence delays delivery without losing readings.
The relay that transmitted perfectly but never received (fixed by one line), the route-planner that sent a boat 13,000 miles the wrong way around the planet, the map that hung because the browser ran out of connections. Each is written up on its own page: Hardware & Mesh, Mission Portal and Backend Gateway.
What the Live Map Shows.
The map keeps measurements and forecasts distinct. A missing sensor reading leaves a visible gap. Model data can still provide context in its own layer, but it does not fill that gap. For OMEGA hardware, a digital signature also lets a receiver check the message's source and integrity.
Cross-Language Float Bugs
Cryptographically signing a JSON payload containing floating-point numbers is notoriously brittle. Python might serialize a coordinate as 1e-07 while a JavaScript node emits 0.0000001. The data is identical, but the string representation differs, breaking the signature verification and making cross-platform trust impossible.
Float-Free Ed25519 Envelopes
The signature uses Ed25519 and a text format containing whole numbers: seconds for time, millionths of a degree for position and millimeters for depth. Avoiding decimal formatting differences lets the microcontroller and server reconstruct the same bytes when checking the signature.
An Open, Multi-Operator Network.
OMEGA runs as an open network of independently-run gateways. Identity is rooted in cryptography, and joining is zero-config: a gateway mints its own key, and that key is its credential.
Self-Minted Identity
On first boot a gateway mints a persistent Ed25519 keypair. Its gateway_id is the key fingerprint, so identity cannot be forged or reassigned. The node self-signs an identity card and joins with no operator-issued token: it generates a key, self-registers, announces, and proves key-possession to peers.
Federation Directory
A federation directory records each peer and a per-peer data-sharing policy (public, partners, or private) with explicit revocation. Operators decide who sees their feed; a revoked peer stops receiving shared observations.
A Transparent Contribution Rank (0–100)
A 0–100 reputation rank is computed transparently from the public sightings ledger: volume, reach, recency, and longevity of a contributor's data. It is deliberately a contribution rank, not a trust gate: it surfaces who is feeding the network, and is not used to admit or block peers. Its quality-control sub-score is inactive today and stays disabled until per-reading QC lands.
Why Python over Go or Rust?
For a telemetry gateway handling raw binary bytes, compiled languages like Rust or Go look like the obvious choice. OMEGA runs on Python anyway, and the reason is who uses it.
Speed vs Science
Python is slower than C++ or Rust. OMEGA's target audience is marine biologists, climatologists, and university researchers. With the entire gateway in Python, researchers can plug pandas, scipy, and numpy models directly into the pipeline without learning a systems language. Those researchers are the people who extend the pipeline, so the gateway is written in the language their analysis code is already in.
Async Everywhere
To offset the speed penalty, the gateway is built on FastAPI and Python's asyncio event loop, with strictly non-blocking I/O: every database query and web request yields the loop while it waits. For a network whose radios deliver bytes at a trickle, that concurrency is more than enough.
Why SQLite over PostgreSQL?
OMEGA stores everything in a single SQLite file, with no database server and no container around it, which at sea is the safer bet.
The Constraint: the gateway often runs on a Raspberry-Pi-class board on a pitching vessel, where waves over the solar panel can cut power without warning; and SD cards are notorious for corrupting under exactly that abuse.
The Decision: a Docker daemon with a PostgreSQL volume is a lot of moving machinery to trust to a fragile SD card. SQLite compiles directly into the Python process (no daemon at all) and the whole database is one physical .db file, so a field operator can copy omega.db to a USB stick and hold a complete, air-gapped backup of the entire deployment. Write-ahead mode (PRAGMA journal_mode=WAL) removes SQLite's classic locking limits, so a reader and a writer no longer block each other.
Why a 3D Globe on the GPU?
OMEGA renders the map the way a video game does: hand all the points to the graphics card (the GPU) at once. A normal web map (like Leaflet) draws every dot as its own little web-page element, which holds up for a few dozen pins and grinds the browser to a halt once you pile on thousands of historical readings..
of DOM nodes] --> Crash[Browser
bogs down] R[React state] -->|array buffer| W[WebGL] --> G[GPU canvas] --> Fast[Render
on change] classDef default fill:#0a0f1d,stroke:#9aa2b1,stroke-width:1px,color:#9aa2b1; classDef bad fill:#3f1010,stroke:#ef4444,stroke-width:2px,color:#fff; classDef good fill:#101529,stroke:#3b82f6,stroke-width:2px,color:#fff; class Crash bad; class Fast good;
The Decision: the portal uses a self-hosted CesiumJS 3D globe that bypasses the browser's DOM, passing coordinate buffers directly to the GPU via WebGL. It renders on change, so a laptop stays responsive, with time-stepped overlays for playing history back.
Status: the 3D digital twin (DTO v3) is partial and in-flight; first load is currently on the order of 30–60 seconds. Pushing into the millions-of-points regime via a Deck.gl layer is a roadmap goal, not shipped today.
import { DeckGL } from '@deck.gl/react';
import { ScatterplotLayer } from '@deck.gl/layers';
// Roadmap sketch: a GPU point layer for dense historical telemetry
function TelemetryMap({ data }) {
const layer = new ScatterplotLayer({
id: 'telemetry-layer',
data,
// WebGL bypasses the DOM and injects directly to the GPU
getPosition: d => [d.longitude, d.latitude],
getFillColor: d => {
// Color map based on raw temperature
if (d.temperature > 25) return [239, 68, 68]; // Red
return [59, 130, 246]; // Blue
},
getRadius: d => 10,
radiusUnits: 'pixels',
pickable: true
});
return (
<DeckGL
initialViewState={{ longitude: -157, latitude: 21, zoom: 6 }}
controller={true}
layers={[layer]}
/>
);
}
Let Operators Add Their Own Formulas, Safely.
Operators frequently need custom derived metrics (e.g., dewpoint, heat index, density) calculated on the fly without writing backend code. The naive approach is running Python's eval() on the server, which is a serious code-injection vulnerability on a public gateway.
The Solution: The backend implements a custom Abstract Syntax Tree (AST) interpreter for derived metrics. It parses and validates mathematical formulas at definition time, explicitly allowing only numeric literals and a whitelisted set of math operations (sqrt, sin, log). Attribute access, function calls, and import tricks are rejected at parse time. Operators get full mathematical expressiveness, and anything outside that whitelist never runs.
Where the Stack Stands.
A plain read of where the stack is strong and where it isn't: the protocol, gateway, and portal carry field evidence, the mesh has been demonstrated on the bench across about six boards and more than one LoRa radio family, including multi-hop relaying, and the alternate bearers and the edge firmware's field-hardening are the least mature parts.
Multi-hop mesh routing has been demonstrated on real hardware, with two nodes relaying a frame to a gateway on the bench, and has not yet run in a field deployment; cross-family RF interop gets a link about half the time, which leaves it unsolved; firmware field-hardening is written but not yet on deployed hardware; and the 3D twin is partial. The single-hop LoRa link, the gateway, and the portal are where the longest-running field evidence lives.