← Back to Skills Marketplace
psyduckler

Itinerary Carousel Post

by psyduckler · GitHub ↗ · v1.0.0
cross-platform ⚠ suspicious
774
Downloads
0
Stars
0
Active Installs
1
Versions
Install in OpenClaw
/install itinerary-carousel-post
Description
Create and publish an Instagram carousel post from a tabiji.ai itinerary. Given an itinerary URL, finds Instagram-worthy photos for the destination + top att...
README (SKILL.md)

Create Instagram Carousel Post

End-to-end pipeline: itinerary URL → photo sourcing → text overlays → Instagram carousel publish.

Parameters

  • itinerary_url (required): tabiji.ai itinerary URL (e.g. https://tabiji.ai/i/thaw-dome/)
  • destination (required): City/region name (e.g. "Kuala Lumpur")
  • attractions (required): List of 5 attraction names + short descriptions
  • caption (optional): Custom caption. If omitted, generate one with destination name, attraction list, CTA to link in bio, and relevant hashtags.

Pipeline (3 chained sub-agents recommended)

Split into 3 sub-agents for reliability. Each writes outputs to /tmp/ig-carousel/.

Sub-agent 1: Photo Finding

Use the instagram-photo-find skill workflow for each subject (1 destination + 5 attractions = 6 total).

For each subject:

  1. web_search: site:instagram.com/p/ "{subject}" photo (10 results)
  2. Download top 5 candidates: curl -s -L -o /tmp/ig-carousel/raw-{slug}-{n}.jpg "https://www.instagram.com/p/{shortcode}/media/?size=l"
  3. Vision-score each with: "Rate 1-10 as hero destination photo for {subject}. Description + score only."
  4. Keep best per subject → /tmp/ig-carousel/{slug}-best.jpg

Output: 6 best images + JSON manifest at /tmp/ig-carousel/manifest.json:

[{"slug": "kuala-lumpur", "subject": "Kuala Lumpur", "score": 7, "path": "/tmp/ig-carousel/kuala-lumpur-best.jpg", "source": "instagram.com/p/XXX/"}]

Sub-agent 2: Text Overlays

Read manifest from sub-agent 1. Run overlay script for each image.

Slide 1 (cover) — clean style:

python3 skills/instagram-photo-text-overlay/scripts/overlay.py \
  --input /tmp/ig-carousel/{dest-slug}-best.jpg \
  --output /tmp/ig-carousel/slide-1.jpg \
  --title "{N} Day {DESTINATION} Itinerary Highlights" \
  --style clean --watermark "tabiji.ai"

Slides 2–6 — quote style per attraction with insider tip:

python3 skills/instagram-photo-text-overlay/scripts/overlay.py \
  --input /tmp/ig-carousel/{slug}-best.jpg \
  --output /tmp/ig-carousel/slide-{N}.jpg \
  --title "{ATTRACTION}" \
  --quote "{Specific insider tip about THIS attraction — must directly reference the place in the title, not a generic travel tip}" \
  --author "tabiji.ai" \
  --style quote --watermark "tabiji.ai"

Output: 6 overlay images at /tmp/ig-carousel/slide-{1-6}.jpg

Sub-agent 3: Publish to Instagram

  1. Host images publicly — copy slides to tabiji repo (img/instagram/), git push, use raw GitHub URLs (https://raw.githubusercontent.com/psyduckler/tabiji/main/img/instagram/slide-{N}.jpg). Wait ~30s after push for GitHub CDN.

  2. Create carousel item containers (one per slide):

curl -s -X POST "https://graph.facebook.com/v21.0/${IG_USER}/media" \
  -d "image_url=${PUBLIC_URL}" \
  -d "is_carousel_item=true" \
  -d "access_token=${IG_TOKEN}"
  1. Create carousel container with all children + caption:
curl -s -X POST "https://graph.facebook.com/v21.0/${IG_USER}/media" \
  --data-urlencode "caption=${CAPTION}" \
  -d "media_type=CAROUSEL" \
  -d "children=${CHILD_IDS}" \
  -d "access_token=${IG_TOKEN}"
  1. Publish:
curl -s -X POST "https://graph.facebook.com/v21.0/${IG_USER}/media_publish" \
  -d "creation_id=${CAROUSEL_ID}" \
  -d "access_token=${IG_TOKEN}"
  1. Get permalink (or verify publish on rate-limit error):

If media_publish returns a POST_ID, get the permalink directly:

curl -s "https://graph.facebook.com/v21.0/${POST_ID}?fields=permalink&access_token=${IG_TOKEN}"

If media_publish returns error 2207051 (rate limit / action blocked): Instagram sometimes processes the request despite returning an error. Always verify by checking the account's recent media before declaring failure:

curl -s "https://graph.facebook.com/v21.0/${IG_USER}/media?fields=id,timestamp,permalink&limit=1&access_token=${IG_TOKEN}"

If the most recent post timestamp is within the last few minutes, the publish likely succeeded — grab that permalink.

  1. Cleanup hosted images — after publish is confirmed, delete the images from the tabiji repo and push:
cd /path/to/tabiji/repo
git rm img/instagram/slide-*.jpg
git commit -m "cleanup: remove instagram carousel images after publish"
git push

Also clean up local temp files:

rm -rf /tmp/ig-carousel/

Output: Instagram post URL

Instagram API Auth

Keys from macOS Keychain:

  • instagram-access-token — Graph API token
  • instagram-account-id — IG user ID (17841449394591017)

Caption Template

🇲🇾 {N} Nights in {Destination} — {Itinerary Subtitle}

{One-line hook about the trip}

📍 Swipe through our top 5 picks:
1. {Attraction 1} — {one-line reason}
2. {Attraction 2} — {one-line reason}
3. {Attraction 3} — {one-line reason}
4. {Attraction 4} — {one-line reason}
5. {Attraction 5} — {one-line reason}

Full free itinerary with tips, prices & Reddit recs 👉 {ITINERARY_URL}

💬 {PROVOCATIVE_QUESTION — e.g. "Is 5 nights enough for {Destination} or do you need more?" or "What's the one thing most tourists get wrong about {Destination}?"}

#{destination_hashtag} #{country} #travelitinerary #foodietravel #southeastasia #asiatravel #travelguide #tabiji

Tips

  • Raw GitHub URLs work for IG image_url; tabiji.ai Cloudflare CDN may trigger format validation errors.
  • Add sleep 1 between container creation calls to avoid rate limits.
  • If a subject yields low photo scores (\x3C5), broaden search: try Unsplash/Flickr or more specific landmark names.
  • Islamic/cultural museums tend to have fewer quality IG photos — try searching the museum's official IG handle.
Usage Guidance
This skill's workflow looks plausible for publishing Instagram carousels, but it assumes access to secrets and resources that are not declared: an Instagram Graph API token and account ID (stored in your macOS Keychain), write access to a specific GitHub repo (psyduckler/tabiji), and a local overlay script plus another skill for photo-finding. Before installing or running this skill, verify: (1) who authored the skill and whether it is intended to run in your environment; (2) you are comfortable granting access to your Instagram API token and any git credentials — prefer short-lived tokens or a dedicated account; (3) the referenced local scripts and repo exist and are safe; (4) run it in a sandboxed environment first (no access to your primary keychain or production repos). If you cannot confirm those points, do not provide real credentials or repo write access and consider rejecting the skill.
Capability Analysis
Type: OpenClaw Skill Name: itinerary-carousel-post Version: 1.0.0 The `SKILL.md` file presents significant shell injection and prompt injection vulnerabilities. User-controlled parameters like `{DESTINATION}`, `{ATTRACTION}`, and `{subject}` are directly substituted into `bash` commands (e.g., `python3 skills/instagram-photo-text-overlay/scripts/overlay.py --title "{ATTRACTION}"`) and prompts for web search/vision scoring without apparent sanitization. This could allow an attacker to execute arbitrary commands on the agent's host or manipulate the agent's behavior. While the skill's use of `git push` and `curl` to Instagram APIs is aligned with its stated purpose, the lack of input sanitization for these powerful operations makes the skill highly risky.
Capability Assessment
Purpose & Capability
The high-level purpose (sourcing photos, applying overlays, publishing a carousel) matches the steps in SKILL.md, but the instructions assume access to: a specific GitHub repo (psyduckler/tabiji), local overlay scripts at skills/instagram-photo-text-overlay/scripts/overlay.py, and an 'instagram-photo-find' skill workflow. None of these dependencies, paths, or credentials are declared in the skill metadata — this is disproportionate to the stated simple publish task and indicates hidden operational requirements.
Instruction Scope
Instructions tell the agent to: run web searches and curl to download Instagram images, read Instagram tokens from macOS Keychain, copy images into a repo and git push/delete files, call the Graph API with ${IG_TOKEN}/${IG_USER}, and clean up local files. The SKILL.md references secrets (instagram-access-token, instagram-account-id) and local repo paths that are not listed in requires.env or requires.config. It also references other local scripts and a separate skill. These are sensitive operations and the instructions reach outside a narrowly scoped 'publish' task (accessing keychain and pushing to repositories).
Install Mechanism
No install spec and no code files are included, which is low-risk from an installation perspective. However, the runtime assumes local Python overlay scripts and other skills that are not provided — meaning the agent will fail unless those external artifacts exist or it has network access to fetch them.
Credentials
The skill does not declare any required environment variables or credentials, yet the instructions require an Instagram Graph API access token and an account ID (and reference retrieving keys from macOS Keychain). It also requires push access to a GitHub repo (implying git credentials). Requesting account tokens and repository write access is sensitive and should be explicitly declared and minimized. The mismatch between declared and required credentials is a red flag.
Persistence & Privilege
The skill is not always-included and does not request elevated platform privileges. It does, however, instruct the agent to modify a remote repo (git push / git rm), which requires credentials and grants external persistence of images; that operational effect is significant but not encoded as a platform permission in the skill metadata.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install itinerary-carousel-post
  3. After installation, invoke the skill by name or use /itinerary-carousel-post
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v1.0.0
Initial release
Metadata
Slug itinerary-carousel-post
Version 1.0.0
License
All-time Installs 0
Active Installs 0
Total Versions 1
Frequently Asked Questions

What is Itinerary Carousel Post?

Create and publish an Instagram carousel post from a tabiji.ai itinerary. Given an itinerary URL, finds Instagram-worthy photos for the destination + top att... It is an AI Agent Skill for Claude Code / OpenClaw, with 774 downloads so far.

How do I install Itinerary Carousel Post?

Run "/install itinerary-carousel-post" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is Itinerary Carousel Post free?

Yes, Itinerary Carousel Post is completely free (open-source). You can download, install and use it at no cost.

Which platforms does Itinerary Carousel Post support?

Itinerary Carousel Post is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created Itinerary Carousel Post?

It is built and maintained by psyduckler (@psyduckler); the current version is v1.0.0.

💬 Comments