{"adoption": {"forks": 730, "observed_at": "2026-08-28T04:10:12.587663+00:00", "stars": 8084}, "canonical_url": "https://ross.abutalabs.com/products/lucky", "card": {"archived": false, "artifact_type": "application", "description": "软硬路由公网神器,ipv6/ipv4 端口转发,反向代理,DDNS,WOL,ipv4 stun内网穿透,cron,acme,rclone,ftp,webdav,filebrowser", "domain": ["networking", "self-hosted"], "enriched": true, "function": ["networking", "proxy", "http-server", "scheduling", "security", "file-system", "self-hosted"], "health_score": 78, "homepage": null, "language": "Go", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["gdy666/lucky"], "name": "gdy666/lucky", "platform": ["windows", "embedded", "cross-platform", "self-hosted"], "pushed_at": "2026-02-15T09:13:32+00:00", "repo": "gdy666/lucky", "stars": 8084, "tags": ["ddns", "port-forwarding", "reverse-proxy", "wake-on-lan", "stun", "nat-traversal", "acme", "ipv6", "openwrt", "webdav", "ftp-server", "filebrowser", "cron", "socat-replacement", "home-network", "automation", "linux", "docker"], "topics": ["ddns", "ipv6", "socat", "stun", "wol", "cron", "acme", "aliyunpan", "filebrowser", "ftp", "webdav", "volcengine", "dynadot", "vercel"], "urls": [], "use_cases": ["forward a public IPv6 port to an internal IPv4 service on my router", "run a DDNS client that supports Cloudflare, Aliyun, Tencent, and other DNS providers", "expose home services without a public IPv4 using STUN hole punching on NAT1 broadband", "wake or shut down my PC remotely over the network", "put a reverse proxy with basic auth and IP allowlist in front of self-hosted apps", "automatically obtain and renew SSL certificates via ACME", "serve my NAS files over WebDAV, FTP, and a web file browser", "run scheduled tasks on Windows or OpenWrt without relying on system cron"], "what_it_is": "Lucky (万吉) is a Go-based all-in-one networking utility for software/hardware routers and embedded Linux devices, bundling IPv6/IPv4 TCP/UDP port forwarding, reverse proxy, DDNS, STUN-based NAT traversal, Wake-on-LAN, scheduled tasks, ACME certificate automation, and network storage (WebDAV/FTP/FileBrowser) behind a single web admin UI. It was originally built to replace socat on routers and ships as a single lightweight binary with a Vue 3 backend plus an OpenToken API for third-party integrations.", "when_to_avoid": ["you require fully open-source software going forward - source is only published through v1.4.10 and later releases are closed-source binaries", "you need enterprise-grade L7 proxying, routing, or middleware extensibility comparable to Traefik, Caddy, or Nginx", "your network is not reachable via STUN traversal (STUN only works on suitable NAT types such as full-cone NAT1), or you need robust tunneling for arbitrary NATs", "you need auditable source for a security-sensitive internet-exposed component"], "when_to_choose": ["you run a home router, NAS, or embedded Linux device (especially with Chinese ISPs, CGNAT, or IPv6) and want one small binary covering port forwarding, DDNS, and STUN traversal", "you want a single web UI to replace a pile of separate router utilities like socat, ddns-go, and cron scripts", "you need low-resource, cross-platform deployment including OpenWrt IPK packages and Docker"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/lucky", "repo": "gdy666/lucky", "role": "main", "score": 75}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:10:12.587663+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T17:31:19.591255+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cedb295121275e0c7073beaa2b1387cae778a6724513097ba1b4c0faf524a64e", "fetched_at": "2026-08-28T04:10:12.587663+00:00", "kind": "readme", "missing": false, "url": "https://github.com/gdy666/lucky"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:10:12.587663+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T17:31:19.591255+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cedb295121275e0c7073beaa2b1387cae778a6724513097ba1b4c0faf524a64e", "fetched_at": "2026-08-28T04:10:12.587663+00:00", "kind": "readme", "missing": false, "url": "https://github.com/gdy666/lucky"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T17:31:19.591255+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cedb295121275e0c7073beaa2b1387cae778a6724513097ba1b4c0faf524a64e", "fetched_at": "2026-08-28T04:10:12.587663+00:00", "kind": "readme", "missing": false, "url": "https://github.com/gdy666/lucky"}], "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:10:12.587663+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:10:12.587663+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:10:12.587663+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T17:31:19.591255+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cedb295121275e0c7073beaa2b1387cae778a6724513097ba1b4c0faf524a64e", "fetched_at": "2026-08-28T04:10:12.587663+00:00", "kind": "readme", "missing": false, "url": "https://github.com/gdy666/lucky"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:10:12.587663+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:10:12.587663+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T17:31:19.591255+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cedb295121275e0c7073beaa2b1387cae778a6724513097ba1b4c0faf524a64e", "fetched_at": "2026-08-28T04:10:12.587663+00:00", "kind": "readme", "missing": false, "url": "https://github.com/gdy666/lucky"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:10:12.587663+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:10:12.587663+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:10:12.587663+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T17:31:19.591255+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cedb295121275e0c7073beaa2b1387cae778a6724513097ba1b4c0faf524a64e", "fetched_at": "2026-08-28T04:10:12.587663+00:00", "kind": "readme", "missing": false, "url": "https://github.com/gdy666/lucky"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:10:12.587663+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:10:12.587663+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T17:31:19.591255+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cedb295121275e0c7073beaa2b1387cae778a6724513097ba1b4c0faf524a64e", "fetched_at": "2026-08-28T04:10:12.587663+00:00", "kind": "readme", "missing": false, "url": "https://github.com/gdy666/lucky"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T17:31:19.591255+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cedb295121275e0c7073beaa2b1387cae778a6724513097ba1b4c0faf524a64e", "fetched_at": "2026-08-28T04:10:12.587663+00:00", "kind": "readme", "missing": false, "url": "https://github.com/gdy666/lucky"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T17:31:19.591255+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cedb295121275e0c7073beaa2b1387cae778a6724513097ba1b4c0faf524a64e", "fetched_at": "2026-08-28T04:10:12.587663+00:00", "kind": "readme", "missing": false, "url": "https://github.com/gdy666/lucky"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T17:31:19.591255+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cedb295121275e0c7073beaa2b1387cae778a6724513097ba1b4c0faf524a64e", "fetched_at": "2026-08-28T04:10:12.587663+00:00", "kind": "readme", "missing": false, "url": "https://github.com/gdy666/lucky"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 67, "longevity": 100, "rhythm": 71}, "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": 1512, "days_push": 199, "days_rel": 199, "gap_med": 25, "n_releases_24m": 16}, "score": 75, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}