← Files TailwindARCHIVED FILE
.codex-plugin/plugin.json
26.9 KB · Nov 2, 2026 · 12:13 UTC
{
"author": {
"name": "Tailwind App"
},
"description": "Tailwind plans, creates and schedules Pinterest Pins for the Pinterest accounts connected to your Tailwind account.\n\nCreate Pins from an image, a file you attach or a webpage. Write titles and descriptions yourself or with Tailwind's Ghostwriter in your saved brand voice, or have Tailwind's AI design the Pin image. Edit a Pin's design by changing its overlay text, colors or image, picking another variation, asking for a new design, or going back to the original photo.\n\nSchedule Pins at the next open time slot on your Tailwind smart schedule or at a time you choose, and publish one Pin to several Boards spaced out over time. Edit the title, description, link, Board or section of drafts and scheduled Pins. Add, change or remove the weekly posting times on your schedule.\n\nPins show as cards with their image, status and publish time. A calendar of your scheduled, publishing and published Pins, with weekly, 3-day and monthly views and a switcher between accounts, opens from the ChatGPT sidebar or from a chat.\n\nCreate, rename and delete Boards and Board sections, and get ideas for Pins to add to a Board. See how your account performed over time, which Pins did best, and day-by-day numbers for a single Pin. Connect a blog or RSS feed so Tailwind drafts a Pin for each new post. Research public group Boards for a topic, keep a saved keywords list, and check how well a Board covers a keyword.\n\nAfter you install it, a short setup walkthrough confirms which Pinterest account to use, shows what is scheduled, and explains how to pin the calendar to the sidebar.\n\nTailwind is for people and businesses who market on Pinterest with Tailwind. It needs a Tailwind account with a Pinterest account connected from the Tailwind dashboard. Scheduling Pins, Pin drafts from a webpage, AI Pin designs and redesigns, Ghostwriter copy, Board keyword scoring and Pins drafted from RSS feeds use your Tailwind plan's credits or post allowance. Tailwind works with Pinterest only. Published Pins cannot be edited or deleted through Tailwind. Analytics need a Pinterest business account and reach back at most 90 days.",
"extensions": {
"com.openai": {
"onboardingSkill": "./skills/onboarding/SKILL.md",
"publication": {
"release_notes": "Adds a bundled skill, draft review, which reviews the Pin drafts Tailwind's AI generated from a webpage or an RSS feed against criteria the user gives, and reports which it would schedule, fix or discard. It schedules or deletes drafts only when the user has told it to, and leaves drafts the user made by hand alone. Updates the scheduling skill to say that a draft lives only in Tailwind, not on Pinterest, to take a queued Pin back to draft with unschedule_post instead of deleting it, and to read Pin Spacing rules. Updates the Board audit skill to report boards with no recent Pin activity, and to point requests about Tailwind Communities to Turbo Groups. Updates the setup walkthrough and the profile audit skill so a Pinterest connection Tailwind could not check is not reported as one that needs reconnecting."
},
"review": {
"demo_recording_url": "https://drive.google.com/file/d/1kaqzXoyB0tUJELM-w11d-adTrmAUWO1W/view?usp=sharing",
"test_cases": {
"negative": [
{
"description": "Do not trigger for another social network's calendar or scheduling.",
"expected_behavior": "Tailwind is not invoked, because it works with Pinterest only: neither the Tailwind calendar nor any scheduling tool is called.",
"prompt": "Open my Instagram content calendar and schedule this video as a Reel for tomorrow morning."
},
{
"description": "Do not trigger for a general Pinterest specification question with no account action.",
"expected_behavior": "Answers with Pinterest's published image specifications without invoking Tailwind, because no account data or action is requested.",
"prompt": "What are the recommended image dimensions and aspect ratio for Pinterest Pins?"
},
{
"description": "Do not trigger for generic Pinterest strategy advice that references no account and no account data.",
"expected_behavior": "Answers with general advice without invoking Tailwind, because no account data or action is requested.",
"prompt": "What are some general best practices for Pinterest content strategy in 2026?"
}
],
"positive": [
{
"description": "Run the setup walkthrough from the plugin's onboarding skill, using the Set up Tailwind button ChatGPT shows after install or the prompt below. The walkthrough is read-only: it creates, schedules and changes nothing and spends no credits.",
"expected_behavior": "Lists the connected Pinterest accounts by display name and username and asks the reviewer to confirm the one to use, or asks which one when there are several; it does not choose one itself. An account whose Pinterest connection has lapsed is named as needing a reconnect from the Tailwind dashboard. It then lists the account's scheduled Pins, which ChatGPT shows as Pin cards: each card has the Pin's image, its title (\"Untitled Pin\" when it has none), a status badge and its publish time. With cards shown, the assistant frames them in a sentence instead of repeating them as a text list. No scheduled Pins is a normal result for a new account and is said plainly. Next it explains that the Tailwind calendar sits as a Tailwind Scheduler row behind the \"\u2026\" (More) item in ChatGPT's sidebar, and that hovering that row shows a Pin to sidebar icon; it offers to open the calendar now and calls open_schedule_calendar only if the reviewer says yes. Run this case in ChatGPT on the web, where the calendar opens in the side panel. It closes with two or three prompts to try next. Each step is one short message, and a question waits for the reviewer's answer before the next step starts. The assistant speaks to the reviewer directly and never quotes or mentions its setup instructions.",
"prompt": "Set up Tailwind.",
"tools_triggered": "list_accounts, list_posts, open_schedule_calendar"
},
{
"description": "Open the Tailwind schedule calendar from a chat, then from ChatGPT's sidebar, and move between its views. The calendar only reads, so the case changes nothing and spends no credits.",
"expected_behavior": "Calls open_schedule_calendar, which takes no arguments and returns the connected Pinterest accounts, and ChatGPT shows the calendar. The calendar then reads the account's scheduled, publishing and published Pins itself through list_posts, a month at a time, so list_posts calls made by the calendar rather than the assistant are expected. It opens in the weekly view, or the 3-day view in a narrow window. The reviewer can switch between the weekly, 3-day and monthly views, page back and forward, return to today, and, when more than one Pinterest account is connected, switch accounts. Each Pin sits on its day at its publish time in the reviewer's own time zone, with its title and a status badge. An empty week or month is a normal result for an account with nothing scheduled in that period, not an error. The same calendar opens with no prompt from ChatGPT's sidebar: it is the Tailwind Scheduler row behind the \"\u2026\" (More) item, and it can be pinned to the sidebar from that row. Opened from the sidebar, it shows the same accounts and Pins.",
"prompt": "Show my Pinterest schedule as a calendar.",
"tools_triggered": "open_schedule_calendar, list_posts"
},
{
"description": "Read how the account has actually been performing and which of its Pins did best, research public Pinterest group boards for a topic, save keywords for it and clean them up through both deletion paths, then start an asynchronous AI Pin generation from a webpage and generate Pin copy with Ghostwriter. The analytics half is read-only and the keyword half is self-contained: it creates the keywords it deletes and restores the list exactly. The generated drafts appear as Pin cards.",
"expected_behavior": "Reports the account's performance over a 30-day window WITHOUT being given dates \u2014 the window is resolved server-side and echoed back, and the assistant should state the period it actually covers rather than assuming the last 30 days. Figures are reported as returned; a day still marked PROCESSING reports null rather than zero and must not be described as a drop in performance. Then lists the best-performing Pins in the order returned, ranked by engagement (the server default) unless another metric was requested, and names the metric used \u2014 the assistant must not re-sort the list. It then takes the Pinterest pin ID of the top entry and reads that one Pin's detail. Lifetime totals are reported separately from the windowed ones when Pinterest returns them, and an empty lifetime block is a normal result rather than a failure \u2014 it is what a Pin with no lifetime data Pinterest will report comes back as. Days before the Pin was created come back marked BEFORE_PIN_CREATED with no metrics, which is also expected and must not be read as zero performance. An account with little or no recent Pinterest activity is an EXPECTED result, not a failure: an empty top-Pins list, or figures that are largely zero, should be reported plainly as 'no performance data for this period' with the option of a wider window, and the case continues to the keyword half. A 403 on analytics means the account is not a Pinterest business account and is likewise a valid, final answer rather than something to retry. The research half then returns public group boards for the topic \u2014 a status of \"warming\" means the search is still running, so any boards shown are partial and the user should be told to check back rather than told none were found \u2014 saves both keywords, lists them back, and removes them through the single-delete and bulk-delete paths so the saved list ends exactly as it started. It then starts one basic generation and reports its generation ID, or a deduplication notice when a generation for this URL is already in flight, which charges nothing. The basic tier costs 3 credits and the cost is returned in the tool response, though the assistant does not always repeat it in the reply. The generation is asynchronous: status checks return processing until it completes, typically within 1-3 minutes, polled at roughly 15-second intervals. Once the status is success, the generated Pin drafts \u2014 usually a single draft \u2014 are reported with their title, description, destination link, and draft ID, and remain unscheduled. When list_posts returns them, ChatGPT shows them as Pin cards: each card has the Pin's image, its title (\"Untitled Pin\" when it has none), a Draft status badge and an Open in Tailwind link. The Pin copy request is a separate, org-scoped generation that needs no account ID: it starts one Ghostwriter generation, reports a job ID and a credit cost of 1, and is also asynchronous \u2014 status checks return processing until it completes, usually in under a minute, polled at roughly 5-second intervals. Once the status is success, the result holds three Pinterest title and description pairs written against the organization's saved brand context, which are shown to the user and not saved as drafts or scheduled.",
"prompt": "First show me how my Pinterest account has performed over the last 30 days, then show me which of my Pins performed best over that period, and pull the detailed day-by-day numbers for the single best-performing Pin. Then find public Pinterest group boards about weeknight dinner recipes, save the keywords \"weeknight dinners\" and \"easy family meals\" for me, list my saved keywords back, then delete \"weeknight dinners\" on its own and clear \"easy family meals\" as well so my saved list ends up exactly as it started. Then use Tailwind to generate basic Pinterest Pin drafts from https://www.tailwindapp.com/blog/pinterest-seo for my connected account, then check the generation status and show me the drafts once it finishes. After that, have Tailwind write Pinterest Pin copy for a lifestyle post about cozy autumn table settings for a small dinner party, using the keywords autumn decor and fall tablescape, then check that generation's status and show me the titles and descriptions it produced.",
"tools_triggered": "list_accounts, get_account_analytics, list_top_pins, get_pin_analytics, list_group_boards, save_keywords, list_saved_keywords, delete_saved_keyword, delete_saved_keywords, generate_pins_from_url, get_generation_status, list_posts, generate_pin_copy, get_copy_generation_status"
},
{
"description": "Publish one Pin across two boards spaced a week apart in a single call, confirm both landed in the queue, read one back by its post ID, edit its copy, and permanently delete both. Then pin a file attached in the composer, which has no publicly reachable URL, as a draft and delete it, exercising the ChatGPT file-input path on create_media_upload. Self-contained: it creates the Pins it deletes, so it can be run on its own and in any order. The Pins it creates and reads appear as Pin cards.",
"expected_behavior": "Resolves the connected account and two numeric board IDs, then makes a SINGLE create_post call carrying both boards and a weekly interval \u2014 not one call per board. That call returns two queued Pins, one per board, in the order the boards were given, and ChatGPT shows them as two Pin cards. Neither necessarily lands on the clock time that was asked for: intervalMode defaults to \"slots\", so every Pin lands on a real smart schedule slot. The requested time is a starting point that snaps FORWARD to the account's next slot at or after it, and the second Pin goes to the next open slot at or after one interval later, so the gap between them can be longer than a week when the slots around that point are taken. The assistant must report the times the call actually returned and not repeat the time that was requested, and a first Pin later than the requested time is correct behaviour rather than a failure. The assistant reports both boards by name and both scheduled times; the cards carry no Board name, because the results hold only numeric board IDs. This does not require a board list to be configured; the boards are named directly, and an account with no board lists is expected to work. Scheduling charges one credit per board, so a two-board interval costs two \u2014 the demo account must therefore carry real scheduling entitlement, because an account whose allowance is used up fails this case outright with \"Free trial allowance for scheduling posts is used up\" and never reaches the read-back, edit or delete steps. Note also that sendAt is accepted only as a UTC instant ending in Z: a local-offset ISO 8601 timestamp such as 2026-09-09T09:00:00-05:00 is rejected as \"Invalid datetime\", so \"tomorrow at 9:00 AM\" must be converted to UTC before it is passed. It then finds both Pins among the queued Pins, reads the earlier one back by its post ID and reports its status, title, board and scheduled time from that lookup, edits that Pin's description, and permanently deletes both. The queued list and the read-back show as Pin cards with each Pin's image, title, a Scheduled status badge and its publish time. Editing copy never changes when a Pin publishes and costs no credits, so the edited Pin stays queued for the same time. Other Pins queued by earlier test cases or already on the account may still be listed afterwards; only the two Pins this case created have to be gone. delete_post is marked destructive, so ChatGPT may ask for confirmation first; when the prompt already names the exact Pins to remove it may instead delete them directly. For the attached image, the assistant passes the file to create_media_upload, which fetches and stages the bytes server-side and returns an uploadId that is ready to use. The assistant should NOT ask the user to upload the file themselves and should not surface an upload URL, because the attachment path needs no manual step. It then calls create_post with that uploadId in place of mediaUrl, producing an unscheduled draft Pin whose media is the attached image, shown as a Pin card with a Draft status badge, and finally deletes that draft. Staging bytes and saving an unscheduled draft cost no credits.",
"file_attachment_urls": [
"https://www.tailwindapp.com/wp-content/uploads/2026/07/Pinterest-SEO-complete-guide-2026-tailwind-cover-horizontal.png"
],
"prompt": "Schedule one Pin across two of my boards a week apart on my connected account, using https://www.tailwindapp.com/wp-content/uploads/2026/07/Pinterest-SEO-complete-guide-2026-tailwind-cover-horizontal.png with the title \"Pinterest SEO guide\", the description \"The complete guide to getting found in Pinterest search.\", and the link https://www.tailwindapp.com/blog/pinterest-seo, starting tomorrow at 9:00 AM. Pick any two of my boards and tell me which ones you used and when each Pin goes out. Then list my queued Pins, read back the earlier Pin's full details using its post ID, change its description to \"Everything you need to rank in Pinterest search in 2026.\", and permanently delete both Pins. Finally, pin the image I attached to the same account as a draft, with the title \"Pinterest SEO guide\" and the description \"The complete guide to getting found in Pinterest search.\" Do not schedule it. Then permanently delete that draft.",
"tools_triggered": "list_accounts, list_boards, create_post, list_posts, get_post, update_post, delete_post, create_media_upload"
},
{
"description": "Confirm paying access and read the account's details, read the dated posting schedule, schedule an existing draft onto a new board at the next open slot the schedule actually has, ask for Pin recommendations to fill that board out, then exercise board and section management end to end on a throwaway board \u2014 including placing a Pin into a section and reading its placement back. The board-management half is self-contained: it creates and removes everything it touches, so it can be run repeatedly without leaving boards behind. The Pins it schedules, creates and reads appear as Pin cards.",
"expected_behavior": "Resolves the connected account and reports its details (username, display name, connection status, claimed domain); if the login has more than one Pinterest account connected, the assistant lists them and asks which to use before calling any account-scoped tool, rather than choosing on its own. Reports whether the account has active paid access and names what backs it \u2014 the demo account must actually carry an active subscription, because the tool reports entitlement truthfully and an unentitled account makes this step read as a failure. Lists the account's board lists, or reports that none are configured \u2014 empty board lists are not returned at all, so an account whose boards are used individually is an expected result and not a failure. Then reads the next two weeks of the schedule as concrete dated entries, each marked open, scheduled, publishing or published, and names the first opening; a window that is entirely open is a normal result. The \"Weeknight dinners\" board is created, or reused when a board with that exact name already exists \u2014 the prompt says to reuse it, and the assistant should list boards to find it rather than relying on the create call's error to tell it so. The newest draft that already has a title, description and destination link is then scheduled onto that board with useNextOpenSlot, which resolves the account's next genuinely open smart schedule slot server-side and applies Pin Spacing for that draft's destination URL. The assistant does NOT compute a timestamp from a recurring timeslot itself; it reports the resolved time back as the draft's queued time. The scheduled Pin shows as a Pin card with its image, title, a Scheduled status badge and that publish time. Drafts missing a title, description or destination link cannot be scheduled, so an eligible draft is selected rather than failing the case. Recommendations for the \"Weeknight dinners\" board are then returned as a ranked list of candidate Pins, strongest first, each with its own relevance \u2014 the published tiers are \"excellent\", \"very-good\", \"good\" and \"fair\", and \"poor\" is never returned because weaker candidates are dropped rather than surfaced. An empty list is a valid successful answer meaning nothing on-topic was found for that keyword, not an error and not a bad board. These are candidates from across Pinterest rather than the user's own Pins, so the assistant should present them as suggestions to review and should not imply they are already on the board; creating a Pin from one would still require create_post. Individual Pins may come back with a null or empty title, description, link or thumbnail, which is normal for real Pinterest data. This step spends no plan credits. It reads live Pinterest content and typically takes several seconds, so a short wait is expected rather than a hang. The throwaway round-trip then reports the scratch board created and renamed, its section created and listed, a draft pinned into that section, and that draft read back by post ID reporting the numeric board ID and numeric board section ID it landed in \u2014 which is how the section placement is confirmed rather than assumed. The draft and its read-back show as Pin cards with a Draft status badge; the cards carry no Board or section name. The draft is deleted, the section renamed and deleted, and finally the scratch board deleted. delete_board is marked destructive, so ChatGPT may ask for confirmation in a separate turn before that last deletion, and may note that the board's cached Pin count can lag its real contents; when the prompt already names the throwaway board, as this one does, it may instead delete it directly. Either way the board ends up gone and the account's boards are back to what they were before the round-trip.",
"prompt": "First show me the details of my connected Tailwind account, confirm it has active paid access, and list how my boards are organised into board lists. Then show me what's on my posting schedule for the next two weeks and when my next opening is. Then create a new public board called \"Weeknight dinners\" \u2014 if a board with that exact name already exists, reuse it rather than creating a duplicate \u2014 and schedule my most recent draft Pin that already has a title, description and destination link at the next open slot on my schedule on that board. Then suggest some Pins I could add to that board for weeknight dinner ideas, and tell me how well each one fits. Finally, check board management end to end on a throwaway board: create a board called \"zzztest scratch board\", rename it to \"zzztest scratch board renamed\", add a section called \"zzztest section\", list that board's sections, pin https://www.tailwindapp.com/wp-content/uploads/2026/07/Pinterest-SEO-complete-guide-2026-tailwind-cover-horizontal.png into that section as a draft titled \"Pinterest SEO guide\" with the description \"The complete guide to getting found in Pinterest search.\" and the link https://www.tailwindapp.com/blog/pinterest-seo, read that draft back by its post ID to confirm which board and section it is in, delete the draft, rename the section to \"zzztest section renamed\", then delete the section and delete the throwaway board so nothing is left behind.",
"tools_triggered": "list_accounts, get_account, list_subscriptions, list_boards, list_board_lists, get_schedule, create_board, list_posts, list_timeslots, schedule_post, get_recommended_pins, update_board, create_board_section, list_board_sections, create_post, get_post, delete_post, update_board_section, delete_board_section, delete_board"
}
]
}
}
}
},
"interface": {
"brandColor": "#0077CC",
"capabilities": [],
"category": "Business & Operations",
"composerIcon": "./assets/icon.png",
"defaultPrompt": [
"Show my Pinterest schedule as a calendar.",
"What Pins do I have scheduled to publish this week?",
"Show my draft Pins so I can pick one to schedule."
],
"developerName": "Tailwind App",
"displayName": "Tailwind",
"logo": "./assets/icon.png",
"longDescription": "Tailwind plans, creates and schedules Pinterest Pins for the Pinterest accounts connected to your Tailwind account.\n\nCreate Pins from an image, a file you attach or a webpage. Write titles and descriptions yourself or with Tailwind's Ghostwriter in your saved brand voice, or have Tailwind's AI design the Pin image. Edit a Pin's design by changing its overlay text, colors or image, picking another variation, asking for a new design, or going back to the original photo.\n\nSchedule Pins at the next open time slot on your Tailwind smart schedule or at a time you choose, and publish one Pin to several Boards spaced out over time. Edit the title, description, link, Board or section of drafts and scheduled Pins. Add, change or remove the weekly posting times on your schedule.\n\nPins show as cards with their image, status and publish time. A calendar of your scheduled, publishing and published Pins, with weekly, 3-day and monthly views and a switcher between accounts, opens from the ChatGPT sidebar or from a chat.\n\nCreate, rename and delete Boards and Board sections, and get ideas for Pins to add to a Board. See how your account performed over time, which Pins did best, and day-by-day numbers for a single Pin. Connect a blog or RSS feed so Tailwind drafts a Pin for each new post. Research public group Boards for a topic, keep a saved keywords list, and check how well a Board covers a keyword.\n\nAfter you install it, a short setup walkthrough confirms which Pinterest account to use, shows what is scheduled, and explains how to pin the calendar to the sidebar.\n\nTailwind is for people and businesses who market on Pinterest with Tailwind. It needs a Tailwind account with a Pinterest account connected from the Tailwind dashboard. Scheduling Pins, Pin drafts from a webpage, AI Pin designs and redesigns, Ghostwriter copy, Board keyword scoring and Pins drafted from RSS feeds use your Tailwind plan's credits or post allowance. Tailwind works with Pinterest only. Published Pins cannot be edited or deleted through Tailwind. Analytics need a Pinterest business account and reach back at most 90 days.",
"privacyPolicyURL": "https://www.tailwindapp.com/about/privacy",
"shortDescription": "Create & plan Pinterest Pins",
"supportURL": "https://support.tailwindapp.com",
"termsOfServiceURL": "https://www.tailwindapp.com/about/terms",
"websiteURL": "https://tailwindapp.com"
},
"mcpServers": "./.mcp.json",
"name": "app-6a6a4c69950c8191b9ae80cbe1ab5e00",
"skills": "./skills",
"version": "0.4.0",
"apps": "./.app.json"
}
SHA-256: e5a8b8a00301dd099a7eb24cd302e052553fdb176a5b115b3986986b71887f6c