National Runner-up (2nd Place), ISRO Bhartiya Antariksh Hackathon 2025. Built by Team DOMinators.
Project Kalam is our hackathon-winning system for near-term atmospheric forecasting and visualization. It combines a Python-based inference pipeline, a Node.js/Express API with WebSocket live logs, Cloudflare R2 storage, MongoDB persistence, and a modern React + Vite + Tailwind UI for map-based exploration, animation, and model report views.
This repository contains the full hackathon project that secured 2nd place at the national level.
Live Focus
- Nowcasting: Predicts short-term satellite frames (T+1, T+2, T+3)
- Visualization: Rich, fast UI for bands, timelines, and animations
- Operational UX: File uploads to R2, report views, and WebSocket streaming of Python model logs
Tech Stack
- Frontend: React 19, Vite, Tailwind CSS, react-router, lucide-react
- Backend: Node.js, Express, WebSocket (
ws), Multer, MongoDB (Mongoose) - Storage: Cloudflare R2 via AWS SDK v3
- ML/Inference: Python pipeline with PyTorch and ONNX
Monorepo Layout
frontend/: React/Vite app (UI, animations, map visualization, reports)backend/: Express API + WebSocket server + R2 uploads + MongoDBPython-Backend/: Training/inference utilities and artifacts used by backend
Quick Start
- Prerequisites: Node.js 18+, Python 3.10+, MongoDB (local or Atlas), Cloudflare R2 bucket + credentials
- Clone:
git clone <this-repo>andcdinto it
Backend
cd backendnpm install- Create
.env(see below) npm run dev(runs Express on:3000and WebSocket on:3001)
Frontend
cd frontendnpm installnpm run dev(Vite dev server on:5173)
Open the app at http://localhost:5173.
Environment Variables (backend/.env)
- Server
PORT=3000NODE_ENV=development
- Database
MONGO_URL=mongodb://localhost:27017/project-kalam(or Atlas URI)
- Cloudflare R2
R2_ENDPOINT=https://<your-account-id>.r2.cloudflarestorage.comR2_ACCESS_KEY_ID=<your-access-key>R2_SECRET_ACCESS_KEY=<your-secret-key>R2_BUCKET_NAME=<your-bucket>R2_PUBLIC_URL=https://pub-<id>.r2.dev/<your-bucket>(or your custom/public base URL)
On startup, the backend verifies R2 configuration and logs a basic health summary.
Local Paths To Update (very important) There are a few Windows paths hard-coded for local development during the hackathon. Update these to match your environment.
-
Python script used during model validation logs
backend/controllers/modelTest.controller.js:20const pythonScriptPath = "d:\\Hackathon\\ISRO\\pre_final\\test1.py";
-
Static serving of predicted images (so the UI can fetch PNGs)
backend/app.js:28const testOutputPath = "D:\\Hackathon\\ISRO\\pre_final\\inference_outputs\\test";
backend/controllers/modelTest.controller.js:255, 445- same
testOutputPathused for locating sequences and performance.json
- same
Set these to your local inference outputs directory and Python entry script.
Run Flow
- Start backend (
:3000) and WebSocket server (:3001). - Start frontend (
:5173). - In the UI:
- Use “Chase The Cloud” to animate frames and request predictions for T+1..T+3.
- Use “Test Model” to stream Python logs via WebSocket.
- Use “Visualize On Map” to explore overlays (if configured).
API Overview (backend)
- Base URL:
http://localhost:3000
Core
GET /— Service info + advertised endpointsGET /api/prediction-images/<relative-path>— Serves predicted images from yourtestOutputPath
R2 Uploads (/api/v1)
POST /upload— Upload a single file (field: file). Validates type/size and stores to R2, persists metadata to MongoDB.POST /test-upload— Multer sanity check. Returns details of the processed file.GET /health— R2 configuration/health snapshot.
Model Test & Predictions (/api/v1)
POST /folder-path— Triggers Python validation job; logs stream over WebSocketws://localhost:3001.POST /predict-frames— Body:{ timeWindow: number[4], selectedDirectory: string, bands: string[], windowSize: number }. Returns predicted frames metadata + performance aggregates.GET /available-sequences— Lists availablesequence_****folders undertestOutputPath.
Frontend Highlights
- Multi-band timeline with keyboard navigation and single-cycle animation.
- Predicted vs ground-truth frame browsing for T+1..T+3 with metrics display.
- Directory selection using the File System Access API.
- Toaster notifications, dark/light theme toggle, and polished UI components.
Key Entrypoints
frontend/src/App.jsx:1— Routes:/(landing),/test,/overlay-clouds,/satellite-animationfrontend/src/pages/SatelliteAnimationPage.jsx:1— Main nowcasting UIfrontend/src/components/ModelTestAndTerminalPreview.jsx:1— WebSocket log streaming UIfrontend/src/libs/axios.js:1— Base API URL (http://localhost:3000/api/v1)
Project Structure
backend/app.js:1— Express setup, static files, WebSocket server, and routesbackend/routes/r2upload.routes.js:1— Upload/health/test endpointsbackend/controllers/r2upload.controller.js:1— R2 upload implementation and MongoDB persistencebackend/routes/modelTest.routes.js:1— Model log + prediction routesbackend/controllers/modelTest.controller.js:1— Python spawn, predictions assembly, performance parsingbackend/config/r2.config.js:1— R2 client and connectivity testbackend/utils/db.js:1— Mongo connection helper (usesMONGO_URL)backend/models/File.model.js:1— File schema with helpful indexes and virtualsPython-Backend/*— Training/inference scripts and artifacts
Troubleshooting
- Images not loading: Update
testOutputPathinbackend/app.js:28and controller references. - WebSocket not connecting: Ensure
ws://localhost:3001is reachable and not firewalled. - Uploads failing: Verify
.envR2 variables and bucket permissions; checkGET /api/v1/health. - Mongo errors: Confirm
MONGO_URLand MongoDB is running. - Python errors: Fix
pythonScriptPathand Python env; run the script manually to verify.
Acknowledgements
- ISRO Bhartiya Antariksh Hackathon 2025 — National Runner-up (2nd Place)
- Gratitude to mentors, organizers, and the open-source community.
License
- MIT — see
LICENSEfor details.