{"adoption": {"forks": 314, "observed_at": "2026-08-28T04:05:52.671142+00:00", "stars": 1909}, "canonical_url": "https://ross.abutalabs.com/products/freerouting", "card": {"archived": false, "artifact_type": "application", "description": "Advanced PCB auto-router", "domain": ["hardware", "developer-tools", "cross-platform"], "enriched": true, "function": ["gui", "routing", "graphics"], "health_score": 100, "homepage": "https://www.freerouting.app", "language": "Java", "license": "GPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["freerouting/freerouting"], "name": "freerouting/freerouting", "platform": ["windows", "jvm"], "pushed_at": "2026-08-26T20:05:28+00:00", "repo": "freerouting/freerouting", "stars": 1909, "tags": ["pcb", "autorouter", "eda", "kicad", "specctra-dsn", "electronics-design", "ripup-and-reroute", "linux", "macos", "desktop"], "topics": ["autorouter", "autoroute", "routing-engine", "routing", "router", "specctra", "dsn", "pcb", "pcb-design", "autorouting", "auto-router", "auto-route", "kicad", "help-wanted"], "urls": [], "use_cases": ["automatically route PCB traces in KiCad", "autoroute a Specctra DSN file", "replace tedious manual PCB trace placement with automated routing", "route PCBs designed in Autodesk Eagle or EasyEDA", "minimize via counts and trace lengths on a circuit board layout", "batch-route PCB designs via a routing API"], "what_it_is": "Freerouting is an open-source, advanced PCB auto-router that works with any EDA tool supporting the Specctra or Electra DSN interface, such as KiCad, Eagle, and EasyEDA. It imports .dsn design files, automatically routes traces with a multi-threaded rip-up-and-retry engine, and exports .ses session files back to the host EDA tool.", "when_to_avoid": ["your EDA tool does not support Specctra DSN import/export", "you need full schematic capture or PCB layout editing, not just routing", "you require a commercial-grade autorouter with vendor support and guarantees"], "when_to_choose": ["you need automated PCB routing compatible with Specctra DSN/SES workflows", "you use KiCad, Eagle, EasyEDA, or another DSN-compatible EDA tool", "you want a free, open-source alternative to commercial autorouters", "you need multi-threaded routing optimization with configurable rules"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/freerouting", "repo": "freerouting/freerouting", "role": "main", "score": 98}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:52.671142+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:11:06.587180+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3896afa58fdd2cb8b86a5bbe1015ecc1a1cc89cd936d5527f586bfb52c7dc97", "fetched_at": "2026-08-28T04:05:52.671142+00:00", "kind": "readme", "missing": false, "url": "https://github.com/freerouting/freerouting"}, {"content_hash": "49c5f425e91f6d8c4d68c983e53575031a13ca49d5e4c274bcaa4a8c9dee9212", "fetched_at": "2026-08-29T10:50:05.489887+00:00", "kind": "homepage", "missing": false, "url": "https://www.freerouting.app"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:52.671142+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:11:06.587180+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3896afa58fdd2cb8b86a5bbe1015ecc1a1cc89cd936d5527f586bfb52c7dc97", "fetched_at": "2026-08-28T04:05:52.671142+00:00", "kind": "readme", "missing": false, "url": "https://github.com/freerouting/freerouting"}, {"content_hash": "49c5f425e91f6d8c4d68c983e53575031a13ca49d5e4c274bcaa4a8c9dee9212", "fetched_at": "2026-08-29T10:50:05.489887+00:00", "kind": "homepage", "missing": false, "url": "https://www.freerouting.app"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:11:06.587180+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3896afa58fdd2cb8b86a5bbe1015ecc1a1cc89cd936d5527f586bfb52c7dc97", "fetched_at": "2026-08-28T04:05:52.671142+00:00", "kind": "readme", "missing": false, "url": "https://github.com/freerouting/freerouting"}, {"content_hash": "49c5f425e91f6d8c4d68c983e53575031a13ca49d5e4c274bcaa4a8c9dee9212", "fetched_at": "2026-08-29T10:50:05.489887+00:00", "kind": "homepage", "missing": false, "url": "https://www.freerouting.app"}], "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:05:52.671142+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:52.671142+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:52.671142+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:11:06.587180+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3896afa58fdd2cb8b86a5bbe1015ecc1a1cc89cd936d5527f586bfb52c7dc97", "fetched_at": "2026-08-28T04:05:52.671142+00:00", "kind": "readme", "missing": false, "url": "https://github.com/freerouting/freerouting"}, {"content_hash": "49c5f425e91f6d8c4d68c983e53575031a13ca49d5e4c274bcaa4a8c9dee9212", "fetched_at": "2026-08-29T10:50:05.489887+00:00", "kind": "homepage", "missing": false, "url": "https://www.freerouting.app"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:52.671142+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:52.671142+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:11:06.587180+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3896afa58fdd2cb8b86a5bbe1015ecc1a1cc89cd936d5527f586bfb52c7dc97", "fetched_at": "2026-08-28T04:05:52.671142+00:00", "kind": "readme", "missing": false, "url": "https://github.com/freerouting/freerouting"}, {"content_hash": "49c5f425e91f6d8c4d68c983e53575031a13ca49d5e4c274bcaa4a8c9dee9212", "fetched_at": "2026-08-29T10:50:05.489887+00:00", "kind": "homepage", "missing": false, "url": "https://www.freerouting.app"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:52.671142+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:52.671142+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:52.671142+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:11:06.587180+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3896afa58fdd2cb8b86a5bbe1015ecc1a1cc89cd936d5527f586bfb52c7dc97", "fetched_at": "2026-08-28T04:05:52.671142+00:00", "kind": "readme", "missing": false, "url": "https://github.com/freerouting/freerouting"}, {"content_hash": "49c5f425e91f6d8c4d68c983e53575031a13ca49d5e4c274bcaa4a8c9dee9212", "fetched_at": "2026-08-29T10:50:05.489887+00:00", "kind": "homepage", "missing": false, "url": "https://www.freerouting.app"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:52.671142+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:52.671142+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:11:06.587180+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3896afa58fdd2cb8b86a5bbe1015ecc1a1cc89cd936d5527f586bfb52c7dc97", "fetched_at": "2026-08-28T04:05:52.671142+00:00", "kind": "readme", "missing": false, "url": "https://github.com/freerouting/freerouting"}, {"content_hash": "49c5f425e91f6d8c4d68c983e53575031a13ca49d5e4c274bcaa4a8c9dee9212", "fetched_at": "2026-08-29T10:50:05.489887+00:00", "kind": "homepage", "missing": false, "url": "https://www.freerouting.app"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:11:06.587180+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3896afa58fdd2cb8b86a5bbe1015ecc1a1cc89cd936d5527f586bfb52c7dc97", "fetched_at": "2026-08-28T04:05:52.671142+00:00", "kind": "readme", "missing": false, "url": "https://github.com/freerouting/freerouting"}, {"content_hash": "49c5f425e91f6d8c4d68c983e53575031a13ca49d5e4c274bcaa4a8c9dee9212", "fetched_at": "2026-08-29T10:50:05.489887+00:00", "kind": "homepage", "missing": false, "url": "https://www.freerouting.app"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:11:06.587180+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3896afa58fdd2cb8b86a5bbe1015ecc1a1cc89cd936d5527f586bfb52c7dc97", "fetched_at": "2026-08-28T04:05:52.671142+00:00", "kind": "readme", "missing": false, "url": "https://github.com/freerouting/freerouting"}, {"content_hash": "49c5f425e91f6d8c4d68c983e53575031a13ca49d5e4c274bcaa4a8c9dee9212", "fetched_at": "2026-08-29T10:50:05.489887+00:00", "kind": "homepage", "missing": false, "url": "https://www.freerouting.app"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:11:06.587180+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3896afa58fdd2cb8b86a5bbe1015ecc1a1cc89cd936d5527f586bfb52c7dc97", "fetched_at": "2026-08-28T04:05:52.671142+00:00", "kind": "readme", "missing": false, "url": "https://github.com/freerouting/freerouting"}, {"content_hash": "49c5f425e91f6d8c4d68c983e53575031a13ca49d5e4c274bcaa4a8c9dee9212", "fetched_at": "2026-08-29T10:50:05.489887+00:00", "kind": "homepage", "missing": false, "url": "https://www.freerouting.app"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 100, "rhythm": 96}, "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": 4449, "days_push": 7, "days_rel": 26, "gap_med": 7.0, "n_releases_24m": 9}, "score": 98, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}