You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Primary data store: users, projects, models, jobs, datasets, experiments
Model Runner
Python/Rust
Ephemeral K8s pods per training job, streaming metrics
JupyterHub
Python
Per-user JupyterLab with pre-configured SDK and datasets
Training Job Lifecycle
User clicks "Train" --> API creates training_job record
--> API creates K8s Job with model code + config
--> Pod starts, loads data via streaming
--> Pod reports metrics via HTTP --> API stores + relays via SSE
--> Frontend receives SSE --> Updates charts in real-time
--> Pod completes --> Saves model artifacts
--> API updates training_job status --> Frontend shows results
Follow these guides to go from zero to a fully tracked ML experiment:
Usage Guide -- Log in, create a project, upload a dataset, launch a workspace
Modeling Guide -- Train, evaluate, and track models using the SDK (13-cell notebook walkthrough)
REST API Reference
Authentication
Method
Endpoint
Description
POST
/auth/register
Register a new user
POST
/auth/login
Login and receive JWT
GET
/auth/me
Get current user profile
Projects
Method
Endpoint
Description
GET
/projects
List all projects
POST
/projects
Create a project
GET
/projects/:id
Get project details
PUT
/projects/:id
Update project
DELETE
/projects/:id
Delete project
Models
Method
Endpoint
Description
GET
/models
List models
POST
/models
Create a model
PUT
/models/:id/code
Update model source code
POST
/models/:id/run
Execute model
Training
Method
Endpoint
Description
POST
/training/start
Start a training job
GET
/training/:id
Get training job status
GET
/training/:id/metrics
SSE stream of training metrics
Other Endpoints
Method
Endpoint
Description
POST
/workspaces/launch
Launch a JupyterLab workspace
DELETE
/workspaces/:id
Stop a workspace
POST
/llm/chat
Chat with LLM assistant (SSE)
GET
/datasets
List datasets
POST
/datasets
Upload a dataset
POST
/experiments
Create an experiment
GET
/experiments/:id/runs
Get experiment runs
GraphQL (port 31002)
Auto-generated from PostgreSQL schema via PostGraphile. Explore at /graphiql.
Environment Variables
Variable
Required
Description
DATABASE_URL
Yes
PostgreSQL connection string
JWT_SECRET
Yes
Secret for JWT signing
JWT_REFRESH_SECRET
Yes
Secret for refresh token signing
RUST_LOG
No
Log level (default: info)
LLM_PROVIDER
No
LLM provider: ollama, openai, or anthropic (default: ollama)
LLM_API_KEY
No
API key for the configured LLM provider
LLM_MODEL
No
Model name for the LLM provider (default: llama2)
LLM_BASE_URL
No
Base URL for LLM API (default: http://localhost:11434)
S3_BUCKET
No
For dataset/artifact storage (default: openmodelstudio)
S3_REGION
No
S3 region (default: us-east-1)
K8S_NAMESPACE
No
Kubernetes namespace (default: openmodelstudio)
Development
Local Development
make dev # Starts Postgres via Docker, prints instructions for API + Frontend
make dev-api # Run Rust API locally on :8080
make dev-frontend # Run Next.js frontend locally on :3000
Run Tests
make test# API + Frontend tests
make test-api # Rust API tests only
make test-e2e # Playwright E2E tests
make test-all # Everything (unit + e2e + models + pipelines)
Makefile Targets
Run make help to see all available targets. Key ones: