Skip to content

Commit c22b2ce

Browse files
paulocastellanoPaulo Castellano
andauthored
feat: independent social posts, workspace analytics and media editing (#374)
* docs: design workspace follower analytics * docs: plan LinkedIn follower analytics v2 * docs: add workspace post analytics design * docs: expand workspace analytics reporting design * docs: plan persisted per-post analytics * docs: add Pinterest post metric catalog * docs: clarify YouTube post analytics * docs: audit Buffer per-post metrics * docs: narrow analytics v1 platform scope * docs: plan native post history import * docs: plan workspace analytics backfill * docs: finalize workspace analytics implementation plan * feat: add workspace analytics schema * feat: persist analytics observations * feat: collect normalized follower snapshots * feat: schedule resilient follower analytics * feat: reconcile analytics publications * feat: collect Meta publication history * feat: discover media network publications * feat: discover open network publications * feat: backfill native analytics through jobs * feat: normalize publication analytics metrics * feat: schedule persisted publication metrics * feat: query workspace analytics reports * feat: read analytics exclusively from database * feat: add workspace analytics dashboard * feat: persist individual publication analytics * chore: prepare workspace analytics operations * test: verify analytics across databases and browser flows * fix: resume failed analytics backfill from checkpoint * docs: record analytics execution status * fix: keep analytics permission failures from disconnecting accounts * fix: complete Pinterest analytics pagination without date ordering * fix: persist recent YouTube video metrics before Analytics catches up * Mark X backfill limited at timeline cap * Resume analytics when connected account is reactivated * Document full analytics branch regression run * feat: finish workspace analytics backfill and dashboard * refactor analytics sync and dashboard aggregation * refactor: harden analytics collection and remove duplicate reads * Localize workspace analytics detail and number formatting * fix: complete analytics translations and localize chart tooltips * Fix analytics backfill recovery and publication metrics gaps * fix analytics backfill retries and persisted metrics compatibility * use full-width layout for analytics dashboard * reorder workspace analytics sections * Default posts analytics chart to bar mode * Align workspace analytics with app layout * Fix duplicate scrolling on full-width analytics layout * Preserve bottom spacing after analytics charts * Fix paid workspace analytics backfill rollout * Fix analytics retry, recovery and dashboard refresh edge cases * Fix workspace analytics page title localization * Separate one-time analytics rollout from daily discovery * Add 'antigravity' to agents list in boost.json * Use Cashier active scope for analytics rollout eligibility * Use Cashier subscription status for analytics rollout * Format analytics model fillable arrays consistently * Serve persisted post metrics without legacy adapters * Route TryPost analytics details by post ID * Refactor analytics reads into existing actions * Refactor analytics collection and business actions * Split follower finalization into per-account jobs * fix: keep analytics jobs reserved past their timeout * refactor: express inclusive analytics date ranges with Carbon * refactor: use Carbon for TikTok video lookup cutoff * docs: update AGENTS.md with frontend, Inertia SSR, dialog, AI agents, and system AI guidelines * refactor analytics to project conventions * test analytics metrics without JSON key order * Fix analytics date presets and report conventions * Refactor follower collectors to use abstract base * Replace remaining analytics collector interfaces with base classes * Expose workspace analytics in API and MCP * fix: restore database queue retry default * refactor: name workspace analytics charts by purpose * fix: update beanstalkd queue retry_after default to 90 seconds * refactor: centralize analytics frontend types * docs: plan independent social posts refactor * feat(posts): validate per-account compositions * feat(posts): create independent destination posts * feat(posts): edit one account post * feat(posts): expose independent batch creation in API and MCP * feat(posts): add independent composer and legacy active split * fix(posts): preserve legacy drafts and validate one-target updates * fix(posts): match composer preview and scheduling flow * Move AI post writing into composer assistant * Open post composer globally and consolidate posts navigation * Port Connect visual design onto independent posts branch * Use slide-over for webhook creation * Use slide-overs for signature and label creation * Standardize cancel before dialog actions * Show webhook events as checkboxes in create sheet * Restore signature and label header icons * Move signature and label controls into page headers * Polish post composer channel selection and controls * Keep composer channel picker anchored during selection * Reuse existing phone previews in post composer * Present post composer as a wide slide-over * feat: manage signatures in post composer popover * refactor: edit signatures in a slide-over * feat: move post comments to realtime post notes * working on new ui * feat(posts): improve Instagram media editing in composer * fix: restore localization and affected backend tests * fix(posts): show video thumbnails in composer * fix: remove Instagram global aspect ratio control * feat: create & schedule flow overhaul - Publish page: queue lists every scheduled post (empty slots only when the queue is empty), drafts/sent tabs, post details, labels picker on cards, plain confirmation for post deletion - Composer: per-channel settings, media tray, templates, media imports (Google Drive, Google Photos, Canva), alt text, posting actions - Create module: ideas board/gallery, templates and RSS feeds with local-state dialogs and lazy explore directory - Channels: connect flows with platform logos, posting goal dialog as the success screen, Telegram deep link from config, Pinterest boards - Sidebar: command palette, channel list scrolls on its own, channel reorder - Label filters drive column and queue counts; deleted labels are rejected - Tests for all of the above on PostgreSQL and MySQL * feat: approvals, external posts import, grid and publish polish - Member permissions (is_admin / requires_approval) replace workspace roles - Post approvals: pending status, Approvals tab, approve/reject on web, API and MCP, Collaboration emails - Import posts published natively on the networks (incl. Instagram stories) into Sent with media and metrics - Disconnecting a channel deletes its posts; purge commands for orphans and imports - Post groups and recurring posts - Instagram grid view, reusable media lightbox and ChannelAvatar component - Remove the standalone post page in favour of the post details dialog - Rename the Analytics page to Insights; metrics band per content type and network - Follower and post insights include today's UTC readings for users west of UTC - Webhook create dialog, MCP settings redesign, publish empty states * feat: time zones, time preferences and channel queue slots - Time format is 12h or 24h only (users.time_format NOT NULL, backfilled per language) - New signups (email, Google, GitHub) detect time zone, week start and clock from the browser - Weekly goal and Insights weekly buckets follow the viewer's week start - Emails render times in the recipient's zone and clock (approval, post at risk) - The frontend never shows times in the browser zone; display-zone helper for notes and tooltips - Composer uses the channel zone (user zone for mixed channels), keeps the instant, slot shortcuts - Calendar clicks open the composer at the clicked instant; confirm before changing a channel zone - Notification preferences save on their own - Channel queue: free slots interleaved with posts, drag any scheduled post onto a slot, queued posts keep their slots, "+ New" opens at the slot, pending approvals reserve their slot - Insights export, sync status, column picker and sorting; post notes without replies/reactions - Remove the never-rendered date range presets * feat: composer network options, release tooling and analytics fixes Composer - Shared step plus per-network cards (channel-list order, back confirmation), per-account settings inside each card - YouTube: title, fixed categories, visibility, license, notify/embed/made for kids, AI-generated; post text is the description - Instagram: AI-generated label, share to feed, 5-hashtag limit at save time (stories exempt) - X: per-account limit (25000 for paid tiers); posts.content widened to mediumText - Threads: ghost post and topic tag; Mastodon: content warning - Editable link-preview card in the editor (drop, replace with media) - Google Business redesign; Pinterest type derived from media - Thread replies for Mastodon and Bluesky with checkpointed, resumable publishing - Unified time zone picker with suggestions; disconnected dot on every channel avatar - Failed posts live in Sent with a failure reason popover; standard auth forms Release - release:trypost-2 runs purge, split (one post per network, settled history included), parallel media adoption, channel posting defaults, analytics backfill and audit - One-off commands moved to app/Console/Commands/Scripts Analytics - YouTube token refresh, Mastodon public reads, Facebook partial reads, Pinterest v5 metrics, engagement rate everywhere, per-network metric sets Other - Google Business is no longer a repurpose destination - Tests no longer reach live APIs when creating Mastodon accounts * feat: settings redesign, empty states, composer pickers and live fixes Settings - Centered first-use empty states with illustrations for labels, signatures, channels, webhooks and API keys (hasData from the database, never from the search) - New list rows for labels, signatures, webhooks and API keys with a single actions menu; API keys show active, expiring soon or expired - Webhook details keep the deliveries list and inline detail in the new design; create/edit dialogs share one events picker with select all - Disconnect channel dialog with refresh connection; labels and signatures return back() with form requests - One-line page descriptions in every locale (SettingsDescriptionTest); SettingsLayout centered mode App - Calendar post popover reusing the timeline card, week cards with text, posting slot chips with Tabler icons - Composer uses the shared label filter (create label inline), empty channel picker and connect button, preview illustration - Sidebar: empty channels shortcuts, user menu with workspace/preferences/help sections and app status, RTL menus - Insights: placeholder without connected channels, sticky header, date range presets, empty state - Welcome state on Publish, weekly goal popover, language suggestion from the browser - Named template handlers, Tabler icons for signatures, standard dialog close button and toast design Fixes - Webhook deliveries no longer duplicate on live updates (matchOn data.id) - Tests no longer hit live APIs when creating Mastodon accounts * feat: threads with per-post media, onboarding redesign and composer polish - Threads (X, Bluesky, Mastodon): X threads, per-post media validated by each network's reply content type, connected composer with keyboard navigation, toolbar and drop zone on the active post, preview follows the active post, thread viewer in post details in the X pattern - X: AI-generated flag, verified badge on the channel avatar and previews - Onboarding redesign (persona/goals, header, no connect step), referral source survey in the app, new logo - Labels picker creates labels inline; consistent pt-BR copy - Publishing status strip, failed posts no longer deletable, move scheduled posts back to drafts, Threads text-post container wait - Shared dialog footer style and connect popup header * feat: insights post details in place, dialog and card footer design, wider composer - Insights: post and network-only publication details open in a dialog on the page (channel performance table and top posts); performance lists the top 50 - Dialog footers: alert dialogs, media editor and post details share the muted rounded footer; post cards in every schedule tab use it too - Post details: thread viewer in the X pattern with verified badges, metrics band like the sent cards; drafts tab drops the draft badge - Verified badge component on the channel avatar and network previews - Wider post composer and preview column * feat: image editor polish, tiktok settings, publish redirects and event time field - Image editor: crop frame and handles, filter intensity, slider fill, same-origin media file route so edits apply on any storage - TikTok: content type derived from media, no mixed media, checkbox options, black preview backdrop - YouTube: title required without text, warning in the composer - Media tray: live drag preview, smaller tile actions with tooltips - Publish and schedule actions redirect to the queue tab, drafts to the drafts tab - Recurrence dialog uses the shadcn Select - Disconnect channel dialog shows the copyable keyword - Google Business: narrower button select, event times follow the user clock * feat: dark mode surfaces, facebook story photos and collage preview, aspect ratio removal - Dark mode: raised dialog surface, retuned tokens, idea board, connect dialog frame, insights, sidebar new menu and connect shortcuts, tooltip keys - Facebook and Instagram publish images at their own ratio; meta.aspect_ratio removed with a migration - Facebook stories accept photos (fitted into the 9:16 frame, published through photo_stories) - Facebook preview lays several photos out as the feed collage - Publishing status strip, tabs header padding on create and insights, repurpose empty state - Shared CharacterCounter for composer and YouTube counters, weekly calendar by default * chore: remove temporary dark mode screenshot test * fix: idea assistant buttons only open the sidebar * feat: repurpose pages redesign and source avatars - Repurpose list: one bordered list with source avatar, watched format, destination avatars, stats and status - Repurpose page in the channel settings pattern: header with source avatar, tabs, settings rows and destination switches - App RepurposeResource sends the source account with its avatar (the public API shape is unchanged) - Repurpose source picker uses ChannelAvatar - Idea assistant buttons only open the sidebar - Post type radios centered in their panel * chore: drop stray resource stub and the facebook settings rows case * feat: single media button with upload in the editor toolbars - The media menu is one button: upload from computer first, then Canva, Google Drive, Google Photos and Unsplash - Removes the last-used source split button and the separate thread upload button - Upload opens the right picker in the composer cards, thread posts and the idea editor * feat: api and mcp parity, insights redesign, mobile polish and composer performance - API and MCP share the web rules and permissions: posts, approvals, media, labels, signatures, webhooks, api keys, repurpose, ideas and stages, queue and scheduling, insights (workspace and per channel) - MCP authorization mirrors the web abilities for every tool - Content type derived from media when API/MCP omit it - Paginated API/MCP lists; PostResource gains author, approval and group - Channel insights: tags and post type filters, metrics chart with presets, per-post table paged by 10, column chooser, network-aware metrics - Meta collectors keep supported metrics when one is rejected - Composer: once props for workspace data, per-open live data, Pinterest cache - Schedule tabs load the list after the shell with one skeleton - Mobile: full-screen dialogs, dialog footer, calendar, channel settings, composer, filters, sidebar auto-collapse - Generate ideas returns one idea to use or regenerate - Inertia 3.5.1 / @inertiajs/vue3 3.8.0 * feat: pr review fixes, deploy safety, api/mcp parity and redirect channel connect - Deploy safety for 2.0: mixed paused/active posts stay scheduled, legacy queued jobs keep working, legacy aspect ratio crops baked in the release, legacy targets publish like before, giphy source normalized, invite emails lowercased - Publishing: rate-limit refusals retry after 1h, 2h and 4h; media ratio rules follow each network's docs; Instagram story AI flag sent - Posts core: row locks on edit/delete, queue slots kept for approval edits, recurrence in the channel time zone, approval members delete only their own posts - Security: post card and note authors expose only safe fields, upload MIME sniffing on every entry point, safe media serving, Mastodon SSRF guard, granted OAuth scopes checked - API and MCP: full post capability parity, post notes, TikTok creator info, media upload flow fixes, uuid validation, 404 for foreign records, per-workspace API limiter - Analytics: Bluesky discovery, retries with backoff, per-account limits, YouTube quota batching, insights by the viewer's time zone - Channel connect: full-page redirect with a confirmation page, switch account, cancelled and missing permission states, lands on the channel page - Ideas board scroll pagination per column, composer fixes, i18n and mobile polish, dead code removed * fix: contrast tokens and calendar post details on phones - Darker light subtle text, lighter dark input borders, readable link blue in dark previews - Tapping a post in the calendar on a phone opens its details dialog directly * fix: pr review follow-ups for connect coverage, translations, api checks and network limits - Every popup-era connect test scenario mapped or re-added on the redirect flow - 144 translation fixes across 13 locales; Polish RSS feeds named Kanały RSS; one-line fit tests for the new strings and the create tabs - API requests and MCP tools authorize the record before validating the body (404 before 422) - TikTok creator info reads error codes on 200 responses; documented init/status codes mapped - Bluesky analytics limited per PDS host with reset headers honoured - Analytics collectors check the granted scope before calling the network * feat: billing and settings cleanup, sidebar polish and analytics follow-ups - Billing shows the current plan with a change-plan dialog; the account page and accounts.billing_email are gone, Stripe customers use the owner's email - Workspace invites name the workspace instead of the account - Settings sidebar collapses to icons like the app sidebar and shares the user menu and collapse toggle - Collapsed app sidebar shows whole network badges and a hover card per channel; settings nav shows the channel count - Channel settings page split into components with a shared Stepper; copy-from-channel search; custom goal stepper inline - Charts keep their width while the sidebar animates; repurpose header, calendar post details and insights tweaks on mobile - Connect page clears the provider fragment on every navigation; contrast tokens and sidebar beta badge * feat: simpler auth pages with password requirements - Login and register titles are just "Log in to TryPost" and "Create a TryPost account"; the register email form is always open - Register shows a live checklist of the password requirements, built from the same rule the server enforces - One password rule in every environment: 12+ characters, mixed case, a number, a symbol and not compromised - Auth pages use the shared LanguageSelect with browser suggestions; the old LocaleSwitcher is gone - Legal line sits at the bottom of the form column, the G2 rating moved under the reviews, and content is centred on phones * feat: mobile calendar in columns, three days view and responsive filters - Calendar on phones uses the desktop grids (week, month and a new three days view) - Period picker sheet on phones with view switch, date picker and today - Shared filter menu: separate controls on desktop, bottom sheet on phones - Header actions teleport to the header on desktop and stay on the toolbar on phones - Global mobile bar with menu and logo, notes and tabs open as bottom sheets - One-word Portuguese weekday names, breakpoint composable on Tailwind breakpoints - Goal dialog, referral survey, billing processing and channel insights polish * fix: heic conversion on long-lived imagemagick 6 processes and ci test stability - Drop the Imagick time limit from HEIC decoding: ImageMagick 6 counts it from the first pixel access of the process, so long-lived workers rejected every HEIC - Mount the app after the initial translations load so raw keys never flash - Shorten ar, fr, ru and el copy that wrapped with Linux font rendering - Layout tests wait for the Inter web font before measuring - Insights and sidebar tests wait for the full condition instead of racing - CI prints logged warnings when backend tests fail --------- Co-authored-by: Paulo Castellano <paulo@castellanos.llc>
1 parent f9fc951 commit c22b2ce

2,849 files changed

Lines changed: 244752 additions & 68937 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 256 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,256 @@
1+
---
2+
name: copywriting
3+
description: When the user wants to write, rewrite, or improve marketing copy for any page — including homepage, landing pages, pricing pages, feature pages, about pages, or product pages. Also use when the user says "write copy for," "improve this copy," "rewrite this page," "marketing copy," "headline help," "CTA copy," "value proposition," "tagline," "subheadline," "hero section copy," "above the fold," "this copy is weak," "make this more compelling," or "help me describe my product." Use this whenever someone is working on website text that needs to persuade or convert. For email copy, see emails. For popup copy, see popups. For editing existing copy, see copy-editing. For the offer underneath the copy (bonuses, guarantees, value framing), see offers.
4+
metadata:
5+
version: 2.0.2
6+
---
7+
8+
# Copywriting
9+
10+
You are an expert conversion copywriter. Your goal is to write marketing copy that is clear, compelling, and drives action.
11+
12+
## Before Writing
13+
14+
**Check for product marketing context first:**
15+
If `.agents/product-marketing.md` exists (or `.claude/product-marketing.md`, or the legacy `product-marketing-context.md` filename, in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
16+
17+
Gather this context (ask if not provided):
18+
19+
### 1. Page Purpose
20+
- What type of page? (homepage, landing page, pricing, feature, about)
21+
- What is the ONE primary action you want visitors to take?
22+
23+
### 2. Audience
24+
- Who is the ideal customer?
25+
- What problem are they trying to solve?
26+
- What objections or hesitations do they have?
27+
- What language do they use to describe their problem?
28+
29+
### 3. Product/Offer
30+
- What are you selling or offering?
31+
- What makes it different from alternatives?
32+
- What's the key transformation or outcome?
33+
- Any proof points (numbers, testimonials, case studies)?
34+
35+
### 4. Context
36+
- Where is traffic coming from? (ads, organic, email)
37+
- What do visitors already know before arriving?
38+
39+
---
40+
41+
## Copywriting Principles
42+
43+
### Clarity Over Cleverness
44+
If you have to choose between clear and creative, choose clear. Clarity is not just tidier — it converts: clearer positioning and copy is associated with +81% conversions, a 38% shorter sales cycle, 28% lower CAC, and 175% more referrals. When a reader has to decode your line, you've lost them.
45+
46+
**For message-market fit tools** — the "Now you can" test, the Human Action Model (discomfort → vision → path), the Perception Gap, and the clarity metrics: See [references/copy-frameworks.md](references/copy-frameworks.md#clarity--message-market-fit)
47+
48+
### Benefits Over Features
49+
Features: What it does. Benefits: What that means for the customer.
50+
51+
### Specificity Over Vagueness
52+
- Vague: "Save time on your workflow"
53+
- Specific: "Cut your weekly reporting from 4 hours to 15 minutes"
54+
55+
### Customer Language Over Company Language
56+
Use words your customers use. Mirror voice-of-customer from reviews, interviews, support tickets.
57+
58+
### One Idea Per Section
59+
Each section should advance one argument. Build a logical flow down the page.
60+
61+
---
62+
63+
## Writing Style Rules
64+
65+
### Core Principles
66+
67+
1. **Simple over complex** — "Use" not "utilize," "help" not "facilitate"
68+
2. **Specific over vague** — Avoid "streamline," "optimize," "innovative"
69+
3. **Active over passive** — "We generate reports" not "Reports are generated"
70+
4. **Confident over qualified** — Remove "almost," "very," "really"
71+
5. **Show over tell** — Describe the outcome instead of using adverbs
72+
6. **Honest over sensational** — Fabricated statistics or testimonials erode trust and create legal liability
73+
74+
### Quick Quality Check
75+
76+
- Jargon that could confuse outsiders?
77+
- Sentences trying to do too much?
78+
- Passive voice constructions?
79+
- Exclamation points? (remove them)
80+
- Marketing buzzwords without substance?
81+
82+
For thorough line-by-line review, use the **copy-editing** skill after your draft.
83+
84+
---
85+
86+
## Best Practices
87+
88+
### Be Direct
89+
Get to the point. Don't bury the value in qualifications.
90+
91+
❌ Slack lets you share files instantly, from documents to images, directly in your conversations
92+
93+
✅ Need to share a screenshot? Send as many documents, images, and audio files as your heart desires.
94+
95+
### Use Rhetorical Questions
96+
Questions engage readers and make them think about their own situation.
97+
- "Hate returning stuff to Amazon?"
98+
- "Tired of chasing approvals?"
99+
100+
### Use Analogies When Helpful
101+
Analogies make abstract concepts concrete and memorable.
102+
103+
### Pepper in Humor (When Appropriate)
104+
Puns and wit make copy memorable—but only if it fits the brand and doesn't undermine clarity.
105+
106+
---
107+
108+
## Page Structure Framework
109+
110+
### Above the Fold
111+
112+
**Headline**
113+
- Your single most important message
114+
- Communicate core value proposition
115+
- Specific > generic
116+
117+
**Example formulas:**
118+
- "{Achieve outcome} without {pain point}"
119+
- "The {category} for {audience}"
120+
- "Never {unpleasant event} again"
121+
- "{Question highlighting main pain point}"
122+
123+
**For comprehensive headline formulas**: See [references/copy-frameworks.md](references/copy-frameworks.md)
124+
125+
**Structure the hero as a transformation** — current discomfort → better vision → path to action (the Human Action Model), then run every headline through the "Now you can" test. See [references/copy-frameworks.md](references/copy-frameworks.md#clarity--message-market-fit)
126+
127+
**For natural transition phrases**: See [references/natural-transitions.md](references/natural-transitions.md)
128+
129+
**Subheadline**
130+
- Expands on headline
131+
- Adds specificity
132+
- 1-2 sentences max
133+
134+
**Primary CTA**
135+
- Action-oriented button text
136+
- Communicate what they get: "Start Free Trial" > "Sign Up"
137+
138+
### Core Sections
139+
140+
| Section | Purpose |
141+
|---------|---------|
142+
| Social Proof | Build credibility (logos, stats, testimonials) |
143+
| Problem/Pain | Show you understand their situation |
144+
| Solution/Benefits | Connect to outcomes (3-5 key benefits) |
145+
| How It Works | Reduce perceived complexity (3-4 steps) |
146+
| Objection Handling | FAQ, comparisons, guarantees |
147+
| Final CTA | Recap value, repeat CTA, risk reversal |
148+
149+
**For detailed section types and page templates**: See [references/copy-frameworks.md](references/copy-frameworks.md)
150+
151+
---
152+
153+
## CTA Copy Guidelines
154+
155+
**Weak CTAs (avoid):**
156+
- Submit, Sign Up, Learn More, Click Here, Get Started
157+
158+
**Strong CTAs (use):**
159+
- Start Free Trial
160+
- Get [Specific Thing]
161+
- See [Product] in Action
162+
- Create Your First [Thing]
163+
- Download the Guide
164+
165+
**Formula:** [Action Verb] + [What They Get] + [Qualifier if needed]
166+
167+
Examples:
168+
- "Start My Free Trial"
169+
- "Get the Complete Checklist"
170+
- "See Pricing for My Team"
171+
172+
---
173+
174+
## Page-Specific Guidance
175+
176+
### Homepage
177+
- Serve multiple audiences without being generic
178+
- Lead with broadest value proposition
179+
- Provide clear paths for different visitor intents
180+
181+
### Landing Page
182+
- Single message, single CTA
183+
- Match headline to ad/traffic source
184+
- Complete argument on one page
185+
186+
### Pricing Page
187+
- Help visitors choose the right plan
188+
- Address "which is right for me?" anxiety
189+
- Make recommended plan obvious
190+
191+
### Feature Page
192+
- Connect feature → benefit → outcome
193+
- Show use cases and examples
194+
- Clear path to try or buy
195+
196+
### About Page
197+
- Tell the story of why you exist
198+
- Connect mission to customer benefit
199+
- Still include a CTA
200+
201+
---
202+
203+
## Voice and Tone
204+
205+
Before writing, establish:
206+
207+
**Formality level:**
208+
- Casual/conversational
209+
- Professional but friendly
210+
- Formal/enterprise
211+
212+
**Brand personality:**
213+
- Playful or serious?
214+
- Bold or understated?
215+
- Technical or accessible?
216+
217+
Maintain consistency, but adjust intensity:
218+
- Headlines can be bolder
219+
- Body copy should be clearer
220+
- CTAs should be action-oriented
221+
222+
---
223+
224+
## Output Format
225+
226+
When writing copy, provide:
227+
228+
### Page Copy
229+
Organized by section:
230+
- Headline, Subheadline, CTA
231+
- Section headers and body copy
232+
- Secondary CTAs
233+
234+
### Annotations
235+
For key elements, explain:
236+
- Why you made this choice
237+
- What principle it applies
238+
239+
### Alternatives
240+
For headlines and CTAs, provide 2-3 options:
241+
- Option A: [copy] — [rationale]
242+
- Option B: [copy] — [rationale]
243+
244+
### Meta Content (if relevant)
245+
- Page title (for SEO)
246+
- Meta description
247+
248+
---
249+
250+
## Related Skills
251+
252+
- **copy-editing**: For polishing existing copy (use after your draft)
253+
- **cro**: If page structure/strategy needs work, not just copy
254+
- **emails**: For email copywriting
255+
- **popups**: For popup and modal copy
256+
- **ab-testing**: To test copy variations
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
{
2+
"skill_name": "copywriting",
3+
"evals": [
4+
{
5+
"id": 1,
6+
"prompt": "Write homepage copy for a SaaS tool that automates employee onboarding. Target audience is HR directors at mid-size companies (200-2000 employees). Main differentiator is that it integrates with all major HRIS systems and cuts onboarding time from 2 weeks to 2 days.",
7+
"expected_output": "Should check for product-marketing.md first. Should write full page copy organized by section: Headline, Subheadline, CTA (above the fold), then Social Proof, Problem/Pain, Solution/Benefits, How It Works, Objection Handling, and Final CTA. Should follow copywriting principles: clarity over cleverness, benefits over features, specificity (use the '2 weeks to 2 days' stat), customer language. Headline should communicate core value proposition. CTAs should be action-oriented ('Start Free Trial' not 'Submit'). Should provide 2-3 headline alternatives with rationale. Should include annotations explaining key copy choices. Should include meta content (SEO page title and meta description).",
8+
"assertions": [
9+
"Checks for product-marketing.md",
10+
"Writes full page copy organized by section",
11+
"Includes Headline, Subheadline, and CTA above the fold",
12+
"Includes Social Proof, Problem/Pain, Solution/Benefits, How It Works sections",
13+
"Uses the '2 weeks to 2 days' specificity in copy",
14+
"CTAs are action-oriented, not generic",
15+
"Provides 2-3 headline alternatives with rationale",
16+
"Includes annotations explaining copy choices",
17+
"Includes meta content (SEO title and meta description)"
18+
],
19+
"files": []
20+
},
21+
{
22+
"id": 2,
23+
"prompt": "Rewrite this headline: 'An Innovative AI-Powered Platform for Streamlined Business Operations' — it's for a B2B SaaS tool that helps small businesses manage invoicing and payments.",
24+
"expected_output": "Should identify problems: jargon ('innovative,' 'AI-powered,' 'streamlined,' 'business operations'), too vague, company language not customer language. Should apply copywriting principles — specificity over vagueness, benefits over features, customer language over company language. Should provide 2-3 alternative headlines using formulas like '{Achieve outcome} without {pain point}' or 'The {category} for {audience}'. Each alternative should include rationale. Should also suggest a subheadline that adds specificity.",
25+
"assertions": [
26+
"Identifies jargon in original headline",
27+
"Identifies vagueness as a problem",
28+
"Identifies company language vs customer language issue",
29+
"Provides 2-3 alternative headlines",
30+
"Alternatives use headline formulas from the skill",
31+
"Each alternative includes rationale",
32+
"Suggests a subheadline"
33+
],
34+
"files": []
35+
},
36+
{
37+
"id": 3,
38+
"prompt": "i need copy for my pricing page. we have three plans: starter ($29/mo), pro ($79/mo), business ($199/mo). it's a social media scheduling tool for marketers",
39+
"expected_output": "Should trigger on the casual phrasing. Should ask or infer audience context. Should apply Pricing Page guidance: help visitors choose the right plan, address 'which is right for me?' anxiety, make recommended plan obvious. Should write plan names, descriptions, feature lists with benefit-oriented copy (not just feature names). Should include a page headline that addresses the pricing decision. CTAs should be specific per plan. Should handle objection handling (FAQ copy). Should provide alternatives for key elements.",
40+
"assertions": [
41+
"Triggers on casual phrasing",
42+
"Applies Pricing Page guidance",
43+
"Addresses 'which plan is right for me' anxiety",
44+
"Makes recommended plan obvious",
45+
"Writes benefit-oriented feature copy, not just feature names",
46+
"Includes page headline",
47+
"CTAs are specific per plan",
48+
"Includes FAQ or objection handling copy",
49+
"Provides alternatives for key elements"
50+
],
51+
"files": []
52+
},
53+
{
54+
"id": 4,
55+
"prompt": "Write copy for our About page. We're a 3-person startup that built a developer tool for database migrations. Founded because we kept losing data during migrations at our last jobs. Tone should be professional but human.",
56+
"expected_output": "Should apply About Page guidance: tell the story of why you exist, connect mission to customer benefit, still include a CTA. Should adapt voice and tone to 'professional but human' as specified. Should tell the founder origin story authentically. Should connect the personal pain to the customer's pain. Should include a CTA even on the About page. Copy should follow style rules: active voice, confident, specific. Should NOT be overly corporate or generic.",
57+
"assertions": [
58+
"Applies About Page guidance",
59+
"Tells the story of why the company exists",
60+
"Connects mission to customer benefit",
61+
"Includes a CTA",
62+
"Adapts tone to professional but human",
63+
"Uses the founder origin story",
64+
"Connects personal pain to customer pain",
65+
"Uses active voice",
66+
"Avoids corporate jargon"
67+
],
68+
"files": []
69+
},
70+
{
71+
"id": 5,
72+
"prompt": "Can you improve this CTA? We currently have 'Learn More' on our feature page for our analytics dashboard product.",
73+
"expected_output": "Should immediately identify 'Learn More' as a weak CTA per the guidelines. Should apply the CTA formula: [Action Verb] + [What They Get] + [Qualifier]. Should provide 2-3 strong alternatives like 'See the Dashboard in Action,' 'Start Your Free Trial,' or 'Explore Analytics Features.' Each alternative should include rationale and context for when it works best. Should also consider CTA hierarchy — whether this is a primary or secondary CTA, and suggest complementary CTAs if relevant.",
74+
"assertions": [
75+
"Identifies 'Learn More' as a weak CTA",
76+
"Applies the CTA formula from the skill",
77+
"Provides 2-3 strong alternatives",
78+
"Each alternative includes rationale",
79+
"Considers CTA hierarchy (primary vs secondary)",
80+
"Suggests complementary CTAs"
81+
],
82+
"files": []
83+
},
84+
{
85+
"id": 6,
86+
"prompt": "Write me a 5-email welcome sequence for new trial users of our project management tool.",
87+
"expected_output": "Should recognize this is an email copywriting task, not page copywriting. Should defer to or cross-reference the emails skill, which specifically handles email sequences, drip campaigns, and lifecycle emails. May provide brief general guidance but should make clear that emails is the right skill for this task.",
88+
"assertions": [
89+
"Recognizes this as email sequence work",
90+
"References or defers to emails skill",
91+
"Does not attempt to write a full email sequence using page copywriting patterns"
92+
],
93+
"files": []
94+
},
95+
{
96+
"id": 7,
97+
"prompt": "Review this copy and tell me what's wrong: 'We are extremely excited to announce our revolutionary, cutting-edge platform that will totally transform how businesses optimize their workflows! Sign up now!!'",
98+
"expected_output": "Should apply the Quick Quality Check. Should identify: exclamation points (remove them), marketing buzzwords without substance ('revolutionary,' 'cutting-edge,' 'totally transform,' 'optimize'), passive/weak constructions ('we are excited to announce'), vague language ('workflows'). Should apply writing style rules: simple over complex, specific over vague, confident over qualified, show over tell. Should rewrite the copy following these principles. Should provide 2-3 alternatives.",
99+
"assertions": [
100+
"Identifies exclamation point overuse",
101+
"Identifies marketing buzzwords without substance",
102+
"Identifies vague language",
103+
"Applies writing style rules",
104+
"Rewrites the copy following principles",
105+
"Provides alternatives",
106+
"Result is specific, clear, and jargon-free"
107+
],
108+
"files": []
109+
},
110+
{
111+
"id": 8,
112+
"prompt": "Write above-the-fold copy for a calendar scheduling tool. Our differentiator is that the recipient gets to overlay their own calendar on the invite, so picking a time feels fair to both people instead of one-sided. Same product needs to work for indie founders AND for enterprise ops teams.",
113+
"expected_output": "Should structure the hero using the Human Action Model transformation spine: current discomfort (the awkwardness of sending a one-sided scheduling link), better vision (scheduling that feels considerate to both people), and path to action (the overlay mechanic + a specific CTA). Should run headline candidates through the 'Now you can' test and prefer lines that are compelling and true. Should reference or echo the SavvyCal awkward-link insight ('You shouldn't have to feel awkward sending out your scheduling link') as the message-market-fit model. Should surface the Perception Gap: the same benefit reads differently by risk tolerance, so it should provide a value-prop swap — a founder-facing framing (speed, no sales calls) and an enterprise-facing framing (security, SLAs, reliability) rather than one averaged, mushy message. Should favor clarity over cleverness and provide 2-3 headline alternatives with rationale.",
114+
"assertions": [
115+
"Structures the hero as discomfort -> vision -> path (Human Action Model)",
116+
"Applies the 'Now you can' test to headline candidates",
117+
"References the SavvyCal awkward-link message-market-fit insight",
118+
"Surfaces the Perception Gap between segments",
119+
"Provides a value-prop swap: founder framing vs enterprise framing",
120+
"Favors clarity over cleverness",
121+
"Provides 2-3 headline alternatives with rationale"
122+
],
123+
"files": []
124+
}
125+
]
126+
}

0 commit comments

Comments
 (0)