Live public camera browser for Android — search, filter, favorites, random skip.
No map. No account. Catalog bundled offline.
Holes is an open-source Flutter app that browses a bundled catalog of ~4,700 documented public HTTPS live streams — traffic cams, city views, outdoor feeds, and more. Search by name or location, filter by country and stream type, star favorites, and skip broken feeds. Everything loads from local JSON at startup; no remote catalog fetch required.
Built for Android (recommended for HLS playback). A web build exists for UI preview; most HLS streams will not play in Chrome.
- ~4,700 bundled HTTPS live streams (HLS, YouTube embeds, MJPEG)
- Search by name, city, country, and tags
- Filters: country, category, stream type, favorites-only
- Random next / previous navigation
- Skip & hide bad feeds; bundled URL blocklist
- Stream health badge, fullscreen player, open in browser
- Onboarding: choose HLS/MJPEG preferences, block categories
- Remembers last camera and favorites locally — no account
| Discover | Filters | Settings |
|---|---|---|
![]() |
![]() |
![]() |
- Open Releases and download
app-release.apk. - Copy to your Android device and install (enable sideloading if prompted).
- On Xiaomi/MIUI, enable Install via USB in Developer options if installation fails.
Before installing, confirm the APK matches the published checksum:
# Windows
Get-FileHash -Path app-release.apk -Algorithm SHA256Compare the output with SHA256.txt. Full instructions: docs/TRUST.md.
You can also scan the APK on VirusTotal (v1.0.0 — clean, no malicious detections).
- Flutter SDK (stable)
- Android SDK for device builds
- Node.js (optional, for
scripts/data pipeline)
flutter pub get
flutter run # Android — recommended for HLS video
flutter run -d chrome # Web UI — most HLS will not play in ChromeAfter changing assets/data/*.json: stop the app and do a full restart (not hot reload).
flutter analyze
flutter testSee docs/instructions.md for icon/splash regeneration, Android network workarounds, and architecture entry points.
flutter build apk --releaseOutput: build/app/outputs/flutter-apk/app-release.apk
Place release artifacts in releases/ (or build first), then:
.\scripts\generate-sha256.ps1 -IncludeBuildOutputsCommit the updated SHA256.txt alongside the GitHub release.
node scripts/build-v1-dataset.mjs # Rebuild v1 datasetSee docs/DATA.md for schema and curation rules.
| Layer | Technology |
|---|---|
| UI | Flutter / Material 3 |
| Video | video_player (HLS), Image.network (MJPEG) |
| Preferences | shared_preferences |
| External links | url_launcher, webview_flutter |
| Data | Bundled JSON under assets/data/ |
| CI | GitHub Actions (flutter analyze, flutter test) |
Only documented public streams you may link. Use feeds for observation only — respect privacy, property, and local laws. Stream rights remain with their respective owners; this app only links to public URLs in the dataset.
| Document | Purpose |
|---|---|
| docs/instructions.md | Developer setup and build |
| docs/TRUST.md | Verify SHA256 and scan with VirusTotal |
| docs/DATA.md | Camera data schema and pipeline |
| CONTRIBUTING.md | How to contribute |
| SECURITY.md | Report security issues |
Project homepage (GitHub Pages): docs/index.html
MIT — see LICENSE.
Camera stream rights remain with their respective owners; this project only links to public URLs documented in the bundled dataset.



