/jab-hook — Jab-jab-jab-right-hook for a personal portfolio skill
Gary Vaynerchuk's jab-jab-jab-right-hook framework applied to a personal portfolio rotation on X and LinkedIn.
by coreyhaines31·MIT license·★ 855 Stars on the repo·GitHub ↗
npx degit coreyhaines31/makerskills/skills/jab-hook#main ~/.claude/skills/jab-hookChecked ·commit main
Inside this skill
SKILL.md · the author's own words# /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* (p… **One-time setup**: see `references/properties.md` and `references/typefully-config.md` to configure your real portfolio + workspace. Perso… ## 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
Word-for-word excerpt, not a result. Read the full SKILL.md ↓
Files of /jab-hook — Jab-jab-jab-right-hook for a personal portfolio
Show the full text123 lines
/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 the Typefully MCP server's list-social-sets tool and 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 its list-drafts tool, filtered to the last 30 days
- Classify each as promo / BIP / educational by content
- First run: call the Typefully MCP server's list-social-sets tool and ask which social set is your personal (X + LinkedIn). Save the ID to
- 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 the Typefully create-draft tool once 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
feedback_social_link_placement.mdin your memory store (see below). 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
Your memory store is your agent's persistent memory if it has one (Claude Code's memory directory, for example), otherwise ${MAKERSKILLS_MEMORY:-${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/memory}/.
feedback_promo_voice.mdin your memory store (if present) — conviction-coded CTAs + reader-perspective framingfeedback_social_cadence.mdin your memory store (if present) — cadence cap (e.g., 2 posts/day per platform)
| 1 | |
| 2 | name jab-hook |
| 3 | 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." |
| 4 | metadata |
| 5 | version 0.3.2 |
| 6 | |
| 7 | |
| 8 | # /jab-hook — Jab-jab-jab-right-hook for a personal portfolio |
| 9 | |
| 10 | 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. |
| 11 | |
| 12 | **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/`. |
| 13 | |
| 14 | ## Mental model |
| 15 | |
| 16 | **N rotation slots** (configured in `~/.config/makerskills/jab-hook/properties.yaml`): one per property you want to promote on rotation |
| 17 | **~2 promo posts/week** → each property cycles every ~3 weeks at equal weight |
| 18 | **Non-promo days**: 50/50 build-in-public vs educational |
| 19 | **Target weekly rhythm**: ~2 promo + ~2–3 BIP + ~2–3 educational |
| 20 | **Platforms**: X + LinkedIn via your personal Typefully workspace |
| 21 | |
| 22 | ## Step 1 — Pick the mode |
| 23 | |
| 24 | Detect from the trigger: |
| 25 | |
| 26 | | User says | Mode | |
| 27 | |---|---| |
| 28 | | "plan my socials," "next week's posts" | **plan** | |
| 29 | | "what should I post," "next promo," "pick next" | **pick-next** | |
| 30 | | "audit my socials," "what's overdue," "what haven't I posted about" | **audit** | |
| 31 | | "draft a promo for X," "BIP post about Y," "educational about Z" | **draft** | |
| 32 | |
| 33 | If ambiguous, confirm. |
| 34 | |
| 35 | ## Step 2 — Load context |
| 36 | |
| 37 | Read `references/properties.md` — the 6 rotation slots and angle ideas |
| 38 | Read `references/voice.md` — the user's voice rules per platform |
| 39 | Read `references/content-types.md` — templates for promo / BIP / educational |
| 40 | Pull recent posts from your personal Typefully workspace: |
| 41 | First run: call the Typefully MCP server's list-social-sets tool 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). |
| 42 | Call its list-drafts tool, filtered to the last 30 days |
| 43 | Classify each as promo / BIP / educational by content |
| 44 | Compute **days since last promo** for each of the 6 slots |
| 45 | |
| 46 | ## Step 3 — Mode logic |
| 47 | |
| 48 | ### plan (7-day plan) |
| 49 | Slot the 1–2 most overdue properties as **promo** posts |
| 50 | Fill remaining 5 days with **alternating** BIP and educational (50/50) |
| 51 | Output as a table: `Day | Type | Property/Topic | Hook | Draft summary` |
| 52 | Don't stack two promo on consecutive days |
| 53 | After the user approves the plan, offer to draft each one in sequence |
| 54 | |
| 55 | ### pick-next |
| 56 | Identify the most overdue property |
| 57 | If most overdue < 14 days, suggest a BIP or educational instead (whichever is less recent) |
| 58 | Draft 1 post; ask before syndicating |
| 59 | |
| 60 | ### audit |
| 61 | Report: days since last promo per property, ordered by most overdue |
| 62 | Flag any property >21 days as overdue |
| 63 | Suggest the next 1–2 moves |
| 64 | |
| 65 | ### draft |
| 66 | Skip rotation logic — draft the requested post |
| 67 | Use the right content-type template |
| 68 | |
| 69 | ## Step 4 — Draft |
| 70 | |
| 71 | 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. |
| 72 | |
| 73 | **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. |
| 74 | |
| 75 | ### Optional: inspiration scan |
| 76 | |
| 77 | For `promo` and `educational` posts, optionally scan inspiration accounts (`references/inspiration.md`) before drafting: |
| 78 | |
| 79 | Pick 1–2 accounts whose audience overlaps with the property |
| 80 | Pull recent posts (agent-browser if it works on LinkedIn; otherwise ask the user to paste examples or fall back to their X/newsletter) |
| 81 | Extract structural patterns: hook openers, post length, line-break rhythm, CTA styles |
| 82 | Apply ONE pattern to the user's voice — never mimic phrasing |
| 83 | 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 |
| 84 | |
| 85 | Skip inspiration scan when the user says "just draft it" or when iterating on an existing post. |
| 86 | |
| 87 | ## Step 5 — Syndicate to Typefully |
| 88 | |
| 89 | Ask: *"Push to Typefully now? (X + LinkedIn, your personal workspace)"* |
| 90 | |
| 91 | If yes: |
| 92 | Read social set ID from `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/typefully.yaml` (setup notes in `references/typefully-config.md`) |
| 93 | Call the Typefully create-draft tool once for X, once for LinkedIn (or once with both platforms if the social set spans both) |
| 94 | 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. |
| 95 | Default to **draft** state (not scheduled) — the user reviews in Typefully UI before sending |
| 96 | Return the Typefully draft URLs |
| 97 | |
| 98 | ## Composes with |
| 99 | |
| 100 | `paste` — clean output for pasting into Typefully / LinkedIn / X manually if the MCP path doesn't fit |
| 101 | `social-fetch` — pull inspiration-account posts for structural analysis (replaces inline agent-browser) |
| 102 | `second-brain` — the `Content Ideas` wiki page hoppers hooks, frameworks, stories; `/jab-hook` drafts pull candidates from there |
| 103 | `deep-research` — when a promo needs a stat or citation the draft doesn't have yet |
| 104 | `marketingskills:social` — generic social frameworks, useful when teaching strategy vs shipping your own posts |
| 105 | `marketingskills:copywriting` — for hook / headline ideation when stuck |
| 106 | |
| 107 | ## Notes on quality |
| 108 | |
| 109 | **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. |
| 110 | **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. |
| 111 | **Links belong in first comments, not the body** for LinkedIn + X. Documented in `feedback_social_link_placement.md` in your memory store (see below). Body posts with inline URLs get algorithm-suppressed on both platforms. |
| 112 | **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. |
| 113 | **Reader-perspective framing.** *"You'll know X"* not *"we'll teach you X."* *"What you're guaranteed"* not *"what we'd guarantee."* |
| 114 | **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`. |
| 115 | **Cadence cap: 2 posts/day per platform, per account.** More than that degrades reach + reads as spam. |
| 116 | |
| 117 | ## Memory references |
| 118 | |
| 119 | Your memory store is your agent's persistent memory if it has one (Claude Code's memory directory, for example), otherwise `${MAKERSKILLS_MEMORY:-${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/memory}/`. |
| 120 | |
| 121 | `feedback_promo_voice.md` in your memory store (if present) — conviction-coded CTAs + reader-perspective framing |
| 122 | `feedback_social_cadence.md` in your memory store (if present) — cadence cap (e.g., 2 posts/day per platform) |
| 123 |
Discussion
Alternatives
Browse more free Claude skills or everything in Finance.