{"adoption": {"forks": 147, "observed_at": "2026-08-28T04:04:48.242801+00:00", "stars": 1465}, "canonical_url": "https://ross.abutalabs.com/products/email-oauth2-proxy", "card": {"archived": false, "artifact_type": "service", "description": "An IMAP/POP/SMTP proxy that transparently adds OAuth 2.0 authentication for email clients that don't support this method. Keep legacy email clients working with Exchange Online, Gmail and other providers.", "domain": ["email", "privacy", "self-hosted", "developer-tools"], "enriched": true, "function": ["proxy", "auth", "email", "security"], "health_score": 93, "homepage": null, "language": "Python", "license": "Apache-2.0", "license_family": "permissive", "maturity": "active", "member_repos": ["simonrob/email-oauth2-proxy"], "name": "simonrob/email-oauth2-proxy", "platform": ["windows", "python", "cross-platform"], "pushed_at": "2026-07-03T14:01:49+00:00", "repo": "simonrob/email-oauth2-proxy", "stars": 1465, "tags": ["imap", "smtp", "pop3", "oauth2", "email-proxy", "legacy-clients", "office365", "gmail", "linux", "macos"], "topics": ["email", "proxy", "imap", "smtp", "oauth", "o365", "gmail", "oauth2", "pop", "pop3"], "urls": [], "use_cases": ["keep legacy email clients working with Office 365 after basic auth deprecation", "use Gmail via IMAP/POP/SMTP without app passwords", "add OAuth 2.0 support to email scripts that only do password login", "switch an existing email account to OAuth without re-adding it in the client", "connect old devices or apps to modern mail providers requiring OAuth"], "what_it_is": "A local IMAP/POP/SMTP proxy written in Python that transparently adds OAuth 2.0 authentication for email clients that don't support it. It intercepts legacy login commands and replaces them with SASL OAuth 2.0 credentials, keeping old clients, scripts, and devices working with providers like Exchange Online, Gmail, and Yahoo.", "when_to_avoid": ["your email client already supports OAuth 2.0 natively", "you need a server-side or multi-user hosted solution rather than a per-machine proxy", "you cannot run a local Python process alongside your mail client"], "when_to_choose": ["your email client, script, or device cannot do OAuth 2.0 but your provider requires it", "you want a local, transparent proxy rather than changing mail infrastructure", "you need cross-platform support with a menu bar helper or headless service"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/email-oauth2-proxy", "repo": "simonrob/email-oauth2-proxy", "role": "main", "score": 84}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:48.242801+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:35:07.055196+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e5e0a4693cd686c8c0216f84bfb0307a4703646b7bea6913b569c0101f28a650", "fetched_at": "2026-08-28T04:04:48.242801+00:00", "kind": "readme", "missing": false, "url": "https://github.com/simonrob/email-oauth2-proxy"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:48.242801+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:35:07.055196+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e5e0a4693cd686c8c0216f84bfb0307a4703646b7bea6913b569c0101f28a650", "fetched_at": "2026-08-28T04:04:48.242801+00:00", "kind": "readme", "missing": false, "url": "https://github.com/simonrob/email-oauth2-proxy"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:35:07.055196+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e5e0a4693cd686c8c0216f84bfb0307a4703646b7bea6913b569c0101f28a650", "fetched_at": "2026-08-28T04:04:48.242801+00:00", "kind": "readme", "missing": false, "url": "https://github.com/simonrob/email-oauth2-proxy"}], "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:04:48.242801+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:48.242801+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:48.242801+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:35:07.055196+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e5e0a4693cd686c8c0216f84bfb0307a4703646b7bea6913b569c0101f28a650", "fetched_at": "2026-08-28T04:04:48.242801+00:00", "kind": "readme", "missing": false, "url": "https://github.com/simonrob/email-oauth2-proxy"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:48.242801+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:48.242801+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:35:07.055196+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e5e0a4693cd686c8c0216f84bfb0307a4703646b7bea6913b569c0101f28a650", "fetched_at": "2026-08-28T04:04:48.242801+00:00", "kind": "readme", "missing": false, "url": "https://github.com/simonrob/email-oauth2-proxy"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:48.242801+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:48.242801+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:48.242801+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:35:07.055196+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e5e0a4693cd686c8c0216f84bfb0307a4703646b7bea6913b569c0101f28a650", "fetched_at": "2026-08-28T04:04:48.242801+00:00", "kind": "readme", "missing": false, "url": "https://github.com/simonrob/email-oauth2-proxy"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:48.242801+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:48.242801+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:35:07.055196+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e5e0a4693cd686c8c0216f84bfb0307a4703646b7bea6913b569c0101f28a650", "fetched_at": "2026-08-28T04:04:48.242801+00:00", "kind": "readme", "missing": false, "url": "https://github.com/simonrob/email-oauth2-proxy"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:35:07.055196+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e5e0a4693cd686c8c0216f84bfb0307a4703646b7bea6913b569c0101f28a650", "fetched_at": "2026-08-28T04:04:48.242801+00:00", "kind": "readme", "missing": false, "url": "https://github.com/simonrob/email-oauth2-proxy"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:35:07.055196+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e5e0a4693cd686c8c0216f84bfb0307a4703646b7bea6913b569c0101f28a650", "fetched_at": "2026-08-28T04:04:48.242801+00:00", "kind": "readme", "missing": false, "url": "https://github.com/simonrob/email-oauth2-proxy"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:35:07.055196+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e5e0a4693cd686c8c0216f84bfb0307a4703646b7bea6913b569c0101f28a650", "fetched_at": "2026-08-28T04:04:48.242801+00:00", "kind": "readme", "missing": false, "url": "https://github.com/simonrob/email-oauth2-proxy"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 90, "longevity": 100, "rhythm": 67}, "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": 2028, "days_push": 61, "days_rel": 61, "gap_med": 101.0, "n_releases_24m": 7}, "score": 84, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}