{"adoption": {"forks": 87, "observed_at": "2026-08-28T04:06:23.613017+00:00", "stars": 2185}, "canonical_url": "https://ross.abutalabs.com/products/andydunstall-piko", "card": {"archived": false, "artifact_type": "service", "description": "An open-source alternative to Ngrok, designed to serve production traffic and be simple to host (particularly on Kubernetes)", "domain": ["networking", "backend", "self-hosted", "infrastructure-as-code"], "enriched": true, "function": ["proxy", "networking", "http-server", "routing", "self-hosted"], "health_score": 99, "homepage": null, "language": "Go", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["andydunstall/piko"], "name": "andydunstall/piko", "platform": ["windows", "go", "cli", "self-hosted"], "pushed_at": "2026-08-24T04:06:17+00:00", "repo": "andydunstall/piko", "stars": 2185, "tags": ["tunneling", "reverse-proxy", "ngrok-alternative", "tcp-proxy", "http-proxy", "kubernetes", "devops", "linux", "macos", "docker"], "topics": ["golang", "http", "reverse-proxy", "http-proxy", "tunneling"], "urls": [], "use_cases": ["expose a local development server to the internet", "self-host an ngrok alternative on Kubernetes", "connect to services inside a customer network without inbound ports", "build a bring-your-own-cloud (BYOC) service that reaches customer deployments", "tunnel TCP traffic to devices behind NAT", "load balance traffic across multiple upstream listeners on the same endpoint"], "what_it_is": "Piko is an open-source reverse proxy for tunneling traffic to services that are not publicly routable, serving as a self-hosted alternative to Ngrok. Upstream services open outbound-only connections to a Piko cluster, which forwards incoming HTTP(S) and TCP traffic over those tunnels with load balancing and fault tolerance.", "when_to_avoid": ["you only need a quick temporary tunnel for local testing and prefer a hosted service with zero setup", "you need features like built-in authentication portals, request inspection UI, or paid-tier capabilities offered by Ngrok", "you want a simple single-node reverse proxy with static routing rules rather than outbound tunnel connections"], "when_to_choose": ["you need production-grade tunneling with clustering, horizontal scaling, and zero-downtime deployments", "you want to self-host tunnels on Kubernetes behind an HTTP(S) load balancer", "your upstream services have no public route but can make outbound connections", "you need both HTTP and TCP tunneling with a Go SDK or CLI agent"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/andydunstall-piko", "repo": "andydunstall/piko", "role": "main", "score": 86}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:06:23.613017+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:48:10.968864+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "92379a7a873fec7821697a2b2e280791201e603ac541a5a44bc3a3d4022f02a6", "fetched_at": "2026-08-28T04:06:23.613017+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andydunstall/piko"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:06:23.613017+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:48:10.968864+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "92379a7a873fec7821697a2b2e280791201e603ac541a5a44bc3a3d4022f02a6", "fetched_at": "2026-08-28T04:06:23.613017+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andydunstall/piko"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:48:10.968864+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "92379a7a873fec7821697a2b2e280791201e603ac541a5a44bc3a3d4022f02a6", "fetched_at": "2026-08-28T04:06:23.613017+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andydunstall/piko"}], "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:06:23.613017+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:06:23.613017+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:06:23.613017+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:48:10.968864+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "92379a7a873fec7821697a2b2e280791201e603ac541a5a44bc3a3d4022f02a6", "fetched_at": "2026-08-28T04:06:23.613017+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andydunstall/piko"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:06:23.613017+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:06:23.613017+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:48:10.968864+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "92379a7a873fec7821697a2b2e280791201e603ac541a5a44bc3a3d4022f02a6", "fetched_at": "2026-08-28T04:06:23.613017+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andydunstall/piko"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:06:23.613017+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:06:23.613017+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:06:23.613017+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:48:10.968864+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "92379a7a873fec7821697a2b2e280791201e603ac541a5a44bc3a3d4022f02a6", "fetched_at": "2026-08-28T04:06:23.613017+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andydunstall/piko"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:06:23.613017+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:06:23.613017+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:48:10.968864+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "92379a7a873fec7821697a2b2e280791201e603ac541a5a44bc3a3d4022f02a6", "fetched_at": "2026-08-28T04:06:23.613017+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andydunstall/piko"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:48:10.968864+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "92379a7a873fec7821697a2b2e280791201e603ac541a5a44bc3a3d4022f02a6", "fetched_at": "2026-08-28T04:06:23.613017+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andydunstall/piko"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:48:10.968864+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "92379a7a873fec7821697a2b2e280791201e603ac541a5a44bc3a3d4022f02a6", "fetched_at": "2026-08-28T04:06:23.613017+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andydunstall/piko"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:48:10.968864+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "92379a7a873fec7821697a2b2e280791201e603ac541a5a44bc3a3d4022f02a6", "fetched_at": "2026-08-28T04:06:23.613017+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andydunstall/piko"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 64, "rhythm": 83}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 897, "days_push": 9, "days_rel": 117, "gap_med": 27, "n_releases_24m": 10}, "score": 86, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}