{"adoption": {"forks": 93, "observed_at": "2026-08-28T04:03:47.420325+00:00", "stars": 1153}, "canonical_url": "https://ross.abutalabs.com/products/pho", "card": {"archived": false, "artifact_type": "application", "description": "A serverless application for viewing and synchronizing photos to cloud storage", "domain": ["photography", "self-hosted", "privacy", "mobile-development", "files"], "enriched": true, "function": ["file-upload", "backup", "image-processing", "gui"], "health_score": 99, "homepage": "https://pho.tools", "language": "Dart", "license": "GPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["fregie/pho"], "name": "fregie/pho", "platform": ["go", "cross-platform"], "pushed_at": "2026-08-20T03:04:55+00:00", "repo": "fregie/pho", "stars": 1153, "tags": ["photo-sync", "nas", "smb", "webdav", "nfs", "gallery", "serverless", "google-photos-alternative", "homelab", "grpc", "flutter-app", "gomobile", "android", "ios", "flutter", "mobile"], "topics": ["backup", "photos", "golang", "flutter", "gallery-images", "nas", "foss", "google-photos-alternative", "grpc", "homelab", "nfs", "photo-gallery", "photo-sync", "privacy", "self-hosted", "selfhosted", "smb", "webdav"], "urls": [], "use_cases": ["back up my phone photos to my NAS automatically", "replace Google Photos with a self-hosted photo sync", "view local and cloud photos in one gallery", "sync camera roll to SMB or WebDAV storage", "private photo backup without a server", "incremental photo sync to network storage", "browse photos on my homelab NAS from my phone"], "what_it_is": "Pho is a serverless, self-hosted photo gallery and sync app that replaces your phone's native photos app and incrementally backs up photos/videos to storage you control (SMB, WebDAV, NFS, and more in the Pro version). It has no central server or database, organizing cloud files by date-based directory structure. The open-source edition provides core viewing and sync for Android, while a paid Pro edition adds AES encryption, parallel uploads, and extra cloud providers on iOS and Android.", "when_to_avoid": ["you need AES-encrypted uploads, parallel transfers, or filters - those are Pro-only", "you need an iOS open-source build - the open edition is Android APK only", "you want web or desktop access to your gallery", "you need features like facial recognition, albums, or sharing links"], "when_to_choose": ["you want photo backups to your own NAS or cloud drive with no server component", "you prefer simple date-based file storage you can access directly", "you want an open-source core with privacy-focused, no-analytics design", "you use SMB, WebDAV, or NFS on a homelab"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/pho", "repo": "fregie/pho", "role": "main", "score": 84}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.420325+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T06:33:27.906099+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "62637b9a15ce71432619a6e3a519e589d9630a2f8abe6eae3c2946d321cee2af", "fetched_at": "2026-08-28T04:03:47.420325+00:00", "kind": "readme", "missing": false, "url": "https://github.com/fregie/pho"}, {"content_hash": "3dc60b663638511ec55d76088731583f2eccab8010d40ebdbd05cd4e5912e91d", "fetched_at": "2026-08-29T12:37:59.389282+00:00", "kind": "homepage", "missing": false, "url": "https://pho.tools"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.420325+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T06:33:27.906099+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "62637b9a15ce71432619a6e3a519e589d9630a2f8abe6eae3c2946d321cee2af", "fetched_at": "2026-08-28T04:03:47.420325+00:00", "kind": "readme", "missing": false, "url": "https://github.com/fregie/pho"}, {"content_hash": "3dc60b663638511ec55d76088731583f2eccab8010d40ebdbd05cd4e5912e91d", "fetched_at": "2026-08-29T12:37:59.389282+00:00", "kind": "homepage", "missing": false, "url": "https://pho.tools"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T06:33:27.906099+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "62637b9a15ce71432619a6e3a519e589d9630a2f8abe6eae3c2946d321cee2af", "fetched_at": "2026-08-28T04:03:47.420325+00:00", "kind": "readme", "missing": false, "url": "https://github.com/fregie/pho"}, {"content_hash": "3dc60b663638511ec55d76088731583f2eccab8010d40ebdbd05cd4e5912e91d", "fetched_at": "2026-08-29T12:37:59.389282+00:00", "kind": "homepage", "missing": false, "url": "https://pho.tools"}], "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:47.420325+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.420325+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.420325+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T06:33:27.906099+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "62637b9a15ce71432619a6e3a519e589d9630a2f8abe6eae3c2946d321cee2af", "fetched_at": "2026-08-28T04:03:47.420325+00:00", "kind": "readme", "missing": false, "url": "https://github.com/fregie/pho"}, {"content_hash": "3dc60b663638511ec55d76088731583f2eccab8010d40ebdbd05cd4e5912e91d", "fetched_at": "2026-08-29T12:37:59.389282+00:00", "kind": "homepage", "missing": false, "url": "https://pho.tools"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.420325+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.420325+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T06:33:27.906099+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "62637b9a15ce71432619a6e3a519e589d9630a2f8abe6eae3c2946d321cee2af", "fetched_at": "2026-08-28T04:03:47.420325+00:00", "kind": "readme", "missing": false, "url": "https://github.com/fregie/pho"}, {"content_hash": "3dc60b663638511ec55d76088731583f2eccab8010d40ebdbd05cd4e5912e91d", "fetched_at": "2026-08-29T12:37:59.389282+00:00", "kind": "homepage", "missing": false, "url": "https://pho.tools"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.420325+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.420325+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.420325+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T06:33:27.906099+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "62637b9a15ce71432619a6e3a519e589d9630a2f8abe6eae3c2946d321cee2af", "fetched_at": "2026-08-28T04:03:47.420325+00:00", "kind": "readme", "missing": false, "url": "https://github.com/fregie/pho"}, {"content_hash": "3dc60b663638511ec55d76088731583f2eccab8010d40ebdbd05cd4e5912e91d", "fetched_at": "2026-08-29T12:37:59.389282+00:00", "kind": "homepage", "missing": false, "url": "https://pho.tools"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.420325+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.420325+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T06:33:27.906099+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "62637b9a15ce71432619a6e3a519e589d9630a2f8abe6eae3c2946d321cee2af", "fetched_at": "2026-08-28T04:03:47.420325+00:00", "kind": "readme", "missing": false, "url": "https://github.com/fregie/pho"}, {"content_hash": "3dc60b663638511ec55d76088731583f2eccab8010d40ebdbd05cd4e5912e91d", "fetched_at": "2026-08-29T12:37:59.389282+00:00", "kind": "homepage", "missing": false, "url": "https://pho.tools"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T06:33:27.906099+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "62637b9a15ce71432619a6e3a519e589d9630a2f8abe6eae3c2946d321cee2af", "fetched_at": "2026-08-28T04:03:47.420325+00:00", "kind": "readme", "missing": false, "url": "https://github.com/fregie/pho"}, {"content_hash": "3dc60b663638511ec55d76088731583f2eccab8010d40ebdbd05cd4e5912e91d", "fetched_at": "2026-08-29T12:37:59.389282+00:00", "kind": "homepage", "missing": false, "url": "https://pho.tools"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T06:33:27.906099+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "62637b9a15ce71432619a6e3a519e589d9630a2f8abe6eae3c2946d321cee2af", "fetched_at": "2026-08-28T04:03:47.420325+00:00", "kind": "readme", "missing": false, "url": "https://github.com/fregie/pho"}, {"content_hash": "3dc60b663638511ec55d76088731583f2eccab8010d40ebdbd05cd4e5912e91d", "fetched_at": "2026-08-29T12:37:59.389282+00:00", "kind": "homepage", "missing": false, "url": "https://pho.tools"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T06:33:27.906099+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "62637b9a15ce71432619a6e3a519e589d9630a2f8abe6eae3c2946d321cee2af", "fetched_at": "2026-08-28T04:03:47.420325+00:00", "kind": "readme", "missing": false, "url": "https://github.com/fregie/pho"}, {"content_hash": "3dc60b663638511ec55d76088731583f2eccab8010d40ebdbd05cd4e5912e91d", "fetched_at": "2026-08-29T12:37:59.389282+00:00", "kind": "homepage", "missing": false, "url": "https://pho.tools"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 98, "longevity": 91, "rhythm": 63}, "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": 1276, "days_push": 13, "days_rel": 35, "gap_med": null, "n_releases_24m": 1}, "score": 84, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}