{"adoption": {"forks": 240, "observed_at": "2026-08-28T04:04:40.832050+00:00", "stars": 1422}, "canonical_url": "https://ross.abutalabs.com/products/cubli_mini", "card": {"archived": false, "artifact_type": "application", "description": null, "domain": ["robotics", "embedded-systems", "hardware", "education"], "enriched": true, "function": ["robotics", "embedded"], "health_score": 20, "homepage": null, "language": "C++", "license": "GPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["ZhaJiHu/Cubli_Mini"], "name": "ZhaJiHu/Cubli_Mini", "platform": ["embedded", "cpp"], "pushed_at": "2024-08-10T10:25:38+00:00", "repo": "ZhaJiHu/Cubli_Mini", "stars": 1422, "tags": ["open-source-hardware", "self-balancing", "reaction-wheel", "inverted-pendulum", "simplefoc", "esp32", "arduino", "foc-motor-control", "freertos", "mpu6050", "as5600-encoder", "pcb-design", "3d-printing", "diy-project", "control-algorithms", "balance-control"], "topics": [], "urls": [], "use_cases": ["build a diy self-balancing cube robot", "learn motor control with simple foc on esp32", "open source hardware balancing robot with full pcb and cad files", "study balance control algorithms like edge and point balancing", "low cost reaction wheel inverted pendulum project", "replicate a mini cubli from bill of materials", "example of freertos and can bus firmware on dual esp32"], "what_it_is": "An open-source hardware and firmware project that recreates ETH Zurich's Cubli as a low-cost, 10x10x10 cm self-balancing cube that balances on its edges and corners using reaction wheels driven via Simple FOC. It ships complete 3D models, PCB and schematic designs, BOMs with purchase links, and dual-ESP32 C++/Arduino firmware (with FreeRTOS and CAN bus) so anyone can build their own for under ~800 RMB.", "when_to_avoid": ["you need a production-ready or plug-and-play balancing robot without manual tuning near the balance point", "you need the original Cubli's active braking or jump-up capability, which this simplified design omits", "you are uncomfortable assembling pcbs, soldering, or fabricating sheet-metal and 3D-printed parts", "you need safety-critical hardware - spinning momentum wheels are hazardous around hands"], "when_to_choose": ["you want a fully documented, low-cost diy self-balancing cube you can physically build from open cad, pcb, and bom files", "you are learning embedded motor control, FOC, sensor fusion with MPU6050, or FreeRTOS task design on ESP32", "you want a hands-on robotics/control-theory learning project with reference videos and tuning guides"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/cubli_mini", "repo": "ZhaJiHu/Cubli_Mini", "role": "main", "score": 32}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:40.832050+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:37:41.029352+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3283970f3704ff6283fc72e6bb02497edf19c0fe8c217e656b101cb1aa1125cc", "fetched_at": "2026-08-28T04:04:40.832050+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ZhaJiHu/Cubli_Mini"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:40.832050+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:37:41.029352+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3283970f3704ff6283fc72e6bb02497edf19c0fe8c217e656b101cb1aa1125cc", "fetched_at": "2026-08-28T04:04:40.832050+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ZhaJiHu/Cubli_Mini"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:37:41.029352+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3283970f3704ff6283fc72e6bb02497edf19c0fe8c217e656b101cb1aa1125cc", "fetched_at": "2026-08-28T04:04:40.832050+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ZhaJiHu/Cubli_Mini"}], "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:40.832050+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:40.832050+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:40.832050+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:37:41.029352+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3283970f3704ff6283fc72e6bb02497edf19c0fe8c217e656b101cb1aa1125cc", "fetched_at": "2026-08-28T04:04:40.832050+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ZhaJiHu/Cubli_Mini"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:40.832050+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:40.832050+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:37:41.029352+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3283970f3704ff6283fc72e6bb02497edf19c0fe8c217e656b101cb1aa1125cc", "fetched_at": "2026-08-28T04:04:40.832050+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ZhaJiHu/Cubli_Mini"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:40.832050+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:40.832050+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:40.832050+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:37:41.029352+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3283970f3704ff6283fc72e6bb02497edf19c0fe8c217e656b101cb1aa1125cc", "fetched_at": "2026-08-28T04:04:40.832050+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ZhaJiHu/Cubli_Mini"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:40.832050+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:40.832050+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:37:41.029352+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3283970f3704ff6283fc72e6bb02497edf19c0fe8c217e656b101cb1aa1125cc", "fetched_at": "2026-08-28T04:04:40.832050+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ZhaJiHu/Cubli_Mini"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:37:41.029352+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3283970f3704ff6283fc72e6bb02497edf19c0fe8c217e656b101cb1aa1125cc", "fetched_at": "2026-08-28T04:04:40.832050+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ZhaJiHu/Cubli_Mini"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:37:41.029352+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3283970f3704ff6283fc72e6bb02497edf19c0fe8c217e656b101cb1aa1125cc", "fetched_at": "2026-08-28T04:04:40.832050+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ZhaJiHu/Cubli_Mini"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:37:41.029352+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3283970f3704ff6283fc72e6bb02497edf19c0fe8c217e656b101cb1aa1125cc", "fetched_at": "2026-08-28T04:04:40.832050+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ZhaJiHu/Cubli_Mini"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 1570, "days_push": 753, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 32, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}