{"id":24333259,"url":"https://github.com/liblaf/cherries","last_synced_at":"2026-06-01T09:00:47.056Z","repository":{"id":272767415,"uuid":"917585478","full_name":"liblaf/cherries","owner":"liblaf","description":"🍒 Sweet experiment tracking with Comet, DVC, and Git integration.","archived":false,"fork":false,"pushed_at":"2026-05-26T00:29:32.000Z","size":3468,"stargazers_count":1,"open_issues_count":10,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-26T02:26:45.493Z","etag":null,"topics":["automation","data-science","experiment-tracking","git","logging","machine-learning","monitoring","neptune","pydantic","python"],"latest_commit_sha":null,"homepage":"https://cherries.readthedocs.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/liblaf.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"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":null,"dco":null,"cla":null},"funding":{"custom":["https://afdian.com/a/liblaf"]}},"created_at":"2025-01-16T09:14:16.000Z","updated_at":"2026-04-05T15:40:13.000Z","dependencies_parsed_at":"2025-01-16T14:57:15.785Z","dependency_job_id":"ca8ccaf6-aa47-4225-8e97-83285d822083","html_url":"https://github.com/liblaf/cherries","commit_stats":null,"previous_names":["liblaf/cherries"],"tags_count":57,"template":false,"template_full_name":null,"purl":"pkg:github/liblaf/cherries","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liblaf%2Fcherries","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liblaf%2Fcherries/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liblaf%2Fcherries/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liblaf%2Fcherries/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liblaf","download_url":"https://codeload.github.com/liblaf/cherries/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liblaf%2Fcherries/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33767439,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-01T02:00:06.963Z","response_time":115,"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":["automation","data-science","experiment-tracking","git","logging","machine-learning","monitoring","neptune","pydantic","python"],"created_at":"2025-01-18T03:14:45.745Z","updated_at":"2026-06-01T09:00:47.050Z","avatar_url":"https://github.com/liblaf.png","language":"Python","funding_links":["https://afdian.com/a/liblaf"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\" markdown\u003e\n\u003ca name=\"readme-top\"\u003e\u003c/a\u003e\n\n![Cherries](https://socialify.git.ci/liblaf/cherries/image?description=1\u0026forks=1\u0026issues=1\u0026language=1\u0026logo=https%3A%2F%2Fraw.githubusercontent.com%2Fmicrosoft%2Ffluentui-emoji%2Frefs%2Fheads%2Fmain%2Fassets%2FCherries%2F3D%2Fcherries_3d.png\u0026name=1\u0026owner=1\u0026pattern=Transparent\u0026pulls=1\u0026stargazers=1\u0026theme=Auto)\n\n**[Explore the docs »](https://liblaf.github.io/cherries/)**\n\n[![Test](https://github.com/liblaf/cherries/actions/workflows/python-test.yaml/badge.svg)](https://github.com/liblaf/cherries/actions/workflows/python-test.yaml)\n[![codecov](https://codecov.io/gh/liblaf/cherries/graph/badge.svg)](https://codecov.io/gh/liblaf/cherries)\n[![PyPI - Version](https://img.shields.io/pypi/v/liblaf-cherries?logo=PyPI\u0026label=PyPI)](https://pypi.org/project/liblaf-cherries)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/liblaf-cherries?logo=Python\u0026label=Python)](https://pypi.org/project/liblaf-cherries)\n[![PyPI - Types](https://img.shields.io/pypi/types/liblaf-cherries?logo=PyPI\u0026label=Types)](https://pypi.org/project/liblaf-cherries)\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n[![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)\n[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/liblaf/cherries/main.svg)](https://results.pre-commit.ci/latest/github/liblaf/cherries/main)\n\n[Changelog](https://github.com/liblaf/cherries/blob/main/CHANGELOG.md) · [Report Bug](https://github.com/liblaf/cherries/issues) · [Request Feature](https://github.com/liblaf/cherries/issues)\n\n![Rule](https://cdn.jsdelivr.net/gh/andreasbm/readme/assets/lines/rainbow.png)\n\n\u003c/div\u003e\n\n## ✨ What Cherries Does\n\nCherries is a lightweight experiment runner for Python scripts that need just\nenough structure to be repeatable. It builds typed config objects, resolves\nstable data and temporary paths, stores scalar metrics as Polars dataframes, and\nfans run events out to local files, Git, Comet, and custom plugins.\n\n- **Typed configs**: pass `pydantic-settings` models into experiments and log\n  them as parameters automatically.\n- **Reproducible paths**: resolve inputs, outputs, and temporary artifacts below\n  the entrypoint-derived run directory.\n- **Metric history**: log one scalar or nested metric mappings such as\n  `{\"train\": {\"loss\": 0.4}}`, then read them back as tables.\n- **Artifact bundles**: log VTK `.series` frames and optional mesh\n  `.landmarks.json` companions with their primary artifacts.\n- **Plugin hooks**: compose ordered hooks for local snapshots, logging, Git,\n  Comet, or your own integrations.\n- **Run profiles**: use `debug` for local work without remote or commit side\n  effects, and `default` for the full logging pipeline.\n\n## 📦 Installation\n\n```bash\nuv add liblaf-cherries\n```\n\n## 🚀 Quick Start\n\n```python\nfrom pathlib import Path\n\nfrom liblaf import cherries\n\n\nclass Config(cherries.BaseConfig):\n    name: str = \"world\"\n    output: Path = cherries.output(\"hello.txt\", mkdir=True)\n\n\ndef experiment(cfg: Config) -\u003e None:\n    message = f\"Hello, {cfg.name}!\"\n    cfg.output.write_text(f\"{message}\\n\")\n    cherries.log_params({\"name\": cfg.name})\n    cherries.log_metric(\"message_length\", len(message))\n\n\nif __name__ == \"__main__\":\n    cherries.main(experiment, profile=\"debug\")\n```\n\n`profile=\"debug\"` keeps Comet disabled and Git commits off while still copying\nthe entrypoint, logs, and logged artifacts into `.cherries/runs/`. The default\nprofile enables Comet, commits dirty changes when needed, and records the final\nGit SHA.\n\n## 🧭 Core Concepts\n\n- `cherries.input()` logs existing inputs immediately.\n- `cherries.output()` and `cherries.temp()` return paths immediately, then log\n  existing files when the run ends.\n- `cherries.log_metric()` records one scalar; `cherries.log_metrics()` flattens\n  nested mappings with `/`.\n- `CHERRIES_NAME` sets the human-readable run name; `CHERRIES_TAGS` attaches a\n  comma-separated tag list to summaries and Comet.\n- Plugins subclass `liblaf.cherries.core.Plugin`, decorate hooks with\n  `liblaf.cherries.core.impl()`, and use `before` or `after` constraints for\n  deterministic order.\n\n## ⌨️ Local Development\n\n[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/liblaf/cherries)\n\n```bash\ngh repo clone liblaf/cherries\ncd cherries\nmise run install\nuv run pytest\nmise run lint\nmise run docs:build\n```\n\n## 🔗 Links\n\n- [Documentation](https://liblaf.github.io/cherries/)\n- [Source Code](https://github.com/liblaf/cherries)\n- [Issue Tracker](https://github.com/liblaf/cherries/issues)\n- [PyPI Package](https://pypi.org/project/liblaf-cherries/)\n\n---\n\n#### 📝 License\n\nCopyright © 2026 [liblaf](https://github.com/liblaf). \u003cbr /\u003e\nThis project is [MIT](https://github.com/liblaf/cherries/blob/main/LICENSE) licensed.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliblaf%2Fcherries","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliblaf%2Fcherries","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliblaf%2Fcherries/lists"}