{"adoption": {"forks": 113, "observed_at": "2026-08-28T04:07:41.674075+00:00", "stars": 3073}, "canonical_url": "https://ross.abutalabs.com/products/containerssh", "card": {"archived": false, "artifact_type": "service", "description": "ContainerSSH: Launch containers on demand", "domain": ["security", "self-hosted", "developer-tools"], "enriched": true, "function": ["ssh", "auth", "authorization", "logging", "security", "container-runtime", "webhook"], "health_score": 97, "homepage": "https://containerssh.io/", "language": "Go", "license": "Apache-2.0", "license_family": "permissive", "maturity": "active", "member_repos": ["ContainerSSH/ContainerSSH"], "name": "ContainerSSH/ContainerSSH", "platform": ["go", "self-hosted", "cloud"], "pushed_at": "2026-08-21T18:53:01+00:00", "repo": "ContainerSSH/ContainerSSH", "stars": 3073, "tags": ["ssh-server", "ephemeral-containers", "honeypot", "audit-logging", "kubernetes", "docker", "devsecops", "on-demand-environments", "containers", "devops", "linux"], "topics": ["docker", "ssh", "containers", "kubernetes", "security-tools", "devsecops", "security"], "urls": [], "use_cases": ["give developers ephemeral SSH environments in containers", "build disposable lab environments for students or vendors", "run an SSH honeypot to capture attacker behavior", "provide audited production debugging access with logged changes", "authenticate SSH users via a custom webhook server", "automatically clean up containers when users disconnect"], "what_it_is": "ContainerSSH is an SSH server written in Go that launches on-demand containers in Docker or Kubernetes for each connecting user. It supports webhook-based authentication and authorization, audit logging with S3 upload, and automatic cleanup of ephemeral environments on disconnect.", "when_to_avoid": ["you just need a plain traditional SSH server on a host", "you don't run Docker or Kubernetes", "you need long-lived persistent shell sessions with persistent state", "you need a simple bastion jump host without container orchestration"], "when_to_choose": ["you need per-user, on-demand containerized SSH environments", "you want webhook-driven authentication and authorization for SSH", "you need full session audit logging for compliance or honeypots", "you want ephemeral environments with automatic cleanup on logout"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/containerssh", "repo": "ContainerSSH/ContainerSSH", "role": "main", "score": 80}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.674075+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T07:27:56.542487+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1ea41fa7494072c6a141d1989453e18277315233b2b3e172af68bf60a94abe04", "fetched_at": "2026-08-28T04:07:41.674075+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ContainerSSH/ContainerSSH"}, {"content_hash": "76295ca24317b5c3ae6f2694f0d6005c9fcc8d0beeef92633e92fa416143021e", "fetched_at": "2026-08-29T09:43:11.512245+00:00", "kind": "homepage", "missing": false, "url": "https://containerssh.io/"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.674075+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T07:27:56.542487+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1ea41fa7494072c6a141d1989453e18277315233b2b3e172af68bf60a94abe04", "fetched_at": "2026-08-28T04:07:41.674075+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ContainerSSH/ContainerSSH"}, {"content_hash": "76295ca24317b5c3ae6f2694f0d6005c9fcc8d0beeef92633e92fa416143021e", "fetched_at": "2026-08-29T09:43:11.512245+00:00", "kind": "homepage", "missing": false, "url": "https://containerssh.io/"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T07:27:56.542487+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1ea41fa7494072c6a141d1989453e18277315233b2b3e172af68bf60a94abe04", "fetched_at": "2026-08-28T04:07:41.674075+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ContainerSSH/ContainerSSH"}, {"content_hash": "76295ca24317b5c3ae6f2694f0d6005c9fcc8d0beeef92633e92fa416143021e", "fetched_at": "2026-08-29T09:43:11.512245+00:00", "kind": "homepage", "missing": false, "url": "https://containerssh.io/"}], "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:07:41.674075+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.674075+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.674075+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T07:27:56.542487+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1ea41fa7494072c6a141d1989453e18277315233b2b3e172af68bf60a94abe04", "fetched_at": "2026-08-28T04:07:41.674075+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ContainerSSH/ContainerSSH"}, {"content_hash": "76295ca24317b5c3ae6f2694f0d6005c9fcc8d0beeef92633e92fa416143021e", "fetched_at": "2026-08-29T09:43:11.512245+00:00", "kind": "homepage", "missing": false, "url": "https://containerssh.io/"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.674075+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.674075+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T07:27:56.542487+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1ea41fa7494072c6a141d1989453e18277315233b2b3e172af68bf60a94abe04", "fetched_at": "2026-08-28T04:07:41.674075+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ContainerSSH/ContainerSSH"}, {"content_hash": "76295ca24317b5c3ae6f2694f0d6005c9fcc8d0beeef92633e92fa416143021e", "fetched_at": "2026-08-29T09:43:11.512245+00:00", "kind": "homepage", "missing": false, "url": "https://containerssh.io/"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.674075+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.674075+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.674075+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T07:27:56.542487+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1ea41fa7494072c6a141d1989453e18277315233b2b3e172af68bf60a94abe04", "fetched_at": "2026-08-28T04:07:41.674075+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ContainerSSH/ContainerSSH"}, {"content_hash": "76295ca24317b5c3ae6f2694f0d6005c9fcc8d0beeef92633e92fa416143021e", "fetched_at": "2026-08-29T09:43:11.512245+00:00", "kind": "homepage", "missing": false, "url": "https://containerssh.io/"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.674075+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.674075+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T07:27:56.542487+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1ea41fa7494072c6a141d1989453e18277315233b2b3e172af68bf60a94abe04", "fetched_at": "2026-08-28T04:07:41.674075+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ContainerSSH/ContainerSSH"}, {"content_hash": "76295ca24317b5c3ae6f2694f0d6005c9fcc8d0beeef92633e92fa416143021e", "fetched_at": "2026-08-29T09:43:11.512245+00:00", "kind": "homepage", "missing": false, "url": "https://containerssh.io/"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T07:27:56.542487+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1ea41fa7494072c6a141d1989453e18277315233b2b3e172af68bf60a94abe04", "fetched_at": "2026-08-28T04:07:41.674075+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ContainerSSH/ContainerSSH"}, {"content_hash": "76295ca24317b5c3ae6f2694f0d6005c9fcc8d0beeef92633e92fa416143021e", "fetched_at": "2026-08-29T09:43:11.512245+00:00", "kind": "homepage", "missing": false, "url": "https://containerssh.io/"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T07:27:56.542487+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1ea41fa7494072c6a141d1989453e18277315233b2b3e172af68bf60a94abe04", "fetched_at": "2026-08-28T04:07:41.674075+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ContainerSSH/ContainerSSH"}, {"content_hash": "76295ca24317b5c3ae6f2694f0d6005c9fcc8d0beeef92633e92fa416143021e", "fetched_at": "2026-08-29T09:43:11.512245+00:00", "kind": "homepage", "missing": false, "url": "https://containerssh.io/"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T07:27:56.542487+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1ea41fa7494072c6a141d1989453e18277315233b2b3e172af68bf60a94abe04", "fetched_at": "2026-08-28T04:07:41.674075+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ContainerSSH/ContainerSSH"}, {"content_hash": "76295ca24317b5c3ae6f2694f0d6005c9fcc8d0beeef92633e92fa416143021e", "fetched_at": "2026-08-29T09:43:11.512245+00:00", "kind": "homepage", "missing": false, "url": "https://containerssh.io/"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 98, "longevity": 100, "rhythm": 44}, "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": 2282, "days_push": 12, "days_rel": 163, "gap_med": 427, "n_releases_24m": 2}, "score": 80, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}