{"adoption": {"forks": 65, "observed_at": "2026-08-28T04:04:27.064576+00:00", "stars": 1343}, "canonical_url": "https://ross.abutalabs.com/products/budgetml", "card": {"archived": false, "artifact_type": "library", "description": "Deploy a ML inference service on a budget in less than 10 lines of code.", "domain": ["machine-learning", "cloud-computing", "apis", "data-science"], "enriched": true, "function": ["deployment", "api-framework", "http-server", "machine-learning", "llm-inference"], "health_score": 20, "homepage": null, "language": "Python", "license": "Apache-2.0", "license_family": "permissive", "maturity": "maintenance", "member_repos": ["ebhy/budgetml"], "name": "ebhy/budgetml", "platform": ["python", "cloud"], "pushed_at": "2024-02-12T17:29:24+00:00", "repo": "ebhy/budgetml", "stars": 1343, "tags": ["mlops", "fastapi", "model-serving", "inference-endpoint", "gcp", "preemptible-instances", "ssl", "low-cost-deployment", "docker", "linux"], "topics": ["mlops", "deployment", "machine-learning", "api", "fastapi", "inference", "data-science"], "urls": [], "use_cases": ["deploy a machine learning model as a REST API cheaply", "serve model predictions on a low-budget cloud endpoint", "quickly put a trained model into production without DevOps knowledge", "host an inference API on a preemptible GCP instance", "get an HTTPS prediction endpoint with SSL in minutes", "avoid setting up Kubernetes for a single model deployment"], "what_it_is": "BudgetML is a Python library that deploys machine learning models as secured HTTPS API endpoints on cheap GCP preemptible instances in under 10 lines of code. It auto-generates a FastAPI server with Swagger docs, OAuth2 security, and LetsEncrypt SSL certificates while keeping costs minimal and uptime high.", "when_to_avoid": ["you need a fully production-grade, highly available serving infrastructure", "you are not deploying on Google Cloud Platform", "you need multi-model orchestration, autoscaling, or Kubernetes features", "you require active maintenance and long-term support, since the project is unmaintained"], "when_to_choose": ["you are a data scientist who wants a model endpoint fast without learning Docker, SSL, or backend servers", "cost is a primary concern and you can tolerate brief periodic downtime", "you need a simple single-model API rather than a full production MLOps setup", "you want automatic FastAPI server generation with interactive Swagger docs"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/budgetml", "repo": "ebhy/budgetml", "role": "main", "score": 23}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:27.064576+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:42:53.753718+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0bca60cd2d1a2a7de5f81251465fd5494e0286e9d060341c2832a18c385588b9", "fetched_at": "2026-08-28T04:04:27.064576+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ebhy/budgetml"}, {"content_hash": "9dea722df4f8c5a46ca4260c0e57361404b3bf985e62a80435498cb692f307e9", "fetched_at": "2026-08-29T12:02:15.522682+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/budgetml/json"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:27.064576+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:42:53.753718+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0bca60cd2d1a2a7de5f81251465fd5494e0286e9d060341c2832a18c385588b9", "fetched_at": "2026-08-28T04:04:27.064576+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ebhy/budgetml"}, {"content_hash": "9dea722df4f8c5a46ca4260c0e57361404b3bf985e62a80435498cb692f307e9", "fetched_at": "2026-08-29T12:02:15.522682+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/budgetml/json"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:42:53.753718+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0bca60cd2d1a2a7de5f81251465fd5494e0286e9d060341c2832a18c385588b9", "fetched_at": "2026-08-28T04:04:27.064576+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ebhy/budgetml"}, {"content_hash": "9dea722df4f8c5a46ca4260c0e57361404b3bf985e62a80435498cb692f307e9", "fetched_at": "2026-08-29T12:02:15.522682+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/budgetml/json"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:04:27.064576+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:27.064576+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:27.064576+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:42:53.753718+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0bca60cd2d1a2a7de5f81251465fd5494e0286e9d060341c2832a18c385588b9", "fetched_at": "2026-08-28T04:04:27.064576+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ebhy/budgetml"}, {"content_hash": "9dea722df4f8c5a46ca4260c0e57361404b3bf985e62a80435498cb692f307e9", "fetched_at": "2026-08-29T12:02:15.522682+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/budgetml/json"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:27.064576+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:27.064576+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:42:53.753718+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0bca60cd2d1a2a7de5f81251465fd5494e0286e9d060341c2832a18c385588b9", "fetched_at": "2026-08-28T04:04:27.064576+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ebhy/budgetml"}, {"content_hash": "9dea722df4f8c5a46ca4260c0e57361404b3bf985e62a80435498cb692f307e9", "fetched_at": "2026-08-29T12:02:15.522682+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/budgetml/json"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:27.064576+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:27.064576+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:27.064576+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:42:53.753718+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0bca60cd2d1a2a7de5f81251465fd5494e0286e9d060341c2832a18c385588b9", "fetched_at": "2026-08-28T04:04:27.064576+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ebhy/budgetml"}, {"content_hash": "9dea722df4f8c5a46ca4260c0e57361404b3bf985e62a80435498cb692f307e9", "fetched_at": "2026-08-29T12:02:15.522682+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/budgetml/json"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:27.064576+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:27.064576+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:42:53.753718+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0bca60cd2d1a2a7de5f81251465fd5494e0286e9d060341c2832a18c385588b9", "fetched_at": "2026-08-28T04:04:27.064576+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ebhy/budgetml"}, {"content_hash": "9dea722df4f8c5a46ca4260c0e57361404b3bf985e62a80435498cb692f307e9", "fetched_at": "2026-08-29T12:02:15.522682+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/budgetml/json"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:42:53.753718+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0bca60cd2d1a2a7de5f81251465fd5494e0286e9d060341c2832a18c385588b9", "fetched_at": "2026-08-28T04:04:27.064576+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ebhy/budgetml"}, {"content_hash": "9dea722df4f8c5a46ca4260c0e57361404b3bf985e62a80435498cb692f307e9", "fetched_at": "2026-08-29T12:02:15.522682+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/budgetml/json"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:42:53.753718+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0bca60cd2d1a2a7de5f81251465fd5494e0286e9d060341c2832a18c385588b9", "fetched_at": "2026-08-28T04:04:27.064576+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ebhy/budgetml"}, {"content_hash": "9dea722df4f8c5a46ca4260c0e57361404b3bf985e62a80435498cb692f307e9", "fetched_at": "2026-08-29T12:02:15.522682+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/budgetml/json"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:42:53.753718+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0bca60cd2d1a2a7de5f81251465fd5494e0286e9d060341c2832a18c385588b9", "fetched_at": "2026-08-28T04:04:27.064576+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ebhy/budgetml"}, {"content_hash": "9dea722df4f8c5a46ca4260c0e57361404b3bf985e62a80435498cb692f307e9", "fetched_at": "2026-08-29T12:02:15.522682+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/budgetml/json"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 8}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2075, "days_push": 933, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 23, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}