{"adoption": {"forks": 162, "observed_at": "2026-08-28T04:05:16.458201+00:00", "stars": 1647}, "canonical_url": "https://ross.abutalabs.com/products/extract_otp_secrets", "card": {"archived": false, "artifact_type": "cli-tool", "description": "Extract one time password (OTP) secrets from QR codes exported by two-factor authentication (2FA) apps such as \"Google Authenticator\". The exported QR codes from authentication apps can be captured by camera, read from images, or read from text files. The secrets can be exported to JSON or CSV, or printed as QR codes to console.", "domain": ["security", "privacy", "developer-tools"], "enriched": true, "function": ["security", "parser", "cli", "serialization", "image-processing"], "health_score": 100, "homepage": "https://scito.ch/content/extract-secret-keys-google-authenticator-qr-export", "language": "Python", "license": "GPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["scito/extract_otp_secrets"], "name": "scito/extract_otp_secrets", "platform": ["python", "windows", "cli", "cross-platform"], "pushed_at": "2026-08-26T15:54:56+00:00", "repo": "scito/extract_otp_secrets", "stars": 1647, "tags": ["otp", "totp", "hotp", "2fa", "google-authenticator", "qr-code", "otpauth", "protobuf", "backup", "recovery", "mfa", "command-line", "linux", "macos", "docker"], "topics": ["otp", "otpauth", "python", "recovery", "google-authenticator", "proto3", "totp", "qr-codes", "tfa", "csv", "json", "protobuf", "security", "qrcode", "2fa", "two-factor", "two-factor-authentication", "security-tools", "standwithukraine", "mfa"], "urls": [], "use_cases": ["extract otp secrets from google authenticator export qr codes", "recover 2fa secret keys after losing my phone", "backup google authenticator accounts to json or csv", "decode otpauth-migration qr code data", "migrate two-factor accounts between phones", "read totp secrets from qr code images", "print otp secrets as qr codes to console"], "what_it_is": "A Python CLI tool that extracts one-time password (TOTP/HOTP) secrets from QR codes exported by two-factor authentication apps like Google Authenticator. It reads QR codes from camera capture, image files, or text files, and exports the secrets to JSON, CSV, or as QR codes printed to console or saved as PNG.", "when_to_avoid": ["you need a GUI-first password manager or authenticator app rather than a CLI extraction tool", "your 2FA app does not support QR export or uses a non-otpauth-migration format", "extracting secrets from devices you do not own - this is for legitimate account recovery only"], "when_to_choose": ["you need to back up or migrate 2FA secrets from Google Authenticator export QR codes", "you want offline, scriptable extraction of OTP secrets with JSON/CSV output", "you need cross-platform recovery of TOTP/HOTP keys from images, camera, or text files"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/extract_otp_secrets", "repo": "scito/extract_otp_secrets", "role": "main", "score": 93}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:16.458201+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:45:21.265888+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4bc02f4797b7674300e5421563b4435e9ba59fee1db2b8c71224f005ac6eb2b3", "fetched_at": "2026-08-28T04:05:16.458201+00:00", "kind": "readme", "missing": false, "url": "https://github.com/scito/extract_otp_secrets"}, {"content_hash": "174d943c794ff63eefd4c514379fb097a5d23a34cdd890e0d69d5a82f996f437", "fetched_at": "2026-08-29T11:18:54.708271+00:00", "kind": "homepage", "missing": false, "url": "https://scito.ch/content/extract-secret-keys-google-authenticator-qr-export"}, {"content_hash": "2ee695f51f13f0157db97f6a98e0c0a74f5cde65a153769844cd8d72ebe0b829", "fetched_at": "2026-08-29T11:18:54.717711+00:00", "kind": "site_page", "missing": false, "url": "https://scito.ch/content/about"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:16.458201+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:45:21.265888+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4bc02f4797b7674300e5421563b4435e9ba59fee1db2b8c71224f005ac6eb2b3", "fetched_at": "2026-08-28T04:05:16.458201+00:00", "kind": "readme", "missing": false, "url": "https://github.com/scito/extract_otp_secrets"}, {"content_hash": "174d943c794ff63eefd4c514379fb097a5d23a34cdd890e0d69d5a82f996f437", "fetched_at": "2026-08-29T11:18:54.708271+00:00", "kind": "homepage", "missing": false, "url": "https://scito.ch/content/extract-secret-keys-google-authenticator-qr-export"}, {"content_hash": "2ee695f51f13f0157db97f6a98e0c0a74f5cde65a153769844cd8d72ebe0b829", "fetched_at": "2026-08-29T11:18:54.717711+00:00", "kind": "site_page", "missing": false, "url": "https://scito.ch/content/about"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:45:21.265888+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4bc02f4797b7674300e5421563b4435e9ba59fee1db2b8c71224f005ac6eb2b3", "fetched_at": "2026-08-28T04:05:16.458201+00:00", "kind": "readme", "missing": false, "url": "https://github.com/scito/extract_otp_secrets"}, {"content_hash": "174d943c794ff63eefd4c514379fb097a5d23a34cdd890e0d69d5a82f996f437", "fetched_at": "2026-08-29T11:18:54.708271+00:00", "kind": "homepage", "missing": false, "url": "https://scito.ch/content/extract-secret-keys-google-authenticator-qr-export"}, {"content_hash": "2ee695f51f13f0157db97f6a98e0c0a74f5cde65a153769844cd8d72ebe0b829", "fetched_at": "2026-08-29T11:18:54.717711+00:00", "kind": "site_page", "missing": false, "url": "https://scito.ch/content/about"}], "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:05:16.458201+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:16.458201+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:16.458201+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:45:21.265888+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4bc02f4797b7674300e5421563b4435e9ba59fee1db2b8c71224f005ac6eb2b3", "fetched_at": "2026-08-28T04:05:16.458201+00:00", "kind": "readme", "missing": false, "url": "https://github.com/scito/extract_otp_secrets"}, {"content_hash": "174d943c794ff63eefd4c514379fb097a5d23a34cdd890e0d69d5a82f996f437", "fetched_at": "2026-08-29T11:18:54.708271+00:00", "kind": "homepage", "missing": false, "url": "https://scito.ch/content/extract-secret-keys-google-authenticator-qr-export"}, {"content_hash": "2ee695f51f13f0157db97f6a98e0c0a74f5cde65a153769844cd8d72ebe0b829", "fetched_at": "2026-08-29T11:18:54.717711+00:00", "kind": "site_page", "missing": false, "url": "https://scito.ch/content/about"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:16.458201+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:16.458201+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:45:21.265888+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4bc02f4797b7674300e5421563b4435e9ba59fee1db2b8c71224f005ac6eb2b3", "fetched_at": "2026-08-28T04:05:16.458201+00:00", "kind": "readme", "missing": false, "url": "https://github.com/scito/extract_otp_secrets"}, {"content_hash": "174d943c794ff63eefd4c514379fb097a5d23a34cdd890e0d69d5a82f996f437", "fetched_at": "2026-08-29T11:18:54.708271+00:00", "kind": "homepage", "missing": false, "url": "https://scito.ch/content/extract-secret-keys-google-authenticator-qr-export"}, {"content_hash": "2ee695f51f13f0157db97f6a98e0c0a74f5cde65a153769844cd8d72ebe0b829", "fetched_at": "2026-08-29T11:18:54.717711+00:00", "kind": "site_page", "missing": false, "url": "https://scito.ch/content/about"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:16.458201+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:16.458201+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:16.458201+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:45:21.265888+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4bc02f4797b7674300e5421563b4435e9ba59fee1db2b8c71224f005ac6eb2b3", "fetched_at": "2026-08-28T04:05:16.458201+00:00", "kind": "readme", "missing": false, "url": "https://github.com/scito/extract_otp_secrets"}, {"content_hash": "174d943c794ff63eefd4c514379fb097a5d23a34cdd890e0d69d5a82f996f437", "fetched_at": "2026-08-29T11:18:54.708271+00:00", "kind": "homepage", "missing": false, "url": "https://scito.ch/content/extract-secret-keys-google-authenticator-qr-export"}, {"content_hash": "2ee695f51f13f0157db97f6a98e0c0a74f5cde65a153769844cd8d72ebe0b829", "fetched_at": "2026-08-29T11:18:54.717711+00:00", "kind": "site_page", "missing": false, "url": "https://scito.ch/content/about"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:16.458201+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:16.458201+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:45:21.265888+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4bc02f4797b7674300e5421563b4435e9ba59fee1db2b8c71224f005ac6eb2b3", "fetched_at": "2026-08-28T04:05:16.458201+00:00", "kind": "readme", "missing": false, "url": "https://github.com/scito/extract_otp_secrets"}, {"content_hash": "174d943c794ff63eefd4c514379fb097a5d23a34cdd890e0d69d5a82f996f437", "fetched_at": "2026-08-29T11:18:54.708271+00:00", "kind": "homepage", "missing": false, "url": "https://scito.ch/content/extract-secret-keys-google-authenticator-qr-export"}, {"content_hash": "2ee695f51f13f0157db97f6a98e0c0a74f5cde65a153769844cd8d72ebe0b829", "fetched_at": "2026-08-29T11:18:54.717711+00:00", "kind": "site_page", "missing": false, "url": "https://scito.ch/content/about"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:45:21.265888+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4bc02f4797b7674300e5421563b4435e9ba59fee1db2b8c71224f005ac6eb2b3", "fetched_at": "2026-08-28T04:05:16.458201+00:00", "kind": "readme", "missing": false, "url": "https://github.com/scito/extract_otp_secrets"}, {"content_hash": "174d943c794ff63eefd4c514379fb097a5d23a34cdd890e0d69d5a82f996f437", "fetched_at": "2026-08-29T11:18:54.708271+00:00", "kind": "homepage", "missing": false, "url": "https://scito.ch/content/extract-secret-keys-google-authenticator-qr-export"}, {"content_hash": "2ee695f51f13f0157db97f6a98e0c0a74f5cde65a153769844cd8d72ebe0b829", "fetched_at": "2026-08-29T11:18:54.717711+00:00", "kind": "site_page", "missing": false, "url": "https://scito.ch/content/about"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:45:21.265888+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4bc02f4797b7674300e5421563b4435e9ba59fee1db2b8c71224f005ac6eb2b3", "fetched_at": "2026-08-28T04:05:16.458201+00:00", "kind": "readme", "missing": false, "url": "https://github.com/scito/extract_otp_secrets"}, {"content_hash": "174d943c794ff63eefd4c514379fb097a5d23a34cdd890e0d69d5a82f996f437", "fetched_at": "2026-08-29T11:18:54.708271+00:00", "kind": "homepage", "missing": false, "url": "https://scito.ch/content/extract-secret-keys-google-authenticator-qr-export"}, {"content_hash": "2ee695f51f13f0157db97f6a98e0c0a74f5cde65a153769844cd8d72ebe0b829", "fetched_at": "2026-08-29T11:18:54.717711+00:00", "kind": "site_page", "missing": false, "url": "https://scito.ch/content/about"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:45:21.265888+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "4bc02f4797b7674300e5421563b4435e9ba59fee1db2b8c71224f005ac6eb2b3", "fetched_at": "2026-08-28T04:05:16.458201+00:00", "kind": "readme", "missing": false, "url": "https://github.com/scito/extract_otp_secrets"}, {"content_hash": "174d943c794ff63eefd4c514379fb097a5d23a34cdd890e0d69d5a82f996f437", "fetched_at": "2026-08-29T11:18:54.708271+00:00", "kind": "homepage", "missing": false, "url": "https://scito.ch/content/extract-secret-keys-google-authenticator-qr-export"}, {"content_hash": "2ee695f51f13f0157db97f6a98e0c0a74f5cde65a153769844cd8d72ebe0b829", "fetched_at": "2026-08-29T11:18:54.717711+00:00", "kind": "site_page", "missing": false, "url": "https://scito.ch/content/about"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 100, "rhythm": 82}, "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": 2293, "days_push": 7, "days_rel": 40, "gap_med": 48.0, "n_releases_24m": 13}, "score": 93, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}