Skip to content
HardwareLab

Turn a digital photo frame into a family wall dashboard

A photo frame with factory root over ADB, turned into a family wall dashboard

Full build guide

By @lito_ordes

Posted
GitHub stars
9 (GitHub)
Turn a digital photo frame into a family wall dashboard
Demo by Lito (@lito_ordes), posted · Watch on X

Build sheet

Parts
XORO CPF 10PF 10.1" digital photo frame (1920x1200, Android 10 eng build), Computer with ADB for setup
AI model or service
Claude Code (the repo is a guide for coding agents like it)
Difficulty
Advanced
Accounts needed
Planify-Backend reachable over HTTPS, plus an account made in Planify-APP
License
MIT

Parts list

  • XORO CPF 10PF 10.1" digital frame (Allwinner A133, 1 GB RAM, 1920×1200, Android 10 eng build) [9]
  • USB-C data cable (Must carry data, not only charge) [10]
  • Computer with adb, JDK 17+ and the Android SDK (Tested on Linux) [11]

Prices and notes: Parts and requirements

Steps

Skill level
Advanced
  1. Phase 1: confirm it is exactly this hardware and software (identity checks)
  2. Phase 2: verified eMMC backup (SHA-256 of every piece)
  3. Phase 3: choose the app and backend
  4. Phase 4: configure and build
  5. Phase 5: install and make the frame a kiosk (Device Owner)
  6. Phase 6: isolate the frame with the firewall
  7. Phase 7: updates over Wi-Fi from one IP
  8. Phase 8: boot logo, screen schedule and power
  9. Phase 9: first use (Wi-Fi, sign in, settings)
  10. Phase 10: final checks [19]

Full instructions: View original

Like this build? Get the weekly builds

Get the best new AI hardware builds every Thursday. One email a week, free.

Built something? Submit a build

Overview

Lito (@lito_ordes) replaced the maker's app on a 10.1" XORO CPF 10PF photo frame with a native Android dashboard: a split-flap clock, Open-Meteo weather, a swipeable week calendar, routines, tasks and a dim night clock. He calls it fully compatible with Claude Code and says the native Android app, with everything superfluous removed, took less than one 5-hour Claude session; the project started from Wes Bos's photo-frame-dashboard. The repo (eusonlito/Planify-Dashboard, MIT) is written as a step-by-step guide for your own coding agent.

What it does

  • Turns a digital photo frame into a family wall screen: time, weather, events, routines and tasks at a glance, without the maker’s app or a subscription. [1]
  • Today screen: a split-flap clock, the next event with a countdown, the weather (now, hour by hour and the coming days), upcoming events, today’s routines and tasks. [2]
  • A week calendar you swipe through, a weather page with a 24-hour view per day, task lists in columns, and a dim night clock outside screen hours. [3]
  • Keeps showing the last data when the network drops: content refreshes every 5 minutes and the weather every 30. [4]
  • The repo is written mainly as a guide for coding agents such as Claude Code or Codex to build their own version, the same way the creator started from wesbos/photo-frame-dashboard. [5]

The creator's config

Copied word for word from the creator's repository, at the commit linked in each source.

  • Phase 4 configuration (comments in Spanish, from the README) [6]

    cp android/planify.properties.example android/planify.properties
    #   planify.baseUrl=https://tu-backend/        URL de la API (obligatoria para la release)
    
    cp scripts/config.example scripts/config.local
    #   ADB_FROM=<ip-de-tu-pc>                     única IP que podrá usar ADB por Wi-Fi (vacía: solo USB)
    #   FRAME_TIMEZONE=Europe/Madrid               opcional (por defecto, la de tu PC)
    #   FRAME_NTP=pool.ntp.org                     opcional

Use-case ideas

  • Point the app at another data source by reimplementing the three backend requests it needs (sign-in, events and tasks). [7]
  • Adapt it to another Android 10 frame with root over ADB: the kiosk, per-UID firewall, screen schedule and cached data layer carry over almost unchanged. [8]

Parts and requirements

PartSpec / notesNeededPrice
XORO CPF 10PF 10.1" digital frame [9]Allwinner A133, 1 GB RAM, 1920×1200, Android 10 eng buildRequired
USB-C data cable [10]Must carry data, not only chargeRequired
Computer with adb, JDK 17+ and the Android SDK [11]Tested on LinuxRequired
  • Network: 2.4 GHz Wi-Fi with WPA2 (the frame’s chip has no WPA3 or 5 GHz); a guest network is better
  • Computer for setup: Computer with adb, JDK 17 or later and the Android SDK (compileSdk 37); tested on Linux
  • Planify-Backend reachable over HTTPS, plus an account made in Planify-APP: only if you use this app as is [12]
  • Requirements source: [13]

How it works

The frame ships with an Android 10 `eng` build that gives root over ADB, so no exploit is needed. A native Kotlin/Jetpack Compose app runs as a Device Owner kiosk and reads from a backend plus Open-Meteo, and a per-UID firewall lets only the dashboard reach the internet. Steps: 1) verify the eng build has root (adb shell id returns uid=0); 2) make a verified eMMC backup (SHA-256 of every piece); 3) pick a backend (Planify, Google Calendar, CalDAV or Home Assistant); 4) install the app as Device Owner; 5) set up the firewall and the screen schedule. Built on a XORO CPF 10PF. Other frames need a different root path; see the Wes Bos guide for other models.

LayerComponentRuns on
Dashboard appNative Kotlin and Jetpack Compose dashboard, read-only [14]Android app (android/)
KioskDevice Owner with lock task (no home or recents buttons) [15]Frame
DataPlanify-Backend (PHP + SQLite) API [16]Planify-Backend
WeatherOpen-Meteo, no API key [17]Open-Meteo
IsolationPer-UID firewall: only the dashboard reaches the internet [18]Frame

Setup effort

Skill level
Advanced

scripts/install.sh runs phases 2 and 4 to 8 in one go and can be re-run; the README says to understand each phase before launching it. [19]

Limits and caveats

  • Many similar frames use the same A133 SoC or Rockchip boards but change the build (many are user builds without root), partitions, touch and Wi-Fi. [20]
  • 1 GB of RAM and heat: continuous animations pushed the frame to 72 °C; pre-rendered frames keep it around 60 °C. [21]
  • The frame’s Wi-Fi has no WPA3 or 5 GHz, and its clock loses the time without a network. [22]

Based on

Take over a cheap Android photo frame and run your own family dashboard by @wesbos.

Hardware

  • XORO CPF 10PF 10.1" digital photo frame (1920x1200, Android 10 eng build)
  • Computer with ADB for setup

Credits and links

Sources

  1. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L3
  2. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L272
  3. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L273-L276
  4. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L281
  5. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L5
  6. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L200-L209
  7. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L189-L195
  8. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L317
  9. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L109-L126
  10. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L161
  11. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L149-L154
  12. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L163
  13. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L147-L163
  14. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L186
  15. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L216-L222
  16. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L9
  17. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L197
  18. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L228-L231
  19. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L169-L262
  20. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L307
  21. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L295
  22. github.com/eusonlito/Planify-Dashboard/blob/4365128c069dc99347b2b1b5cb138697a765ffa3/README.md?plain=1#L293-L294

This page is a short summary written by HardwareLab. Build steps, code and photos belong to the creator; follow “View original” for the full project.

Featured? Add this badge

Built this? Paste the badge into your README. It links back to this page.

Featured on HardwareLab

Markdown

[![Featured on HardwareLab](https://hardwarelab.dev/badge.svg)](https://hardwarelab.dev/projects/planify-dashboard/?utm_source=badge&utm_medium=referral&utm_campaign=launch_2w)

HTML

<a href="https://hardwarelab.dev/projects/planify-dashboard/?utm_source=badge&utm_medium=referral&utm_campaign=launch_2w"><img src="https://hardwarelab.dev/badge.svg" alt="Featured on HardwareLab" width="188" height="20"></a>