{"adoption": {"forks": 28, "observed_at": "2026-09-03T02:15:00.527907+00:00", "stars": 1121}, "canonical_url": "https://ross.abutalabs.com/products/tailsnitch", "card": {"archived": false, "artifact_type": "cli-tool", "description": "A security auditor for Tailscale configurations. Scans your tailnet for misconfigurations, overly permissive access controls, and security best practice violations.", "domain": ["security", "networking", "developer-tools"], "enriched": true, "function": ["security", "vulnerability-scanning", "cli", "configuration-management"], "health_score": 98, "homepage": null, "language": "Go", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["Adversis/tailsnitch"], "name": "Adversis/tailsnitch", "platform": ["windows", "go", "cli"], "pushed_at": "2026-09-02T17:38:55+00:00", "repo": "Adversis/tailsnitch", "stars": 1121, "tags": ["tailscale", "tailnet", "security-audit", "misconfiguration-detection", "acl-analysis", "vpn-security", "command-line", "linux", "macos"], "topics": [], "urls": [], "use_cases": ["audit my tailscale tailnet for security misconfigurations", "find overly permissive ACL rules in tailscale", "detect stale devices and unused auth keys in tailnet", "check if tailnet lock is enabled", "export tailscale security audit results as json", "automatically fix tailscale security issues", "verify tailscale ssh rules are not too permissive"], "what_it_is": "Tailsnitch is a Go-based CLI security auditor for Tailscale configurations that scans a tailnet for 50+ misconfigurations, overly permissive access controls, and best-practice violations. It supports read-only audits and interactive remediation via the Tailscale API, with filtering by severity, category, and specific checks.", "when_to_avoid": ["you use a different VPN or mesh networking solution", "you need continuous runtime monitoring rather than point-in-time audits", "you cannot grant API/OAuth access to your tailnet"], "when_to_choose": ["you run a Tailscale tailnet and want automated security auditing", "you need actionable, categorized findings with severity levels", "you want interactive or automated remediation of common misconfigurations"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/tailsnitch", "repo": "Adversis/tailsnitch", "role": "main", "score": 74}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-09-03T02:15:00.527907+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T06:41:26.684631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e4aee515e393b366be37bbbe9befbffa0d3380407eecdf20773b031e00c3e415", "fetched_at": "2026-09-03T02:15:00.527907+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Adversis/tailsnitch"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-09-03T02:15:00.527907+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T06:41:26.684631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e4aee515e393b366be37bbbe9befbffa0d3380407eecdf20773b031e00c3e415", "fetched_at": "2026-09-03T02:15:00.527907+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Adversis/tailsnitch"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T06:41:26.684631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e4aee515e393b366be37bbbe9befbffa0d3380407eecdf20773b031e00c3e415", "fetched_at": "2026-09-03T02:15:00.527907+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Adversis/tailsnitch"}], "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:00.527907+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-09-03T02:15:00.527907+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-09-03T02:15:00.527907+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T06:41:26.684631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e4aee515e393b366be37bbbe9befbffa0d3380407eecdf20773b031e00c3e415", "fetched_at": "2026-09-03T02:15:00.527907+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Adversis/tailsnitch"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-09-03T02:15:00.527907+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-09-03T02:15:00.527907+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T06:41:26.684631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e4aee515e393b366be37bbbe9befbffa0d3380407eecdf20773b031e00c3e415", "fetched_at": "2026-09-03T02:15:00.527907+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Adversis/tailsnitch"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-09-03T02:15:00.527907+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-09-03T02:15:00.527907+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-09-03T02:15:00.527907+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T06:41:26.684631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e4aee515e393b366be37bbbe9befbffa0d3380407eecdf20773b031e00c3e415", "fetched_at": "2026-09-03T02:15:00.527907+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Adversis/tailsnitch"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-09-03T02:15:00.527907+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-09-03T02:15:00.527907+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T06:41:26.684631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e4aee515e393b366be37bbbe9befbffa0d3380407eecdf20773b031e00c3e415", "fetched_at": "2026-09-03T02:15:00.527907+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Adversis/tailsnitch"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T06:41:26.684631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e4aee515e393b366be37bbbe9befbffa0d3380407eecdf20773b031e00c3e415", "fetched_at": "2026-09-03T02:15:00.527907+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Adversis/tailsnitch"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T06:41:26.684631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e4aee515e393b366be37bbbe9befbffa0d3380407eecdf20773b031e00c3e415", "fetched_at": "2026-09-03T02:15:00.527907+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Adversis/tailsnitch"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T06:41:26.684631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e4aee515e393b366be37bbbe9befbffa0d3380407eecdf20773b031e00c3e415", "fetched_at": "2026-09-03T02:15:00.527907+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Adversis/tailsnitch"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 100, "longevity": 18, "rhythm": 74}, "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": 252, "days_push": 0, "days_rel": 172, "gap_med": 0.5, "n_releases_24m": 7}, "score": 74, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 3, "stale_scrape": false}}