{"id":30376784,"url":"https://github.com/ozh/cadrephoto","last_synced_at":"2026-06-28T05:32:09.152Z","repository":{"id":308393212,"uuid":"1032032331","full_name":"ozh/cadrephoto","owner":"ozh","description":"✉➜🖼️ Email to photo frame for Raspberry + e-ink. Winner of Github's For The Love Of Code 2025 !","archived":false,"fork":false,"pushed_at":"2025-10-25T11:43:03.000Z","size":503,"stargazers_count":21,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-18T20:04:23.335Z","etag":null,"topics":["e-ink","eink","fortheloveofcode","python","raspberry","raspberry-pi"],"latest_commit_sha":null,"homepage":"","language":"Python","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/ozh.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":"2025-08-04T17:42:42.000Z","updated_at":"2026-02-16T12:24:06.000Z","dependencies_parsed_at":"2025-08-05T18:36:07.206Z","dependency_job_id":"64a96414-5d9b-45ca-8dfb-0e8d2132825c","html_url":"https://github.com/ozh/cadrephoto","commit_stats":null,"previous_names":["ozh/cadrephoto"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ozh/cadrephoto","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozh%2Fcadrephoto","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozh%2Fcadrephoto/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozh%2Fcadrephoto/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozh%2Fcadrephoto/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ozh","download_url":"https://codeload.github.com/ozh/cadrephoto/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozh%2Fcadrephoto/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34878963,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-28T02:00:05.809Z","response_time":54,"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":["e-ink","eink","fortheloveofcode","python","raspberry","raspberry-pi"],"created_at":"2025-08-20T15:26:09.073Z","updated_at":"2026-06-28T05:32:09.129Z","avatar_url":"https://github.com/ozh.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"# ✉➜🖼️  Cadrephoto\n\u003e An email-to-photo-frame for your Grandma, powered by Raspberry Pi and eink display\u003cbr/\u003e\n\n**Cadrephoto** (_french for \"photo frame\"_) is a project that allows you to send photos\non a digital photo frame **via email** : no app needed, no knowledge, perfect for users\nof all ages and who may not be tech-savvy.\n\n\u003cimg width=\"1280\" height=\"640\" alt=\"image\" src=\"https://github.com/user-attachments/assets/a1295404-95e5-44e1-a95a-6fe6610597b7\" /\u003e\n\n## 📑 Table of Contents\n- [💡 Features](#-features)\n- [🖥️ Hardware](#%EF%B8%8F-hardware)\n- [⚙️ Installation](#%EF%B8%8F-installation)\n- [🧩 Setup the service](#-setup-the-service)\n- [📸 Pictures](#-pictures)\n- [📝 Inspiration \u0026 License](#-inspiration-and-license)\n \n# 💡 Features \u003ca href=\"#-table-of-contents\"\u003eꜛ\u003c/a\u003e\n\nThe principle is the following:\n\n- Raspberry Pi runs a Python script displaying photos on an eink screen\n- It checks at regular intervals for new emails on a given email account\n- When a new email with a photo arrives, the photo is displayed on the screen\n- Email sender and photo frame owner receive an email notification\n- Only the most recent photos are kept, making things ephemeral and an incentive to send newer pics ;)\n- Everything is fully configurable via a simple configuration file\n\nThe buttons on the frame are used to perform various actions:\n\n- ⏺ **Button 1 (short press)** → display next photo (when Grandma wants something new)\n- ⏺ **Button 2 (long press)** → delete current photo (if Grandma doesn’t like it)\n- ⏺ **Button 3 (long press)** → debug screens with useful info (for curious Grandpa)\n- ⏺ **Button 4 (long press)** → clean shutdown of the Raspberry Pi (when Grandma relocates the frame)\n\n# 🖥️ Hardware \u003ca href=\"#-table-of-contents\"\u003eꜛ\u003c/a\u003e\n\n- A [Pimoroni Inky Impressions](https://shop.pimoroni.com/products/inky-impression-7-3) eink display (I used the 7.3\")\n- Any Raspberry Pi (built on a Raspberry Pi Zero 2 so any model should work)\n- Obviously all the required stuff to run a Raspberry Pi (power supply, SD card, etc.)\n- A case (I slightly hacked an Ikea 13 cm x 18 cm frame to house the screen ; there are also lots of 3D print templates available)\n\n# ⚙️ Installation \u003ca href=\"#-table-of-contents\"\u003eꜛ\u003c/a\u003e\n\n1. You'll want to create a **dedicated email account**, on a server that supports IMAP\nand SMTP (most email providers should work) to receive the photos, since the script\nwill delete all emails after processing them.\n\u003cbr/\u003e(The wow factor with Grandma and her grand kids from having an email such as `photoframe@your-domain.com` is neat ;)\n\n\n2. Then, dependencies. You'll have to `pip install` the following Python packages:\n\n* [`inky`](https://github.com/pimoroni/inky) (check [this guide](https://learn.pimoroni.com/article/getting-started-with-inky-impression) if you're new to this)\n* `pillow`\n* `pillow-heif`\n* `lgpio` and `gpiod`\n* `python-dotenv`\n\u003cbr/\u003e(as always, all packages must be installed in the virtual environment -- I sticked to the\none created by the Pimoroni Inky setup script)\n\n3. Clone this repository, copy the [`.env-example`](https://github.com/ozh/cadrephoto/blob/master/.env-example) file to `.env`, and edit everything\nto match your setup.\n\n\n4. Test the script by running it : `python -u main.py` (in the appropriate virtual environment)\u003cbr/\u003e\nIf everything is set up correctly, you can setup the service, see below.\u003cbr/\u003e\nIf not, I included a few [tests](https://github.com/ozh/cadrephoto/blob/master/tests/) to help you troubleshoot things.\n\n\n# 🧩 Setup the service \u003ca href=\"#-table-of-contents\"\u003eꜛ\u003c/a\u003e\n\nOnce everything is working, you can setup the service, so the script runs automatically\nat Raspberry boot, and restarts if it crashes.\n\n1. Create a systemd service file \n\n```bash\n$ sudo nano /etc/systemd/system/cadrephoto.service\n```\n\n2. Copy the following content into the file and modify it to match paths and user :\n```ini\n[Unit]\nDescription=Cadrephoto\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nExecStart=/home/ozh/.virtualenvs/pimoroni/bin/python /home/ozh/cadrephoto/app.py\nWorkingDirectory=/home/ozh/cadrephoto\nRestart=always\nRestartSec=120\nUser=ozh\nStandardOutput=journal\nStandardError=journal\n\n[Install]\nWantedBy=multi-user.target\n```\n\n3. Enable and start the service :\n```bash\n$ sudo systemctl daemon-reload\n$ sudo systemctl enable cadrephoto.service\n$ sudo systemctl start cadrephoto.service\n```\n\n4. You can now :\n```bash\n# Check the status of the service:\n$ sudo systemctl status cadrephoto.service\n\n# Stop the service:\n$ sudo systemctl stop cadrephoto.service\n\n# View the logs in real-time:\n$ journalctl -u cadrephoto.service -f\n```\n\n5. I think it's a good idea to install [`log2ram`](https://github.com/azlux/log2ram) to avoid writing constantly on the\nSD card, which is not good for its longevity.\n\n# 📷 Pictures \u003ca href=\"#-table-of-contents\"\u003eꜛ\u003c/a\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003ePhoto frame full shot\u003c/summary\u003e\n  \n  ![20250818_183325](https://github.com/user-attachments/assets/45d28f79-7cd3-46d4-94b0-2435c51b2b06)\n  \n  Button A displays next photo. Button B deletes current photo.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eDebug screens\u003c/summary\u003e\n\n  Long Press on Button C displays a debug screen with various info, then another screen with the application log\n\n  ![20250818_162448](https://github.com/user-attachments/assets/d0e69d0f-2d7c-48fb-bb32-1a7a159c9a07)\n  \n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eShutdown screen\u003c/summary\u003e\n  \n  ![20250818_172115](https://github.com/user-attachments/assets/2e69535d-47e5-4088-8454-aea31b040409)\n  \n  (Customisable message like everything in the project)\n\u003c/details\u003e\n\n\n# 📝 Inspiration and License \u003ca href=\"#-table-of-contents\"\u003eꜛ\u003c/a\u003e\n\nThis was my first Raspberry Pi project and first Python project 🎉.\n\nSpecial thanks to projects that inspired me:\n* https://github.com/NotmoGit/AstroInky\n* https://github.com/tymzd/InkMemories\n\nAny crappy code is mine alone 😉\n\nProject licensed under the WTF Public License. [![WTFPL](https://www.wtfpl.net/wp-content/uploads/2012/12/wtfpl-badge-4.png)](http://www.wtfpl.net/about/)\nFeel free to do whatever the hell you want with it.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fozh%2Fcadrephoto","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fozh%2Fcadrephoto","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fozh%2Fcadrephoto/lists"}