{"adoption": {"forks": 179, "observed_at": "2026-08-28T04:03:16.058416+00:00", "stars": 1022}, "canonical_url": "https://ross.abutalabs.com/products/freejoy", "card": {"archived": false, "artifact_type": "application", "description": "STM32F103 USB HID game device controller with flexible configuration", "domain": ["gaming-tools", "hardware", "embedded-systems"], "enriched": true, "function": ["embedded", "game", "sdk"], "health_score": 84, "homepage": null, "language": "C", "license": "GPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["FreeJoy-Team/FreeJoy"], "name": "FreeJoy-Team/FreeJoy", "platform": ["embedded", "windows"], "pushed_at": "2026-04-19T09:12:55+00:00", "repo": "FreeJoy-Team/FreeJoy", "stars": 1022, "tags": ["stm32f103", "usb-hid", "joystick", "hotas", "sim-racing", "flight-sim", "firmware", "game-controller", "stm32", "linux", "macos"], "topics": ["joystick", "hotas", "pedals", "steering-wheel", "rudder", "game-controller", "usb-hid"], "urls": [], "use_cases": ["build a DIY HOTAS joystick controller", "make custom racing pedals for sim racing", "convert analog sensors into a USB steering wheel", "create a button box with encoders and LEDs", "customize an existing joystick controller firmware", "wire shift registers for many buttons on a game controller"], "what_it_is": "FreeJoy is open-source firmware for the STM32F103C8 microcontroller that turns the board into a highly configurable USB HID game controller. It supports analog axes, up to 128 digital inputs, encoders, sensors, and LEDs for building custom HOTAS, pedals, steering wheels, and other sim racing or flight sim hardware.", "when_to_avoid": ["you need a plug-and-play commercial controller without soldering or firmware flashing", "your hardware is not STM32F103C8-based", "you need force feedback or console (non-PC) compatibility"], "when_to_choose": ["you want a cheap, flexible DIY USB game controller based on STM32F103", "you need many inputs (axes, buttons, encoders, hats) on one device", "you want configurable calibration, curves, deadbands, and shift modifiers", "you want to control LEDs or integrate with SimHub"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/freejoy", "repo": "FreeJoy-Team/FreeJoy", "role": "main", "score": 69}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:16.058416+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T07:08:41.300767+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3a5a4b54855791de903c564b5dd2a3e77022062e2a0f918f180dde091497e5e1", "fetched_at": "2026-08-28T04:03:16.058416+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreeJoy-Team/FreeJoy"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:16.058416+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T07:08:41.300767+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3a5a4b54855791de903c564b5dd2a3e77022062e2a0f918f180dde091497e5e1", "fetched_at": "2026-08-28T04:03:16.058416+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreeJoy-Team/FreeJoy"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T07:08:41.300767+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3a5a4b54855791de903c564b5dd2a3e77022062e2a0f918f180dde091497e5e1", "fetched_at": "2026-08-28T04:03:16.058416+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreeJoy-Team/FreeJoy"}], "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:16.058416+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:16.058416+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:16.058416+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T07:08:41.300767+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3a5a4b54855791de903c564b5dd2a3e77022062e2a0f918f180dde091497e5e1", "fetched_at": "2026-08-28T04:03:16.058416+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreeJoy-Team/FreeJoy"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:16.058416+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:16.058416+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T07:08:41.300767+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3a5a4b54855791de903c564b5dd2a3e77022062e2a0f918f180dde091497e5e1", "fetched_at": "2026-08-28T04:03:16.058416+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreeJoy-Team/FreeJoy"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:16.058416+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:16.058416+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:16.058416+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T07:08:41.300767+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3a5a4b54855791de903c564b5dd2a3e77022062e2a0f918f180dde091497e5e1", "fetched_at": "2026-08-28T04:03:16.058416+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreeJoy-Team/FreeJoy"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:16.058416+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:16.058416+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T07:08:41.300767+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3a5a4b54855791de903c564b5dd2a3e77022062e2a0f918f180dde091497e5e1", "fetched_at": "2026-08-28T04:03:16.058416+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreeJoy-Team/FreeJoy"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T07:08:41.300767+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3a5a4b54855791de903c564b5dd2a3e77022062e2a0f918f180dde091497e5e1", "fetched_at": "2026-08-28T04:03:16.058416+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreeJoy-Team/FreeJoy"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T07:08:41.300767+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3a5a4b54855791de903c564b5dd2a3e77022062e2a0f918f180dde091497e5e1", "fetched_at": "2026-08-28T04:03:16.058416+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreeJoy-Team/FreeJoy"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T07:08:41.300767+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3a5a4b54855791de903c564b5dd2a3e77022062e2a0f918f180dde091497e5e1", "fetched_at": "2026-08-28T04:03:16.058416+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreeJoy-Team/FreeJoy"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 78, "longevity": 100, "rhythm": 39}, "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": 2525, "days_push": 136, "days_rel": 193, "gap_med": null, "n_releases_24m": 1}, "score": 69, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}