{"adoption": {"forks": 78, "observed_at": "2026-08-28T04:05:22.417026+00:00", "stars": 1690}, "canonical_url": "https://ross.abutalabs.com/products/tsdproxy", "card": {"archived": false, "artifact_type": "service", "description": "Automatic Tailscale reverse proxy for Docker containers. Zero sidecars. Label-based config. Automatic HTTPS.", "domain": ["networking", "self-hosted", "security"], "enriched": true, "function": ["proxy", "networking", "deployment", "self-hosted"], "health_score": 98, "homepage": "https://almeidapaulopt.github.io/tsdproxy/", "language": "Go", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["almeidapaulopt/tsdproxy"], "name": "almeidapaulopt/tsdproxy", "platform": ["go", "self-hosted"], "pushed_at": "2026-08-19T04:04:38+00:00", "repo": "almeidapaulopt/tsdproxy", "stars": 1690, "tags": ["tailscale", "reverse-proxy", "wireguard", "docker-labels", "automatic-https", "homelab", "tsnet", "traefik-alternative", "funnel", "tcp-proxy", "containers", "devops", "docker", "linux"], "topics": ["docker", "go", "self-hosted", "tailscale", "proxy", "vpn", "containers", "docker-compose", "homelab", "https", "networking", "reverse-proxy", "tsnet", "wireguard", "automatic", "sidecar", "ssl", "traefik-alternative"], "urls": [], "use_cases": ["expose docker containers on tailscale network", "automatic https reverse proxy for homelab services", "replace traefik with simpler tailscale proxy", "proxy tcp and udp services like ssh or databases over tailscale", "publish a service publicly with tailscale funnel", "expose multiple ports of a container with one label", "manage self-hosted apps behind headscale control server"], "what_it_is": "TSDProxy is a self-hosted service that automatically exposes Docker containers on a Tailscale network via a single reverse proxy. Containers are configured with Docker labels, require no per-service sidecars, and get automatic HTTPS certificates from Tailscale.", "when_to_avoid": ["you need a general-purpose reverse proxy for public traffic without Tailscale", "your containers are not on Docker or a supported provider", "you require advanced routing features like path-based routing or middleware chains typical of Traefik or nginx"], "when_to_choose": ["you run docker containers and want them reachable on your tailnet with zero per-container sidecars", "you want label-based configuration and automatic HTTPS without managing certificates", "you need TCP/UDP proxying alongside HTTP services", "you use Tailscale or Headscale in a homelab or self-hosted setup"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/tsdproxy", "repo": "almeidapaulopt/tsdproxy", "role": "main", "score": 85}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.417026+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:38:21.286720+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d744e6d2483fbbc5458d04b9e79c51be58c5794fdcb981953edca297aebc1402", "fetched_at": "2026-08-28T04:05:22.417026+00:00", "kind": "readme", "missing": false, "url": "https://github.com/almeidapaulopt/tsdproxy"}, {"content_hash": "ee5f276ad233ac14df50845f4811b63cb1ab8654b8eed3c68804a6e0bb298906", "fetched_at": "2026-08-29T11:13:17.860705+00:00", "kind": "homepage", "missing": false, "url": "https://almeidapaulopt.github.io/tsdproxy/"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.417026+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:38:21.286720+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d744e6d2483fbbc5458d04b9e79c51be58c5794fdcb981953edca297aebc1402", "fetched_at": "2026-08-28T04:05:22.417026+00:00", "kind": "readme", "missing": false, "url": "https://github.com/almeidapaulopt/tsdproxy"}, {"content_hash": "ee5f276ad233ac14df50845f4811b63cb1ab8654b8eed3c68804a6e0bb298906", "fetched_at": "2026-08-29T11:13:17.860705+00:00", "kind": "homepage", "missing": false, "url": "https://almeidapaulopt.github.io/tsdproxy/"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:38:21.286720+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d744e6d2483fbbc5458d04b9e79c51be58c5794fdcb981953edca297aebc1402", "fetched_at": "2026-08-28T04:05:22.417026+00:00", "kind": "readme", "missing": false, "url": "https://github.com/almeidapaulopt/tsdproxy"}, {"content_hash": "ee5f276ad233ac14df50845f4811b63cb1ab8654b8eed3c68804a6e0bb298906", "fetched_at": "2026-08-29T11:13:17.860705+00:00", "kind": "homepage", "missing": false, "url": "https://almeidapaulopt.github.io/tsdproxy/"}], "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:22.417026+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.417026+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.417026+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:38:21.286720+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d744e6d2483fbbc5458d04b9e79c51be58c5794fdcb981953edca297aebc1402", "fetched_at": "2026-08-28T04:05:22.417026+00:00", "kind": "readme", "missing": false, "url": "https://github.com/almeidapaulopt/tsdproxy"}, {"content_hash": "ee5f276ad233ac14df50845f4811b63cb1ab8654b8eed3c68804a6e0bb298906", "fetched_at": "2026-08-29T11:13:17.860705+00:00", "kind": "homepage", "missing": false, "url": "https://almeidapaulopt.github.io/tsdproxy/"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.417026+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.417026+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:38:21.286720+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d744e6d2483fbbc5458d04b9e79c51be58c5794fdcb981953edca297aebc1402", "fetched_at": "2026-08-28T04:05:22.417026+00:00", "kind": "readme", "missing": false, "url": "https://github.com/almeidapaulopt/tsdproxy"}, {"content_hash": "ee5f276ad233ac14df50845f4811b63cb1ab8654b8eed3c68804a6e0bb298906", "fetched_at": "2026-08-29T11:13:17.860705+00:00", "kind": "homepage", "missing": false, "url": "https://almeidapaulopt.github.io/tsdproxy/"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.417026+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.417026+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.417026+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:38:21.286720+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d744e6d2483fbbc5458d04b9e79c51be58c5794fdcb981953edca297aebc1402", "fetched_at": "2026-08-28T04:05:22.417026+00:00", "kind": "readme", "missing": false, "url": "https://github.com/almeidapaulopt/tsdproxy"}, {"content_hash": "ee5f276ad233ac14df50845f4811b63cb1ab8654b8eed3c68804a6e0bb298906", "fetched_at": "2026-08-29T11:13:17.860705+00:00", "kind": "homepage", "missing": false, "url": "https://almeidapaulopt.github.io/tsdproxy/"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.417026+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.417026+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:38:21.286720+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d744e6d2483fbbc5458d04b9e79c51be58c5794fdcb981953edca297aebc1402", "fetched_at": "2026-08-28T04:05:22.417026+00:00", "kind": "readme", "missing": false, "url": "https://github.com/almeidapaulopt/tsdproxy"}, {"content_hash": "ee5f276ad233ac14df50845f4811b63cb1ab8654b8eed3c68804a6e0bb298906", "fetched_at": "2026-08-29T11:13:17.860705+00:00", "kind": "homepage", "missing": false, "url": "https://almeidapaulopt.github.io/tsdproxy/"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:38:21.286720+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d744e6d2483fbbc5458d04b9e79c51be58c5794fdcb981953edca297aebc1402", "fetched_at": "2026-08-28T04:05:22.417026+00:00", "kind": "readme", "missing": false, "url": "https://github.com/almeidapaulopt/tsdproxy"}, {"content_hash": "ee5f276ad233ac14df50845f4811b63cb1ab8654b8eed3c68804a6e0bb298906", "fetched_at": "2026-08-29T11:13:17.860705+00:00", "kind": "homepage", "missing": false, "url": "https://almeidapaulopt.github.io/tsdproxy/"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:38:21.286720+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d744e6d2483fbbc5458d04b9e79c51be58c5794fdcb981953edca297aebc1402", "fetched_at": "2026-08-28T04:05:22.417026+00:00", "kind": "readme", "missing": false, "url": "https://github.com/almeidapaulopt/tsdproxy"}, {"content_hash": "ee5f276ad233ac14df50845f4811b63cb1ab8654b8eed3c68804a6e0bb298906", "fetched_at": "2026-08-29T11:13:17.860705+00:00", "kind": "homepage", "missing": false, "url": "https://almeidapaulopt.github.io/tsdproxy/"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:38:21.286720+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d744e6d2483fbbc5458d04b9e79c51be58c5794fdcb981953edca297aebc1402", "fetched_at": "2026-08-28T04:05:22.417026+00:00", "kind": "readme", "missing": false, "url": "https://github.com/almeidapaulopt/tsdproxy"}, {"content_hash": "ee5f276ad233ac14df50845f4811b63cb1ab8654b8eed3c68804a6e0bb298906", "fetched_at": "2026-08-29T11:13:17.860705+00:00", "kind": "homepage", "missing": false, "url": "https://almeidapaulopt.github.io/tsdproxy/"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 98, "longevity": 49, "rhythm": 90}, "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": 695, "days_push": 14, "days_rel": 68, "gap_med": 2.0, "n_releases_24m": 41}, "score": 85, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}