A citizen-science platform turning ocean photos into fundable biodiversity data, maps and analytics.
Imagine if every dive, surf, or beach walk yielded verified data that protects the ocean and pays you for it. As coastlines change faster than governments can monitor them, marine conservation, coastal management, and eco-tourism face a critical shortage of actionable data. Traditional scientific fieldwork is costly and geographically limited, yet millions of surfers, divers, and beachgoers are already out on the water every day, seeing far more than any research team ever could. Nautica bridges this gap by empowering everyday explorers to become citizen scientists, turning casual sightings into valuable records, covering vast coastlines that funded surveys could never reach.
For contributors (citizen users), using the app feels less like filling out surveys and more like a fun outdoor scavenger hunt. Either you log what you come across in the ocean or at the beach or, as a special feature called “quest”, Nautica gives you a list of species to log - a short daily hit-list of targets, some of them posted and funded by a research partner who needs that exact record - whether that's sea turtle nesting tracks along the dunes, a Blue Dragon nudibranch, or a patch of seagrass. You capture them using whatever device you already have with you: a phone on the beach, a GoPro while snorkeling, or an underwater camera on a deep dive.
When you upload a photo, two checks run automatically: First, World ID confirms you're a unique human - no wallet setup, no intrusive KYC - capping one human to one identity globally without Nautica ever collecting an ID or touching a bank account. Tiered credentials match proof to stakes: a quick Selfie Check to explore and earn XP, a stronger Identity Check or Orb verification before any payout (mocked for demo). For the buyers on the other side, "every record traces to a provably unique human" is a guarantee ordinary citizen-science apps cannot make. Second, an AI vision model (qwen3-vl-30b) on 0G Compute identifies the species and returns a tamper-proof attestation - verifiable proof of what was checked and by which model, that anyone can re-verify later without trusting our server. So anyone can confirm later that a record wasn't faked or edited - stock photos, screenshots, and pre-generated fakes don't pass. Once it's written on-chain, a third, independent check flags anything logged somewhere it biologically shouldn't be, like a lionfish far outside its range. Submissions earn XP and climb the community leaderboard; at Level 5 you unlock sponsored research quests that pay out in USDC on Base. Every verified record is recorded on-chain and indexed by The Graph into a public, queryable feed - the leaderboard, the live sightings map, and partner dashboards all read from it, and because it's an open dataset, a city or scientist can even query it with their own AI agents.
The real demand comes from the other side of the platform: • Municipalities & State Agencies can track invasive species (blue crabs, lionfish) and monitor beach safety (jellyfish warnings) and water health along public coastlines. • Scientists & NGOs get verified, GBIF-compatible biodiversity datasets that drop directly into existing research pipelines. • Tourism Boards & Dive Centers can post quests that turn the people already in the water — their divers, their guests — into a live monitoring network: an up-to-the-day read on jellyfish blooms and beach safety, species-count baselines for the exact sites they operate, and a verified biodiversity record for eco-certification, marine-protected-area applications, and marketing a "healthy reef" story. Their customer traffic becomes coastal data at zero extra staffing.
Nautica uses World ID, 0G Compute, and The Graph behind the scenes to turn a wildlife photo into a verified, on-chain record. The frontend is Next.js and React with a MapLibre map, and the backend is a TypeScript service on Hono that brokers every integration, so the browser never holds a subgraph URL, an 0G key, or the relayer key. The whole app also runs in a zero-key mock mode and flips each integration to live per env var, with GET /health reporting which parts are live vs. simulated.
Core contract (Solidity 0.8.24, Foundry): A single NauticaQuests contract on Base Sepolia (OpenZeppelin AccessControl / Pausable / ReentrancyGuard / SafeERC20). createQuest escrows the partner's USDC reward in the same call; only RELAYER_ROLE records a completion and settles the payout from that quest's escrow, after 0G passes. Players can't self-attest, and a quest can't pay out more than it funded. Quest metadata (species/title/reward) lives on-chain, so the subgraph reads it from QuestCreated with no off-chain registry.
World ID (IDKit 4.0): Server-signed rp_context (signRequest, signing key server-side, short TTL) → IDKitRequestWidget with selfieCheckLegacy / identityCheck / orbLegacy → server-side v4 cloud verify. Selfie Check gates sign-in + XP; Identity Check or Orb gates payouts. The nullifier enforces one-human-per-account, so the leaderboard and the shared USDC pool can't be sybil-farmed. Proof-shape reconciliation: selfieCheckLegacy returns a v3 proof (proof is a string; v4 expects string[]) that reports its credential as face, not selfie, and allow_legacy_proofs is per-credential — the verifier accepts both shapes and both vocabularies.
0G Compute (qwen3-vl-30b, TEE): Router path (OpenAI-compatible, single sk- key), image inline, deterministic json_object verdict, anti-cheat prompt that rejects screenshots, screens, and stock images. Three independent verification layers: (1) Router verify_tee in "verified" trust mode → x_0g_trace.tee_verified; (2) the provider's on-chain 0G Serving-registry record (teeSignerAddress, verifiability, acknowledged); (3) the provider's Intel TDX DCAP quote from GET /v1/quote → assert report_data == the on-chain signer → verify against Intel's root of trust, stored as quoteVerified/quoteVerifier. simulated:false is derived in one place from tee_verified and kill-tested; XP is awarded only on a genuine pass, and each passed photo's provenance root is pinned to 0G Storage (@0glabs SDK). The documented Automata mainnet verifier is retired, so quote verification runs against Automata's live Ethereum Sepolia deployment (Phala / dcap-qvl off-chain fallback); the mainnet 0G Compute addresses aren't in the docs, only the SDK constants. Honesty bound: today's provider runs the model on a centralized upstream with only the broker inside the enclave, so the claim is "independently verified the provider's TEE attestation," not "the model ran in a TEE."
The Graph (subgraph, Base Sepolia): Indexes the NauticaQuests events (SightingRecorded, PayoutSettled, PlayerRegistered) into Player / Sighting / Attestation / Activity / Global entities; deployed to Subgraph Studio. The backend reads through a broker: with SUBGRAPH_URL unset it serves byte-identical shapes from an in-memory store, so the frontend is unchanged and offline demos work.
The Graph — Subgraph MCP + plausibility agent. A Subgraph MCP server exposes the live dataset as MCP tools (leaderboard, per-species sightings, global stats, raw GraphQL); point Claude Desktop at it and "where have lionfish been sighted this month?" runs the GraphQL. A separate plausibility agent reads each new sighting back through the subgraph and scores it on species range + season + nearby same-species sightings, flagging e.g. a lionfish logged outside its plausible waters.
Submission pipeline: freshness nonce (single-use, issued before capture → kills reused/pre-generated photos) → 0G TEE verify → relayer records on Base Sepolia → subgraph indexes the event → an eager server job polls the subgraph by txHash until the sighting is indexed → runs the plausibility agent → caches the verdict. The gallery shows the attestation + verdict with no user action.
Location: A GPS-anchored, server-time-stamped soft signal: a picker leashes the chosen spot to within 5 km of a live navigator.geolocation fix (we never trust client EXIF — iOS Safari strips it), never a hard reject.

