jab-hook
Gary Vaynerchuk's jab-jab-jab-right-hook framework applied to a personal portfolio rotation on X and LinkedIn. Jabs = build-in-public + educational (value). Hooks = promo (the ask). Each property in the user's configured portfolio (see `~/.config/makerskills/jab-hook/properties.y
Install
npx skills add https://github.com/coreyhaines31/makerskills/tree/main/skills/jab-hook
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install coreyhaines31-makerskills@llmmart
git clone https://github.com/coreyhaines31/makerskills.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole coreyhaines31/makerskills collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
/jab-hook — Jab-jab-jab-right-hook for a personal portfolio
Gary Vaynerchuk's framework applied to your configured portfolio: keep the feed mostly jabs (value — BIP + educational) so the hooks (promo) earn attention when they land. Drafts to your personal Typefully workspace.
One-time setup: see references/properties.md and references/typefully-config.md to configure your real portfolio + workspace. Personal config lives in ${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/.
Mental model
- N rotation slots (configured in
~/.config/makerskills/jab-hook/properties.yaml): one per property you want to promote on rotation - ~2 promo posts/week → each property cycles every ~3 weeks at equal weight
- Non-promo days: 50/50 build-in-public vs educational
- Target weekly rhythm: ~2 promo + ~2–3 BIP + ~2–3 educational
- Platforms: X + LinkedIn via your personal Typefully workspace
Step 1 — Pick the mode
Detect from the trigger:
| User says | Mode |
|---|---|
| "plan my socials," "next week's posts" | plan |
| "what should I post," "next promo," "pick next" | pick-next |
| "audit my socials," "what's overdue," "what haven't I posted about" | audit |
| "draft a promo for X," "BIP post about Y," "educational about Z" | draft |
If ambiguous, confirm.
Step 2 — Load context
- Read
references/properties.md— the 6 rotation slots and angle ideas - Read
references/voice.md— the user's voice rules per platform - Read
references/content-types.md— templates for promo / BIP / educational - Pull recent posts from your personal Typefully workspace:
- First run: call
mcp__typefully__typefully_list_social_setsand ask which social set is your personal (X + LinkedIn). Save the ID to${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/typefully.yamlfor future runs (schema inreferences/typefully-config.example.yaml— never save it inside the skill folder; upgrades wipe it). - Call
mcp__typefully__typefully_list_draftsfiltered to the last 30 days - Classify each as promo / BIP / educational by content
- First run: call
- Compute days since last promo for each of the 6 slots
Step 3 — Mode logic
plan (7-day plan)
- Slot the 1–2 most overdue properties as promo posts
- Fill remaining 5 days with alternating BIP and educational (50/50)
- Output as a table:
Day | Type | Property/Topic | Hook | Draft summary - Don't stack two promo on consecutive days
- After the user approves the plan, offer to draft each one in sequence
pick-next
- Identify the most overdue property
- If most overdue < 14 days, suggest a BIP or educational instead (whichever is less recent)
- Draft 1 post; ask before syndicating
audit
- Report: days since last promo per property, ordered by most overdue
- Flag any property >21 days as overdue
- Suggest the next 1–2 moves
draft
- Skip rotation logic — draft the requested post
- Use the right content-type template
Step 4 — Draft
Follow references/voice.md and references/content-types.md. Default: single post, one per platform (X version + LinkedIn version). Thread only if the second post earns its place.
Link placement (load-bearing): never put a URL in the body. Default is no link at all — let curiosity drive the click. When a link is needed, draft it as a first comment for LinkedIn (Typefully supports auto-comment) or a reply for X. The body always stands alone.
Optional: inspiration scan
For promo and educational posts, optionally scan inspiration accounts (references/inspiration.md) before drafting:
- Pick 1–2 accounts whose audience overlaps with the property
- Pull recent posts (agent-browser if it works on LinkedIn; otherwise ask the user to paste examples or fall back to their X/newsletter)
- Extract structural patterns: hook openers, post length, line-break rhythm, CTA styles
- Apply ONE pattern to the user's voice — never mimic phrasing
- Log new patterns in
${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/patterns.local.md(create if missing) so they accumulate —references/patterns.mddocuments the starter patterns and stays read-only
Skip inspiration scan when the user says "just draft it" or when iterating on an existing post.
Step 5 — Syndicate to Typefully
Ask: "Push to Typefully now? (X + LinkedIn, your personal workspace)"
If yes:
- Read social set ID from
${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/typefully.yaml(setup notes inreferences/typefully-config.md) - Call
mcp__typefully__typefully_create_draftonce for X, once for LinkedIn (or once with both platforms if the social set spans both) - If the draft has a first-comment link, configure Typefully to add it automatically (LinkedIn auto-comment / X reply). If the MCP doesn't support auto-comment for one of the platforms, surface the comment text so the user can paste it after publishing.
- Default to draft state (not scheduled) — the user reviews in Typefully UI before sending
- Return the Typefully draft URLs
Composes with
paste— clean output for pasting into Typefully / LinkedIn / X manually if the MCP path doesn't fitsocial-fetch— pull inspiration-account posts for structural analysis (replaces inline agent-browser)second-brain— theContent Ideaswiki page hoppers hooks, frameworks, stories;/jab-hookdrafts pull candidates from theredeep-research— when a promo needs a stat or citation the draft doesn't have yetmarketingskills:social— generic social frameworks, useful when teaching strategy vs shipping your own postsmarketingskills:copywriting— for hook / headline ideation when stuck
Notes on quality
- 1 promo per week per property is the floor, not the ceiling. Rotation compounds when it's predictable — 4 properties × 1 promo/week = 4 promo weeks/month. Educational + BIP + community fill the rest.
- Never mimic phrasing from inspiration accounts. Extract structure (hook opener type, line-break rhythm, CTA style) and apply to your own voice. Voice is the moat; copying phrasing destroys it.
- Links belong in first comments, not the body for LinkedIn + X. Documented in
~/.claude/memory/feedback_social_link_placement.md. Body posts with inline URLs get algorithm-suppressed on both platforms. - Draft state, not scheduled state. Every Typefully push defaults to draft — human review in the Typefully UI before publish is non-negotiable. Automated scheduling of unreviewed drafts has repeatedly produced posts the user regrets.
- Reader-perspective framing. "You'll know X" not "we'll teach you X." "What you're guaranteed" not "what we'd guarantee."
- Voice.local.md overrides the shipped voice.md. Personal voice rules never live in the public repo — always in
${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/voice.local.md. - Cadence cap: 2 posts/day per platform, per account. More than that degrades reach + reads as spam.
Memory references
~/.claude/memory/feedback_promo_voice.md(if present) — conviction-coded CTAs + reader-perspective framing~/.claude/memory/feedback_social_cadence.md(if present) — cadence cap (e.g., 2 posts/day per platform)
Files (makerskills)
-
references
-
content-types.md 3.4 KB
# Content types Three types. Weekly target: 2 promo + 2–3 BIP + 2–3 educational = 5–7 posts. --- ## promo (~2/week, one of the 6 properties) Direct mention of one property by name. **Default: no link in the body.** If a link is included, it goes in a first comment below the post (Typefully supports this on LinkedIn) or a reply on X — never inline. See `voice.md`. **Hook = the angle, not "check out X."** Best openers: - Specific outcome: *"I just shipped a CRO audit that cut signup friction by 38%."* - Contrarian take: *"Most CRO playbooks tell you to A/B test. Most teams shouldn't."* - Story open: *"Two weeks ago, a SaaS founder told me their bounce rate was 'fine.' It was 31%."* - One specific lesson: *"The most underrated chapter in Mental Models For Marketing: 'Loss aversion ≠ scarcity.'"* **Structure**: ``` [hook — a take, outcome, or story] [1–2 sentence development naming the property] [conviction-coded close — invites action without linking] ``` If a first-comment link is being added, draft it separately as: ``` [short context line + URL] ``` **Decision: link or no link?** - No link: when the post stands alone — readers can find the property by name. Default for short promo, BIP-adjacent promo, and when the property is well-known to the audience. - Link in first comment: when there's a specific destination (an ebook, a new feature page, a newsletter issue) that wouldn't be obvious from the property name alone. **Avoid**: - "Just dropped X, link below" - "Excited to share..." - Anything that sounds like a press release ## build-in-public / BIP (~2–3/week) Behind-the-scenes of running your businesses, properties, or the user's day. Usually no CTA, no URL. **Best openers**: - A number: *"$X MRR this month."* / *"Took 14 sales calls this week."* - A screenshot description: *"Here's what our pipeline looked like Monday morning."* - A lesson: *"Here's what didn't work this quarter."* - A workflow: *"How I'm using Claude Code to draft client decks."* **Structure**: ``` [concrete fact, number, or moment] [the lesson or surprise] [optional: question or observation that invites reply] ``` **Topics that work**: - Revenue / pipeline updates - What the user shipped this week - A tool / process change - A mistake + what they learned - Behind-the-scenes of a project ## educational (~2–3/week, no plug) Standalone insight or framework. No property URL. No CTA. Just teach one thing. **Best openers**: - A framework: *"Three signals you're charging too little:"* - A counterintuitive observation: *"Email open rates went up when we stopped writing subject lines for clicks."* - A pattern: *"Every B2B SaaS pricing page makes the same mistake on the enterprise tier."* **Structure**: ``` [take or observation] [the explanation in 1–3 sentences, or a short list] [optional: the implication] ``` **Topics that work**: - CRO / pricing / positioning principles - Marketing-x-AI trends and predictions - Tactical observations from client work (anonymized) - A reframe of a common piece of advice ## Cross-type mixing rules - Two consecutive promo posts → don't. Space them. - Two consecutive BIP posts → fine if different topics. - A promo post the day after a BIP that mentioned the same property → cannibalization, skip or change angle. - Educational that *implicitly* showcases a property's value is great, but don't link to the property — that turns it into promo. -
inspiration.example.md 3.3 KB
# Inspiration accounts (example / template) **Copy this file to `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/inspiration.local.md` and replace with your real list.** The local copy is gitignored. ## Setup ```bash mkdir -p ~/.config/makerskills/jab-hook cp skills/jab-hook/references/inspiration.example.md \ ~/.config/makerskills/jab-hook/inspiration.local.md # Then edit ~/.config/makerskills/jab-hook/inspiration.local.md with your real accounts ``` ## Schema — organize by platform What works on LinkedIn doesn't work on X (and vice versa). Organize the file with one section per platform you draft for. The `jab-hook` skill scans accounts from the section matching the draft's target platform. ```markdown # Inspiration accounts ## LinkedIn Long-form professional, carousels, framework breakdowns. | Name | LinkedIn | Why | |---|---|---| | <Real Name> | https://www.linkedin.com/in/<handle> | <1-line note — their niche, angle, what they do well> | ## X (Twitter) Short, punchy, thread mechanics, reply-as-content. | Name | X handle | Why | |---|---|---| | <Real Name> | https://x.com/<handle> | <note> | ## Instagram Visual-first, reel-driven. | Name | Instagram | Why | |---|---|---| | <Real Name> | https://www.instagram.com/<handle> | <note> | ## TikTok Vertical video, hook-heavy, trend-aware. | Name | TikTok | Why | |---|---|---| ## YouTube Long-form video. (More relevant to youtubeskills than jab-hook.) | Name | YouTube | Why | |---|---|---| ## Bluesky / Threads / Mastodon / other | Name | Platform | URL | Why | |---|---|---|---| ``` Only fill in sections for platforms you actually draft for. Leave others as placeholders. ## Same operator, two platforms? If someone is strong on both LinkedIn and X, list them in **both** sections — their craft differs per platform. Treat each listing as a separate inspiration source. ## How `jab-hook` uses your list When drafting a `promo` or `educational` post: 1. The skill determines the target platform(s) of the draft (X, LinkedIn, both) 2. Picks 1–2 accounts from the matching section(s) whose audience overlaps the property being promoted 3. Pulls recent posts via `social-fetch` (uses `agent-browser` for LinkedIn if no paid keys; ScrapeCreators for full X threads when `SCRAPECREATORS_API_KEY` is set) 4. Extracts: hook openers, structural patterns, CTA styles, post length, line-break rhythm 5. Chooses one pattern that fits the property + content type + platform conventions 6. Applies the pattern to YOUR voice — don't mimic their voice, only the structure Extracted patterns accumulate in `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/patterns.local.md`, tagged with `platform: <linkedin | x | …>` so the skill knows which patterns transfer where. ## Notes - LinkedIn often blocks unauthenticated scraping. If `agent-browser` walls, fall back to: pasting examples, pulling from their public newsletters, or scraping their X accounts. - X scraping needs `$SCRAPECREATORS_API_KEY` for full threads. Free strategy returns preview only. - Never copy phrasing — only structure, format, hook archetype. - Inspiration is a starting point. Your voice rules in `voice.md` (+ `voice.local.md` overlay) always override format choices. - Some patterns transfer across platforms (story-open hooks); others don't (LinkedIn carousels ≠ X threads). -
inspiration.md 3.6 KB
# Inspiration accounts **Your personal list lives at `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/inspiration.local.md`** — not in this repo (gitignored, on disk only). The list of operators you're learning from is your taste — keep it private. See `inspiration.example.md` in this directory for the schema + setup instructions. ## How the skill loads it 1. Read `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/inspiration.local.md` for the personal account list 2. If missing, skip the inspiration scan (skill still works, just without external pattern pull) ## Per-platform organization (load-bearing) The local file is organized by platform — `## LinkedIn`, `## X (Twitter)`, `## Instagram`, etc. — because **what works on one platform usually doesn't work on another**: - **LinkedIn**: long-form professional, carousel/document posts, framework breakdowns, narrative + takeaway - **X**: short (≤280 chars), thread mechanics, reply-as-content, punchier + snarkier - **Instagram**: visual-first, reel-driven, lifestyle / behind-the-scenes - **TikTok**: vertical video, hook-heavy, trend-aware short-form - **YouTube**: long-form (more relevant to `youtubeskills` than `jab-hook`) When the skill scans inspiration, it pulls from the section matching the TARGET PLATFORM of the draft. Cross-posted drafts (e.g., X + LinkedIn) scan both sections. ## Same person, two platforms When an operator appears on multiple platforms with strong presence on each, list them in both relevant sections — their craft per platform is usually different. Treat each listing as a separate inspiration source for that platform. ## Pattern library — also local + platform-tagged When the skill extracts hook patterns / structural patterns from inspiration-account posts, it writes them to: `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/patterns.local.md` Each pattern is tagged with the source platform (e.g., `platform: linkedin`) so future scans know which patterns transfer where. Some patterns are platform-portable (story-open hooks); others are platform-specific (LinkedIn carousel structure, X thread mechanics). This file is gitignored. The pattern library grows with use and stays your private playbook. ## Methodology (this stays public — recipe, not data) When drafting a `promo` or `educational` post: 1. **Determine the target platform(s)** — X, LinkedIn, both, etc. 2. **Pick 1–2 accounts from the matching platform section(s)** whose audience overlaps the property being promoted 3. **Pull their recent posts via `social-fetch`** - LinkedIn: `agent-browser` with modal dismissal (no API key needed) or ScrapeCreators if `SCRAPECREATORS_API_KEY` set for full post data - X: ScrapeCreators recommended; free tier returns preview only 4. **Extract**: hook openers, structural patterns (numbered list / contrarian-take / story-open / thread mechanics), CTA styles, post length, line-break rhythm 5. **Choose ONE pattern** that fits the property + content type + platform conventions 6. **Apply the pattern to YOUR voice** — don't mimic their voice, only the structure ## Notes - LinkedIn often blocks unauthenticated scraping. If `agent-browser` walls, fall back to: pasting examples, pulling from their public newsletters, or scraping their X accounts. - Never copy phrasing — only structure, format, hook archetype. - Inspiration is a starting point. Your voice rules in `voice.md` (+ `voice.local.md` overlay) always override format choices. - Some patterns transfer across platforms (story-open hooks); others don't (LinkedIn carousels won't work on X). The `patterns.local.md` platform tag helps the skill respect the boundary. -
patterns.md 1.6 KB
# Patterns library **Your extracted patterns live at `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/patterns.local.md`** — not in this repo (gitignored, on disk only). The patterns you've mined from inspiration accounts are your taste — keep them private. ## How the library works Each entry has: source account, archetype, anatomy (hook + structure + close), when-to-use, sample lift to your voice. The skill appends new patterns here as you scan more inspiration accounts. Over time it becomes a personal playbook of "things that work" for your audience. ## Schema (for reference — your real file will look like this) ```markdown ## N. <Pattern name> **Source**: <Account name> (<Platform>, post on <topic>, <date>) **Hook archetype**: <Description of the opening move> > *"<verbatim example from the source post>"* **Anatomy**: 1. <First structural beat> 2. <Second beat> 3. <Third beat> **When to use**: - <Property type or content type this fits> - <Audience signal this works for> **Lift to your voice**: - <What to drop from the source> - <What to keep> - <Adaptations specific to your voice rules> ``` ## When the skill writes to this file After running `/jab-hook` with an inspiration scan, the extracted patterns are appended to `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/patterns.local.md`. The skill numbers them sequentially. ## Notes - Patterns compound — the more you scan, the sharper your draft suggestions - Periodic cleanup: every 30–50 patterns, deduplicate similar ones - Reference your own voice rules (`voice.md` + `voice.local.md`) when deciding what to lift vs drop -
properties.example.yaml 1.7 KB
# Properties — your rotation slots # # Copy this file to ~/.config/makerskills/jab-hook/properties.yaml # and fill in your real properties. The personal copy is gitignored. # # Each slot = one of YOUR things to promote on rotation. # Default cadence: ~1 promo every 3 weeks per slot, ~2 promos/week total. # # When picking "most overdue," count from the date of the last PROMO # post (not BIP / educational mentions). slots: - name: "My SaaS product" description: "What it is in one line" url: "https://example.com" primary_cta: "try it / book a demo / sign up" angle_ideas: - "Customer win or before/after" - "Behind-the-scenes of recent work" - "Specific feature or recent ship" - "The methodology / framework you use" notes: | Any nuance about voice when promoting this one (e.g., "use I-voice not we-voice here") - name: "Newsletter" description: "Topic, audience, why they should subscribe" url: "https://example.com/newsletter" primary_cta: "subscribe" angle_ideas: - "Lesson from most recent issue" - "Archive gem" - "Why I started it / editorial POV" # Add as many slots as you have properties to rotate. # Group ebooks / courses / other products as one slot with sub-rotation: - name: "Ebooks (rotating)" description: "All ebooks share one slot; rotate within" rotation: - title: "Ebook 1" url: "https://example.com/ebook-1" - title: "Ebook 2" url: "https://example.com/ebook-2" primary_cta: "buy now ($X)" angle_ideas: - "One specific lesson from the ebook" - "Who the ebook is for (1-sentence ICP)" - "Before/after of someone who applied it" -
properties.md 1.6 KB
# Properties — rotation methodology **Personal property list lives at `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/properties.yaml`** — not in this repo (gitignored, on disk only). This file documents the rotation methodology that operates on whatever properties you configure. ## Setup (one-time) ```bash mkdir -p ~/.config/makerskills/jab-hook cp skills/jab-hook/references/properties.example.yaml \ ~/.config/makerskills/jab-hook/properties.yaml # Edit ~/.config/makerskills/jab-hook/properties.yaml — add your real properties ``` See `properties.example.yaml` for the full schema with comments. ## Rotation methodology - **N slots, equal weight.** Each slot = one of your things to promote. - Default cadence: **~1 promo every 3 weeks per slot, ~2 promos/week total.** - When picking the "most overdue" slot, count from the date of the last **promo** post that mentioned it (BIP / educational mentions don't reset the timer). ## How the skill uses your properties config 1. Reads `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/properties.yaml` 2. For each slot, tracks "days since last promo" against Typefully history 3. Picks next promo based on Eisenhower-like priority (overdue + currently-most-promotable) 4. Drafts using the slot's voice notes + angle ideas 5. For "rotating" slots (e.g., ebooks where one slot cycles through N items), advances internal rotation per call ## Adding / removing slots Edit `~/.config/makerskills/jab-hook/properties.yaml` and re-run `/jab-hook` — no other change needed. The skill picks up the new config on every run. -
typefully-config.example.yaml 1 KB
# Typefully config — your personal workspace # # Copy this file to ~/.config/makerskills/jab-hook/typefully.yaml # and fill in your real values. The personal copy is gitignored. # # The skill reads from $MAKERSKILLS_CONFIG/jab-hook/typefully.yaml # (defaults to ~/.config/makerskills/jab-hook/typefully.yaml) personal_workspace: social_set_id: 0 # your Typefully social set ID (integer) username: "@yourhandle" name: "Your Name" team: "Your Team" platforms: # confirm via mcp__typefully__typefully_get_social_set_details - x - linkedin # Other social sets in the same team — listed so the skill knows # NOT to draft into them by default. Leave empty if solo. other_social_sets: - id: 0 name: "Partner / teammate handle" # do_not_use: true # uncomment to explicitly block this from /jab-hook # Behavior default: state: draft # draft | scheduled | published — usually draft add_first_comment: ask # ask | always | never (for the link-placement rule) -
typefully-config.md 1.2 KB
# Typefully config **Personal config lives at `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/typefully.yaml`** — not in this repo (gitignored, on disk only). ## Setup (one-time) ```bash # Create your personal config mkdir -p ~/.config/makerskills/jab-hook cp skills/jab-hook/references/typefully-config.example.yaml \ ~/.config/makerskills/jab-hook/typefully.yaml # Edit ~/.config/makerskills/jab-hook/typefully.yaml with your real Typefully social set ID. # Find it via: mcp__typefully__typefully_list_social_sets ``` ## Schema See `typefully-config.example.yaml` in this directory for the full schema + comments. ## How the skill loads it 1. Read `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/typefully.yaml` 2. If the file doesn't exist, fall back to interactive setup: - Call `mcp__typefully__typefully_list_social_sets` - Ask which one is the user's personal workspace - Save the answer to the config file for next time ## Other social sets in the same Typefully team If you're in a team workspace, the config file's `other_social_sets` list documents which sets to AVOID by default when drafting. The skill will not push to those without explicit override. -
voice.md 3.1 KB
# Voice — your personal posts First-person "I" voice. Direct, dry, conviction-coded. No hype. ## Voice rules (load-bearing) 1. **Conviction-coded CTAs over transactional** — "lock it in" beats "book a call now." "Grab the playbook" beats "click here to download." Make the CTA sound like a decision, not a transaction. 2. **Reader-perspective framing** — write what the reader gets, not what the user provides. "What you're guaranteed" not "what we'd guarantee." "You'll know X" not "we'll teach you X." 3. **Lead with a take, not a question** — questions feel needy; takes feel earned. 4. **One idea per post** — if it sprawls, split into a thread or cut it. 5. **Short sentences. Specific nouns. Verbs that do work.** ## Voice anti-patterns (starting list — iterate) - No emojis as decoration. Rare and pointed only. - No "🚀 💡 🔥" cliches, ever. - No "BTW," "PSA," "hot take," "unpopular opinion" openers — they signal weakness. - No "thread 🧵" labels — the thread structure speaks for itself. - No hashtags. - No "Just dropped," "Just shipped" unless something actually shipped today. - No questions just to bait engagement. ## Link placement (load-bearing) - **Default: no link in the post body.** Many promo posts work better with no link at all — let curiosity drive people to profile or search. Mention the property by name; trust the reader. - **When a link is needed: put it in a first comment below the post, not in the body.** Platforms downrank posts with outbound links. The comment also lets the link be richer (longer, with context) without bloating the post. - Never inline a URL inside the post body. ## Per-platform ### X - Single post default, ≤280 chars - Thread only if post #2 earns its place (genuinely adds, not just continues) - Link goes in a reply to the original post, not in the post itself - Reply game matters more than posting volume — note in plans when a post is "join the conversation" worthy ### LinkedIn - 200–400 chars body. No URL in the body. - Link goes in a first comment (Typefully supports this on LinkedIn drafts) - No hashtags (the user doesn't use them) - First line is the hook — gets cut off in feed if too long, so make line 1 self-contained ## Iterate me This is a starting point. Add rules here as they come up. Trim rules that turn out wrong. --- ## Local overlay (your personal voice DNA) The rules above are a sensible public default. To layer your specific voice on top (your tics, your phrasings, your callbacks): 1. Create `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/voice.local.md` 2. Put your additional voice rules / banned phrases / personal stylistic preferences in there 3. The `jab-hook` skill loads `voice.md` first (this file, generic), then `voice.local.md` (yours, additive) so your personal rules override or extend the defaults Example local overlay content: - Your own banned phrases beyond the AI-slop list - Personal sign-offs you do/don't use - Conviction-coded CTA phrasings unique to you - Account-specific tics (e.g., "always use 'lock it in' instead of 'book a call' on agency posts") `voice.local.md` is gitignored — your personal voice DNA never enters this repo.
-
-
SKILL.md 7.9 KB
--- name: jab-hook description: Gary Vaynerchuk's jab-jab-jab-right-hook framework applied to a personal portfolio rotation on X and LinkedIn. Jabs = build-in-public + educational (value). Hooks = promo (the ask). Each property in the user's configured portfolio (see `~/.config/makerskills/jab-hook/properties.yaml`) gets a hook at least once every ~3 weeks; jabs fill the rest. Drafts go into the user's Typefully workspace via MCP. Modes — plan (7-day plan), pick-next (single post), audit (coverage report), draft (specific post). Triggers on "/jab-hook," "what should I post," "plan my socials," "next promo," "next jab," "next hook," "social rotation," "promote [property]," "BIP post," "audit my socials," "what haven't I posted about." metadata: version: 0.3.1 --- # /jab-hook — Jab-jab-jab-right-hook for a personal portfolio Gary Vaynerchuk's framework applied to your configured portfolio: keep the feed mostly *jabs* (value — BIP + educational) so the *hooks* (promo) earn attention when they land. Drafts to your personal Typefully workspace. **One-time setup**: see `references/properties.md` and `references/typefully-config.md` to configure your real portfolio + workspace. Personal config lives in `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/`. ## Mental model - **N rotation slots** (configured in `~/.config/makerskills/jab-hook/properties.yaml`): one per property you want to promote on rotation - **~2 promo posts/week** → each property cycles every ~3 weeks at equal weight - **Non-promo days**: 50/50 build-in-public vs educational - **Target weekly rhythm**: ~2 promo + ~2–3 BIP + ~2–3 educational - **Platforms**: X + LinkedIn via your personal Typefully workspace ## Step 1 — Pick the mode Detect from the trigger: | User says | Mode | |---|---| | "plan my socials," "next week's posts" | **plan** | | "what should I post," "next promo," "pick next" | **pick-next** | | "audit my socials," "what's overdue," "what haven't I posted about" | **audit** | | "draft a promo for X," "BIP post about Y," "educational about Z" | **draft** | If ambiguous, confirm. ## Step 2 — Load context 1. Read `references/properties.md` — the 6 rotation slots and angle ideas 2. Read `references/voice.md` — the user's voice rules per platform 3. Read `references/content-types.md` — templates for promo / BIP / educational 4. Pull recent posts from your personal Typefully workspace: - First run: call `mcp__typefully__typefully_list_social_sets` and ask which social set is your personal (X + LinkedIn). Save the ID to `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/typefully.yaml` for future runs (schema in `references/typefully-config.example.yaml` — never save it inside the skill folder; upgrades wipe it). - Call `mcp__typefully__typefully_list_drafts` filtered to the last 30 days - Classify each as promo / BIP / educational by content 5. Compute **days since last promo** for each of the 6 slots ## Step 3 — Mode logic ### plan (7-day plan) - Slot the 1–2 most overdue properties as **promo** posts - Fill remaining 5 days with **alternating** BIP and educational (50/50) - Output as a table: `Day | Type | Property/Topic | Hook | Draft summary` - Don't stack two promo on consecutive days - After the user approves the plan, offer to draft each one in sequence ### pick-next - Identify the most overdue property - If most overdue < 14 days, suggest a BIP or educational instead (whichever is less recent) - Draft 1 post; ask before syndicating ### audit - Report: days since last promo per property, ordered by most overdue - Flag any property >21 days as overdue - Suggest the next 1–2 moves ### draft - Skip rotation logic — draft the requested post - Use the right content-type template ## Step 4 — Draft Follow `references/voice.md` and `references/content-types.md`. Default: **single post**, one per platform (X version + LinkedIn version). Thread only if the second post earns its place. **Link placement (load-bearing)**: never put a URL in the body. Default is no link at all — let curiosity drive the click. When a link is needed, draft it as a **first comment** for LinkedIn (Typefully supports auto-comment) or a **reply** for X. The body always stands alone. ### Optional: inspiration scan For `promo` and `educational` posts, optionally scan inspiration accounts (`references/inspiration.md`) before drafting: 1. Pick 1–2 accounts whose audience overlaps with the property 2. Pull recent posts (agent-browser if it works on LinkedIn; otherwise ask the user to paste examples or fall back to their X/newsletter) 3. Extract structural patterns: hook openers, post length, line-break rhythm, CTA styles 4. Apply ONE pattern to the user's voice — never mimic phrasing 5. Log new patterns in `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/patterns.local.md` (create if missing) so they accumulate — `references/patterns.md` documents the starter patterns and stays read-only Skip inspiration scan when the user says "just draft it" or when iterating on an existing post. ## Step 5 — Syndicate to Typefully Ask: *"Push to Typefully now? (X + LinkedIn, your personal workspace)"* If yes: 1. Read social set ID from `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/typefully.yaml` (setup notes in `references/typefully-config.md`) 2. Call `mcp__typefully__typefully_create_draft` once for X, once for LinkedIn (or once with both platforms if the social set spans both) 3. If the draft has a first-comment link, configure Typefully to add it automatically (LinkedIn auto-comment / X reply). If the MCP doesn't support auto-comment for one of the platforms, surface the comment text so the user can paste it after publishing. 4. Default to **draft** state (not scheduled) — the user reviews in Typefully UI before sending 5. Return the Typefully draft URLs ## Composes with - `paste` — clean output for pasting into Typefully / LinkedIn / X manually if the MCP path doesn't fit - `social-fetch` — pull inspiration-account posts for structural analysis (replaces inline agent-browser) - `second-brain` — the `Content Ideas` wiki page hoppers hooks, frameworks, stories; `/jab-hook` drafts pull candidates from there - `deep-research` — when a promo needs a stat or citation the draft doesn't have yet - `marketingskills:social` — generic social frameworks, useful when teaching strategy vs shipping your own posts - `marketingskills:copywriting` — for hook / headline ideation when stuck ## Notes on quality - **1 promo per week per property is the floor, not the ceiling.** Rotation compounds when it's predictable — 4 properties × 1 promo/week = 4 promo weeks/month. Educational + BIP + community fill the rest. - **Never mimic phrasing from inspiration accounts.** Extract *structure* (hook opener type, line-break rhythm, CTA style) and apply to your own voice. Voice is the moat; copying phrasing destroys it. - **Links belong in first comments, not the body** for LinkedIn + X. Documented in `~/.claude/memory/feedback_social_link_placement.md`. Body posts with inline URLs get algorithm-suppressed on both platforms. - **Draft state, not scheduled state.** Every Typefully push defaults to draft — human review in the Typefully UI before publish is non-negotiable. Automated scheduling of unreviewed drafts has repeatedly produced posts the user regrets. - **Reader-perspective framing.** *"You'll know X"* not *"we'll teach you X."* *"What you're guaranteed"* not *"what we'd guarantee."* - **Voice.local.md overrides the shipped voice.md.** Personal voice rules never live in the public repo — always in `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/voice.local.md`. - **Cadence cap: 2 posts/day per platform, per account.** More than that degrades reach + reads as spam. ## Memory references - `~/.claude/memory/feedback_promo_voice.md` (if present) — conviction-coded CTAs + reader-perspective framing - `~/.claude/memory/feedback_social_cadence.md` (if present) — cadence cap (e.g., 2 posts/day per platform)
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.