explaingit

marstechhan/papercolor-frame

3CAudience · developerComplexity · 4/5ActiveLicenseSetup · hard

TLDR

Open-source ESP32-S3 firmware for a 6-color E Ink photo frame. Hosts its own Wi-Fi and a phone web app to upload, crop, dither, and display photos with no cloud.

Mindmap

mindmap
  root((PaperColor-Frame))
    Inputs
      Photos uploaded from phone
      Colorimeter readings
      Button presses
    Outputs
      6 color E Ink display
      4bpp framebuffer
      Captive portal web UI
    Use Cases
      DIY digital photo frame
      E Ink dithering experiments
      M5Stack PaperColor firmware
    Tech Stack
      ESP-IDF
      C
      WebAssembly
      Emscripten

Things people build with this

USE CASE 1

Flash custom firmware onto an M5Stack PaperColor E Ink photo frame

USE CASE 2

Experiment with browser-side WASM dithering for 6-color E Ink panels

USE CASE 3

Build a no-cloud photo frame that serves its own Wi-Fi and web app

USE CASE 4

Calibrate a 6-color E Ink display using colorimeter readings

Tech stack

CESP-IDFWebAssemblyEmscriptenNode.js

Getting it running

Difficulty · hard Time to first run · 1day+

Needs ESP-IDF 5.x with ESP32-S3 toolchain plus Emscripten and Node.js, and the build script expects a Homebrew Emscripten path.

GPL-3.0-only requires that any distributed modifications or derivative works are also released under GPL-3.0.

In plain English

PaperColor Frame is open-source firmware for a small digital photo frame that uses a six-color E Ink screen. The target hardware is an ESP32-S3 board from a family called M5Stack PaperColor, with an SD card slot, buttons, status lights, and a 4-inch reflective color display. The README says the frame creates its own Wi-Fi hotspot and serves a phone-friendly web page, so you can upload and manage photos from a browser without any cloud account or separate app. The web interface lets you upload images, see them as a wall of polaroid-style cards, and send any photo to the screen. Before sending, you can rotate, fit, and crop the image, preview how the dithering will look, apply presets, or hand-tune the color. The image conversion that turns a normal photo into something a six-color E Ink panel can show is done in the browser using a WebAssembly module, producing a packed 4-bit-per-pixel framebuffer. There are two dithering paths, one called Classic VED and a newer one called E6 Mix that is tuned for real reflective ink. The firmware also exposes a calibration screen where you type in colorimeter readings for the solid inks and optional mixed patches, so the conversion can be matched to the actual screen. Photos are stored on the SD card by default and fall back to internal flash storage when no card is present. Other settings cover slideshow timing, sleep behavior, status light brightness, Wi-Fi password, and language. Building it needs ESP-IDF 5.x with ESP32-S3 support, plus Emscripten for the browser-side dither module and Node.js for a small smoke test. The repo is organized into firmware source, an embedded web app, documentation on the color pipeline and implementation, host-side test helpers, and standard ESP partition files. The README has English and Chinese sections side by side. The license is GPL-3.0-only.

Copy-paste prompts

Prompt 1
Walk me through flashing PaperColor-Frame to an ESP32-S3 board with ESP-IDF 5.x
Prompt 2
Show me how the WASM dither module in web_wasm/ converts an RGB photo to a 4bpp 6-color framebuffer
Prompt 3
Explain the captive portal HTTP API in main/http_server.* and how the phone web UI talks to it
Prompt 4
Help me add a new dithering preset alongside Classic VED and E6 Mix in main/dither.*
Prompt 5
Trace how power_manager.* coordinates buttons, sleep, and the PMIC for low-power behavior
Open on GitHub → Explain another repo

Generated 2026-05-22 · Model: sonnet-4-6 · Verify against the repo before relying on details.