← CRUX
CRUX·01 / 04·Acrux

Jawara Management System

Mobile & AI·December 1, 2025

Overview

Jawara Management System is a mobile app built to digitize community administration. Developed for the JAWARA program by Group 6, the system gives administrators tools to manage resident demographics, finances, and announcements.

Jawara Mobile Dashboard

My Role & Leadership

I was the Team Lead for this project. My main responsibilities included:

  • Project Management: Breaking down features into tasks and managing the team workflow.
  • Technical Architecture: Designing the system foundation and setting architectural standards.
  • Systems Integration: Connecting the Flutter frontend, Laravel backend, and Python machine learning services.

Core Features

The system handles real-world community data with the following features:

  • Financial Tracking: Records incomes, dues, and expenses with reporting features.
  • Demographic Management: Tracks physical houses, family units, and individual citizen records.
  • Biometric Security: An e-KYC feature that verifies user identity by matching a live selfie against their ID card (KTP).
  • Community Broadcasting: A hub for administrators to send announcements and collect resident feedback.

The Architecture & “The Bridge”

We needed to integrate a deep learning model for biometric verification but lacked a dedicated GPU server. Our stack used Flutter for the frontend, Laravel for the backend API, and Python (DeepFace) running locally in a Jupyter Notebook for the AI engine.

To connect the Laravel backend to our local Python environment, we set up a tunnel using FastAPI and ngrok.

Here is the script used to establish the persistent bridge directly from the Jupyter Notebook:

tunnel_setup.py

import nest_asyncio
import uvicorn
from pyngrok import ngrok, conf
import os

# Allow async loops within the Jupyter environment
nest_asyncio.apply()

PORT = 5000
STATIC_DOMAIN = "caliphal-dallas-wriggly.ngrok-free.dev"

# Clean up any lingering processes
ngrok.kill()
os.system(f"fuser -k {PORT}/tcp")

# Establish a secure tunnel using a static domain
conf.get_default().auth_token = os.environ.get("NGROK_TOKEN")
public_url = ngrok.connect(PORT, domain=STATIC_DOMAIN)
print(f"API Tunnel established at: {public_url.public_url.replace('http://', 'https://')}")

# Serve the FastAPI application
config = uvicorn.Config("main:app", host="0.0.0.0", port=PORT, log_level="info")
server = uvicorn.Server(config)
await server.serve()

After opening the tunnel, we exposed FastAPI endpoints to handle biometric verification and login using the DeepFace library:

api_endpoints.py

from fastapi import FastAPI, File, UploadFile
from deepface import DeepFace

app = FastAPI()

@app.post("/verify")
async def verify_face(ktp: UploadFile = File(...), selfie: UploadFile = File(...)):
    # e-KYC: Match uploaded ID Card photo against live selfie
    try:
        result = DeepFace.verify(
            img1_path=ktp.filename, 
            img2_path=selfie.filename,
            model_name="VGG-Face", 
            detector_backend="opencv", 
            enforce_detection=False
        )
        return {"status": "success", "verified": result['verified'], "similarity": result['distance']}
    except Exception as e:
        return {"status": "error", "message": str(e)}

@app.post("/find-face")
async def find_face(selfie: UploadFile = File(...)):
    # Biometric Login: Search selfie against known faces database
    try:
        dfs = DeepFace.find(
            img_path=selfie.filename, 
            db_path="known_faces",
            model_name="VGG-Face", 
            silent=True
        )
        if len(dfs) > 0 and not dfs[0].empty:
            match = dfs[0].iloc[0]['identity']
            return {"status": "found", "match_filename": match}
        return {"status": "not_found"}
    except Exception as e:
        return {"status": "error", "message": str(e)}

Database Design

The Laravel backend uses a relational database divided into three domains. The API endpoints are documented with Swagger.

Jawara Swagger API

1. Identity & Access

Table Description
Users Authentication, roles, and registration states
Citizens Demographic records and biometric data

2. Resident Management

Table Description
Houses Physical addresses mapped to family units
Families Household groupings and property ownership
Mutations Historical tracking of resident relocations

3. Finance & Operations

Table Description
Billings Community dues and payment tracking
Transactions Ledger for incomes and expenses
Activities Management of community events and personnel

Tech Stack

Flutter | Laravel | Python | ngrok