skills/frame-tv/SKILL.md
Generate or resize art for Samsung Frame TV displays using AI image generation. Use this skill when the user asks to generate wall art, create art for their Samsung Frame TV, make TV art, generate an image for their Frame TV, resize an image for Frame TV, or wants AI-generated artwork for display. Powered by Google Gemini (nano-banana-2 style).
npx skillsauth add agairola/life-skills frame-tvInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate AI artwork or resize existing images for Samsung Frame TV displays. Uses Google Gemini (nano-banana-2 style) for image generation and Pillow for precision resizing.
npx skills add agairola/life-skills --skill frame-tv
Trigger this skill when the user:
brew install uv (macOS) or pip install uv (all platforms)GEMINI_API_KEY required for image generation (free at Google AI Studio). Not needed for resize-only mode.uv run.See references/api_upgrade.md for API key setup instructions.
!command -v uv > /dev/null 2>&1 && echo "uv: installed" || echo "uv: NOT INSTALLED"
!test -n "${GEMINI_API_KEY:-}" && echo "GEMINI_API_KEY: set" || (test -f ~/.nano-banana/.env && echo "GEMINI_API_KEY: found in ~/.nano-banana/.env") || echo "GEMINI_API_KEY: NOT SET (needed for generation, not resize)"
uv run "${CLAUDE_SKILL_DIR}/scripts/frame_tv_art.py" [OPTIONS]
| Flag | Values | Default | Purpose |
|------|--------|---------|---------|
| --prompt / -p | text | (none) | Text prompt for AI image generation |
| --resize / -r | file path | (none) | Resize an existing image for Frame TV |
| --input-image / -i | file path(s) | (none) | Reference image(s) for generation (up to 14, repeatable) |
| --tv / -t | 32, 43, 50, 55, 65, 75, 85 | 55 | Samsung Frame TV size in inches |
| --resolution | 512px, 1K, 2K, 4K | 4K | Generation resolution preset (auto-detected from input image if not set) |
| --output-dir / -o | directory path | art | Output directory |
| --model / -m | Gemini model ID | gemini-3.1-flash-image-preview | Gemini model to use |
| --aspect / -a | ratio (e.g., 16:9) | 16:9 | Aspect ratio (passed via API image_config) |
| --api-key | API key string | (none) | Gemini API key (overrides env vars) |
| --preview | (flag) | off | Generate a quick 512px preview (use --upscale to finalize) |
| --upscale | file path | (none) | Upscale a preview image to full 4K resolution |
| --dry-run | (flag) | off | Validate without API call |
Only parse stdout (JSON). Stderr contains diagnostics only.
# Preview first, then upscale (RECOMMENDED workflow)
uv run "${CLAUDE_SKILL_DIR}/scripts/frame_tv_art.py" --prompt "calm ocean sunset, oil painting style" --preview
# → shows 512px preview, user reviews it
# → if approved, run the upscale_command from the JSON output:
uv run "${CLAUDE_SKILL_DIR}/scripts/frame_tv_art.py" --upscale art/frame_art_<timestamp>_raw.png
# Generate directly at 4K (skip preview)
uv run "${CLAUDE_SKILL_DIR}/scripts/frame_tv_art.py" --prompt "calm ocean sunset, oil painting style"
# Generate for a specific TV size
uv run "${CLAUDE_SKILL_DIR}/scripts/frame_tv_art.py" --prompt "Japanese garden in autumn" --tv 65
# Resize an existing image for Frame TV
uv run "${CLAUDE_SKILL_DIR}/scripts/frame_tv_art.py" --resize /path/to/image.jpg --tv 55
# Use a reference image for style/content guidance
uv run "${CLAUDE_SKILL_DIR}/scripts/frame_tv_art.py" --prompt "in this style but with autumn colors" --input-image ref.jpg
# Multiple reference images
uv run "${CLAUDE_SKILL_DIR}/scripts/frame_tv_art.py" --prompt "combine these styles" --input-image style1.jpg --input-image style2.jpg
# Square aspect ratio (for specific art styles)
uv run "${CLAUDE_SKILL_DIR}/scripts/frame_tv_art.py" --prompt "abstract geometric art" --aspect 1:1
# Specify resolution preset
uv run "${CLAUDE_SKILL_DIR}/scripts/frame_tv_art.py" --prompt "landscape painting" --resolution 2K
# Pass API key directly
uv run "${CLAUDE_SKILL_DIR}/scripts/frame_tv_art.py" --prompt "ocean sunset" --api-key "your-key-here"
# Dry run to check config
uv run "${CLAUDE_SKILL_DIR}/scripts/frame_tv_art.py" --prompt "test" --dry-run
# Resize for a smaller 32" TV (1080p)
uv run "${CLAUDE_SKILL_DIR}/scripts/frame_tv_art.py" --resize photo.jpg --tv 32
Follow the formatting rules in ../../references/platform-formatting.md. Key skill-specific formatting below.
Frame TV Art Preview:
Prompt: "calm ocean sunset, oil painting style"
Preview: art/frame_art_20260319_143022_raw.png (512px)
Does this look good? If yes, I'll generate the full 4K version for your 55" TV.
When the user approves, run the upscale_command from the JSON output. After upscale:
Frame TV Art — Full Resolution:
Prompt: "calm ocean sunset, oil painting style"
TV Size: 55" (3840×2160)
Upscaled from preview → 3840×2160
Output: art/frame_art_55in_20260319_143122.jpg
Transfer tip: Copy to USB drive for best quality — avoids compression from phone/cloud transfer.
Frame TV Art Generated:
Prompt: "calm ocean sunset, oil painting style"
TV Size: 55" (3840×2160)
Generated: 1024×1024 → resized to 3840×2160
Output: art/frame_art_55in_20260319_143022.jpg
Transfer tip: Copy to USB drive for best quality — avoids compression from phone/cloud transfer.
Image Resized for Frame TV:
Input: vacation_photo.jpg (4000×3000)
TV Size: 55" (3840×2160)
Output: art/vacation_photo_frame_55in_20260319_143022.jpg (3840×2160)
Transfer tip: Copy to USB drive for best quality.
| TV Size | Resolution | |---------|-----------| | 32" | 1920×1080 (Full HD) | | 43" | 3840×2160 (4K UHD) | | 50" | 3840×2160 (4K UHD) | | 55" | 3840×2160 (4K UHD) | | 65" | 3840×2160 (4K UHD) | | 75" | 3840×2160 (4K UHD) | | 85" | 3840×2160 (4K UHD) |
For best quality on your Frame TV:
Avoid transferring via messaging apps (WhatsApp, iMessage) — they compress images significantly.
Image generation uses Google Gemini (nano-banana-2 approach) with gemini-3.1-flash-image-preview. Aspect ratio and resolution are passed via image_config in the API config (not just prompt text). Supports reference/input images sent alongside the prompt. Handles multiple output images from a single generation. RGBA images are converted to RGB before JPEG saving. Images are resized to exact TV dimensions using Pillow's LANCZOS resampling. Output is high-quality JPEG (quality=92, no chroma subsampling).
content-media
Extract transcripts from YouTube videos. Use when the user asks for a transcript, subtitles, or captions of a YouTube video and provides a YouTube URL (youtube.com/watch?v=, youtu.be/, or similar). Supports output with or without timestamps.
development
Check the current UV index and sun safety advice for Australian cities. Use this skill when the user asks about UV index, sunscreen, sun protection, sunburn risk, whether it's safe to be outside in the sun, SPF recommendation, or sun safety for any Australian city. Works with zero configuration — no API keys needed.
development
Check live traffic incidents, roadworks, and hazards in Sydney. Use this skill when the user asks about traffic jams, road closures, accidents, roadworks, traffic conditions, how the traffic is, M5 traffic, highway conditions, or any Sydney traffic question. Works without API keys (provides Live Traffic NSW/Google Maps links) but best with a free TfNSW API key for real-time incident data.
development
Check Sydney toll road prices and calculate route toll costs. Use this skill when the user asks about toll prices, toll costs, how much the toll is, M2 toll, harbour bridge toll, tunnel toll, cheapest route, toll calculator, E-Tag, Linkt, or any Sydney toll road question. Works with zero configuration — no API keys needed.