An end-to-end, multi-module census platform with:
- Spring Boot backend API (authentication, census submission, verification workflow).
- Python FastAPI AI service (income anomaly detection using Isolation Forest).
- Flutter enumerator app (offline-first field collection + sync).
- Next.js admin dashboard (analytics, review, and manual verification actions).
.
|-- README.md
|-- LICENSE
`-- Caste-census/
`-- caste-census/
|-- pom.xml # Spring Boot backend
|-- src/
|-- ai-service/ # FastAPI + scikit-learn anomaly service
`-- census_app/
|-- lib/ # Flutter app source
`-- admin-dashboard/ # Next.js dashboard
- Enumerator logs in through Flutter app.
- Enumerator captures census data and profile image, saves locally (SQLite) when offline.
- Enumerator syncs pending records to Spring Boot backend.
- Backend stores data in PostgreSQL and marks each new record as
PENDING. - Admin triggers AI verification from dashboard.
- Backend sends safe payload (
id,householdId,income) to Python AI service. - AI service flags anomalous records; backend updates those records to
FLAGGED. - Admin verifies or flags records manually from dashboard.
- Java 17
- Spring Boot 3
- Spring Web, Spring Data JPA, Spring Validation, Spring Security (basic role model)
- PostgreSQL
- Lombok
- Python 3.10+
- FastAPI
- Uvicorn
- pandas
- scikit-learn (IsolationForest)
- Flutter (Dart)
- sqflite / sqflite_common_ffi (offline local DB)
- connectivity_plus
- image_picker
- http
- Next.js 16 (App Router)
- React 19
- TypeScript
- Axios
- Recharts
- Tailwind CSS
- Java 17+
- Maven 3.9+
- PostgreSQL 14+
- Python 3.10+
- Flutter SDK 3+
- Node.js 20+
Backend config is currently in Caste-census/caste-census/src/main/resources/application.yml and Caste-census/caste-census/src/main/resources/application.properties:
- Backend port:
9090 - PostgreSQL DB:
censusdb - Default DB user:
postgres
Update DB credentials before running in your environment.
AI service endpoint expected by backend:
http://127.0.0.1:8001/ai/verify
Dashboard and Flutter app call backend on:
http://localhost:9090
Create database:
CREATE DATABASE censusdb;cd Caste-census/caste-census
mvn spring-boot:runBackend starts on http://localhost:9090.
cd Caste-census/caste-census/ai-service
python -m venv .venv
# Windows PowerShell
.venv\Scripts\Activate.ps1
pip install -r requirements.txt
uvicorn main:app --host 127.0.0.1 --port 8001 --reloadcd Caste-census/caste-census/census_app/admin-dashboard
npm install
npm run devDashboard runs on http://localhost:3000.
cd Caste-census/caste-census/census_app
flutter pub get
flutter runOn Windows/Linux desktop, sqflite_common_ffi is initialized in app startup.
On first backend run, default users are created by Caste-census/caste-census/src/main/java/com/census/config/DataSeeder.java:
- Admin
- Username:
admin - Password:
admin123
- Username:
- Enumerator
- Username:
user - Password:
user123
- Username:
Use these only for local development.
POST /api/auth/login- Returns role string:
ROLE_ADMINorROLE_ENUMERATOR.
- Returns role string:
POST /api/census/submit- Validated submission payload (household, caste, education, occupation, income, region, image).
GET /api/census/all- Returns all census records.
POST /api/census/run-ai- Triggers AI verification scan.
GET /api/census/status/{householdId}- Public status lookup by household ID.
POST /api/verify/{id}/flag- Flags record for review.
GET /api/admin/flagged-records- Returns records flagged by AI/manual checks.
POST /api/admin/verify/{id}- Marks record as
VERIFIED.
- Marks record as
POST /api/admin/flag/{id}- Marks record as
FLAGGED.
- Marks record as
Main census entity fields are defined in Caste-census/caste-census/src/main/java/com/census/model/CensusEntity.java:
id(UUID)householdIdcaste(stored via JPA converter)educationoccupationincomeregionprofileImageBase64verificationStatus(PENDING,FLAGGED,VERIFIED)
The AI service in Caste-census/caste-census/ai-service/model.py:
- Converts incoming records to DataFrame.
- Uses
incomefeature for outlier detection. - Runs IsolationForest with
contamination=0.1. - Returns anomalous record IDs.
Backend integration is in Caste-census/caste-census/src/main/java/com/census/service/AiVerificationService.java.
- Enumerator saves forms locally to SQLite table
census. - Records are tracked with status (
PENDING/SYNCED). - Sync screen uploads pending records to backend.
- Successful uploads are marked
SYNCEDlocally.
Relevant files:
- Caste-census/caste-census/census_app/lib/services/local_db_service.dart
- Caste-census/caste-census/census_app/lib/screens/sync_status.dart
-
Login fails for valid users:
- Ensure backend started successfully and DataSeeder has run.
- Check backend logs for DB connection issues.
-
AI verification says offline:
- Confirm FastAPI service is running on port
8001. - Verify endpoint path
/ai/verify.
- Confirm FastAPI service is running on port
-
Dashboard shows no records:
- Make sure synced records exist in DB.
- Confirm dashboard can reach
http://localhost:9090.
-
Flutter sync not working:
- Check machine network access and backend availability.
- Verify pending records exist in local SQLite DB.
- Current auth is simple username/password with plain-text comparison and role response.
- Replace with secure password hashing (e.g., BCrypt), token-based auth (JWT), and restricted CORS before production.
- Move DB credentials and secrets to environment variables.
- Avoid storing large base64 images in primary transactional tables for production scale.
See LICENSE.