{"adoption": {"forks": 296, "observed_at": "2026-08-28T04:08:36.034494+00:00", "stars": 4125}, "canonical_url": "https://ross.abutalabs.com/products/2fauth", "card": {"archived": false, "artifact_type": "application", "description": "A Web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes", "domain": ["security", "privacy", "self-hosted", "web-development"], "enriched": true, "function": ["auth", "security", "self-hosted", "http-server"], "health_score": 95, "homepage": "https://docs.2fauth.app/", "language": "PHP", "license": "AGPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["Bubka/2FAuth"], "name": "Bubka/2FAuth", "platform": ["self-hosted", "php", "cross-platform"], "pushed_at": "2026-07-12T06:12:32+00:00", "repo": "Bubka/2FAuth", "stars": 4125, "tags": ["totp", "hotp", "otp", "two-factor-authentication", "authenticator-app", "qrcode", "steam-guard", "webauthn", "yubikey", "laravel", "web-server", "docker", "linux"], "topics": ["otp", "2fa", "2factor", "totp", "hotp", "self-hosted", "webapp", "qrcode", "two-factor-authentication", "two-factor"], "urls": [], "use_cases": ["self-hosted alternative to google authenticator", "generate 2fa codes from desktop browser", "backup and restore two-factor accounts", "manage totp and hotp tokens in one place", "share 2fa codes across a team", "scan qr codes to add otp accounts", "store 2fa secrets encrypted in own database", "get otp codes without taking out smartphone"], "what_it_is": "2FAuth is a self-hosted web application for managing Two-Factor Authentication accounts and generating TOTP, HOTP, and Steam Guard security codes from any browser. It serves as an open-source alternative to proprietary authenticator apps like Google Authenticator, with QR code scanning, encrypted storage, and multi-user support.", "when_to_avoid": ["you want a simple phone-only authenticator with no server to maintain", "you are not comfortable self-hosting and securing a web app (HTTPS, backups of APP_KEY)", "you need offline code generation with no network access", "you require enterprise-grade multi-tenant 2FA management"], "when_to_choose": ["you want your 2FA secrets out of a single phone and in a self-hosted, backupable database", "you need OTP codes on desktop as well as mobile", "you want a team or family to share access to 2FA accounts with isolated vaults", "you prefer open-source, self-hosted tools with encryption and WebAuthn/security-key login"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/2fauth", "repo": "Bubka/2FAuth", "role": "main", "score": 94}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.034494+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T18:23:04.282415+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6fe24f8148479192d1aba7df1d9b5600f89dd25d0d079cb305b1a7e3ac250a28", "fetched_at": "2026-08-28T04:08:36.034494+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Bubka/2FAuth"}, {"content_hash": "6923cf904e965da52f93378782a62024caad64d13855895cf0b2b3becaea96f2", "fetched_at": "2026-08-29T09:14:36.849061+00:00", "kind": "homepage", "missing": false, "url": "https://docs.2fauth.app/"}, {"content_hash": "26b983169fc5863bcf1496d285703e6c1b4700b3f41b1f286bea7ba40a4c3e0e", "fetched_at": "2026-08-29T09:14:36.851513+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/self-hosted-server"}, {"content_hash": "7966ab88243bf1c280f2c63296f9d604654ff031e8b064e1b56a5e3d32cc79d9", "fetched_at": "2026-08-29T09:14:36.853563+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/docker/docker-compose"}, {"content_hash": "7c240e37eb0fd43247c4438cf744079ea987f143b38eb695603599e2797c8400", "fetched_at": "2026-08-29T09:14:36.855529+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/env-vars"}, {"content_hash": "c8676a56de9b41aace64ae256d9f6dce355f0e23826f54f8091e2c0677c1a637", "fetched_at": "2026-08-29T09:14:36.858396+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/user-preferences"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.034494+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T18:23:04.282415+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6fe24f8148479192d1aba7df1d9b5600f89dd25d0d079cb305b1a7e3ac250a28", "fetched_at": "2026-08-28T04:08:36.034494+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Bubka/2FAuth"}, {"content_hash": "6923cf904e965da52f93378782a62024caad64d13855895cf0b2b3becaea96f2", "fetched_at": "2026-08-29T09:14:36.849061+00:00", "kind": "homepage", "missing": false, "url": "https://docs.2fauth.app/"}, {"content_hash": "26b983169fc5863bcf1496d285703e6c1b4700b3f41b1f286bea7ba40a4c3e0e", "fetched_at": "2026-08-29T09:14:36.851513+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/self-hosted-server"}, {"content_hash": "7966ab88243bf1c280f2c63296f9d604654ff031e8b064e1b56a5e3d32cc79d9", "fetched_at": "2026-08-29T09:14:36.853563+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/docker/docker-compose"}, {"content_hash": "7c240e37eb0fd43247c4438cf744079ea987f143b38eb695603599e2797c8400", "fetched_at": "2026-08-29T09:14:36.855529+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/env-vars"}, {"content_hash": "c8676a56de9b41aace64ae256d9f6dce355f0e23826f54f8091e2c0677c1a637", "fetched_at": "2026-08-29T09:14:36.858396+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/user-preferences"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T18:23:04.282415+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6fe24f8148479192d1aba7df1d9b5600f89dd25d0d079cb305b1a7e3ac250a28", "fetched_at": "2026-08-28T04:08:36.034494+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Bubka/2FAuth"}, {"content_hash": "6923cf904e965da52f93378782a62024caad64d13855895cf0b2b3becaea96f2", "fetched_at": "2026-08-29T09:14:36.849061+00:00", "kind": "homepage", "missing": false, "url": "https://docs.2fauth.app/"}, {"content_hash": "26b983169fc5863bcf1496d285703e6c1b4700b3f41b1f286bea7ba40a4c3e0e", "fetched_at": "2026-08-29T09:14:36.851513+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/self-hosted-server"}, {"content_hash": "7966ab88243bf1c280f2c63296f9d604654ff031e8b064e1b56a5e3d32cc79d9", "fetched_at": "2026-08-29T09:14:36.853563+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/docker/docker-compose"}, {"content_hash": "7c240e37eb0fd43247c4438cf744079ea987f143b38eb695603599e2797c8400", "fetched_at": "2026-08-29T09:14:36.855529+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/env-vars"}, {"content_hash": "c8676a56de9b41aace64ae256d9f6dce355f0e23826f54f8091e2c0677c1a637", "fetched_at": "2026-08-29T09:14:36.858396+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/user-preferences"}], "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:36.034494+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.034494+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.034494+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T18:23:04.282415+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6fe24f8148479192d1aba7df1d9b5600f89dd25d0d079cb305b1a7e3ac250a28", "fetched_at": "2026-08-28T04:08:36.034494+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Bubka/2FAuth"}, {"content_hash": "6923cf904e965da52f93378782a62024caad64d13855895cf0b2b3becaea96f2", "fetched_at": "2026-08-29T09:14:36.849061+00:00", "kind": "homepage", "missing": false, "url": "https://docs.2fauth.app/"}, {"content_hash": "26b983169fc5863bcf1496d285703e6c1b4700b3f41b1f286bea7ba40a4c3e0e", "fetched_at": "2026-08-29T09:14:36.851513+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/self-hosted-server"}, {"content_hash": "7966ab88243bf1c280f2c63296f9d604654ff031e8b064e1b56a5e3d32cc79d9", "fetched_at": "2026-08-29T09:14:36.853563+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/docker/docker-compose"}, {"content_hash": "7c240e37eb0fd43247c4438cf744079ea987f143b38eb695603599e2797c8400", "fetched_at": "2026-08-29T09:14:36.855529+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/env-vars"}, {"content_hash": "c8676a56de9b41aace64ae256d9f6dce355f0e23826f54f8091e2c0677c1a637", "fetched_at": "2026-08-29T09:14:36.858396+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/user-preferences"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.034494+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.034494+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T18:23:04.282415+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6fe24f8148479192d1aba7df1d9b5600f89dd25d0d079cb305b1a7e3ac250a28", "fetched_at": "2026-08-28T04:08:36.034494+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Bubka/2FAuth"}, {"content_hash": "6923cf904e965da52f93378782a62024caad64d13855895cf0b2b3becaea96f2", "fetched_at": "2026-08-29T09:14:36.849061+00:00", "kind": "homepage", "missing": false, "url": "https://docs.2fauth.app/"}, {"content_hash": "26b983169fc5863bcf1496d285703e6c1b4700b3f41b1f286bea7ba40a4c3e0e", "fetched_at": "2026-08-29T09:14:36.851513+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/self-hosted-server"}, {"content_hash": "7966ab88243bf1c280f2c63296f9d604654ff031e8b064e1b56a5e3d32cc79d9", "fetched_at": "2026-08-29T09:14:36.853563+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/docker/docker-compose"}, {"content_hash": "7c240e37eb0fd43247c4438cf744079ea987f143b38eb695603599e2797c8400", "fetched_at": "2026-08-29T09:14:36.855529+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/env-vars"}, {"content_hash": "c8676a56de9b41aace64ae256d9f6dce355f0e23826f54f8091e2c0677c1a637", "fetched_at": "2026-08-29T09:14:36.858396+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/user-preferences"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.034494+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.034494+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.034494+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T18:23:04.282415+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6fe24f8148479192d1aba7df1d9b5600f89dd25d0d079cb305b1a7e3ac250a28", "fetched_at": "2026-08-28T04:08:36.034494+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Bubka/2FAuth"}, {"content_hash": "6923cf904e965da52f93378782a62024caad64d13855895cf0b2b3becaea96f2", "fetched_at": "2026-08-29T09:14:36.849061+00:00", "kind": "homepage", "missing": false, "url": "https://docs.2fauth.app/"}, {"content_hash": "26b983169fc5863bcf1496d285703e6c1b4700b3f41b1f286bea7ba40a4c3e0e", "fetched_at": "2026-08-29T09:14:36.851513+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/self-hosted-server"}, {"content_hash": "7966ab88243bf1c280f2c63296f9d604654ff031e8b064e1b56a5e3d32cc79d9", "fetched_at": "2026-08-29T09:14:36.853563+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/docker/docker-compose"}, {"content_hash": "7c240e37eb0fd43247c4438cf744079ea987f143b38eb695603599e2797c8400", "fetched_at": "2026-08-29T09:14:36.855529+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/env-vars"}, {"content_hash": "c8676a56de9b41aace64ae256d9f6dce355f0e23826f54f8091e2c0677c1a637", "fetched_at": "2026-08-29T09:14:36.858396+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/user-preferences"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.034494+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.034494+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T18:23:04.282415+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6fe24f8148479192d1aba7df1d9b5600f89dd25d0d079cb305b1a7e3ac250a28", "fetched_at": "2026-08-28T04:08:36.034494+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Bubka/2FAuth"}, {"content_hash": "6923cf904e965da52f93378782a62024caad64d13855895cf0b2b3becaea96f2", "fetched_at": "2026-08-29T09:14:36.849061+00:00", "kind": "homepage", "missing": false, "url": "https://docs.2fauth.app/"}, {"content_hash": "26b983169fc5863bcf1496d285703e6c1b4700b3f41b1f286bea7ba40a4c3e0e", "fetched_at": "2026-08-29T09:14:36.851513+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/self-hosted-server"}, {"content_hash": "7966ab88243bf1c280f2c63296f9d604654ff031e8b064e1b56a5e3d32cc79d9", "fetched_at": "2026-08-29T09:14:36.853563+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/docker/docker-compose"}, {"content_hash": "7c240e37eb0fd43247c4438cf744079ea987f143b38eb695603599e2797c8400", "fetched_at": "2026-08-29T09:14:36.855529+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/env-vars"}, {"content_hash": "c8676a56de9b41aace64ae256d9f6dce355f0e23826f54f8091e2c0677c1a637", "fetched_at": "2026-08-29T09:14:36.858396+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/user-preferences"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T18:23:04.282415+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6fe24f8148479192d1aba7df1d9b5600f89dd25d0d079cb305b1a7e3ac250a28", "fetched_at": "2026-08-28T04:08:36.034494+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Bubka/2FAuth"}, {"content_hash": "6923cf904e965da52f93378782a62024caad64d13855895cf0b2b3becaea96f2", "fetched_at": "2026-08-29T09:14:36.849061+00:00", "kind": "homepage", "missing": false, "url": "https://docs.2fauth.app/"}, {"content_hash": "26b983169fc5863bcf1496d285703e6c1b4700b3f41b1f286bea7ba40a4c3e0e", "fetched_at": "2026-08-29T09:14:36.851513+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/self-hosted-server"}, {"content_hash": "7966ab88243bf1c280f2c63296f9d604654ff031e8b064e1b56a5e3d32cc79d9", "fetched_at": "2026-08-29T09:14:36.853563+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/docker/docker-compose"}, {"content_hash": "7c240e37eb0fd43247c4438cf744079ea987f143b38eb695603599e2797c8400", "fetched_at": "2026-08-29T09:14:36.855529+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/env-vars"}, {"content_hash": "c8676a56de9b41aace64ae256d9f6dce355f0e23826f54f8091e2c0677c1a637", "fetched_at": "2026-08-29T09:14:36.858396+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/user-preferences"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T18:23:04.282415+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6fe24f8148479192d1aba7df1d9b5600f89dd25d0d079cb305b1a7e3ac250a28", "fetched_at": "2026-08-28T04:08:36.034494+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Bubka/2FAuth"}, {"content_hash": "6923cf904e965da52f93378782a62024caad64d13855895cf0b2b3becaea96f2", "fetched_at": "2026-08-29T09:14:36.849061+00:00", "kind": "homepage", "missing": false, "url": "https://docs.2fauth.app/"}, {"content_hash": "26b983169fc5863bcf1496d285703e6c1b4700b3f41b1f286bea7ba40a4c3e0e", "fetched_at": "2026-08-29T09:14:36.851513+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/self-hosted-server"}, {"content_hash": "7966ab88243bf1c280f2c63296f9d604654ff031e8b064e1b56a5e3d32cc79d9", "fetched_at": "2026-08-29T09:14:36.853563+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/docker/docker-compose"}, {"content_hash": "7c240e37eb0fd43247c4438cf744079ea987f143b38eb695603599e2797c8400", "fetched_at": "2026-08-29T09:14:36.855529+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/env-vars"}, {"content_hash": "c8676a56de9b41aace64ae256d9f6dce355f0e23826f54f8091e2c0677c1a637", "fetched_at": "2026-08-29T09:14:36.858396+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/user-preferences"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T18:23:04.282415+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "6fe24f8148479192d1aba7df1d9b5600f89dd25d0d079cb305b1a7e3ac250a28", "fetched_at": "2026-08-28T04:08:36.034494+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Bubka/2FAuth"}, {"content_hash": "6923cf904e965da52f93378782a62024caad64d13855895cf0b2b3becaea96f2", "fetched_at": "2026-08-29T09:14:36.849061+00:00", "kind": "homepage", "missing": false, "url": "https://docs.2fauth.app/"}, {"content_hash": "26b983169fc5863bcf1496d285703e6c1b4700b3f41b1f286bea7ba40a4c3e0e", "fetched_at": "2026-08-29T09:14:36.851513+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/self-hosted-server"}, {"content_hash": "7966ab88243bf1c280f2c63296f9d604654ff031e8b064e1b56a5e3d32cc79d9", "fetched_at": "2026-08-29T09:14:36.853563+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/installation/docker/docker-compose"}, {"content_hash": "7c240e37eb0fd43247c4438cf744079ea987f143b38eb695603599e2797c8400", "fetched_at": "2026-08-29T09:14:36.855529+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/env-vars"}, {"content_hash": "c8676a56de9b41aace64ae256d9f6dce355f0e23826f54f8091e2c0677c1a637", "fetched_at": "2026-08-29T09:14:36.858396+00:00", "kind": "site_page", "missing": false, "url": "https://docs.2fauth.app/getting-started/config/user-preferences"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 92, "longevity": 100, "rhythm": 92}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2667, "days_push": 52, "days_rel": 59, "gap_med": 14.0, "n_releases_24m": 21}, "score": 94, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}