Smart India Hackathon 2026 — PS176 Team Samudra Dristhi · Heritage Institute of Technology, Kolkata
A marine advisory console for small fishing boats in the Bay of Bengal. It answers the questions that decide whether a crew goes out: what the sea will do, where the fish are likely to be, where the boat is not allowed, and when to turn back.
Live: marine-orca.vercel.app
| Sea state | Wind, wave and weather on a time-stepped grid — hourly to 12 hours, three-hourly to 48, with probability shading past 12 and no spatial claim past 48 |
| Cyclone watch | IMD and RSMC bulletin parsing, track points, severity |
| Fishing zones | INCOIS potential-fishing-zone advisories, plus a Copernicus-derived PFZ path |
| Boundaries | Point-in-polygon geofencing against India's mainland and Andaman EEZ and protected areas |
| Routing | Passage planning that stays in water and routes around hazards |
| Risk | Calibrated risk scoring across sources |
| Agreement | Flags when forecast models disagree enough to change the advice |
| Evidence | BM25 retrieval over ingested advisories — what is prohibited inside a boundary, and until when |
| Archive | Keeps what the scrapers already fetch, so history exists to answer "what did IMD say last week" |
| Voice & IVR | Spoken advisories and phone access for crews without a smartphone |
Everything is served in the fisherman's own language through a Sarvam language edge: detection, a marine glossary, and localisation.
firmware/esp32_xponder stands in for the S-band MSS terminal ISRO is fitting
to fishing vessels under Nabhmitra. The satellite hop is not simulated; the
terminal-to-phone link is, and that link is real on the device too.
What it demonstrates is the payload. A satellite message to a boat is tens of
bytes, not kilobytes, so no sentence is ever transmitted. One frame is
20 bytes: a magic byte, a version, a message type, a severity, and a
latitude and longitude as int32 degrees × 1e5. The phone renders and speaks
the warning in the crew's own language from the type code alone.
| offset | size | field |
|---|---|---|
| 0 | 1 | magic 0xA5 |
| 1 | 1 | version 0x01 |
| 2 | 1 | type — 1 cyclone, 2 lightning, 4 track point, 0x10 SOS, 0x11 SOS received |
| 3 | 1 | severity |
| 4 | 4 | latitude, int32, degrees × 1e5 |
| 8 | 4 | longitude, int32, degrees × 1e5 |
firmware/esp32_xponder and frontend/src/services/xponder/frame.ts implement
the same layout, and the phone pairs to the terminal over Bluetooth LE.
INCOIS · IMD · RSMC · Open-Meteo · NOAA CoastWatch · ERA5 · Copernicus
│
▼
┌──────────────── orca-core (FastAPI) ────────────────┐
│ orchestrator → plans, replans, runs a dependsOn │
│ DAG with deterministic recovery when an agent │
│ fails — no extra model call │
│ │
│ agents: weather · cyclone · ocean · geospatial · │
│ risk · route · trends · visualization · reporting · │
│ evidence retrieval │
│ │
│ guardrails · timeframe · discovery · execution │
│ archive · memory · scheduler · Sarvam language edge │
└─────────────────────────────────────────────────────┘
│ │
▼ ▼
Web console (React + Leaflet) Android app (Capacitor)
│
▼ Bluetooth LE
ESP32 Xponder (20-byte frames)
Retrieval is one agent among ten, selected by the same planner as the rest — not a layer everything is routed through. Asking for the wave height at Digha returns a number, not a document search.
.
├── orca-core/ FastAPI service — agents, tools, API routes, providers, language
│ ├── app/
│ │ ├── agents/ orchestrator, weather, cyclone, ocean, geospatial, risk, route,
│ │ │ trends, visualization, reporting, evidence, execution, guardrails
│ │ ├── tools/ seagrid, marine, ocean, pfz, copernicus_pfz, cyclone, geofence,
│ │ │ routing, vessels, oil_spill, satellite_zones, closures, evidence,
│ │ │ agreement, fusion, ml_risk, ml_calibration, forecast_correction
│ │ ├── api/ seagrid, conditions, risk, route, cyclone, pfz, geofence, evidence,
│ │ │ archive, chat, conversations, console, voice, ivr, trends, location
│ │ ├── language/ detect, glossary, localise
│ │ └── providers/ llm, sarvam
│ ├── data/geo/ EEZ, coastline and protected-area geometry
│ └── tests/
├── frontend/ React 19 + Vite + Leaflet console, wrapped for Android via Capacitor
│ └── android/
├── firmware/
│ └── esp32_xponder/ Simulated Nabhmitra S-band terminal
├── extras/ India mainland and Andaman EEZ geometry, WKT and GeoJSON
├── docs/ Architecture diagram and backlog
└── HackHeritage/ Earlier project whose executor and planner were ported into orca-core
| Layer | Tools |
|---|---|
| Service | FastAPI, Uvicorn, Python 3.12, pytest |
| Agents | Custom orchestrator with a dependsOn task graph and deterministic replanning |
| Geo | Point-in-polygon geofencing over EEZ and protected-area polygons, Leaflet on the client |
| Retrieval | BM25 over verified-ingested advisories |
| Language | Sarvam for Indic detection, glossary and localisation |
| Web | React 19, TypeScript 5.8, Vite 6, Tailwind CSS 4, Leaflet, Motion, lucide-react |
| Mobile | Capacitor 8 for Android, Bluetooth LE for transponder pairing |
| Firmware | ESP32, Arduino IDE |
| Hosting | Vercel for the console, Render for orca-core |
cd orca-core
python -m venv .venv && .venv/Scripts/activate # source .venv/bin/activate on macOS/Linux
pip install -r requirements.txt
cp .env.example .env # then fill in the keys
uvicorn app.main:app --reload --port 8100Check it is alive:
curl http://localhost:8100/healthTests:
pytest -qThe console:
cd frontend
npm install
npm run dev # http://localhost:3000Heritage Institute of Technology, Kolkata.
| Member | GitHub |
|---|---|
| Ankan Giri | @Ankan0503 |
| Sayan Sinha | @Sayan260106 |
| Raunak | @raunak095 |
| Rupkatha Ghosh | @Rupkatha-Ghosh |
| Swarnavo Sen | @swarnavosen10-byte |
| Shrabani Neogi | @shrabani-stack |
MIT — see LICENSE.