← All projects

Project 03DIY smart display

A photo frame turned digital calendar

I unlocked a cheap Frameo photo frame and turned it into a digital calendar that prioritizes my personal appointments but gives me visibility to my favorite teams' games in their own colors off to the side.

At a glance

Goal
Stop my appointments getting lost between game days
Built with
Pastigio Frameo frame, ADB, Fully Kiosk Browser, Google Apps Script, Claude
Result
4 design versions · 1 unlocked frame · $0 in software
HardwareAndroidGoogle Apps ScriptClaude

Published October 22, 2026 · Updated October 26, 2026

The problem

My Google Calendar has everything in it: my personal appointments (medical, dates, events), birthdays, holidays, and the schedules of every team I follow. That’s the Celtics, the Patriots, the Revs, Rhode Island FC, Inter, the USMNT, Germany and Formula 1 (I follow a lot of teams). With all of that in one place, my own appointments get lost in the middle of it.

The spark was a video from Syntax, Jailbreaking a $50 photo frame. The idea: cheap smart photo frames are basically Android tablets in disguise, and with a little work you can strip out the stock software and run your own web dashboard on them. I liked the idea of doing this as a DIY project rather than buying something off the shelf.

The finished calendar on the photo frame, on a kitchen counter at night in dark mode
The finished calendar on my counter (I blurred my own appointments).

Picking the frame

The design I landed on needed a 1080p screen, and to read it from across the kitchen it needed to be at least 15 inches. I compared two 15.6 inch frames on Amazon, a Pastigio and a Euphro, and went with the Pastigio. It runs Frameo, the most common photo frame software, which means more people have already opened one up (and documented it).

For comparison, an Amazon Echo Show is $349.99 and a Skylight Calendar is $319.99, and I’m not sure how much customizing you can do with either of them. The frame cost me $106.20 (with tax).

Designing it

Before buying anything, I mocked up the screen with my real calendar to see what would actually be readable. It took four versions to get it right.

Version 1: an agenda list

The first idea was a dark screen with a big clock and a list of what’s coming up for me, with games tucked into a small week strip at the bottom.

Version 1: a dark screen with a large clock on the left and a list of upcoming appointments on the right
Version 1. The events in this mockup are placeholders.

The problem: from a glance, a list makes everything look like it’s on the same day.

Version 2: a week board

Next, a light version where every day gets its own column, my plans as solid blue cards and games as small gray chips at the bottom of each day.

Version 2: a light week view with seven columns, blue cards for personal plans and gray chips for games
Version 2.

Better, but I wanted more. Two thirds of the screen for my next seven days, with appointments spaced out to reflect the time they are, and the other third for sports and holidays. That meant a bigger screen.

Version 3: a timed week, 1080p

This one moved to a 1920 by 1080 layout: a time grid from 8:00 to 20:00 where an appointment’s height matches how long it lasts, a games and holidays panel on the right, and a ticker along the bottom with the day’s games. The ticker only shows game times, never scores (I don’t want spoilers).

Version 3: a seven day time grid on the left, a games and holidays list on the right and a ticker along the bottom
Version 3.

Version 4: the one

Version 4 is the one I loved. The changes:

  • 24 hour time, plus the weather next to the clock and each day’s high and low.
  • Four days instead of seven, showing six hours starting with the current one. Anything outside that window shows up as a small “Earlier” or “Later” tag, and nothing goes missing.
  • Every game in a block with the team’s colors and logo. I gave the hex codes for the background and text color and found SVG files of the team logos. I also wanted home (H) and away (A) to be designated.
  • A big “Next up” card that’s readable from across the kitchen.
Version 4 in day mode: clock and weather, a large Next up card, a four day time grid, team colored game blocks with logos and a ticker
Version 4 during the day, with placeholder appointments.

Unlocking the frame

The unlocking turned out to be the easiest part. The creator of the Syntax video put his notes on GitHub (photo-frame-dashboard), and someone had already documented my exact frame there. Their unit needed a risky workaround to let a computer connect to it, but mine let my PC straight in after turning on ADB access in Frameo’s beta settings.

Even better, it already shipped with root access and a new enough built-in browser to run the dashboard. There was nothing to root and nothing to upgrade. From there:

  • I switched off the two apps that push updates to the frame, since an update could undo everything.
  • I installed Fully Kiosk Browser (the free version), which shows one web page full screen and opens when the frame starts up.
  • I switched off the Frameo app and Android’s status bar app (which kept crashing once Frameo wasn’t covering it up).

The messy middle: making Fully the frame’s official home screen counts as “Kiosk Mode” in Fully, which is a paid feature, and the frame greeted me with a license screen. I backed that out and used a free startup app instead (more on that below).

Making it work

The dashboard itself is a web page running on Google Apps Script, which is free and lives inside my Google account. It reads my calendars directly, pulls the local weather, and loads the team logos from a folder in my Google Drive. It refreshes every few minutes, and switches to a dark mode at sunset.

The same calendar in dark mode after sunset
After sunset it switches to dark mode on its own.

A few things didn’t work the first time:

  • The logos were invisible. I’d made them all white for the colored blocks, and the first version put each logo on a white circle. They were there, just white on white.
  • The logos still didn’t load until I gave the script access to Google Drive (I’d left that checkbox unticked when I first approved it).
  • Birthdays pushed the grid off the screen. All-day events take up a row, and the grid didn’t make room for them until it learned to shrink the hours to fit.

Night mode

One thing I noticed immediately: even in dark mode, the frame glowed. That’s the backlight, and no dark color fixes it. I wanted something like my Google Nest Hub: just the time in gray on black, and the calendar back when I need it.

The frame doesn’t have a motion sensor (the only sensor is the one that detects rotation), and Fully’s screensaver is a paid feature. The free version came in two parts:

  • The dashboard shows a gray clock between 21:00 and 6:30 after two minutes without a touch. A tap brings the calendar back.
  • A small script on the frame turns the backlight down to its lowest readable level (3 out of 255) at the same time, and back up on a tap. A free app called Termux:Boot starts it, and opens the calendar, every time the frame turns on.
The night screen: a large gray clock on a black background
The night clock.

This part took a few rounds too. The script dimmed the screen within seconds and ignored taps at first (it couldn’t find Android’s tools when it started up at boot), and then refused to dim at all (this frame reports “time ran out” with a different code than usual). It works now.

Update: on the wall, with a homemade plug

I ended up mounting the frame on the wall, below my analog clock and above the phone I use to buzz in guests from the lobby. The calendar looked right at home there, but the long black wire and the bulky black plug did not. The plug was the biggest eyesore, and I wanted something slim that only takes up one spot on the outlet (I use the other one from time to time).

The catch: the frame runs on 12 volts, and most USB-C chargers don’t offer 12V at all. I found a flat white USB-C charger that lists 12V on its label, and then needed something to sit between the charger and the frame, ask for 12V, and end in the right plug.

That plug turned out to be the hard part. The frame takes a 4.0 x 1.35 mm barrel plug, which is surprisingly rare. I couldn’t find a single cable with that plug on Amazon, and the more common 4.0 x 1.7 mm size doesn’t fit.

My first try was an off-the-shelf USB-C cable with a switchable voltage and a 4.0 x 1.35 mm tip. It worked, but every time it lost power it went back to 5 volts, and at 5 volts the frame boots but runs slow. Not something I wanted to fix by hand after every power cut.

The fix was to build my own:

  • The plug: I cut the cord off the frame’s original power adapter, which gave me the exact 4.0 x 1.35 mm plug, already wired.
  • The brains: a tiny USB-C “trigger” board that asks the charger for 12V every time it powers up. You pick the voltage by bridging one pad with a dab of solder.
  • The tools: a soldering iron, a set of helping hands and a cheap multimeter, which I used to figure out which wire was positive and to check for 12 volts before anything went near the frame.
Close-up through a magnifier of a small USB-C trigger board with two wires soldered to its positive and negative pads
The trigger board, with the 12V pad bridged and the original plug's wires soldered on.
The trigger board held in a helping hands stand on a blue silicone soldering mat, with the black cord running off to the side
The setup on my soldering mat.

The board gets wrapped in heat-shrink tubing and tucks behind the frame. Now the only things on the wall are the flat white charger and a 3 foot USB-C cable, which turned out to be exactly the right length.

The calendar mounted on a hallway wall between a large analog clock and a white lobby intercom phone, with a thin white USB-C cable running down to a flat white charger in the outlet
The after shot: on the wall, with the flat white charger in the outlet (I blurred my own appointments).

What’s next

The calendar has a permanent home on the wall now. Next on the list:

  • Hiding the wire. I’m getting a cable channel to run the cord down the wall, which hides it and keeps it from getting snagged on something.
  • Adding a motion sensor. The frame doesn’t have one built in, and I’d like the calendar to wake up when I walk by instead of waiting for a tap.
  • Adding more screens. For example, a full month calendar view, my photos (it is a photo frame, after all), and more.

Big thanks to Wes Bos and the Syntax team for the idea and for documenting the hard parts.


This page was produced with a Claude repurposing agentic workflow I built, and Claude was my build partner for the project itself: the mockups, the dashboard code and the scripts on the frame. I made the calls, tested everything, and reviewed and edited everything before it went live.