{"id":48963767,"url":"https://github.com/aitjcize/esp32-photoframe-app","last_synced_at":"2026-04-18T03:04:00.981Z","repository":{"id":351831331,"uuid":"1212626248","full_name":"aitjcize/esp32-photoframe-app","owner":"aitjcize","description":"Android/iOS app implemented in Flutter for esp32-photoframe","archived":false,"fork":false,"pushed_at":"2026-04-16T17:13:52.000Z","size":83,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-16T18:29:39.003Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aitjcize.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2026-04-16T15:08:22.000Z","updated_at":"2026-04-16T17:13:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/aitjcize/esp32-photoframe-app","commit_stats":null,"previous_names":["aitjcize/esp32-photoframe-app"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/aitjcize/esp32-photoframe-app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aitjcize%2Fesp32-photoframe-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aitjcize%2Fesp32-photoframe-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aitjcize%2Fesp32-photoframe-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aitjcize%2Fesp32-photoframe-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aitjcize","download_url":"https://codeload.github.com/aitjcize/esp32-photoframe-app/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aitjcize%2Fesp32-photoframe-app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31954738,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T00:39:45.007Z","status":"online","status_checked_at":"2026-04-18T02:00:07.018Z","response_time":103,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2026-04-18T03:04:00.005Z","updated_at":"2026-04-18T03:04:00.977Z","avatar_url":"https://github.com/aitjcize.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ESP32 PhotoFrame App\n\nCross-platform companion app for [ESP32 PhotoFrame](https://github.com/nickoala/esp32-photoframe) e-paper displays.\n\n## Features\n\n### Device Management\n- **mDNS auto-discovery** via `_esp32-pframe._tcp` service type\n- **Saved devices** with online status indicators (HTTP ping every 15s)\n- **Manual connection** by IP address or `.local` hostname\n- Automatic `.local` hostname resolution to IP for reliable connections\n\n### Gallery\n- Browse and manage albums on the device\n- View image thumbnails with caching\n- Multi-select for batch deletion\n- Create and delete albums\n- Pull-to-refresh with per-device caching for instant load\n\n### Image Processing\nFull port of [epaper-image-convert](https://github.com/nickoala/epaper-image-convert) to Dart:\n- **Dithering algorithms**: Floyd-Steinberg, Stucki, Burkes, Sierra\n- **Color matching**: RGB and LAB (CIE Delta E)\n- **Tone mapping**: Contrast and S-curve modes\n- **Adjustments**: Exposure, saturation, dynamic range compression\n- **Presets**: Balanced, Dynamic, Vivid, Soft, Grayscale\n- **Layout modes**: Cover (crop), Fit (letterbox), Custom (drag to pan, pinch to zoom)\n- **Live preview** during custom layout adjustments\n- **EPDGZ output** at native panel resolution with orientation handling\n- Background masking for clean letterbox edges after dithering\n\n### Device Settings\nAll settings from the webapp:\n- WiFi, display orientation/rotation, timezone, NTP server\n- Auto-rotate with interval, clock alignment, storage/URL source\n- Sleep schedule, deep sleep\n- Home Assistant URL\n- AI generation API keys (OpenAI, Google Gemini)\n- OTA firmware updates with progress tracking\n\n## Building\n\n### Prerequisites\n- Flutter SDK 3.11+\n- JDK 17 (for Android builds)\n- Android SDK with NDK\n\n### Build \u0026 Install\n```bash\nexport JAVA_HOME=/path/to/jdk17\nflutter build apk --release\nadb install build/app/outputs/flutter-apk/app-release.apk\n```\n\n### Firmware\nThe device firmware needs the `_esp32-pframe._tcp` mDNS service registered for auto-discovery. See `mdns_service.c` in the firmware repo.\n\n## Architecture\n\n```\nlib/\n  main.dart                     # App entry, routing, theme\n  models/\n    device.dart                 # Device, SystemInfo, BatteryInfo\n    config.dart                 # DeviceConfig\n    album.dart                  # Album, PhotoInfo\n  providers/\n    device_provider.dart        # State management, keep-alive, caching\n  screens/\n    discovery_screen.dart       # Device discovery \u0026 connection\n    gallery_screen.dart         # Album browser, image grid\n    preview_screen.dart         # Image processing editor\n    settings_screen.dart        # Device configuration\n  services/\n    api_client.dart             # REST API client for ESP32\n    device_discovery.dart       # mDNS discovery \u0026 online ping\n    saved_devices.dart          # Persistent device storage\n    epaper/\n      image_processor.dart      # Dithering, color conversion, EPDGZ\n      palettes.dart             # Measured color palettes (Spectra 6)\n      presets.dart               # Processing presets\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faitjcize%2Fesp32-photoframe-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faitjcize%2Fesp32-photoframe-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faitjcize%2Fesp32-photoframe-app/lists"}