EduVerse
Offline-first PWA for rural education with LoRa mesh sync between ESP32 devices when there is no internet.
Problem
Rural students often have intermittent or no internet, so cloud-first e-learning platforms are unusable for them. EduVerse works fully offline and syncs progress when connectivity — or a nearby LoRa peer — is available.
Impact
- 14-table PostgreSQL relational schema
- Zero-internet learning via Service Workers + IndexedDB
- LoRa mesh sync over a 5–15 km range
- AI weak-area detection from quiz + level data
Architecture
flowchart TB S[Student PWA] -->|offline cache| IDB[(IndexedDB)] S -->|WebSocket| API[Express API] T[Teacher PWA] -->|WebSocket| API API --> DB[(PostgreSQL 14 tables)] S -->|LoRa 5-15km| ESP[ESP32 Node] ESP -->|batched sync| API API --> AI[Weak-Area Engine]
Mermaid flowchart source — renders as a diagram when embedded in docs.
Data model
- users, roles, user_roles
- courses, modules, lessons
- quizzes, questions, attempts
- xp_events, level_progress
- chat_rooms, messages
- device_syncs (LoRa batches)
API design
| Method | Path | Purpose |
|---|---|---|
| POST | /api/auth/login | JWT login |
| GET | /api/courses | List enrolled courses |
| POST | /api/attempts | Submit quiz attempt (queued offline) |
| GET | /api/recommendations | AI weak-area recommendations |
| POST | /api/sync/lora | Accept batched LoRa sync payload |
Features
- →Full offline learning with background sync on reconnect
- →Gamified XP + level progression per student
- →Real-time student-teacher chat over WebSocket
- →LoRa hardware bridge for internet-less progress sync
- →AI recommendations from attempt + completion data
Engineering decisions & tradeoffs
PWA + IndexedDB over a native app
PWAs install on low-end Android without a store, work offline, and share one codebase with desktop teachers. IndexedDB is enough for lesson blobs + queued attempts.
LoRa instead of SMS or mesh Wi-Fi
LoRa gives kilometers of range on cheap ESP32 hardware and doesn't need a cellular plan. Great fit for batched, low-frequency progress payloads.
14 normalized tables over a document store
Grades, attempts, and roles are highly relational. Normal forms plus RBAC policies made the AI recommendation queries straightforward.
Challenges & lessons
- — Reconciling offline attempts with server-authoritative state without losing student work.
- — Framing LoRa payloads small enough to survive lossy links while carrying meaningful progress deltas.
- — Designing an AI weak-area heuristic that works with sparse attempt data early in a course.
Future improvements
- — Peer-to-peer LoRa mesh routing instead of hub-and-spoke
- — Signed sync payloads to harden against device spoofing
- — Teacher analytics dashboard with cohort-level weak areas