From 71c88cbdb635eeb7e3ed21ab8417862f39e67f01 Mon Sep 17 00:00:00 2001 From: Mario Lurig Date: Mon, 16 Feb 2026 11:57:55 -0700 Subject: [PATCH 1/3] LFS for PNG --- .gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..24a8e87 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.png filter=lfs diff=lfs merge=lfs -text From 1e426060017cb94cb4ee623acf278289bdc1db62 Mon Sep 17 00:00:00 2001 From: Mario Lurig Date: Mon, 16 Feb 2026 12:04:55 -0700 Subject: [PATCH 2/3] github stuff workflow for validating image size and generating gallery for 800x480 script for generating gallery PR template README added Screens section --- .github/PULL_REQUEST_TEMPLATE.md | 6 +++ .github/workflows/validate-images.yml | 41 +++++++++++++++++++ README.md | 25 ++++++++++++ generate_gallery.py | 59 +++++++++++++++++++++++++++ 4 files changed, 131 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/validate-images.yml create mode 100644 generate_gallery.py diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..1b6386d --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,6 @@ +# Screens PR +> I certify that these images I'm adding have been tested at [tailor.trmnl.com](https://tailor.trmnl.com) + +For all imagery used in these images, I have the right to publish them as CC0 licensed files. +**OR** +All imagery can be distributed freely and was sourced here: \ No newline at end of file diff --git a/.github/workflows/validate-images.yml b/.github/workflows/validate-images.yml new file mode 100644 index 0000000..76a842c --- /dev/null +++ b/.github/workflows/validate-images.yml @@ -0,0 +1,41 @@ +name: Image Validation and Gallery Update + +on: + push: + branches: [ main ] + pull_request: + paths: + - 'screens/800x480/**' + +jobs: + process-images: + runs-on: ubuntu-latest + permissions: + contents: write # Needed to push the GALLERY.md update + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Validate PNG dimensions + run: | + FILES=$(find screens/800x480 -name "*.png") + for FILE in $FILES; do + DIMENSIONS=$(identify -format "%wx%h" "$FILE") + if [ "$DIMENSIONS" != "800x480" ]; then + echo "::error file=$FILE::Invalid dimensions: $DIMENSIONS. Must be 800x480." + exit 1 + fi + done + + - name: Generate Gallery + run: python3 generate_gallery.py + + - name: Commit and Push Gallery + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + run: | + git config --global user.name "Gallery Bot" + git config --global user.email "bot@github.com" + git add GALLERY_800x480.md + git diff --quiet && git diff --staged --quiet || (git commit -m "docs: update 800x480 gallery" && git push) \ No newline at end of file diff --git a/README.md b/README.md index ea2c8c1..3c74ea6 100644 --- a/README.md +++ b/README.md @@ -15,3 +15,28 @@ You can make customizations to the following brand attributes 4. Install emscripten eg: `brew install emscripten` 5. Compile and create a wasm file `bash build.sh` 6. open `index.html` on your browser. + +# Community Screens +[tailor.trmnl.com](https://tailor.trmnl.com/) +Customize TRMNL with Tailor, our firmware tool that writes custom splash and loading screens for your TRMNL device. + +## Devices Supported +- TRMNL OG (800x480) + +## Folder and File Structure +``` +screens/ +├─ 800x480/ +│ ├─ CATEGORY/ +│ │ ├─ splash/ +│ │ ├─ loading/ +``` +> New categories and subsequent folders can be created as part of a Pull Request. + +### Filename Structure +Hyphen separated sections, with underscore for spaces within a section. _Credit is optional._ +**WIDTHxHEIGHT-TYPE-UNIQUE_NAME-CREDIT?.png** +_e.g._ +`800x480-splash-dungeon_crawler_carl_safehouse-mashermello.png` +`800x480-loading-dungeon_crawler_carl_princess_donut.png` + diff --git a/generate_gallery.py b/generate_gallery.py new file mode 100644 index 0000000..1557435 --- /dev/null +++ b/generate_gallery.py @@ -0,0 +1,59 @@ +import os +import urllib.parse + +# Configuration +BASE_DIR = "screens/800x480" +OUTPUT_FILE = "GALLERY_800x480.md" +REPO_URL = "https://github.com/usetrmnl/trmnl-designs/raw/main" + +def generate_gallery(): + # Adjusted title and back-link reference for the specific size + markdown = [ + "# 🖼️ 800x480 Screen Gallery", + "Browse and download splash and loading screens for TRMNL OG. All images are pre-validated to **800x480 PNG**.\n", + "> **Tip:** Right-click 'Download' and select 'Save Link As...' to save directly to your device.\n" + ] + + if not os.path.exists(BASE_DIR): + print(f"Directory {BASE_DIR} not found. Skipping.") + return + + # Table of Contents + categories = sorted([d for d in os.listdir(BASE_DIR) if os.path.isdir(os.path.join(BASE_DIR, d))]) + markdown.append("### 📂 Categories") + for cat in categories: + markdown.append(f"- [{cat.replace('_', ' ').title()}](#{cat.lower()})") + markdown.append("\n---\n") + + for category in categories: + cat_name = category.replace('_', ' ').title() + markdown.append(f"## {cat_name}") + markdown.append("| Type | Preview | Action |") + markdown.append("| :--- | :--- | :--- |") + + cat_path = os.path.join(BASE_DIR, category) + for sub in ["splash", "loading"]: + sub_path = os.path.join(cat_path, sub) + if os.path.exists(sub_path): + files = sorted([f for f in os.listdir(sub_path) if f.lower().endswith('.png')]) + for f in files: + img_path = f"{sub_path}/{f}" + encoded_path = urllib.parse.quote(img_path) + download_url = f"{REPO_URL}/{encoded_path}" + + # Using HTML for controlled scaling in the Markdown table + preview = f'{f}' + download_link = f"**[💾 Download]({download_url})**" + + markdown.append(f"| {sub.capitalize()} | {preview} | {download_link}
`{f}` |") + + # Anchor link back to the specific 800x480 header + markdown.append("\n[↑ Back to Top](#-800x480-screen-gallery)\n") + markdown.append("---\n") + + with open(OUTPUT_FILE, "w") as f: + f.write("\n".join(markdown)) + print(f"Successfully generated {OUTPUT_FILE}") + +if __name__ == "__main__": + generate_gallery() \ No newline at end of file From b5bc51b39092756f656f263084b03c8a7cf2491b Mon Sep 17 00:00:00 2001 From: Mario Lurig Date: Mon, 16 Feb 2026 17:18:20 -0700 Subject: [PATCH 3/3] License clarifications --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- README.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 1b6386d..a4d9d12 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,4 +3,4 @@ For all imagery used in these images, I have the right to publish them as CC0 licensed files. **OR** -All imagery can be distributed freely and was sourced here: \ No newline at end of file +All imagery is Public Domain and was sourced here: \ No newline at end of file diff --git a/README.md b/README.md index 3c74ea6..b8b0c52 100644 --- a/README.md +++ b/README.md @@ -40,3 +40,5 @@ _e.g._ `800x480-splash-dungeon_crawler_carl_safehouse-mashermello.png` `800x480-loading-dungeon_crawler_carl_princess_donut.png` +### License +Any PR'd screens will fall under either CC0 (you own the rights and choose this license) or Public Domain licensing for us to be able to host them and have traceability. \ No newline at end of file