back to projects

// the build story

Academic risk intelligence that identifies at-risk students before they fall through the cracks.

Firasa logo

01The Problem

Most academic risk systems are reactive: a student is flagged only after grades slip or attendance drops, by which point the intervention window has mostly closed.

There was no widely accessible tool that read behavioral signals early, explained its reasoning, and surfaced guidance an educator or student could actually act on. A prediction without an explanation does not change behavior; it just adds another number to ignore.

02The Approach

Firasa clusters students into behavioral learning profiles using unsupervised machine learning, working from proxies that are available before failure ever shows up on a transcript: engagement patterns, submission timing, and resource access.

The pipeline moves data input through feature engineering, into clustering, then through a SHAP and LIME explanation layer, before serving results through a Flask REST API to a React frontend. Every stage exists so the final recommendation can be traced back to the behavior that produced it.

03What Makes It Different

Firasa is explainability-first by design. SHAP and LIME turn cluster membership into a reasoned account of why a student was grouped the way they were, so the output reads as a conversation starter for an educator, not a verdict.

The name is a deliberate nod to that idea: Firasa is an 11th-century Arabic concept describing the ability to read a person's inner state from outward signs, which is exactly what the system does with behavioral data instead of intuition.

04The Outcome

Firasa is deployed and in active use: 260+ organic users across 10+ countries, running on a Flask API on Render, a React frontend on Vercel, and a Python ML pipeline connecting them.

It was also built as part of Agrim's ML coursework evaluation, where it was recognized for the same explainability-first approach that defines the live product.

<Stack />

Key Architectural Decisions

Unsupervised clustering over supervised classification

Labeled 'at-risk' outcomes are scarce and biased toward whoever already got flagged. Clustering on behavioral proxies surfaces profiles without needing historical failure labels, and generalizes across student populations a supervised model wouldn't.

SHAP and LIME over an opaque risk score

A number alone tells an educator nothing about what to do next. Layering SHAP for global feature importance with LIME for per-student explanations turns each recommendation into something a human can question and act on.

Flask as the inference layer

The ML pipeline is Python end to end, so a Flask REST API kept the model, the explanation layer, and the serving logic in one language without a translation layer between training and inference.

Render and Vercel over a single host

Splitting the Flask API onto Render and the React frontend onto Vercel let each half deploy on infrastructure suited to it, backend workloads on Render and static/edge-rendered frontend on Vercel, without provisioning a server directly.