{"adoption": {"forks": 154, "observed_at": "2026-08-28T04:07:56.635040+00:00", "stars": 3331}, "canonical_url": "https://ross.abutalabs.com/products/wisper", "card": {"archived": false, "artifact_type": "library", "description": "A micro library providing Ruby objects with Publish-Subscribe capabilities", "domain": ["backend", "web-development", "developer-tools"], "enriched": true, "function": ["middleware", "message-queue", "developer-tools"], "health_score": 20, "homepage": null, "language": "Ruby", "license": null, "license_family": "other", "maturity": "stable", "member_repos": ["krisleech/wisper"], "name": "krisleech/wisper", "platform": ["ruby"], "pushed_at": "2024-08-15T15:29:18+00:00", "repo": "krisleech/wisper", "stars": 3331, "tags": ["publish-subscribe", "event-bus", "decoupling", "hexagonal-architecture", "activerecord-callbacks-alternative"], "topics": ["ruby", "events", "publish-subscribe", "pubsub"], "urls": [], "use_cases": ["decouple business logic from external concerns in Ruby applications", "replace ActiveRecord callbacks and observers in Rails apps", "broadcast domain events from service objects", "subscribe listeners to object events at runtime", "publish events asynchronously in Ruby", "build hexagonal architecture in Ruby"], "what_it_is": "Wisper is a micro library that adds Publish-Subscribe (pub/sub) capabilities to plain Ruby objects. Objects including the Wisper::Publisher module can broadcast events to subscribed listeners, synchronously or asynchronously, without depending on Rails.", "when_to_avoid": ["you need durable, cross-process event delivery or a real message queue", "you are starting a greenfield app and prefer its successor libraries like WisperNext or Ma", "you need event sourcing with persistence and replay"], "when_to_choose": ["you want lightweight pub/sub in Ruby without a message broker dependency", "you need to decouple service objects from side effects like notifications", "you want an alternative to ActiveRecord callbacks and observers", "you need runtime, context-based subscription of listeners"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/wisper", "repo": "krisleech/wisper", "role": "main", "score": 32}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.635040+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T18:41:42.698463+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6bee13f203c3c1cc1d6159ad00f7bbc785fd0d42103bd7cfd19515a3b55734c1", "fetched_at": "2026-08-28T04:07:56.635040+00:00", "kind": "readme", "missing": false, "url": "https://github.com/krisleech/wisper"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.635040+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T18:41:42.698463+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6bee13f203c3c1cc1d6159ad00f7bbc785fd0d42103bd7cfd19515a3b55734c1", "fetched_at": "2026-08-28T04:07:56.635040+00:00", "kind": "readme", "missing": false, "url": "https://github.com/krisleech/wisper"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T18:41:42.698463+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6bee13f203c3c1cc1d6159ad00f7bbc785fd0d42103bd7cfd19515a3b55734c1", "fetched_at": "2026-08-28T04:07:56.635040+00:00", "kind": "readme", "missing": false, "url": "https://github.com/krisleech/wisper"}], "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:56.635040+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.635040+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.635040+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T18:41:42.698463+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6bee13f203c3c1cc1d6159ad00f7bbc785fd0d42103bd7cfd19515a3b55734c1", "fetched_at": "2026-08-28T04:07:56.635040+00:00", "kind": "readme", "missing": false, "url": "https://github.com/krisleech/wisper"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.635040+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.635040+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T18:41:42.698463+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6bee13f203c3c1cc1d6159ad00f7bbc785fd0d42103bd7cfd19515a3b55734c1", "fetched_at": "2026-08-28T04:07:56.635040+00:00", "kind": "readme", "missing": false, "url": "https://github.com/krisleech/wisper"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.635040+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.635040+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.635040+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T18:41:42.698463+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6bee13f203c3c1cc1d6159ad00f7bbc785fd0d42103bd7cfd19515a3b55734c1", "fetched_at": "2026-08-28T04:07:56.635040+00:00", "kind": "readme", "missing": false, "url": "https://github.com/krisleech/wisper"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.635040+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.635040+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T18:41:42.698463+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6bee13f203c3c1cc1d6159ad00f7bbc785fd0d42103bd7cfd19515a3b55734c1", "fetched_at": "2026-08-28T04:07:56.635040+00:00", "kind": "readme", "missing": false, "url": "https://github.com/krisleech/wisper"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T18:41:42.698463+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6bee13f203c3c1cc1d6159ad00f7bbc785fd0d42103bd7cfd19515a3b55734c1", "fetched_at": "2026-08-28T04:07:56.635040+00:00", "kind": "readme", "missing": false, "url": "https://github.com/krisleech/wisper"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T18:41:42.698463+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6bee13f203c3c1cc1d6159ad00f7bbc785fd0d42103bd7cfd19515a3b55734c1", "fetched_at": "2026-08-28T04:07:56.635040+00:00", "kind": "readme", "missing": false, "url": "https://github.com/krisleech/wisper"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T18:41:42.698463+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6bee13f203c3c1cc1d6159ad00f7bbc785fd0d42103bd7cfd19515a3b55734c1", "fetched_at": "2026-08-28T04:07:56.635040+00:00", "kind": "readme", "missing": false, "url": "https://github.com/krisleech/wisper"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases", "no_license"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 4905, "days_push": 748, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 32, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}