A decision-support web app for Ghana's NMEP to track vector-control distribution cycles, automate net/insecticide disposal alerts, and monitor insecticide resistance hotspots.
# MalVector Track
Vector intervention distribution, disposal & insecticide resistance monitoring
for Ghana's National Malaria Elimination Programme (NMEP).
CSCD602 Advanced Software Engineering — Individual Project-Based Examination.
Implements the MVP (FR-1–FR-5) as scoped in `SRS_Effort_Estimation.docx` and
designed in `System_Design.docx`.
**Live application:**
malvector-track.vercel.app
**Repository:**
github.com
> **Note on how this was built and verified:** this codebase was originally
> generated in an environment with no network access, so early versions were
> only syntax-checked, not run live. It has since been deployed to a real
> Supabase project and Vercel, and tested end-to-end through the actual UI as
> both District Officer and Admin roles. That process surfaced and fixed
> three real defects — two Row Level Security misconfigurations and one
> missing cross-field validation — documented in full in
> `Testing_Report.docx` and `Technical_Debt_Plan.docx`.
## 1. Prerequisites
- Node.js 18+
- A free Supabase project
- A Vercel account for deployment
## 2. Local setup
```bash
npm install
cp .env.local.example .env.local
# edit .env.local with your Supabase project URL + publishable (anon) key
```
## 3. Database setup
In the Supabase SQL editor, run in order:
1. `supabase/schema.sql` — creates tables, indexes, and RLS policies
2. Create your first users via **Authentication > Users > Add user** in the
Supabase dashboard (one with role you'll assign as `admin`, one or more as
`officer`)
3. `supabase/seed.sql` — districts, plus profile rows linking `profiles` to
the auth users you just created (fill in their UUIDs)
4. `supabase/fixes.sql` — two RLS fixes required for the app to work
correctly: (a) an `is_admin()` helper function that resolves an infinite
recursion bug in the `profiles` SELECT policy, and (b) a missing INSERT
policy on `disposal_items` that otherwise silently blocks disposal
tracking for Dis …