{"adoption": {"forks": 1950, "observed_at": "2026-08-28T04:11:34.964905+00:00", "stars": 23462}, "canonical_url": "https://ross.abutalabs.com/products/streisand", "card": {"archived": true, "artifact_type": "infra-config", "description": "Streisand sets up a new server running your choice of WireGuard, OpenConnect, OpenSSH, OpenVPN, Shadowsocks, sslh, Stunnel, or a Tor bridge. It also generates custom instructions for all of these services. At the end of the run you are given an HTML file with instructions that can be shared with friends, family members, and fellow activists.", "domain": ["security", "privacy", "censorship-circumvention", "self-hosted"], "enriched": true, "function": ["vpn", "security", "deployment", "configuration-management", "proxy"], "health_score": 10, "homepage": "https://twitter.com/streisandvpn", "language": "Shell", "license": "NOASSERTION", "license_family": "other", "maturity": "maintenance", "member_repos": ["StreisandEffect/streisand"], "name": "StreisandEffect/streisand", "platform": ["cloud", "self-hosted", "cli"], "pushed_at": "2021-05-04T09:42:40+00:00", "repo": "StreisandEffect/streisand", "stars": 23462, "tags": ["ansible", "wireguard", "openvpn", "shadowsocks", "tor-bridge", "openconnect", "stunnel", "anti-censorship", "vpn-server-setup", "devops", "linux"], "topics": ["vpn", "ansible", "openvpn", "wireguard", "openconnect", "anyconnect", "shadowsocks", "stunnel", "tor", "ssh", "streisand", "censorship"], "urls": [], "use_cases": ["set up a personal VPN server on a cloud provider", "deploy WireGuard and OpenVPN automatically with Ansible", "circumvent internet censorship in hostile networks", "create a Tor bridge with obfs4 pluggable transport", "generate shareable VPN setup instructions for friends and family"], "what_it_is": "Streisand is an Ansible-based automation tool that provisions a cloud server running multiple censorship-resistant VPN and proxy services such as WireGuard, OpenVPN, Shadowsocks, OpenConnect, SSH, and a Tor bridge. It generates a private HTML instruction site with client setup guides that can be shared with others.", "when_to_avoid": ["you need a maintained, actively updated tool - the last release was in 2021 and the project is archived", "you want a simple single-protocol VPN setup without Ansible complexity", "you have no Unix command-line or cloud provider experience"], "when_to_choose": ["you want a multi-protocol VPN server provisioned nearly automatically", "you need censorship and throttling resistance with options like Shadowsocks and Tor bridges", "you want ready-made client instructions to share with non-technical users"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/streisand", "repo": "StreisandEffect/streisand", "role": "main", "score": 10}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:11:34.964905+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T16:56:27.871248+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6cb497c2bd99ac0ce03a9c2f98d6fc05b0ad9aca4f4393df10e000b9ff77f39d", "fetched_at": "2026-08-28T04:11:34.964905+00:00", "kind": "readme", "missing": false, "url": "https://github.com/StreisandEffect/streisand"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:11:34.964905+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T16:56:27.871248+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6cb497c2bd99ac0ce03a9c2f98d6fc05b0ad9aca4f4393df10e000b9ff77f39d", "fetched_at": "2026-08-28T04:11:34.964905+00:00", "kind": "readme", "missing": false, "url": "https://github.com/StreisandEffect/streisand"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T16:56:27.871248+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6cb497c2bd99ac0ce03a9c2f98d6fc05b0ad9aca4f4393df10e000b9ff77f39d", "fetched_at": "2026-08-28T04:11:34.964905+00:00", "kind": "readme", "missing": false, "url": "https://github.com/StreisandEffect/streisand"}], "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:11:34.964905+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:11:34.964905+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:11:34.964905+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T16:56:27.871248+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6cb497c2bd99ac0ce03a9c2f98d6fc05b0ad9aca4f4393df10e000b9ff77f39d", "fetched_at": "2026-08-28T04:11:34.964905+00:00", "kind": "readme", "missing": false, "url": "https://github.com/StreisandEffect/streisand"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:11:34.964905+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:11:34.964905+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T16:56:27.871248+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6cb497c2bd99ac0ce03a9c2f98d6fc05b0ad9aca4f4393df10e000b9ff77f39d", "fetched_at": "2026-08-28T04:11:34.964905+00:00", "kind": "readme", "missing": false, "url": "https://github.com/StreisandEffect/streisand"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:11:34.964905+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:11:34.964905+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:11:34.964905+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T16:56:27.871248+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6cb497c2bd99ac0ce03a9c2f98d6fc05b0ad9aca4f4393df10e000b9ff77f39d", "fetched_at": "2026-08-28T04:11:34.964905+00:00", "kind": "readme", "missing": false, "url": "https://github.com/StreisandEffect/streisand"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:11:34.964905+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:11:34.964905+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T16:56:27.871248+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6cb497c2bd99ac0ce03a9c2f98d6fc05b0ad9aca4f4393df10e000b9ff77f39d", "fetched_at": "2026-08-28T04:11:34.964905+00:00", "kind": "readme", "missing": false, "url": "https://github.com/StreisandEffect/streisand"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T16:56:27.871248+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6cb497c2bd99ac0ce03a9c2f98d6fc05b0ad9aca4f4393df10e000b9ff77f39d", "fetched_at": "2026-08-28T04:11:34.964905+00:00", "kind": "readme", "missing": false, "url": "https://github.com/StreisandEffect/streisand"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T16:56:27.871248+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6cb497c2bd99ac0ce03a9c2f98d6fc05b0ad9aca4f4393df10e000b9ff77f39d", "fetched_at": "2026-08-28T04:11:34.964905+00:00", "kind": "readme", "missing": false, "url": "https://github.com/StreisandEffect/streisand"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T16:56:27.871248+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6cb497c2bd99ac0ce03a9c2f98d6fc05b0ad9aca4f4393df10e000b9ff77f39d", "fetched_at": "2026-08-28T04:11:34.964905+00:00", "kind": "readme", "missing": false, "url": "https://github.com/StreisandEffect/streisand"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases", "archived", "no_license"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 4546, "days_push": 1947, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 10, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}