EtlabPro is a full-stack student companion platform for Sahrdaya ETLAB users. It combines a production-oriented FastAPI backend, ETLAB scraping workflows, Supabase persistence, and a Flutter mobile app with rich analytics across attendance, internal marks, semester results, monthly calendar view, and timetable.
- Authenticates with ETLAB and syncs academic data into normalized storage.
- Serves a secure API for mobile consumption.
- Provides mobile dashboards for:
- Home insights (attendance + result summaries)
- Attendance tracking and risk analysis
- CAT result breakdown with projection analysis
- University end-sem result history by semester
- Day-wise timetable and monthly attendance calendar
Backend responsibilities:
- FastAPI API surface for auth, sync, live comparison, and analytics reads.
- Scrapers for profile, attendance, marks, timetable, and university results.
- Service layer orchestration that controls refresh policies and sync lifecycle.
- Supabase persistence through dedicated DB modules.
Frontend responsibilities:
- Secure login/session handling.
- JWT-backed API calls to protected endpoints.
- Local cached state for resilience and faster UX.
- Light and dark themed UI for all major student workflows.
EtlabPro is currently self-hosted in Bangalore on a Dokploy setup.
Current hosting posture:
- Containerized backend deployment (FastAPI/Uvicorn) managed via Dokploy.
- Environment-driven secret management for runtime configuration.
- Public API exposure through a controlled self-hosted infrastructure boundary.
- Security-oriented backend defaults (JWT auth, CORS allow-list, reduced logging, docs disabled in production mode).
This gives you direct infrastructure control while keeping the application safely self-hosted and maintainable.
EtlabPro is designed with a safe-by-default backend model when operated with correct deployment practices.
Implemented in code:
- JWT access/refresh token flow for authenticated access.
- Protected routes enforced via Bearer token dependency checks.
- CORS origin restrictions from environment configuration.
- Supabase service role key only used server-side.
- Mobile credentials/tokens stored with encrypted secure storage.
- Production docs disabled by default.
- Concise operational logging to reduce sensitive signal leakage.
Operational best practices to keep it safe over time:
- Keep all secrets in environment variables and rotate them periodically.
- Enforce HTTPS end-to-end in front of Dokploy-managed services.
- Restrict DB and admin access by network and role.
- Monitor auth failures, sync anomalies, and dependency updates.
EtlabPro/
Backend/
app/
api/ # FastAPI routes + auth deps
scraper/ # ETLAB scraping modules
db/ # Supabase read/write modules
services/ # Sync orchestration
models/ # Pydantic schemas
docs/dbms/ # Canonical schema + migration plan
requirements.txt
Dockerfile
frontend/
lib/
screens/
services/
core/
widgets/
assets/images/
pubspec.yaml
cd Backend
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
copy .env.example .env
uvicorn app.main:app --reload --port 8000- Health endpoint:
GET /health - API base:
/api/v1
Create frontend/.env:
API_BASE_URL=http://10.0.2.2:8000
APP_VERSION=1.0.0Run app:
cd frontend
flutter pub get
flutter runThe following screenshots are arranged by feature, with Light and Dark mode shown side-by-side.
| Feature | Light | Dark |
|---|---|---|
| Home | ![]() |
![]() |
| Attendance Analysis | ![]() |
![]() |
| CAT Results | ![]() |
![]() |
| End-Sem Results | ![]() |
![]() |
| Monthly Calendar | ![]() |
![]() |
| Grade Analysis | ![]() |
![]() |
| Timetable | ![]() |
![]() |
Public endpoints:
POST /api/v1/auth/loginPOST /api/v1/auth/refreshGET /api/v1/meta/latest-versionGET /health
Protected endpoints include:
- full sync + attendance-only update
- live attendance/monthly/updates workflows
- profile, attendance, marks, timetable, university results, summary
- departments, programmes, years, semesters, teachers metadata
- This repository is actively developed.
- Database normalization and migration strategy are documented in
Backend/docs/dbms.

.jpeg)
.jpeg)


.jpeg)
.jpeg)
.jpeg)
.jpeg)
.jpeg)


.jpeg)
.jpeg)