Sentinel is an ML data quality and model-readiness platform for tabular datasets.
Upload a CSV, run deterministic diagnostics, and get a production-style report with actionable fixes and visual diagnostics.
- Upload CSV datasets and run analysis asynchronously.
- Optional target-aware analysis (target column can be provided at upload time).
- V2 diagnostics stack:
- missingness + structural risks
- leakage heuristics
- categorical / outlier checks
- target signal diagnostics
- lightweight model simulation
- recommendation engine
- V2 calibrated scoring (
sentinel_score) with difficulty + modeling risk labels. - Visual diagnostics are generated once during analysis and persisted in DB.
- Report page only opens after processing is complete.
- Works for guest sessions and authenticated users (Supabase).
- React + TypeScript + Vite
- Tailwind CSS
- shadcn-style component structure (
frontend/components/ui) - Supabase JS client
- FastAPI
- SQLAlchemy
- Pandas + SciPy + scikit-learn + Matplotlib
- PostgreSQL (production) / SQLite (local fallback)
- Background processing via FastAPI
BackgroundTasks
- Frontend: Vercel
- Backend: Render
- Database: Neon Postgres
- Auth: Supabase
.
├── frontend/ # Vite React app
├── backend/ # FastAPI API + analysis engine
├── render.yaml # Render blueprint config
├── runtime.txt # Runtime pin fallback
└── README.md
cd backend
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
uvicorn app.main:app --reloadBackend URL: http://localhost:8000
cd frontend
npm install
npm run devFrontend URL: http://localhost:5173
Required:
DATABASE_URLSUPABASE_URLSUPABASE_ANON_KEYSUPABASE_JWT_SECRET
Optional:
APP_NAME(default:SentinelAI)CORS_ALLOW_ORIGINS(comma-separated)CORS_ALLOW_ORIGIN_REGEX
VITE_API_URLVITE_SUPABASE_URLVITE_SUPABASE_ANON_KEY
POST /datasets/upload
multipart:file,dataset_name, optionaltarget_columnGET /datasetsGET /datasets/{dataset_id}/statusDELETE /datasets/{dataset_id}
GET /reports/{dataset_id}(raw payload/status)GET /reports/{dataset_id}/view(frontend view payload)
GET /plots/{dataset_id}/{plot_type}returnsimage/png- Plot types:
missing_heatmaptarget_distributionfeature_importancenumeric_distributioncorrelation_heatmap
GET /health
- Plots are generated in worker after analysis.
- Stored in
analysis_plotstable (dataset_id + plot_typeunique). - Served directly from DB bytes (no on-demand regeneration on normal path).
- Delete dataset also removes persisted plots.
- Root directory:
frontend - Build command:
npm run build - Output directory:
dist
Set:
VITE_API_URL=https://<your-render-backend>.onrender.comVITE_SUPABASE_URL=https://<your-project-ref>.supabase.coVITE_SUPABASE_ANON_KEY=<anon-key>
Use render.yaml (recommended) or set manually:
- Root directory:
backend - Build command:
python -m pip install --upgrade pip && pip install --only-binary=:all: -r requirements.txt - Start command:
uvicorn app.main:app --host 0.0.0.0 --port $PORT
Set:
DATABASE_URL=postgresql+psycopg2://...SUPABASE_URLSUPABASE_ANON_KEYSUPABASE_JWT_SECRETCORS_ALLOW_ORIGINS=https://<your-vercel-domain>
ERR_CERT_COMMON_NAME_INVALID(Supabase): verify exactVITE_SUPABASE_URL.- CORS blocked from Vercel: verify backend env + redeploy latest CORS fixes.
- Render SciPy build failures: use latest requirements + wheel-only install command.