DEV Community

Cover image for Pinterest Skill for Claude Code: Make, Check, Preview and Schedule Pinterest Pins From Your Agent
Frank Heijdenrijk
Frank Heijdenrijk

Posted on

Pinterest Skill for Claude Code: Make, Check, Preview and Schedule Pinterest Pins From Your Agent

Pinterest skill for Claude Code, free and MIT licensed: Pinterest Skill lets your agent turn a page (a blog post, a product, a recipe, a guide) and your own photos or videos into several genuinely different pins, check every pin against Pinterest's limits and the patterns that get accounts flagged, show you the batch in the home feed, and schedule it over the coming weeks after you say yes. It also works in Codex, Cursor and OpenClaw.

Everything up to scheduling runs on your own computer with Python and Pillow (ffmpeg only for video pins). There is no paid API. This post covers what the skill does, how to install it, the example in the repo, and then the parts that are code: the renderer, the checker and its repeat detection, the scheduler and the results.

npx skills add social-media-skills/pinterest-skill -g -a claude-code -y
Enter fullscreen mode Exit fullscreen mode

Repo: github.com/social-media-skills/pinterest-skill

Five pins the Pinterest skill made for one page about Moon phases, shown in the home feed: a grid of all 8 phases, a 12-second NASA video, a full Moon photo pin, a big 29.5 days fact pin and a viewing guide

The example in the repo: five pins for NASA's Moon phases page, made only from NASA images, NASA's Moon phase animation and illustrations based on them (no endorsement implied).

What is a Pinterest skill?

An agent skill is a folder with a SKILL.md that tells an agent like Claude Code how to do a job, plus the scripts it runs. Most Claude Pinterest help stops at text: a few titles, a description, a list of keywords. The work that decides whether pins get seen is different and repetitive: several fresh designs for every page, the keyword where the feed shows it, the right board, a steady pace, and never the same picture pinned to the same page again.

This skill ships the scripts that do that work, so the agent hands you real pins:

  • 1000x1500 pins in six layouts from your photos, with the subject kept in the crop;
  • video pins from your own clip or photos, at 2:3 or 9:16, opening on the strongest frame;
  • titles, descriptions and alt text that use the page's own words;
  • a check that refuses what Pinterest treats as spam or rejects;
  • a preview of the batch in the home feed at real size, then each close-up;
  • a schedule that spreads pins out, and one validated request per pin.

Install

Claude Code:

npx skills add social-media-skills/pinterest-skill -g -a claude-code -y
Enter fullscreen mode Exit fullscreen mode

Codex, Cursor and other agents: npx skills add social-media-skills/pinterest-skill, then pick your agent. OpenClaw: openclaw skills install @social-media-skills/pinterest-skill. Gemini CLI: gemini extensions install https://github.com/social-media-skills/pinterest-skill.

It needs Python 3.9+ with Pillow, and ffmpeg for video pins. scripts/check_setup.py tells you what's missing and prints the install command for your OS.

The example

examples/moon-phases/ holds five pins for one page, NASA's guide to the Moon phases, each with a different angle and its own picture:

  1. All 8 phases in a grid, as seen from the Northern Hemisphere (illustrations made by shading NASA's Lunar Reconnaissance Orbiter view of the Moon).
  2. A 12-second video of one cycle, cut from NASA's Moon phase animation for 2026 with video.py fit --start 1.5 --end 25.3 --speed 2: full Moon to full Moon, and it opens on the full Moon, because the first frame is the cover.
  3. A full Moon over Kennedy Space Center for "why we always see the same side of the Moon".
  4. A big 29.5 for the length of the cycle, over an astronaut photo of a crescent Moon above Earth.
  5. When to see the main phases, from NASA's rise and set times, over a NASA photo of the full Moon above the U.S. Capitol.

Every pin, check report, preview, schedule and WoopSocial request in that folder came from the scripts.

The renderer: designs that read at feed size

render_pins.py takes a pins.json with your brand colours and one entry per pin: a layout, the photo, where the subject sits (focus), and the headline. It renders at twice the size and scales down for crisp text, fits the headline to its box, balances the line lengths so no word sits alone on the last line, and keeps shrinking a single long word rather than cutting it.

It writes a manifest per batch: each pin's source photos and its headline height at the feed's column width (236 pixels). The check reads both. A headline under about 14 pixels in the feed can't be read on a phone, so the check says so. If the text contains a character the font can't draw (an emoji, CJK in a Latin font), the renderer reports it instead of printing empty boxes, and brand.font_file takes a font that has them.

The checker: repeats, pace and the page

pin_check.py covers the published limits (formats, sizes, the 100, 800 and 500 character fields, video length) and then the parts that decide whether an account gets flagged:

  • Repeats. Each picture gets a fingerprint: a 256-bit difference hash plus a tiny colour thumbnail. A difference hash alone calls two dark photos "the same", and the colour check stops that. Two pins for one page that look alike are refused, and so are two pins built from the same source photo, even in different layouts.
  • The log. log.py record writes every posted pin, with its fingerprint, to pins-log.jsonl. A picture already pinned to the same page is refused next time. Pages are compared by a canonical URL (no tracking parameters, no fragment, no www), so adding ?utm_source=pinterest doesn't make an old picture new.
  • Boards and pace. One page sent to several boards on one day is refused, and so is a day with more pins than the account's cap, counting pins already posted.
  • The page. Links must be full https addresses: a typo'd key or a javascript: link fails the check instead of reaching Pinterest. Shorteners are refused. If page.py found a redirect, the check asks for the final URL, and a pin that shares no words with its page's title and headings gets a warning.

The scheduler: a steady trickle

schedule.py gives each unscheduled pin the first free day that keeps one pin a day per account and new pins for the same page 7 days apart, counting the log. Pins for a seasonal page (a holiday, a launch) go out 90 to 45 days before the moment, configurable per page. A start date in the past moves to today, a moment that has passed turns the pin into an evergreen one, and requests for pins you removed from the plan are deleted so they can't be sent by mistake.

Scheduling without a Pinterest developer app

A new Pinterest developer app starts on trial access, where pins are visible only to you; public pins need an app review. The skill schedules through WoopSocial instead, a social media API and MCP server for agents, made by the team that maintains the skill. Here is how scheduling pins through WoopSocial works. The agent uploads each pin, validates every request, and only then shows you the preview. It schedules after a clear yes.

WoopSocial's Pinterest fields are the board, title, description, link and one image or video. Alt text isn't one of them yet, so schedule.md lists each pin's alt text to paste in Pinterest after it goes live.

Results, from day 30

log.py results reads the numbers WoopSocial collects for each pin, plus a CSV from Pinterest Analytics if you have one. It ranks designs for the same page by outbound clicks per 1,000 impressions, then saves per 1,000, and only ranks pins from day 30 with at least 1,000 impressions. Pinterest says there's no set engagement window and older pins can take off later, so the advice it gives is about the next pins, never about deleting the slow ones.

Try it

npx skills add social-media-skills/pinterest-skill -g -a claude-code -y
Enter fullscreen mode Exit fullscreen mode

Then tell your agent "make Pinterest pins for this post" with a link and a folder of your photos. The repo is social-media-skills/pinterest-skill. Issues and pull requests are welcome.

Top comments (0)