{"adoption": {"forks": 39, "observed_at": "2026-09-03T02:15:18.262949+00:00", "stars": 1188}, "canonical_url": "https://ross.abutalabs.com/products/pinact", "card": {"archived": false, "artifact_type": "cli-tool", "description": "pinact is a CLI to edit GitHub Workflow and Composite action files and pin versions of Actions and Reusable Workflows. pinact can also update their versions and verify version annotations.", "domain": ["developer-tools", "security", "version-control"], "enriched": true, "function": ["cli", "security", "developer-tools", "ci-cd", "version-control", "code-review", "configuration-management", "yaml"], "health_score": 100, "homepage": null, "language": "Go", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["suzuki-shunsuke/pinact"], "name": "suzuki-shunsuke/pinact", "platform": ["cli", "cross-platform"], "pushed_at": "2026-09-03T00:53:08+00:00", "repo": "suzuki-shunsuke/pinact", "stars": 1188, "tags": ["github-actions", "supply-chain-security", "pin-actions", "sha-pinning", "workflow-files", "sarif", "reviewdog", "github-enterprise", "version-comments", "reusable-workflows", "devops", "automation", "command-line"], "topics": ["cli", "github-actions", "oss", "security"], "urls": [], "use_cases": ["pin github actions to commit shas in workflow files", "update pinned action versions with a cooldown period", "verify version comments on sha-pinned actions in ci", "check that all actions in workflows are pinned without editing files", "pin actions referenced in readme code examples", "generate sarif findings for unpinned actions to review with reviewdog"], "what_it_is": "pinact is a Go CLI that pins GitHub Actions and Reusable Workflows to full commit SHAs in workflow and composite action files, adding version comments for readability. It can also update pinned versions, verify version comments, enforce minimum release age, and output SARIF for reviewdog-based reviews.", "when_to_avoid": ["you don't use GitHub Actions or reusable workflows", "you need a general-purpose YAML formatter or linter rather than action pinning", "you want automatic merging of action version updates rather than file edits"], "when_to_choose": ["you want to harden GitHub Actions workflows against supply-chain attacks by pinning actions to SHAs", "you need to keep pinned action versions up to date while enforcing a minimum release age", "you want CI validation that actions are pinned and version comments are correct", "you use GitHub Enterprise Server or need offline checking without the GitHub API"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/pinact", "repo": "suzuki-shunsuke/pinact", "role": "main", "score": 96}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-09-03T02:15:18.262949+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T06:26:08.900505+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fdd32ff525cee9dbaed0910352822b1fde7a6cdd7e747969628ead15914a8f79", "fetched_at": "2026-09-03T02:15:18.262949+00:00", "kind": "readme", "missing": false, "url": "https://github.com/suzuki-shunsuke/pinact"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-09-03T02:15:18.262949+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T06:26:08.900505+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fdd32ff525cee9dbaed0910352822b1fde7a6cdd7e747969628ead15914a8f79", "fetched_at": "2026-09-03T02:15:18.262949+00:00", "kind": "readme", "missing": false, "url": "https://github.com/suzuki-shunsuke/pinact"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T06:26:08.900505+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fdd32ff525cee9dbaed0910352822b1fde7a6cdd7e747969628ead15914a8f79", "fetched_at": "2026-09-03T02:15:18.262949+00:00", "kind": "readme", "missing": false, "url": "https://github.com/suzuki-shunsuke/pinact"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-09-03T02:15:18.262949+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-09-03T02:15:18.262949+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-09-03T02:15:18.262949+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T06:26:08.900505+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fdd32ff525cee9dbaed0910352822b1fde7a6cdd7e747969628ead15914a8f79", "fetched_at": "2026-09-03T02:15:18.262949+00:00", "kind": "readme", "missing": false, "url": "https://github.com/suzuki-shunsuke/pinact"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-09-03T02:15:18.262949+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-09-03T02:15:18.262949+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T06:26:08.900505+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fdd32ff525cee9dbaed0910352822b1fde7a6cdd7e747969628ead15914a8f79", "fetched_at": "2026-09-03T02:15:18.262949+00:00", "kind": "readme", "missing": false, "url": "https://github.com/suzuki-shunsuke/pinact"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-09-03T02:15:18.262949+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-09-03T02:15:18.262949+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-09-03T02:15:18.262949+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T06:26:08.900505+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fdd32ff525cee9dbaed0910352822b1fde7a6cdd7e747969628ead15914a8f79", "fetched_at": "2026-09-03T02:15:18.262949+00:00", "kind": "readme", "missing": false, "url": "https://github.com/suzuki-shunsuke/pinact"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-09-03T02:15:18.262949+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-09-03T02:15:18.262949+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T06:26:08.900505+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fdd32ff525cee9dbaed0910352822b1fde7a6cdd7e747969628ead15914a8f79", "fetched_at": "2026-09-03T02:15:18.262949+00:00", "kind": "readme", "missing": false, "url": "https://github.com/suzuki-shunsuke/pinact"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T06:26:08.900505+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fdd32ff525cee9dbaed0910352822b1fde7a6cdd7e747969628ead15914a8f79", "fetched_at": "2026-09-03T02:15:18.262949+00:00", "kind": "readme", "missing": false, "url": "https://github.com/suzuki-shunsuke/pinact"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T06:26:08.900505+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fdd32ff525cee9dbaed0910352822b1fde7a6cdd7e747969628ead15914a8f79", "fetched_at": "2026-09-03T02:15:18.262949+00:00", "kind": "readme", "missing": false, "url": "https://github.com/suzuki-shunsuke/pinact"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T06:26:08.900505+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fdd32ff525cee9dbaed0910352822b1fde7a6cdd7e747969628ead15914a8f79", "fetched_at": "2026-09-03T02:15:18.262949+00:00", "kind": "readme", "missing": false, "url": "https://github.com/suzuki-shunsuke/pinact"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 100, "longevity": 88, "rhythm": 95}, "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": 1238, "days_push": 0, "days_rel": 35, "gap_med": 2, "n_releases_24m": 52}, "score": 96, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 3, "stale_scrape": false}}