DEV Community

ULNIT
ULNIT

Posted on

I Built an AI Thumbnail Generator in Pure Python — It Runs on a $35 Raspberry Pi

The Problem with Thumbnails

Every YouTuber knows the pain: you spend hours editing a video, and then another 45 minutes wrestling with Canva or Photoshop just to make a thumbnail. Multiply that by 3 videos a week, and you're losing 2+ hours to something that should be automated.

I got tired of it. So I built an AI Thumbnail Generator in pure Python that creates professional thumbnails, blog featured images, and social media graphics — in under 2 seconds per image.

How It Works

At its core, it's Python + Pillow. No cloud AI APIs. No GPU. No monthly subscription. Just a single Python script that:

  1. Takes a title (and optional subtitle)
  2. Picks a preset (YouTube, blog, Twitter/X, LinkedIn, Instagram, Story, product hero)
  3. Applies a color palette (8 choices — purple, green, blue, orange, pink, dark, yellow, hot pink)
  4. Renders a gradient background, wraps text intelligently, adds icon decorations and a watermark
  5. Saves a 400KB optimized PNG ready to upload

Here's the core rendering logic:

from PIL import Image, ImageDraw, ImageFont
import textwrap, random

PRESETS = {
    'youtube': (1280, 720),
    'blog': (1200, 630),
    'twitter': (1200, 675),
    'linkedin': (1200, 627),
    'instagram': (1080, 1080),
    'story': (1080, 1920),
    'product': (1200, 800),
}

PALETTES = {
    'purple': ('#4A0E4E', '#7B2D8E'),
    'green': ('#0D3B0D', '#2E7D32'),
    'blue': ('#0D2137', '#1565C0'),
    'orange': ('#3E1A00', '#E65100'),
    'pink': ('#3D0A2E', '#C2185B'),
    'dark': ('#121212', '#333333'),
    'yellow': ('#3D2E00', '#F9A825'),
    'hotpink': ('#3D0030', '#FF1493'),
}

def generate_thumbnail(title, preset='youtube', palette='purple', subtitle=None):
    width, height = PRESETS[preset]
    bg1, bg2 = PALETTES[palette]

    img = Image.new('RGB', (width, height))
    draw = ImageDraw.Draw(img)

    # Gradient background
    for y in range(height):
        r1, g1, b1 = int(bg1[1:3], 16), int(bg1[3:5], 16), int(bg1[5:7], 16)
        r2, g2, b2 = int(bg2[1:3], 16), int(bg2[3:5], 16), int(bg2[5:7], 16)
        ratio = y / height
        r, g, b = int(r1 + (r2 - r1) * ratio), int(g1 + (g2 - g1) * ratio), int(b1 + (b2 - b1) * ratio)
        draw.line([(0, y), (width, y)], fill=(r, g, b))

    # Text rendering with auto-wrap
    font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", size=48)
    lines = textwrap.wrap(title, width=30)
    y_pos = height // 3
    for line in lines:
        bbox = draw.textbbox((0, 0), line, font=font)
        text_width = bbox[2] - bbox[0]
        draw.text(((width - text_width) // 2, y_pos), line, fill='white', font=font)
        y_pos += 60

    if subtitle:
        sub_font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", size=28)
        bbox = draw.textbbox((0, 0), subtitle, font=sub_font)
        sw = bbox[2] - bbox[0]
        draw.text(((width - sw) // 2, y_pos + 20), subtitle, fill='#CCCCCC', font=sub_font)

    # Accent border
    draw.rectangle([0, 0, width-1, height-1], outline='#FFD700', width=3)

    return img
Enter fullscreen mode Exit fullscreen mode

That's the entire engine. No external APIs. No cloud costs. Zero dependencies beyond Pillow. It runs on a Raspberry Pi 4 with 2GB RAM without breaking a sweat.

Batch Mode: 7 Thumbnails, 1 Command

Need thumbnails for every platform at once? Batch mode generates all 7 presets simultaneously:

python3 engine.py "AI Automation in 2026" --batch
Enter fullscreen mode Exit fullscreen mode

Output:

✅ Saved: output/ai-automation-in-2026_youtube.png
✅ Saved: output/ai-automation-in-2026_blog.png
✅ Saved: output/ai-automation-in-2026_twitter.png
✅ Saved: output/ai-automation-in-2026_linkedin.png
✅ Saved: output/ai-automation-in-2026_instagram.png
✅ Saved: output/ai-automation-in-2026_story.png
✅ Saved: output/ai-automation-in-2026_product.png
DONE — 7 images in < 2 seconds
Enter fullscreen mode Exit fullscreen mode

API Mode for Automated Pipelines

Need to integrate thumbnail generation into a CI/CD pipeline or content automation workflow? Fire it up in API mode:

python3 engine.py --api --port 8899
Enter fullscreen mode Exit fullscreen mode

Then POST a JSON payload:

curl -X POST http://localhost:8899/generate   -H "Content-Type: application/json"   -d '{"title": "My New Video", "preset": "youtube", "palette": "blue"}'
Enter fullscreen mode Exit fullscreen mode

Returns the generated image path. This is how I've plugged it into my Hermes Agent cron pipeline — every morning at 9am, a new thumbnail is auto-generated for the daily social media post.

The $35 Stack

Here's what's wild: this entire setup — the thumbnail generator, the cron scheduler, the social media pipelines, the dev.to auto-publisher, the AI trading signals, the API gateway — all runs on a single $35 Raspberry Pi 4, 24/7.

No AWS bill. No Vercel. No serverless cold starts. Just a tiny ARM board sitting in my living room, quietly pumping out content, images, and API responses around the clock.

Comparison: What You Actually Get

Tool Price Automation Self-Hosted Pi-Compatible
AI Thumbnail Pro $5 one-time ✅ Full API
Canva $13/mo ❌ Manual ❌ Cloud
Photoshop $23/mo ❌ Manual ❌ Desktop
Midjourney $10/mo ❌ Prompt only ❌ Cloud

$5 once vs. $156/year for Canva. The math isn't hard.

Try It Yourself

The full source code is open source on GitHub:

👉 github.com/ulnit/ai-thumbnail-pro

Star it, fork it, run it on your Pi. If it saves you even 2 hours of thumbnail-making this month, it paid for itself 20x over.


Building AI tools that run on a Pi and actually make money. If you find this useful, consider buying me a coffee:paypal.me/ulnit

Top comments (0)