{"adoption": {"forks": 170, "observed_at": "2026-08-28T04:03:12.550247+00:00", "stars": 1008}, "canonical_url": "https://ross.abutalabs.com/products/openffboard", "card": {"archived": false, "artifact_type": "application", "description": "OpenFFBoard is a universal force feedback interface for DIY simulation devices", "domain": ["hardware", "simulation", "gaming-tools", "embedded-systems"], "enriched": true, "function": ["embedded", "sdk", "developer-tools"], "health_score": 99, "homepage": "https://hackaday.io/project/163904-open-ffboard", "language": "C", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["Ultrawipf/OpenFFBoard"], "name": "Ultrawipf/OpenFFBoard", "platform": ["embedded", "cross-platform", "windows"], "pushed_at": "2026-08-22T20:12:50+00:00", "repo": "Ultrawipf/OpenFFBoard", "stars": 1008, "tags": ["force-feedback", "firmware", "usb-hid", "sim-racing", "diy-hardware", "motor-controller", "steering-wheel", "joystick", "linux", "macos"], "topics": ["firmware", "usb-hid", "forcefeedback"], "urls": [], "use_cases": ["build a DIY direct drive force feedback steering wheel", "make a custom force feedback joystick for sim racing", "drive a stepper or servo motor as an FFB device", "replace expensive commercial FFB wheel bases with an open source alternative", "create a USB HID force feedback controller recognized by games", "add custom force feedback effects to a gamepad-style controller"], "what_it_is": "Open FFBoard is open-source firmware for a universal force feedback interface and motor driver, designed for DIY simulation devices like direct-drive steering wheels and joysticks. It provides USB HID FFB device modes, multiple analog axis and button inputs, and is configured via a companion GUI.", "when_to_avoid": ["you need plug-and-play consumer hardware with no DIY assembly", "you are a beginner uncomfortable with firmware flashing and hardware wiring", "you need guaranteed stability - the project is experimental and features may change", "you only need a simple non-FFB game controller"], "when_to_choose": ["you are building your own sim racing wheel or FFB joystick hardware", "you want an open, highly configurable alternative to commercial FFB bases", "you need USB HID force feedback compatibility across many games", "you want a modular motor controller for stepper/servo FFB setups"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/openffboard", "repo": "Ultrawipf/OpenFFBoard", "role": "main", "score": 93}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.550247+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T07:12:07.533687+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2501b2064ae3d6c133eab8df384ed7f65828f0e6db3857b39fd6d17bcff25411", "fetched_at": "2026-08-28T04:03:12.550247+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Ultrawipf/OpenFFBoard"}, {"content_hash": "3ac585fd5f5fb4e6037079b58c292631976d217c1e0275e3f9f0f77a575d915d", "fetched_at": "2026-08-29T13:12:11.028233+00:00", "kind": "homepage", "missing": false, "url": "https://hackaday.io/project/163904-open-ffboard"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.550247+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T07:12:07.533687+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2501b2064ae3d6c133eab8df384ed7f65828f0e6db3857b39fd6d17bcff25411", "fetched_at": "2026-08-28T04:03:12.550247+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Ultrawipf/OpenFFBoard"}, {"content_hash": "3ac585fd5f5fb4e6037079b58c292631976d217c1e0275e3f9f0f77a575d915d", "fetched_at": "2026-08-29T13:12:11.028233+00:00", "kind": "homepage", "missing": false, "url": "https://hackaday.io/project/163904-open-ffboard"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T07:12:07.533687+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2501b2064ae3d6c133eab8df384ed7f65828f0e6db3857b39fd6d17bcff25411", "fetched_at": "2026-08-28T04:03:12.550247+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Ultrawipf/OpenFFBoard"}, {"content_hash": "3ac585fd5f5fb4e6037079b58c292631976d217c1e0275e3f9f0f77a575d915d", "fetched_at": "2026-08-29T13:12:11.028233+00:00", "kind": "homepage", "missing": false, "url": "https://hackaday.io/project/163904-open-ffboard"}], "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:03:12.550247+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.550247+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.550247+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T07:12:07.533687+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2501b2064ae3d6c133eab8df384ed7f65828f0e6db3857b39fd6d17bcff25411", "fetched_at": "2026-08-28T04:03:12.550247+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Ultrawipf/OpenFFBoard"}, {"content_hash": "3ac585fd5f5fb4e6037079b58c292631976d217c1e0275e3f9f0f77a575d915d", "fetched_at": "2026-08-29T13:12:11.028233+00:00", "kind": "homepage", "missing": false, "url": "https://hackaday.io/project/163904-open-ffboard"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.550247+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.550247+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T07:12:07.533687+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2501b2064ae3d6c133eab8df384ed7f65828f0e6db3857b39fd6d17bcff25411", "fetched_at": "2026-08-28T04:03:12.550247+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Ultrawipf/OpenFFBoard"}, {"content_hash": "3ac585fd5f5fb4e6037079b58c292631976d217c1e0275e3f9f0f77a575d915d", "fetched_at": "2026-08-29T13:12:11.028233+00:00", "kind": "homepage", "missing": false, "url": "https://hackaday.io/project/163904-open-ffboard"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.550247+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.550247+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.550247+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T07:12:07.533687+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2501b2064ae3d6c133eab8df384ed7f65828f0e6db3857b39fd6d17bcff25411", "fetched_at": "2026-08-28T04:03:12.550247+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Ultrawipf/OpenFFBoard"}, {"content_hash": "3ac585fd5f5fb4e6037079b58c292631976d217c1e0275e3f9f0f77a575d915d", "fetched_at": "2026-08-29T13:12:11.028233+00:00", "kind": "homepage", "missing": false, "url": "https://hackaday.io/project/163904-open-ffboard"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.550247+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.550247+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T07:12:07.533687+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2501b2064ae3d6c133eab8df384ed7f65828f0e6db3857b39fd6d17bcff25411", "fetched_at": "2026-08-28T04:03:12.550247+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Ultrawipf/OpenFFBoard"}, {"content_hash": "3ac585fd5f5fb4e6037079b58c292631976d217c1e0275e3f9f0f77a575d915d", "fetched_at": "2026-08-29T13:12:11.028233+00:00", "kind": "homepage", "missing": false, "url": "https://hackaday.io/project/163904-open-ffboard"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T07:12:07.533687+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2501b2064ae3d6c133eab8df384ed7f65828f0e6db3857b39fd6d17bcff25411", "fetched_at": "2026-08-28T04:03:12.550247+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Ultrawipf/OpenFFBoard"}, {"content_hash": "3ac585fd5f5fb4e6037079b58c292631976d217c1e0275e3f9f0f77a575d915d", "fetched_at": "2026-08-29T13:12:11.028233+00:00", "kind": "homepage", "missing": false, "url": "https://hackaday.io/project/163904-open-ffboard"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T07:12:07.533687+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2501b2064ae3d6c133eab8df384ed7f65828f0e6db3857b39fd6d17bcff25411", "fetched_at": "2026-08-28T04:03:12.550247+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Ultrawipf/OpenFFBoard"}, {"content_hash": "3ac585fd5f5fb4e6037079b58c292631976d217c1e0275e3f9f0f77a575d915d", "fetched_at": "2026-08-29T13:12:11.028233+00:00", "kind": "homepage", "missing": false, "url": "https://hackaday.io/project/163904-open-ffboard"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T07:12:07.533687+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2501b2064ae3d6c133eab8df384ed7f65828f0e6db3857b39fd6d17bcff25411", "fetched_at": "2026-08-28T04:03:12.550247+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Ultrawipf/OpenFFBoard"}, {"content_hash": "3ac585fd5f5fb4e6037079b58c292631976d217c1e0275e3f9f0f77a575d915d", "fetched_at": "2026-08-29T13:12:11.028233+00:00", "kind": "homepage", "missing": false, "url": "https://hackaday.io/project/163904-open-ffboard"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 100, "rhythm": 82}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2395, "days_push": 11, "days_rel": 40, "gap_med": 78.0, "n_releases_24m": 9}, "score": 93, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}