{"id":13426979,"url":"https://github.com/pycaret/pycaret","last_synced_at":"2026-10-24T20:04:12.027Z","repository":{"id":37431242,"uuid":"223636350","full_name":"pycaret/pycaret","owner":"pycaret","description":"Open-source, low-code AutoML platform for Python. PyCaret 4.0: sklearn-native engine + React control plane.","archived":false,"fork":false,"pushed_at":"2026-07-23T00:34:25.000Z","size":271811,"stargazers_count":9859,"open_issues_count":34,"forks_count":1840,"subscribers_count":143,"default_branch":"main","last_synced_at":"2026-10-24T14:34:48.884Z","etag":null,"topics":["anomaly-detection","automl","classification","clustering","data-science","fastapi","machine-learning","ml","mlops","open-source","pycaret","python","react","regression","scikit-learn"],"latest_commit_sha":null,"homepage":"https://pycaret.org","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pycaret.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","claude":"CLAUDE.md","gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null},"funding":null},"created_at":"2019-11-23T18:40:48.000Z","updated_at":"2026-10-23T02:47:45.000Z","dependencies_parsed_at":"2026-10-08T14:34:00.652Z","dependency_job_id":null,"html_url":"https://github.com/pycaret/pycaret","commit_stats":{"total_commits":3941,"total_committers":143,"mean_commits":27.55944055944056,"dds":0.6848515605176351,"last_synced_commit":"8f1bb0db8d86b2086b0ff2069b276f09aff0fc4d"},"previous_names":[],"tags_count":41,"template":false,"template_full_name":null,"purl":"pkg:github/pycaret/pycaret","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pycaret%2Fpycaret","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pycaret%2Fpycaret/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pycaret%2Fpycaret/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pycaret%2Fpycaret/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pycaret","download_url":"https://codeload.github.com/pycaret/pycaret/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pycaret%2Fpycaret/sbom","scorecard":{"id":751179,"data":{"date":"2025-08-11","repo":{"name":"github.com/pycaret/pycaret","commit":"58ec3c282d58e94727f9d5b77b49f241e9103ab3"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.6,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":10,"reason":"all changesets reviewed","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/stale.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Vulnerabilities","score":3,"reason":"7 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2018-34 / GHSA-2fc2-6r4j-p65h","Warn: Project is vulnerable to: PYSEC-2021-856 / GHSA-5545-2q6w-2gh6","Warn: Project is vulnerable to: PYSEC-2019-108 / GHSA-9fq2-x9r6-wfmf","Warn: Project is vulnerable to: PYSEC-2018-33 / GHSA-cw6w-4rcx-xphc","Warn: Project is vulnerable to: PYSEC-2021-857 / GHSA-f7c7-j99h-c22f","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2017-1 / GHSA-frgw-fgh6-9g52"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":7,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:49: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:63: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/codeql-analysis.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/lock_old_threads.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/lock_old_threads.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/stale.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/stale.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:85: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:87: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:124: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:126: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:162: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:164: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:201: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:203: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:240: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:242: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/pycaret/pycaret/test.yml/master?enable=pin","Warn: containerImage not pinned by hash: Docker_files/pycaret_full/Dockerfile:3: pin your Docker image by updating jupyter/base-notebook:latest to jupyter/base-notebook:latest@sha256:8c903974902b0e9d45d9823c2234411de0614c5c98c4bb782b3d4f55b3e435e6","Warn: containerImage not pinned by hash: Docker_files/pycaret_slim/Dockerfile:3: pin your Docker image by updating jupyter/base-notebook:latest to jupyter/base-notebook:latest@sha256:8c903974902b0e9d45d9823c2234411de0614c5c98c4bb782b3d4f55b3e435e6","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:52","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:53","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:96","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:97","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:105","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:135","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:136","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:173","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:174","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:182","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:212","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:213","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:221","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:251","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:252","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:260","Info:   0 out of  18 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction dependencies pinned","Info:   0 out of   2 containerImage dependencies pinned","Info:   0 out of  16 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}}]},"last_synced_at":"2025-08-22T20:26:10.453Z","repository_id":37431242,"created_at":"2025-08-22T20:26:10.454Z","updated_at":"2025-08-22T20:26:10.454Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":345237552,"owners_count":38493953,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-10-03T21:59:58.778Z","status":"online","status_checked_at":"2026-10-24T02:00:07.043Z","response_time":103,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anomaly-detection","automl","classification","clustering","data-science","fastapi","machine-learning","ml","mlops","open-source","pycaret","python","react","regression","scikit-learn"],"created_at":"2024-07-31T00:01:50.018Z","updated_at":"2026-10-24T20:04:12.000Z","avatar_url":"https://github.com/pycaret.png","language":"Python","funding_links":[],"categories":["Jupyter Notebook","Uncategorized","Machine Learning and AI","🎯 Tool Categories","Table of Contents","Machine Learning","AutoML","\u003cspan id=\"head41\"\u003e3.5. Machine Learning and Deep Learning\u003c/span\u003e","Profiling","Machine Learning Framework","Python","工作流程和实验跟踪","Model Training and Orchestration","C++","Libraries","Machine Learning Frameworks","General tools"],"sub_categories":["Uncategorized","Machine Learning Frameworks","🛠️ AutoML \u0026 Model Training","AI - Frameworks and Toolkits","General Purpose Machine Learning","Profiling","\u003cspan id=\"head42\"\u003e3.5.1. Machine Learning\u003c/span\u003e","Experiment Management","[Tools](#tools-1)"],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"docs/images/logo.png\" alt=\"PyCaret\" width=\"200\"/\u003e\n\n# PyCaret — open-source self-hosted ML platform\n\n### The engine, the control plane, and the UI — all in one box.\n\n[![CI](https://github.com/pycaret/pycaret/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/pycaret/pycaret/actions/workflows/test.yml)\n[![Python](https://img.shields.io/badge/Python-3.11%20%7C%203.12%20%7C%203.13-blue)](https://github.com/pycaret/pycaret)\n[![License](https://img.shields.io/pypi/l/pycaret.svg)](https://github.com/pycaret/pycaret/blob/main/LICENSE)\n\n[Vision](docs/revamp/VISION.md) ·\n[Architecture](docs/revamp/PLATFORM_ARCHITECTURE.md) ·\n[Roadmap](docs/revamp/ROADMAP.md) ·\n[Spec](docs/revamp/CONTROL_PLANE_SPEC.md) ·\n[Agent guide](AGENTS.md)\n\n\u003c/div\u003e\n\n---\n\n\u003e ## ⚠ 4.0 is **work in progress** — you're on `main` (the 4.0 line)\n\u003e\n\u003e PyCaret 4.0 is a ground-up architectural revamp. The 3.x line is frozen on PyPI as `pycaret 3.4.0` — no further commits.\n\u003e\n\u003e Track progress in [`docs/revamp/STATUS.md`](docs/revamp/STATUS.md) and [`docs/revamp/ROADMAP.md`](docs/revamp/ROADMAP.md).\n\n---\n\n## What you get\n\nA self-hosted ML platform you can run on your laptop in 5 minutes:\n\n- **Engine** — sklearn-1.7-based AutoML library (`pycaret` on PyPI).\n- **Control plane** — FastAPI backend with workspaces, projects, experiments, runs, model registry, deployments, approvals, monitoring, drift, lineage, webhooks, schedules, LLM-advisory copilots.\n- **Web UI** — React + Vite, dark-mode-first. Configure everything via point-and-click; nothing requires editing YAML.\n- **One-command local install** — `docker compose up` and the whole thing is running locally on `http://localhost:3020`.\n\n### How it's built today\n\nToday's `docker compose` ships a **deliberately compact** two-container shape: one for the nginx-served React bundle, one for a FastAPI process that ALSO runs the in-process scheduler, the in-process compute, and a local SQLite file (persisted to a Docker volume) — the same single-binary pattern Plausible / Vaultwarden / n8n use for self-hosters. Great for laptops, fine for a small-team production deploy.\n\nThe architecture is designed to split apart cleanly: every external dependency (storage, DB, secrets, auth, queue, compute) is meant to sit behind a `Protocol` with multiple implementations, so the same codebase can target separate api / worker / runtime containers backed by RDS / S3 / SecretsManager / SQS / Fargate when you outgrow the single-binary shape. Most of those `Protocol` extractions are still ahead of us — see [PLATFORM_ARCHITECTURE.md](docs/revamp/PLATFORM_ARCHITECTURE.md) for the gap matrix and the phasing plan. We're publishing the foundation now and growing it in the open.\n\n---\n\n## Quickstart — local install in 5 minutes\n\n**Prerequisites:** Docker Desktop 4.27+ (or Docker Engine 25.0+ with Compose v2.24+). That's it.\n\n```bash\ngit clone https://github.com/pycaret/pycaret.git\ncd pycaret\ndocker compose up --build\n```\n\nFirst build takes ~5 min (Python deps + npm install + Vite build). Subsequent starts are \u003c 30 sec.\n\nOnce you see `pycaret-api  | INFO: Application startup complete.` and `pycaret-web  | … starting nginx`, open:\n\n**http://localhost:3020**\n\nThe setup screen will prompt you to create your first admin account + workspace. You're in.\n\n### What's running\n\n| Service | URL | What it is |\n|---|---|---|\n| `pycaret-web` | http://localhost:3020 | React UI (nginx-served bundle, proxies `/api` + `/ws` to backend) |\n| `pycaret-api` | http://localhost:8020 | FastAPI + SQLAlchemy + APScheduler (in-process worker for V1) |\n| `pycaret-data` (volume) | (named volume) | SQLite DB + uploaded CSVs + fitted `.pkl` files + Fernet key |\n\n### Common ops\n\n```bash\ndocker compose logs -f api      # tail backend logs\ndocker compose logs -f web      # tail UI logs\ndocker compose restart api      # restart backend only\ndocker compose down             # stop everything (volume PRESERVED — data + key safe)\ndocker compose down -v          # NUKE everything including the data volume (wipes DB + key)\n```\n\n### Troubleshooting\n\n| Symptom | Cause | Fix |\n|---|---|---|\n| `Cannot connect to the Docker daemon` | Docker Desktop / Docker Engine not running | Start Docker Desktop, wait for the whale icon, retry |\n| `bind: address already in use` on `:3020` or `:8020` | Another process holds the port | Override: `PYCARET_WEB_PORT=3030 PYCARET_API_PORT=8030 docker compose up` |\n| Build hangs at `pip install` for \u003e10 min | Slow network on first build, or Docker Desktop is RAM-starved | Open Docker Desktop → Settings → Resources → bump RAM to ≥6 GB, retry |\n| `no space left on device` during build | Old Docker images filling the disk | `docker system prune -a` then retry |\n| `/bin/sh^M: bad interpreter` in api logs | Shell script got CRLF endings on a Windows checkout | This shouldn't happen — `.gitattributes` forces LF. If it does, re-clone with `git clone --config core.autocrlf=false` |\n| UI loads but every `/api` call returns 404 | `pycaret-api` container hasn't finished bootstrapping (Alembic migrations) — happens on the very first `up` | Wait ~30 sec for the health check to pass; `docker compose logs -f api` to watch |\n| Forgot the admin password | DB is encrypted; you can't recover it | `docker compose down -v` to wipe and re-bootstrap |\n\n### Config\n\nAll overrideable via a `.env` file at the repo root (gitignored — see [`.env.example`](.env.example) for the template):\n\n```bash\ncp .env.example .env\n# edit .env: set PYCARET_JWT_SECRET to something real, etc.\ndocker compose up\n```\n\nThe biggest knobs:\n- **`PYCARET_SECRETS_KEY`** — Fernet key for encrypting LLM API keys + connection passwords at rest. Auto-generated on first run + persisted to the data volume; only set this explicitly if you want the same key across multiple instances.\n- **`PYCARET_JWT_SECRET`** — Used to sign auth tokens. **Must** be a strong random value in any prod deploy.\n- **`PYCARET_DATABASE_URL`** — Swap from SQLite to Postgres in prod (`postgresql+psycopg://…`).\n- **`PYCARET_STORAGE_BACKEND=s3`** + bucket creds — swap artifacts from local FS to S3.\n\n---\n\n## Take it for a spin (golden path)\n\n1. **Setup** — create the first admin account + your workspace.\n2. **Configure LLM (optional)** — sidebar → **Settings → LLM** → paste your Anthropic or OpenAI API key. Enables the AI dataset consultant + experiment designer copilots.\n3. **Upload a dataset** OR pick one — sidebar → **Build → Datasets** → click **Browse samples** to grab a bundled CSV (juice, bank, iris, …) with one click.\n4. **Create a project** — sidebar → **Build → Projects** → New project.\n5. **Run an experiment** — inside the project → New experiment → pick your dataset, pick the task type (classification / regression / clustering / anomaly / time series), pick the target column. The run starts automatically and trains ~12 algorithms.\n6. **Promote the winner** — on the Run detail page, the leaderboard ranks all 12 trials. Pick one → **Promote** → it lands as v1 on the **Model registry**.\n7. **Deploy** — Model registry → click your model → on the version row, **Deploy** → give it an endpoint slug (e.g. `juice-prod`).\n8. **Predict** — Deployment detail page → use the **Test a prediction** panel, or `curl POST http://localhost:8020/api/v1/deployments/juice-prod/predict` with a JSON row.\n\nThat's the full Train → Register → Deploy → Predict loop in ~10 minutes.\n\n---\n\n## Local development (without docker compose)\n\nIf you want to hack on the code with hot-reload, the docker compose setup is overkill — run the services directly:\n\n```bash\n# Prereqs: Python 3.13 + Node 22 + uv 0.11+ + npm 10+\n\n# Install everything (engine + control plane + UI deps)\nuv sync --all-packages --all-extras\ncd apps/web \u0026\u0026 npm install \u0026\u0026 cd ..\n\n# Two terminals:\nuv run --package pycaret-server pycaret-server serve --reload   # backend :8020\ncd apps/web \u0026\u0026 npm run dev                                       # frontend :3020\n```\n\n`apps/web/vite.config.ts` proxies `/api` and `/ws` to `:8020` — same browser experience as the docker setup.\n\n---\n\n## Security — what's safe to push, what's not\n\nA `scripts/check-secrets.sh` scanner blocks accidental secret commits. Run it manually any time:\n\n```bash\nbash scripts/check-secrets.sh\n```\n\nOr install as a git pre-push hook (recommended):\n\n```bash\ncp scripts/check-secrets.sh .git/hooks/pre-push \u0026\u0026 chmod +x .git/hooks/pre-push\n```\n\nIt scans for Anthropic / OpenAI / Stripe / Slack / GitHub / AWS / Google API key shapes, Fernet ciphertext blobs, and PEM private keys. Whole-file allow-list: [`scripts/.secrets-allowlist`](scripts/.secrets-allowlist). Single-line allow: append `# pragma: allow-secret` to the line.\n\nThings that NEVER get committed by design:\n- `*.db` / `*.sqlite` (SQLite files — may contain encrypted secret blobs)\n- `.env` (your local config)\n- `*.pem` / `*.key` / `credentials.json` / `aws-credentials*`\n- `/data/` (docker-compose volume mount point if you ever bind-mount it)\n\nSee [`.gitignore`](.gitignore) for the full list.\n\n---\n\n## Architecture, honestly\n\n**Today** (what `docker compose up` actually runs): two containers. The api one runs a single FastAPI / uvicorn process that ALSO holds the in-process scheduler (APScheduler), the in-process compute (ThreadPoolExecutor), the inference runtime, and a SQLAlchemy session pointing at a SQLite file in a Docker volume. The web one is an nginx serving the built React bundle + reverse-proxying `/api` to the api container. That's the entire production deployment today.\n\n**Tomorrow** (where we're going): every external dependency (storage, DB, secrets, auth, queue, compute, notifications) sits behind a `Protocol` with a local impl AND a cloud impl. Storage + DB are already abstracted that way; the remaining five `Protocol` extractions are queued as Phase 1 work. Once that's done, splitting api / worker / runtime into separate containers and pointing them at RDS / S3 / SQS / Secrets Manager becomes a config swap, not a rewrite.\n\nWe're publishing the foundation now and growing it in the open. Full design + gap matrix: [PLATFORM_ARCHITECTURE.md](docs/revamp/PLATFORM_ARCHITECTURE.md).\n\n---\n\n## Contributing\n\nThis project is **Claude Code-first**: contributors clone, run `claude` in the repo, pick an approved issue, let the agent do the work, open a PR. See [AGENTS.md](AGENTS.md) for the full agent brief and [CONTRIBUTING.md](CONTRIBUTING.md) for the human workflow.\n\n---\n\n## License\n\nPyCaret 4.0 is dual-licensed:\n- The **engine** (`packages/engine/`) — **MIT** (free for any use, including commercial).\n- The **control plane** (`services/api/`, `apps/web/`, `infra/`) — **BUSL-1.1** with a 4-year change date to Apache-2.0. Production-self-host is fine for any organisation under the [Additional Use Grant](LICENSE); managed-SaaS-of-PyCaret-itself is the restricted case.\n\nSee [LICENSE](LICENSE) for the legal text, [LICENSE.engine.txt](LICENSE.engine.txt) for the engine MIT terms.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpycaret%2Fpycaret","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpycaret%2Fpycaret","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpycaret%2Fpycaret/lists"}