/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 ↗

Use now

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

coreyhaines31/main1 file shown
SKILL.md
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

  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 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).
    • Call its list-drafts tool, 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 the Typefully create-draft tool 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 feedback_social_link_placement.md in 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.md in your memory store (if present) — conviction-coded CTAs + reader-perspective framing
  • feedback_social_cadence.md in your memory store (if present) — cadence cap (e.g., 2 posts/day per platform)
1---
2name: jab-hook
3description: 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."
4metadata:
5 version: 0.3.2
6---
7 
8# /jab-hook — Jab-jab-jab-right-hook for a personal portfolio
9 
10Gary 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 
24Detect 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 
33If ambiguous, confirm.
34 
35## Step 2 — Load context
36 
371. Read `references/properties.md` — the 6 rotation slots and angle ideas
382. Read `references/voice.md` — the user's voice rules per platform
393. Read `references/content-types.md` — templates for promo / BIP / educational
404. 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
445. 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 
71Follow `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 
77For `promo` and `educational` posts, optionally scan inspiration accounts (`references/inspiration.md`) before drafting:
78 
791. Pick 1–2 accounts whose audience overlaps with the property
802. Pull recent posts (agent-browser if it works on LinkedIn; otherwise ask the user to paste examples or fall back to their X/newsletter)
813. Extract structural patterns: hook openers, post length, line-break rhythm, CTA styles
824. Apply ONE pattern to the user's voice — never mimic phrasing
835. 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 
85Skip inspiration scan when the user says "just draft it" or when iterating on an existing post.
86 
87## Step 5 — Syndicate to Typefully
88 
89Ask: *"Push to Typefully now? (X + LinkedIn, your personal workspace)"*
90 
91If yes:
921. Read social set ID from `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/typefully.yaml` (setup notes in `references/typefully-config.md`)
932. Call the Typefully create-draft tool once for X, once for LinkedIn (or once with both platforms if the social set spans both)
943. 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.
954. Default to **draft** state (not scheduled) — the user reviews in Typefully UI before sending
965. 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 
119Your 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