{"id":39721808,"url":"https://github.com/sfortis/frigate-viewer","last_synced_at":"2026-04-21T20:00:59.617Z","repository":{"id":294047535,"uuid":"985827029","full_name":"sfortis/frigate-viewer","owner":"sfortis","description":"Bloatfree opensource Frigate NVR network-aware android viewer","archived":false,"fork":false,"pushed_at":"2026-04-21T19:17:21.000Z","size":3539,"stargazers_count":30,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-04-21T19:41:30.943Z","etag":null,"topics":["android","frigate","network-aware","nvr","opensource","viewer"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sfortis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-05-18T15:56:28.000Z","updated_at":"2026-04-21T18:52:52.000Z","dependencies_parsed_at":"2025-05-18T17:49:15.047Z","dependency_job_id":"4c9affd4-1482-4697-a584-0f9df9192658","html_url":"https://github.com/sfortis/frigate-viewer","commit_stats":null,"previous_names":["sfortis/frigate-viewer"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/sfortis/frigate-viewer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sfortis%2Ffrigate-viewer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sfortis%2Ffrigate-viewer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sfortis%2Ffrigate-viewer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sfortis%2Ffrigate-viewer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sfortis","download_url":"https://codeload.github.com/sfortis/frigate-viewer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sfortis%2Ffrigate-viewer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32108187,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-21T11:25:29.218Z","status":"ssl_error","status_checked_at":"2026-04-21T11:25:28.499Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","frigate","network-aware","nvr","opensource","viewer"],"created_at":"2026-01-18T10:48:19.619Z","updated_at":"2026-04-21T20:00:59.611Z","avatar_url":"https://github.com/sfortis.png","language":"Kotlin","funding_links":["https://www.buymeacoffee.com/sfortis"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# Frigate Viewer\n\n**A seamless Android client for [Frigate NVR](https://frigate.video/) with smart URL switching and push-like notifications.**\n\n[![Release](https://img.shields.io/github/v/release/sfortis/frigate-viewer?logo=github)](https://github.com/sfortis/frigate-viewer/releases/latest)\n[![Build](https://img.shields.io/github/actions/workflow/status/sfortis/frigate-viewer/build.yml?branch=dev\u0026label=build\u0026logo=github-actions)](https://github.com/sfortis/frigate-viewer/actions/workflows/build.yml)\n[![License](https://img.shields.io/github/license/sfortis/frigate-viewer)](LICENSE)\n![Android](https://img.shields.io/badge/Android-10%2B-3DDC84?logo=android\u0026logoColor=white)\n![Kotlin](https://img.shields.io/badge/Kotlin-2.0-7F52FF?logo=kotlin\u0026logoColor=white)\n[![Downloads](https://img.shields.io/github/downloads/sfortis/frigate-viewer/total?logo=github)](https://github.com/sfortis/frigate-viewer/releases)\n\n_This app is an unofficial third-party client and is not affiliated with the Frigate NVR project._\n\n\u003c/div\u003e\n\n---\n\n## Table of Contents\n\n- [What it does](#what-it-does)\n- [Screenshots](#screenshots)\n- [Install](#install)\n- [How URL switching works](#how-url-switching-works)\n- [Notifications](#notifications)\n- [Live stats](#live-stats)\n- [Downloads](#downloads)\n- [Deep linking](#deep-linking)\n- [Permissions](#permissions)\n- [Requirements](#requirements)\n- [Privacy](#privacy)\n- [Support](#support)\n- [License](#license)\n\n## What it does\n\nFrigate Viewer makes your self-hosted Frigate NVR feel like a proper mobile app.\n\n- **Auto-switches between home and remote URLs** based on your Wi-Fi. No VPN, no manual toggles.\n- **Reliable push-style notifications** with snapshot thumbnails. Tap a notification and you land right on the event.\n- **Live system health at a glance.** CPU and GPU load in the top bar, tap for per-camera FPS and detector inference.\n- **Fine-grained notification filters** by camera, zone and severity. One notification per event, never a spam flood.\n- **Secure by default.** Supports client certificates (mTLS) for Cloudflare Access / nginx setups, self-signed certs on LAN.\n- **Two-way talk** on doorbell and intercom cameras, with the phone's call-quality audio path engaged for clearer voice.\n\n## Screenshots\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"screenshots/01-home.png\" width=\"230\" alt=\"Home: cameras + live stats\" /\u003e\n  \u003cimg src=\"screenshots/02-stats-popup.png\" width=\"230\" alt=\"System statistics\" /\u003e\n  \u003cimg src=\"screenshots/03-connection-status.png\" width=\"230\" alt=\"Connection status\" /\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"screenshots/04-settings-root.png\" width=\"230\" alt=\"Settings root\" /\u003e\n  \u003cimg src=\"screenshots/05-notifications-settings.png\" width=\"230\" alt=\"Notification filters\" /\u003e\n  \u003cimg src=\"screenshots/06-connection-settings.png\" width=\"230\" alt=\"Connection + mTLS\" /\u003e\n\u003c/p\u003e\n\n## Install\n\nGrab the latest signed APK from the [Releases page](https://github.com/sfortis/frigate-viewer/releases/latest) and install it on your device.\n\nFirst-run setup:\n1. Open **Settings → Connection** and enter your internal URL (e.g. `https://frigate.home.lan`) and external URL (e.g. `https://frigate.example.com`).\n2. Under **Network mode** leave on **Auto** and add your home Wi-Fi SSIDs.\n3. If your Frigate requires auth, enter username + password under **Frigate Account**.\n4. If you use mTLS behind Cloudflare Access / nginx, import your `.p12` certificate under **Client certificate (mTLS)**.\n5. Enable **Notifications** and grant **Ignore battery optimizations** when prompted.\n\n## How URL switching works\n\n| Connection mode | Behavior |\n|---|---|\n| **Auto** | SSID in your home list: Internal URL. Anything else (cellular, guest Wi-Fi, airport): External URL. |\n| **Internal** | Always Internal, regardless of network. |\n| **External** | Always External. Useful for debugging remote access from home. |\n\nEvery URL change triggers a validation probe; the badge turns orange (INT, connected to home) or red (EXT, or unreachable). A 24-sample rolling latency history feeds the graph in the status popup.\n\n## Notifications\n\nThe background `FrigateAlertService` keeps a `wss://.../ws` connection open and subscribes to `reviews` and `events`.\n\n- **Alert** (severity `alert`): tap opens `/review?id=\u003creview_id\u003e`.\n- **Detection** (severity `detection`): tap opens `/explore?event_id=\u003cevent_id\u003e` (Frigate 0.14+).\n- **Dedupe per event / review id.** The `new → update → end` lifecycle collapses to exactly one notification.\n- **Zone filter.** Events without matching zones are dropped for cameras where you've allow-listed zones.\n\n### Android 14+ reliability\n\n| Technique | Purpose |\n|---|---|\n| `FOREGROUND_SERVICE_TYPE_SPECIAL_USE` | Sidesteps the 6-hour cap imposed on `DATA_SYNC` foreground services |\n| Partial WakeLock | Keeps CPU scheduling the WebSocket ping loop during doze |\n| WifiLock (high-perf) | Prevents Wi-Fi radio power-save from dropping the socket |\n| Network callback kick | Forces a reconnect on network regain instead of waiting for exponential backoff |\n| 15-min WorkManager watchdog | Revives the service if an OEM kills it (Samsung, MIUI, Honor) |\n| Repost-on-dismiss receiver | Restores the persistent notification within ~1 s if the user swipes it away |\n\n## Live stats\n\nBoth the top-bar badges and the full stats panel are fed by Frigate's `/api/stats` endpoint, polled every 2 seconds while the activity is visible. Parsing tolerates Frigate 0.13 / 0.14 / 0.15+ schema drift (`cpu_usages`, `gpu_usages` vs legacy `gpus`, percent-suffixed string values, nested `service.uptime`).\n\nThe stats panel surfaces:\n\n- CPU and GPU cards with progress bars and hot-load tint (neutral, amber, red at or above 80%).\n- RAM chip, uptime chip.\n- Per-detector inference time.\n- Per-camera capture FPS and detection FPS.\n\nIf polling fails, the badges dim after 10 seconds instead of lying bright.\n\n## Downloads\n\nVideo clips and snapshots from Frigate:\n\n- Works on both internal (self-signed) and external networks.\n- Configurable destination: `Downloads/Frigate` (default), Pictures, Movies, or Downloads root.\n- Progress notifications with an **Open** action on completion.\n\n## Deep linking\n\nThe app registers the `frigate://` (and legacy `freegate://`) scheme for automation.\n\n| URI | Opens |\n|---|---|\n| `frigate://home` | Camera grid |\n| `frigate://settings` | Settings root |\n| `frigate://review/\u003cid\u003e` | Specific review segment |\n| `frigate://event/\u003cid\u003e` | Specific event in Explore view |\n| `frigate://camera/\u003cid\u003e` | Specific camera (planned) |\n\n## Permissions\n\nMinimum viable set. Nothing else is requested.\n\n| Permission | Why |\n|---|---|\n| `INTERNET`, `ACCESS_NETWORK_STATE`, `ACCESS_WIFI_STATE` | Base connectivity |\n| `NEARBY_WIFI_DEVICES` (API 33+) / `ACCESS_FINE_LOCATION` (API 32 and below) | Read SSID for auto-switching. `neverForLocation` flag set on 13+ |\n| `RECORD_AUDIO`, `MODIFY_AUDIO_SETTINGS` | Two-way talk to doorbell / intercom cameras |\n| `POST_NOTIFICATIONS` | Alerts and detections |\n| `FOREGROUND_SERVICE` + `FOREGROUND_SERVICE_SPECIAL_USE` | Alert listener lifetime |\n| `RECEIVE_BOOT_COMPLETED` | Re-start the listener after reboot |\n| `WAKE_LOCK` | Keep the WebSocket ping loop alive during doze |\n| `REQUEST_IGNORE_BATTERY_OPTIMIZATIONS` | Optional, prompted once on notification enable |\n| `REQUEST_INSTALL_PACKAGES` | In-app updater from GitHub releases |\n\n## Requirements\n\n- Android 10 (API 29) minimum, Android 13+ recommended.\n- Frigate NVR with local and / or remote access. Notifications work on any Frigate that broadcasts `reviews` / `events` over `/ws` (0.12+). Stats parsing supports 0.13 through 0.17.\n\n## Privacy\n\n- **Viewer only.** All processing happens on your Frigate server. No cloud relay, no analytics, no telemetry, no crash reporting.\n- **Local storage only.** Session cookies and the `frigate_token` live in app-private storage. The Frigate account password is kept in `EncryptedSharedPreferences`.\n- **No ads.**\n- **Open source.** Auditable end to end.\n\n## Support\n\nIf Frigate Viewer made your life easier and you'd like to say thanks, a coffee goes a long way towards keeping the app maintained. No pressure. Bug reports and PRs are equally welcome.\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://www.buymeacoffee.com/sfortis\" target=\"_blank\"\u003e\u003cimg src=\"https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png\" alt=\"Buy Me A Coffee\" height=\"50\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsfortis%2Ffrigate-viewer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsfortis%2Ffrigate-viewer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsfortis%2Ffrigate-viewer/lists"}