{"adoption": {"forks": 91, "observed_at": "2026-08-28T04:03:58.796793+00:00", "stars": 1204}, "canonical_url": "https://ross.abutalabs.com/products/zxcvbn-ts-zxcvbn", "card": {"archived": false, "artifact_type": "library", "description": "Low-Budget Password Strength Estimation", "domain": ["security", "web-development", "frontend", "developer-tools"], "enriched": true, "function": ["security", "developer-tools", "internationalization"], "health_score": 78, "homepage": "https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/wheeler", "language": "TypeScript", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["zxcvbn-ts/zxcvbn"], "name": "zxcvbn-ts/zxcvbn", "platform": ["browser", "cross-platform"], "pushed_at": "2026-08-12T15:55:17+00:00", "repo": "zxcvbn-ts/zxcvbn", "stars": 1204, "tags": ["password-strength", "zxcvbn", "password-estimation", "form-validation", "typescript", "nodejs"], "topics": ["hacktoberfest", "password", "password-strength"], "urls": [], "use_cases": ["estimate password strength in a signup form", "replace LUDS password complexity rules with a smarter score", "give users instant feedback on weak passwords", "check passwords against common leaked password patterns", "add localized password feedback in multiple languages", "add custom dictionary matchers for password checking"], "what_it_is": "A TypeScript rewrite of Dropbox's zxcvbn password strength estimator that scores passwords based on pattern matching against common passwords, dictionary words, keyboard patterns, and other weak patterns. It provides strength scores, verbal feedback, i18n support, and extensible custom matchers.", "when_to_avoid": ["you need server-side password strength checking in a non-JS backend", "you need actual password cracking or entropy auditing rather than estimation", "you cannot ship the dictionary packages due to bundle size constraints"], "when_to_choose": ["you need client-side password strength estimation in a JavaScript/TypeScript app", "you want an algorithmic alternative to rigid password composition policies", "you need i18n support for password feedback and dictionaries", "you want to extend matching with custom dictionaries or API-based matchers"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/zxcvbn-ts-zxcvbn", "repo": "zxcvbn-ts/zxcvbn", "role": "main", "score": 76}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:58.796793+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T06:19:41.604451+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4d89aeb1196876534557db76d484e4e81c6d8dc6f6c376b2b210e0c5dcd40f5c", "fetched_at": "2026-08-28T04:03:58.796793+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zxcvbn-ts/zxcvbn"}, {"content_hash": "6c9afd83b8077f4f3a99971f6e74b7b81ed29d01cb2c9bdb0c7e9ec0bbc0566b", "fetched_at": "2026-08-29T12:27:39.649384+00:00", "kind": "homepage", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/wheeler"}, {"content_hash": "916468c9b12015551fdbb81426da3373a97f8969a45f3a96f82829198b60a2dd", "fetched_at": "2026-08-29T12:27:39.658387+00:00", "kind": "site_page", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/symposium-organizers"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:58.796793+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T06:19:41.604451+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4d89aeb1196876534557db76d484e4e81c6d8dc6f6c376b2b210e0c5dcd40f5c", "fetched_at": "2026-08-28T04:03:58.796793+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zxcvbn-ts/zxcvbn"}, {"content_hash": "6c9afd83b8077f4f3a99971f6e74b7b81ed29d01cb2c9bdb0c7e9ec0bbc0566b", "fetched_at": "2026-08-29T12:27:39.649384+00:00", "kind": "homepage", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/wheeler"}, {"content_hash": "916468c9b12015551fdbb81426da3373a97f8969a45f3a96f82829198b60a2dd", "fetched_at": "2026-08-29T12:27:39.658387+00:00", "kind": "site_page", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/symposium-organizers"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T06:19:41.604451+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4d89aeb1196876534557db76d484e4e81c6d8dc6f6c376b2b210e0c5dcd40f5c", "fetched_at": "2026-08-28T04:03:58.796793+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zxcvbn-ts/zxcvbn"}, {"content_hash": "6c9afd83b8077f4f3a99971f6e74b7b81ed29d01cb2c9bdb0c7e9ec0bbc0566b", "fetched_at": "2026-08-29T12:27:39.649384+00:00", "kind": "homepage", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/wheeler"}, {"content_hash": "916468c9b12015551fdbb81426da3373a97f8969a45f3a96f82829198b60a2dd", "fetched_at": "2026-08-29T12:27:39.658387+00:00", "kind": "site_page", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/symposium-organizers"}], "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:03:58.796793+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:58.796793+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:58.796793+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T06:19:41.604451+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4d89aeb1196876534557db76d484e4e81c6d8dc6f6c376b2b210e0c5dcd40f5c", "fetched_at": "2026-08-28T04:03:58.796793+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zxcvbn-ts/zxcvbn"}, {"content_hash": "6c9afd83b8077f4f3a99971f6e74b7b81ed29d01cb2c9bdb0c7e9ec0bbc0566b", "fetched_at": "2026-08-29T12:27:39.649384+00:00", "kind": "homepage", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/wheeler"}, {"content_hash": "916468c9b12015551fdbb81426da3373a97f8969a45f3a96f82829198b60a2dd", "fetched_at": "2026-08-29T12:27:39.658387+00:00", "kind": "site_page", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/symposium-organizers"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:58.796793+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:58.796793+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T06:19:41.604451+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4d89aeb1196876534557db76d484e4e81c6d8dc6f6c376b2b210e0c5dcd40f5c", "fetched_at": "2026-08-28T04:03:58.796793+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zxcvbn-ts/zxcvbn"}, {"content_hash": "6c9afd83b8077f4f3a99971f6e74b7b81ed29d01cb2c9bdb0c7e9ec0bbc0566b", "fetched_at": "2026-08-29T12:27:39.649384+00:00", "kind": "homepage", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/wheeler"}, {"content_hash": "916468c9b12015551fdbb81426da3373a97f8969a45f3a96f82829198b60a2dd", "fetched_at": "2026-08-29T12:27:39.658387+00:00", "kind": "site_page", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/symposium-organizers"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:58.796793+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:58.796793+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:58.796793+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T06:19:41.604451+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4d89aeb1196876534557db76d484e4e81c6d8dc6f6c376b2b210e0c5dcd40f5c", "fetched_at": "2026-08-28T04:03:58.796793+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zxcvbn-ts/zxcvbn"}, {"content_hash": "6c9afd83b8077f4f3a99971f6e74b7b81ed29d01cb2c9bdb0c7e9ec0bbc0566b", "fetched_at": "2026-08-29T12:27:39.649384+00:00", "kind": "homepage", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/wheeler"}, {"content_hash": "916468c9b12015551fdbb81426da3373a97f8969a45f3a96f82829198b60a2dd", "fetched_at": "2026-08-29T12:27:39.658387+00:00", "kind": "site_page", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/symposium-organizers"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:58.796793+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:58.796793+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T06:19:41.604451+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4d89aeb1196876534557db76d484e4e81c6d8dc6f6c376b2b210e0c5dcd40f5c", "fetched_at": "2026-08-28T04:03:58.796793+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zxcvbn-ts/zxcvbn"}, {"content_hash": "6c9afd83b8077f4f3a99971f6e74b7b81ed29d01cb2c9bdb0c7e9ec0bbc0566b", "fetched_at": "2026-08-29T12:27:39.649384+00:00", "kind": "homepage", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/wheeler"}, {"content_hash": "916468c9b12015551fdbb81426da3373a97f8969a45f3a96f82829198b60a2dd", "fetched_at": "2026-08-29T12:27:39.658387+00:00", "kind": "site_page", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/symposium-organizers"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T06:19:41.604451+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4d89aeb1196876534557db76d484e4e81c6d8dc6f6c376b2b210e0c5dcd40f5c", "fetched_at": "2026-08-28T04:03:58.796793+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zxcvbn-ts/zxcvbn"}, {"content_hash": "6c9afd83b8077f4f3a99971f6e74b7b81ed29d01cb2c9bdb0c7e9ec0bbc0566b", "fetched_at": "2026-08-29T12:27:39.649384+00:00", "kind": "homepage", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/wheeler"}, {"content_hash": "916468c9b12015551fdbb81426da3373a97f8969a45f3a96f82829198b60a2dd", "fetched_at": "2026-08-29T12:27:39.658387+00:00", "kind": "site_page", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/symposium-organizers"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T06:19:41.604451+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4d89aeb1196876534557db76d484e4e81c6d8dc6f6c376b2b210e0c5dcd40f5c", "fetched_at": "2026-08-28T04:03:58.796793+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zxcvbn-ts/zxcvbn"}, {"content_hash": "6c9afd83b8077f4f3a99971f6e74b7b81ed29d01cb2c9bdb0c7e9ec0bbc0566b", "fetched_at": "2026-08-29T12:27:39.649384+00:00", "kind": "homepage", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/wheeler"}, {"content_hash": "916468c9b12015551fdbb81426da3373a97f8969a45f3a96f82829198b60a2dd", "fetched_at": "2026-08-29T12:27:39.658387+00:00", "kind": "site_page", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/symposium-organizers"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T06:19:41.604451+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4d89aeb1196876534557db76d484e4e81c6d8dc6f6c376b2b210e0c5dcd40f5c", "fetched_at": "2026-08-28T04:03:58.796793+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zxcvbn-ts/zxcvbn"}, {"content_hash": "6c9afd83b8077f4f3a99971f6e74b7b81ed29d01cb2c9bdb0c7e9ec0bbc0566b", "fetched_at": "2026-08-29T12:27:39.649384+00:00", "kind": "homepage", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/wheeler"}, {"content_hash": "916468c9b12015551fdbb81426da3373a97f8969a45f3a96f82829198b60a2dd", "fetched_at": "2026-08-29T12:27:39.658387+00:00", "kind": "site_page", "missing": false, "url": "https://www.usenix.org/conference/usenixsecurity16/symposium-organizers"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 97, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2462, "days_push": 21, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 76, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}