What Is Running, and What Is Not.
The detail below is long. This is the short version, so nothing further down has to argue for itself.
Oceanic Measurement and Environmental Geospatial Array.
Satellites map the ocean surface from orbit. Measuring what the water is doing at your harbor takes a moored scientific buoy, and those are expensive enough to be few and far between. OMEGA is a complete, open system for measuring the ocean yourself: solar-powered sensor buoys built from parts anyone can buy, a radio mesh that carries their readings ashore from beyond cell coverage, and a live 3D globe where you watch your own patch of ocean in real time, with every reading cryptographically signed and results that track NOAA's official buoys almost perfectly.
The detail below is long. This is the short version, so nothing further down has to argue for itself.
| Sensor nodes | Bench-tested on about six boards across several LoRa variants |
| Radio reception | Demonstrated on hardware |
| Multi-hop routing | Demonstrated between two devices on the bench; field test pending |
| Shore gateway | Running continuously |
| Mission portal | Running |
| Acoustic link | Designed, not built |
| Long-duration deployment | Not yet demonstrated |
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: if you want to know what the water is doing at your harbor, reef, or research site, you usually get a forecast model's guess instead of a reading.
OMEGA changes who gets to measure the ocean. A research lab, a harbor, a school, or a sailing community can put their own sensors in the water (readings like water temperature, air pressure, and position) and watch their own patch of sea live: when the temperature spikes, when the swell turns, when a storm arrives. The system also pulls in the official public feeds (NOAA buoys, tide gauges, ocean models), so your hardware and the government's appear side by side on the same map.
And because every reading is cryptographically signed and the network is an open federation anyone can join, what one operator measures can be shared with (and trusted by) everyone else. That is what lets the network grow by adding many affordable instruments where today there are only a few expensive moorings.
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.
Envelopes travel over the LoRa mesh, IP, Wi-Fi HaLow, LoRaWAN, serial, and satellite, with a JANUS underwater acoustic bearer specified and not yet deployed. 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.
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.
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. The same identity scheme, envelope, storage, and command semantics serve environmental sensors, autonomous surface vessels, ROVs, and acoustic links: telemetry flows up, and signed, versioned commands and mission intents flow down. A system that grows a separate subsystem per domain ends up with subsystems that cannot talk to each other.
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.
Start with results. All three came out of this system's own hardware and pipeline, and each one is written up in full on the pages that follow.
When OMEGA's science pipeline and the government's official buoys watched the same ocean, they matched with a correlation of 0.965–0.971 across 12 stations: near-perfect agreement, from hardware that costs a tiny fraction of an official mooring.
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 →
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 →
A reading should mean the same thing no matter how it reached you: by radio, by cable, or over the internet. Everything else hangs on that. In the program's words, "the standard is the protocol, not the box." 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: an 8-channel radio receiver, a sailboat's SignalK navigation feed, and The Things Network all joined the mesh with zero protocol changes; they feed the same ingest contract, and boats and third-party networks become first-class OMEGA stations. 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 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.
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 LoRa mesh, gateway, and portal layers have field evidence behind them. This one has no field evidence: 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 architecture above reads clean. Getting there wasn't. Each problem below came up in practice, and each one lists the fix that shipped.
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. That is a working link and not a solved problem, and closing the gap is ongoing.
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.
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: same number, different bytes, signature dead. 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.
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; every reading is safe in flash before any transmission is attempted; data moves only when a route genuinely 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.
An ocean instrument is only scientifically useful if you can always tell a measurement from a forecast. OMEGA enforces an "Absolute Data Purity" rule: the live map shows only deployed hardware and real measurements. Missing data renders as a visible gap, never quietly filled in with a forecast. Each measurement is cryptographically signed at the source, so any receiver can check that the reading came from that node and has not been altered on the way.
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.
Each reading is signed at the source with a standard scheme (Ed25519) over a stripped-down text form that uses only whole numbers (time in whole seconds, position in millionths of a degree, depth in millimeters) and rejects any decimals outright. This guarantees that signed bytes are 100% reproducible on a $30 microcontroller and a cloud server alike, securing the federation against spoofed readings.
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.
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.
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 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 honestly inactive today and stays dark until per-reading QC lands.
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.
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.
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 instead of stalling. For a network whose radios deliver bytes at a trickle, that concurrency is more than enough.
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.
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 handful of pins and grinds the browser to a halt once you pile on thousands of historical readings.
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. To keep a laptop responsive it renders on-change rather than in a fixed loop, 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]}
/>
);
}
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.
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 is a working ~50% link rather than a solved problem; 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.