docs: add MIT license and README

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-31 13:39:27 -04:00
parent ece72b339b
commit b034873b0d
2 changed files with 118 additions and 0 deletions

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 cottongin
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

97
README.md Normal file
View File

@@ -0,0 +1,97 @@
> [!IMPORTANT]
> This project was developed entirely with AI coding assistance (Claude Opus 4.6 via Cursor IDE) and has not undergone rigorous review. It is provided as-is and may require adjustments for other environments.
# Immich Frame
![PaperColor displaying a photo from Immich](docs/PaperColor.jpg)
An ESP32 firmware for the [M5Stack PaperColor](https://shop.m5stack.com/products/m5paper-color-esp32s3-dev-kit) e-ink display that turns it into a digital photo frame powered by your [Immich](https://immich.app/) server.
## Features
- **Photo cycling modes** -- random, chronological, reverse-chronological, favorites-weighted, and recency-weighted
- **Deep sleep with batch caching** -- fetches multiple photo IDs per wake cycle to minimize network calls and extend battery life
- **6-color e-ink rendering** -- Floyd-Steinberg dithering calibrated to the Spectra 6 palette with blue noise smoothing
- **Portrait pairing** -- automatically pairs two portrait photos side-by-side
- **Metadata overlays** -- date, time, location, people, album, and camera info as caption bars or corner badges
- **Web UI** -- configure all settings, manage albums, trigger actions, and download wake logs from your browser
- **Wake logging** -- persistent CSV log of each photo cycle that survives reboots and deep sleep
## Hardware
- [M5Stack PaperColor](https://shop.m5stack.com/products/m5paper-color-esp32s3-dev-kit) -- ESP32-S3R8 (16MB flash, 8MB PSRAM), 4" 600x400 Spectra 6 e-ink display, 1250mAh battery, 2.4 GHz Wi-Fi
## Requirements
- [PlatformIO](https://platformio.org/) (CLI or IDE plugin)
- An [Immich](https://immich.app/) server with an API key
## Getting Started
1. Clone the repository:
```bash
git clone https://code.cottongin.xyz/cottongin/immich-frame.git
cd immich-frame
```
2. Build and flash:
```bash
pio run -t upload
```
3. On first boot the device creates a `PaperColor-Setup` WiFi access point. Connect to it and open `192.168.4.1` in your browser.
4. Enter your WiFi credentials, Immich server URL, and API key. The device reboots and begins displaying photos.
## Usage
The PaperColor has three user buttons along the top edge (left to right: Top, Up, Down) and a power button on the side.
**Single press:**
| Button | Action |
|--------|--------|
| Top | Show a random photo |
| Up | Next photo |
| Down | Play / pause slideshow |
**Combos and holds:**
| Input | Action |
|-------|--------|
| Top double-press | Enter deep sleep |
| Top + Down hold (3s) | Enter deep sleep |
| Up hold (5s) | Factory reset (erases all settings, reboots) |
**LED feedback:**
- White flash on any button press
- Red flash when entering deep sleep
- Green pulse while charging
- Orange pulse at low battery, red pulse at critical
**Deep sleep:** In deep sleep mode the device wakes on a timer, fetches and displays a photo, then sleeps again. The interval and batch size are configured via the web UI. Press the power button to wake manually.
## Configuration
Once connected to your network, access the web UI at `http://papercolor.local` to manage:
- **Slideshow** -- interval (2m to custom), cycling mode, image quality, deep sleep batch size
- **Display** -- metadata overlay content and position, translucent badge backgrounds
- **Albums** -- filter photos by specific Immich albums
- **Device** -- sync time, download/clear wake logs, deep sleep, reboot, factory reset
## Tools
The `tools/` directory contains standalone HTML utilities for analyzing wake log CSV files:
- `log-viewer.html` -- chart and table view of a single wake log
- `log-compare.html` -- side-by-side comparison of multiple wake logs
Open them directly in your browser; no server required.
## License
[MIT](LICENSE)