{"adoption": {"forks": 244, "observed_at": "2026-08-28T04:08:23.994496+00:00", "stars": 3842}, "canonical_url": "https://ross.abutalabs.com/products/letter_opener", "card": {"archived": false, "artifact_type": "library", "description": "Preview mail in the browser instead of sending.", "domain": ["web-development", "developer-tools", "email"], "enriched": true, "function": ["email", "developer-tools", "testing"], "health_score": 67, "homepage": null, "language": "Ruby", "license": "MIT", "license_family": "permissive", "maturity": "stable", "member_repos": ["ryanb/letter_opener"], "name": "ryanb/letter_opener", "platform": ["ruby", "cross-platform"], "pushed_at": "2026-04-25T13:24:46+00:00", "repo": "ryanb/letter_opener", "stars": 3842, "tags": ["rails", "action-mailer", "email-preview", "development-environment", "mail-gem"], "topics": [], "urls": [], "use_cases": ["preview emails in browser during rails development", "avoid accidentally sending test emails to real users", "test actionmailer emails without an smtp server", "inspect email content and metadata locally", "set up mail delivery for a non-rails ruby app"], "what_it_is": "A Ruby gem that intercepts outgoing email in development and previews it in the browser instead of sending it. It integrates with Rails ActionMailer, the Mail gem, and Pony as a custom delivery method.", "when_to_avoid": ["your app runs on a remote staging server or VM with no local browser", "you need to test actual SMTP delivery behavior", "you need shared team access to sent test emails"], "when_to_choose": ["you develop Rails or Ruby apps and need safe local email previews", "you want zero-config email testing without external services", "you run your app locally and can open a browser"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/letter_opener", "repo": "ryanb/letter_opener", "role": "main", "score": 68}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:08:23.994496+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T18:26:13.399228+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "169c3f5a1823e29756a1c046c3c333ac3f05d1fcd047c0c200a510e4f9398882", "fetched_at": "2026-08-28T04:08:23.994496+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ryanb/letter_opener"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:08:23.994496+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T18:26:13.399228+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "169c3f5a1823e29756a1c046c3c333ac3f05d1fcd047c0c200a510e4f9398882", "fetched_at": "2026-08-28T04:08:23.994496+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ryanb/letter_opener"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T18:26:13.399228+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "169c3f5a1823e29756a1c046c3c333ac3f05d1fcd047c0c200a510e4f9398882", "fetched_at": "2026-08-28T04:08:23.994496+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ryanb/letter_opener"}], "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:08:23.994496+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:08:23.994496+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:08:23.994496+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T18:26:13.399228+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "169c3f5a1823e29756a1c046c3c333ac3f05d1fcd047c0c200a510e4f9398882", "fetched_at": "2026-08-28T04:08:23.994496+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ryanb/letter_opener"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:08:23.994496+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:08:23.994496+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T18:26:13.399228+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "169c3f5a1823e29756a1c046c3c333ac3f05d1fcd047c0c200a510e4f9398882", "fetched_at": "2026-08-28T04:08:23.994496+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ryanb/letter_opener"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:08:23.994496+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:08:23.994496+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:08:23.994496+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T18:26:13.399228+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "169c3f5a1823e29756a1c046c3c333ac3f05d1fcd047c0c200a510e4f9398882", "fetched_at": "2026-08-28T04:08:23.994496+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ryanb/letter_opener"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:08:23.994496+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:08:23.994496+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T18:26:13.399228+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "169c3f5a1823e29756a1c046c3c333ac3f05d1fcd047c0c200a510e4f9398882", "fetched_at": "2026-08-28T04:08:23.994496+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ryanb/letter_opener"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T18:26:13.399228+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "169c3f5a1823e29756a1c046c3c333ac3f05d1fcd047c0c200a510e4f9398882", "fetched_at": "2026-08-28T04:08:23.994496+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ryanb/letter_opener"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T18:26:13.399228+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "169c3f5a1823e29756a1c046c3c333ac3f05d1fcd047c0c200a510e4f9398882", "fetched_at": "2026-08-28T04:08:23.994496+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ryanb/letter_opener"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T18:26:13.399228+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "169c3f5a1823e29756a1c046c3c333ac3f05d1fcd047c0c200a510e4f9398882", "fetched_at": "2026-08-28T04:08:23.994496+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ryanb/letter_opener"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 79, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 5474, "days_push": 130, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 68, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}