Reddit Quote Carousel Topaz
Create an Instagram carousel from a popular-picks list with Reddit quotes + Topaz 2x upscaling. Cover = "clean" style ("Top CATEGORY in Destination"), attrac...
技能说明
name: reddit-quote-topaz description: Create an Instagram carousel from a popular-picks list with Reddit quotes + Topaz 2x upscaling. Cover = "clean" style ("Top CATEGORY in Destination"), attraction slides = "quote" style with Reddit quotes + subreddit attribution. All photos Topaz-enhanced before overlay. Trigger phrase "reddit-quote-topaz". Use when Bernard says "reddit-quote-topaz" or wants a Topaz-enhanced Reddit-quote carousel.
Reddit Quote Carousel (Topaz Enhanced)
Same as reddit-quote-carousel but adds Topaz Labs 2x AI upscale after photo finding, before text overlays.
Trigger
Bernard says "reddit-quote-topaz" → use this skill.
Bernard says "reddit-quote" → use reddit-quote-carousel (no Topaz).
Parameters
- destination (required): City/region (e.g. "Barcelona")
- category (required): What the picks are (e.g. "Cheap Eats", "Hidden Gems", "Date Night Spots")
- popular_picks_url (required): tabiji.ai popular-picks page URL to pull attractions + Reddit quotes from
- reddit_post_count (optional): Number of Reddit posts analyzed (for subtitle). Pull from the page if available.
Pipeline (3 chained sub-agents)
Working directory: /tmp/ig-reddit-quote/
Sub-agent 1: Scrape Picks + Find Photos + Topaz Enhance
-
Fetch the popular-picks page via
web_fetchto get:- List of attractions (names)
- A compelling Reddit quote for each attraction (vivid, specific, personal — not generic praise)
- The subreddit each quote came from (e.g. "r/london", "r/AskLondon")
- Total Reddit post count if shown on the page
-
Find photos using
instagram-photo-findworkflow:- 1 hero photo for the destination (for cover slide)
- 1 photo per attraction (for quote slides)
- For each:
web_search→ download candidates → vision-score → keep best
-
Topaz 2x Enhance each best photo:
TOPAZ_API_KEY=$(security find-generic-password -s "topaz-api-key" -w)
curl --request POST \
--url https://api.topazlabs.com/image/v1/enhance \
--header "X-API-Key: ${TOPAZ_API_KEY}" \
--header 'accept: image/jpeg' \
--header 'content-type: multipart/form-data' \
--form 'model=Low Resolution V2' \
--form 'output_scale_factor=2' \
--form 'output_format=jpeg' \
--form "image=@/tmp/ig-reddit-quote/${slug}-best.jpg" \
--output "/tmp/ig-reddit-quote/${slug}-enhanced.jpg"
If sync returns JSON with process_id instead of image bytes, use async flow:
# Submit async
RESPONSE=$(curl -s --request POST \
--url https://api.topazlabs.com/image/v1/enhance/async \
--header "X-API-Key: ${TOPAZ_API_KEY}" \
--header 'content-type: multipart/form-data' \
--form 'model=Low Resolution V2' \
--form 'output_scale_factor=2' \
--form 'output_format=jpeg' \
--form "image=@/tmp/ig-reddit-quote/${slug}-best.jpg")
PROCESS_ID=$(echo "$RESPONSE" | jq -r '.process_id')
# Poll until Completed
while true; do
STATUS=$(curl -s --header "X-API-Key: ${TOPAZ_API_KEY}" \
"https://api.topazlabs.com/image/v1/status/${PROCESS_ID}" | jq -r '.status')
[ "$STATUS" = "Completed" ] && break
sleep 3
done
# Download
curl -s --header "X-API-Key: ${TOPAZ_API_KEY}" \
"https://api.topazlabs.com/image/v1/download/${PROCESS_ID}" \
--output "/tmp/ig-reddit-quote/${slug}-enhanced.jpg"
- Write manifest to
/tmp/ig-reddit-quote/manifest.json:
{
"destination": "Barcelona",
"category": "Cheap Eats",
"reddit_post_count": 150,
"cover_photo": "/tmp/ig-reddit-quote/cover-enhanced.jpg",
"slides": [
{
"name": "Bar Cañete",
"quote": "Went here on a random Tuesday and had the best patatas bravas of my life.",
"subreddit": "r/barcelona",
"photo": "/tmp/ig-reddit-quote/bar-canete-enhanced.jpg",
"original": "/tmp/ig-reddit-quote/bar-canete-best.jpg",
"source_url": "instagram.com/p/XXX/",
"topaz_enhanced": true
}
]
}
Sub-agent 2: Text Overlays
Read manifest. Create overlays using instagram-photo-text-overlay skill on enhanced images.
Slide 1 (Cover) — clean style:
python3 /Users/psy/.openclaw/workspace/skills/instagram-photo-text-overlay/scripts/overlay.py \
--input /tmp/ig-reddit-quote/cover-enhanced.jpg \
--output /tmp/ig-reddit-quote/slide-1.jpg \
--title "Top {COUNT} {CATEGORY} in {DESTINATION}" \
--subtitle "Insider Takes from Reddit ({N}+ posts)" \
--style clean --watermark "tabiji.ai"
Slides 2+ — quote style, one per attraction:
python3 /Users/psy/.openclaw/workspace/skills/instagram-photo-text-overlay/scripts/overlay.py \
--input /tmp/ig-reddit-quote/{slug}-enhanced.jpg \
--output /tmp/ig-reddit-quote/slide-{N}.jpg \
--title "{ATTRACTION_NAME}" \
--quote "{REDDIT_QUOTE}" \
--author "{SUBREDDIT}" \
--style quote --watermark "tabiji.ai"
Output: slides at /tmp/ig-reddit-quote/slide-{1-N}.jpg
Sub-agent 3: Publish to Instagram
- Host images in tabiji repo (
img/instagram/), git push, use raw GitHub URLs - Create carousel item containers
- Create carousel container with caption
- Publish
- Get permalink
- Cleanup hosted images + local temp files
Instagram API Auth
Keys from macOS Keychain:
instagram-access-token— Graph API tokeninstagram-account-id— IG user ID (17841449394591017)
Topaz API Auth
topaz-api-key— Topaz Labs API key (macOS Keychain)
Caption Template
{flag_emoji} Top {COUNT} {CATEGORY} in {DESTINATION}
Real recommendations from {N}+ Reddit posts 🧵
📍 Swipe for the spots + what Redditors actually said:
1. {Attraction 1}
2. {Attraction 2}
...
Full list with maps, prices & more Reddit recs 👉 {POPULAR_PICKS_URL}
💬 {PROVOCATIVE_QUESTION — e.g. "What's the most overrated restaurant you've been to abroad?" or "Would you trust a stranger's Reddit rec over a Michelin star?"}
#{destination} #{category_tag} #redditfinds #traveltips #foodietravel #localfavorites #tabiji
Tips
- Pick quotes that are specific and personal — "best patatas bravas of my life" beats "this place is great"
- Keep quotes under ~120 chars so they render well on the slide
- If a quote is too long, trim it but keep the vivid part
- The cover title should feel like a listicle: "Top 7 Cheap Eats in Barcelona"
- Topaz model:
Low Resolution V2— designed for web-sourced images (our exact use case) - Topaz rate limits: If HTTP 429, use exponential backoff. Sequential processing of 6-8 images should be fine.
- Keep originals in manifest so you can fall back if Topaz fails on a specific image
如何使用「Reddit Quote Carousel Topaz」?
- 打开小龙虾AI(Web 或 iOS App)
- 点击上方「立即使用」按钮,或在对话框中输入任务描述
- 小龙虾AI 会自动匹配并调用「Reddit Quote Carousel Topaz」技能完成任务
- 结果即时呈现,支持继续对话优化