Upload a dataset. Understand it. Race models. Export results.
Full-stack interactive ML web application — no LLM, no AutoML black box. Every preprocessing decision is explained in plain English and every model races in parallel.
- Profiles any CSV — column types, nulls, skewness, cardinality, class balance
- Infers the task — binary/multiclass classification or regression
- Composes a preprocessing pipeline — imputation, scaling, encoding, SMOTE — with a plain-English reason for each step. Every step is overridable.
- Recommends models — rule-based badges (Recommended / Caution / Included) based on dataset signals
- Races 5 models in parallel — live leaderboard via WebSocket; each result streams in as it finishes
- Explains the winner — SHAP feature importance, confusion matrix, full metric grid
- Exports —
winner_model.pklandpipeline.yaml
| Layer | Stack |
|---|---|
| Backend | Python 3.11 · FastAPI · scikit-learn · XGBoost · LightGBM · SHAP · SMOTE |
| Parallel training | ProcessPoolExecutor (bypasses GIL) |
| Live streaming | WebSocket (/race/{session_id}) |
| Frontend | Next.js 15 · React 19 · TypeScript · Tailwind CSS |
| State | Zustand |
| Charts | Recharts |
| Deploy | Render (backend) · Vercel (frontend) |
cd backend
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS/Linux
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # edit if needed
uvicorn main:app --reload --port 8000Backend runs at http://localhost:8000. API docs at http://localhost:8000/docs.
cd frontend
npm install
# .env.local already points to localhost:8000
npm run devFrontend runs at http://localhost:3000.
| Variable | Default | Description |
|---|---|---|
ALLOWED_ORIGINS |
http://localhost:3000 |
Comma-separated CORS origins |
SESSION_TTL_SECONDS |
1800 |
Session cleanup interval |
MAX_UPLOAD_MB |
25 |
Max CSV file size |
MAX_TRAINING_ROWS |
50000 |
Auto-sample above this |
| Variable | Default | Description |
|---|---|---|
NEXT_PUBLIC_API_BASE_URL |
http://localhost:8000 |
FastAPI backend URL |
NEXT_PUBLIC_WS_BASE_URL |
ws://localhost:8000 |
WebSocket URL |
- Push
backend/to GitHub - Render → New Web Service → connect repo, root directory =
backend - Build:
pip install -r requirements.txt - Start:
uvicorn main:app --host 0.0.0.0 --port $PORT - Add env vars in Render dashboard (
ALLOWED_ORIGINS= your Vercel URL)
Free tier sleeps after 15 min inactivity. The frontend calls
GET /healthon load to pre-warm it.
- Push
frontend/to GitHub - Vercel → New Project → root directory =
frontend, framework = Next.js - Add env vars:
NEXT_PUBLIC_API_BASE_URLandNEXT_PUBLIC_WS_BASE_URL - Deploy
automl-pipeline-studio/
├── backend/
│ ├── main.py # FastAPI routes + WebSocket
│ ├── requirements.txt
│ ├── core/
│ │ ├── profiler.py # CSV profiling
│ │ ├── composer.py # Pipeline decision logic
│ │ ├── recommender.py # Rule-based model badges
│ │ ├── runner.py # ProcessPoolExecutor race + SHAP
│ │ ├── exporter.py # .pkl + pipeline.yaml
│ │ └── sampler.py # File validation + stratified sampling
│ ├── models/ # Pydantic models
│ └── utils/ # Session management + logger
└── frontend/
├── app/
│ ├── layout.tsx
│ └── page.tsx # Main page — step router
└── src/
├── api/client.ts # Axios API calls
├── store/useAppStore.ts # Zustand global state
├── hooks/
│ ├── useWebSocket.ts # WS connection with retry
│ └── useUpload.ts # Upload with progress
├── types/index.ts # TypeScript interfaces
└── components/
├── section-a/ # Profile, Target, Pipeline, Recommendations
└── section-b/ # Leaderboard, Winner, Charts, Export
| Endpoint | Method | Description |
|---|---|---|
/health |
GET | Keep-alive ping |
/profile |
POST | Upload CSV → DataProfile |
/compose |
POST | Target + overrides → PipelineConfig |
/recommend |
POST | PipelineConfig → model badges |
/race/{id} |
WS | Stream model results live |
/download/{id}/{pkl|yaml} |
GET | Download artifacts |
/session/{id} |
DELETE | Cleanup session |