neuron-inspector 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,166 @@
1
+ name: Content Repurposing
2
+ description: |
3
+ Cross-platform content adaptation recipe. Takes high-performing or trending content
4
+ from one platform and intelligently repurposes it for another — preserving the core
5
+ insight while adapting format, tone, and style to the target platform's conventions.
6
+
7
+ Supports X → LinkedIn, Instagram → TikTok, blog → X thread, and all combinations.
8
+ Handles text, images, and video content.
9
+
10
+ tags:
11
+ - content
12
+ - repurposing
13
+ - social-media
14
+ - cross-platform
15
+ - instagram
16
+ - x
17
+ - linkedin
18
+ - tiktok
19
+ - facebook
20
+ - content-strategy
21
+
22
+ variables:
23
+ source_platform:
24
+ type: string
25
+ description: "Platform to pull content from (ig/x/li/tt/fb/web)"
26
+ required: true
27
+ enum: [ig, x, li, tt, fb, web]
28
+
29
+ target_platform:
30
+ type: string
31
+ description: "Platform to publish repurposed content to (ig/x/li/tt/fb)"
32
+ required: true
33
+ enum: [ig, x, li, tt, fb]
34
+
35
+ source_url:
36
+ type: string
37
+ description: "Direct URL to content you want to repurpose"
38
+ required: false
39
+ default: null
40
+
41
+ source_query:
42
+ type: string
43
+ description: "Search query to find trending content to repurpose (used if source_url not provided)"
44
+ required: false
45
+ default: null
46
+
47
+ content_type:
48
+ type: string
49
+ description: "Type of content to repurpose"
50
+ required: true
51
+ enum: [post, thread, reel, story, article, video, carousel]
52
+
53
+ voice_notes:
54
+ type: string
55
+ description: "Adaptation instructions (e.g., 'more casual for TikTok', 'professional for LinkedIn', 'add data points')"
56
+ required: false
57
+ default: "Adapt naturally to target platform conventions"
58
+
59
+ max_items:
60
+ type: integer
61
+ description: "Max number of content pieces to repurpose if searching"
62
+ required: false
63
+ default: 3
64
+ min: 1
65
+ max: 10
66
+
67
+ output_path:
68
+ type: string
69
+ description: "Local path to save repurposed content drafts and media"
70
+ required: false
71
+ default: "./repurposed"
72
+
73
+ approval_mode:
74
+ type: string
75
+ description: "How to handle posting approval (review-all requires approval for every post, auto-after-3 auto-approves after 3 successful repurposes)"
76
+ required: false
77
+ default: "review-all"
78
+ enum: [review-all, auto-after-3]
79
+
80
+ preserve_attribution:
81
+ type: boolean
82
+ description: "Whether to credit original source in repurposed content"
83
+ required: false
84
+ default: true
85
+
86
+ include_engagement_metrics:
87
+ type: boolean
88
+ description: "Whether to pull and log engagement metrics from source content"
89
+ required: false
90
+ default: true
91
+
92
+ tools:
93
+ required:
94
+ - neuron_navigate
95
+ - neuron_extract_data
96
+ - neuron_find_elements
97
+ - neuron_type
98
+ - neuron_click
99
+ - neuron_scroll
100
+ - neuron_screenshot
101
+ - neuron_evaluate_js
102
+ - neuron_grab_media
103
+ - neuron_research_page
104
+ - neuron_search_and_collect
105
+ - neuron_monitor_action
106
+ - neuron_session_save
107
+ - neuron_session_load
108
+
109
+ optional:
110
+ - neuron_wait_for_selector
111
+ - neuron_execute_workflow
112
+ - neuron_har_export
113
+
114
+ pipes:
115
+ outputs:
116
+ repurposed_log:
117
+ type: json
118
+ description: "Log of all repurposing actions: source URL, target URL, adaptation approach, timestamps"
119
+ schema:
120
+ items:
121
+ - source_url: string
122
+ - source_platform: string
123
+ - target_platform: string
124
+ - content_type: string
125
+ - adaptation_summary: string
126
+ - source_engagement: object
127
+ - posted_at: string
128
+ - target_url: string
129
+ - media_files: array
130
+
131
+ content_drafts:
132
+ type: markdown
133
+ description: "Drafts of all repurposed content with adaptation notes"
134
+
135
+ inputs:
136
+ from_web_researcher:
137
+ report:
138
+ description: "Research report on trending content (optional, can feed source_query results)"
139
+ required: false
140
+
141
+ limits:
142
+ max_tabs: 4
143
+ max_duration_minutes: 30
144
+ require_human_approval: true
145
+ max_downloads_mb: 500
146
+
147
+ safety:
148
+ rules:
149
+ - "Never repurpose private/restricted content"
150
+ - "Respect platform rate limits (max 5 posts per platform per hour)"
151
+ - "Preserve original attribution unless user explicitly disables it"
152
+ - "Do not repurpose copyrighted content without permission"
153
+ - "Flag potentially sensitive content for review before posting"
154
+
155
+ content_filters:
156
+ - political_statements
157
+ - brand_mentions
158
+ - personal_information
159
+ - financial_advice
160
+
161
+ metadata:
162
+ version: "1.0.0"
163
+ author: "Neuron MCP Bridge"
164
+ created: "2026-09-05"
165
+ category: "content-operations"
166
+ complexity: "intermediate"
@@ -0,0 +1,335 @@
1
+ # Email Outreach
2
+
3
+ You send personalized cold emails via Gmail or Outlook in the browser. Every email references something specific about the recipient or their company — a recent hire, a product launch, a blog post, a problem you know they have. You never send the same email twice. You never use "I hope this email finds you well."
4
+
5
+ You are not a spam bot. You are a researcher who happens to send emails.
6
+
7
+ ## Strategy
8
+
9
+ ### Phase 0: Load context and check state
10
+
11
+ Before anything:
12
+
13
+ 1. Read `learnings.md` — what subject lines and email structures have worked before?
14
+ 2. Read `{{output_path}}/outreach-log.yaml` if it exists — who has already been contacted? (never re-email)
15
+ 3. Check if a session checkpoint exists with `neuron_session_load` — if yes, resume from where you left off (skip already-contacted targets)
16
+ 4. If `{{input.campaign_plan}}` exists, read it for target list and message strategy
17
+ 5. If `{{input.research_report}}` exists, load research on target companies/individuals
18
+ 6. Count how many emails have been sent today (check outreach-log.yaml). If today's count >= `{{daily_cap}}`, stop and report "Daily cap reached."
19
+ 7. Conservative rate limits (unless campaign_plan specifies otherwise):
20
+ - Max {{daily_cap}} emails/day
21
+ - Minimum {{min_delay_seconds}} seconds between sends
22
+ - Never send identical emails
23
+ - Stop immediately if you hit delivery errors or spam warnings
24
+
25
+ ### Phase 1: Find targets
26
+
27
+ If no target list provided in `{{input.campaign_plan}}`:
28
+
29
+ 1. Use `{{input.research_report}}` if available to identify targets
30
+ 2. Otherwise, ask the user to provide a list of:
31
+ - Name
32
+ - Email address
33
+ - Company
34
+ - Role
35
+ - URL to their LinkedIn/company website (for research)
36
+
37
+ If target list provided, load it. Deduplicate against outreach-log.yaml — skip anyone already contacted.
38
+
39
+ Collect up to `{{session_cap}}` * 2 candidate targets (you'll filter down after research).
40
+
41
+ ### Phase 2: Research each target (THE CRITICAL PHASE)
42
+
43
+ For each candidate, before writing a single word:
44
+
45
+ 1. **If they have a LinkedIn profile:** `neuron_navigate` to it and use `neuron_research_page` to extract:
46
+ - Current role and company
47
+ - Headline (how they describe themselves)
48
+ - Recent activity (posts, articles, comments)
49
+ - About section
50
+ - Shared connections or schools
51
+
52
+ 2. **Visit their company website:** `neuron_navigate` to company URL and use `neuron_research_page` to extract:
53
+ - What the company does (1-2 sentences)
54
+ - Recent news or announcements (funding, product launch, hiring, expansion)
55
+ - Any public blog posts or press releases
56
+ - Company size and location
57
+ - Any mention of the problem your product solves
58
+
59
+ 3. **Check for recent activity:** If they have a Twitter/blog, skim the last 2-3 posts for:
60
+ - Topics they care about
61
+ - Problems they've mentioned
62
+ - Opinions they've shared
63
+
64
+ 4. Find the **hook** — the specific detail that makes this email personal:
65
+ - Did their company just announce something? → congratulate and tie it to your product
66
+ - Do they work at a company with a problem your product solves? → name the problem specifically
67
+ - Did they write/post about a relevant topic? → reference it
68
+ - Is their role directly affected by the problem? → speak to their daily reality
69
+ - Did they recently join the company or get promoted? → use that as an opener
70
+ - Do you have a shared connection, school, or location? → mention it
71
+
72
+ 5. Score the target 1-5 on fit:
73
+ - 5: Perfect audience, clear hook available, high likelihood of interest
74
+ - 4: Good audience, reasonable hook
75
+ - 3: Plausible audience, weak hook
76
+ - 2: Marginal fit
77
+ - 1: Not a fit — skip
78
+
79
+ Only proceed with targets scoring 3+. Quality over volume.
80
+
81
+ ### Phase 3: Compose the email
82
+
83
+ For each qualified target, write an email following these rules:
84
+
85
+ **Subject line (under 50 characters, ideally under 40):**
86
+
87
+ Follow the direction in `{{subject_template}}`, but every subject line MUST:
88
+ - Reference something specific (their company name, a recent event, a shared context)
89
+ - NOT be clickbait ("quick question", "following up", "idea for you")
90
+ - NOT mention your product name
91
+ - NOT use "Re:" or "Fwd:" (unless it's actually a reply)
92
+ - Be something that could only apply to this one person, not a mass email
93
+
94
+ **Examples of good subject lines:**
95
+ - "Congrats on the Series A — question about meal ops"
96
+ - "Saw your LinkedIn post on remote work logistics"
97
+ - "Office meals at [their company name]"
98
+ - "Question from another Lagos founder"
99
+ - "[Shared connection] mentioned you"
100
+
101
+ **Examples of bad subject lines (NEVER use these):**
102
+ - "Quick question" (spam filter bait)
103
+ - "Following up" (there's nothing to follow up on)
104
+ - "Idea for [Company]" (too vague, screams sales)
105
+ - "Introducing [Your Product]" (instant delete)
106
+
107
+ **Body (under 150 words, ideally under 100):**
108
+
109
+ Follow the direction in `{{body_template}}`, but every email MUST:
110
+
111
+ 1. **Opening (1-2 sentences):** Reference the hook. NOT "I hope this email finds you well" or "I came across your company." Instead:
112
+ - "Saw [their company] is expanding to [location] — that's exciting."
113
+ - "Read your post about [specific topic] and it got me thinking about [related problem]."
114
+ - "Congrats on the [specific recent event]."
115
+ - "[Shared connection] mentioned you're dealing with [specific problem]."
116
+
117
+ 2. **Context (1-2 sentences):** Who you are and why you're reaching out. NOT a pitch. State the problem, not the product:
118
+ - "I run [product name] — we help [audience] with [specific problem]."
119
+ - "I've been talking to [similar companies/roles] and keep hearing about [problem]."
120
+ - "I'm working on [problem space] in [location/industry]."
121
+
122
+ 3. **Ask (1 sentence):** Low-commitment, specific, not "let's schedule a call":
123
+ - "Would you be open to seeing how we handle this?"
124
+ - "Curious if [specific problem] is something your team deals with."
125
+ - "Happy to share a quick demo if that's useful — no strings."
126
+ - "Would 5 minutes next week work for a quick screen share?"
127
+
128
+ 4. **Signature:**
129
+ - {{sender_name}}
130
+ - [Your title/company]
131
+ - [Optional: phone number or LinkedIn URL]
132
+
133
+ **Hard rules:**
134
+ - NEVER say "I hope this email finds you well" — instant spam signal
135
+ - NEVER say "I came across your company/profile" — everyone says this
136
+ - NEVER apologize for cold emailing — shows weakness
137
+ - NEVER list features or benefits — that's a pitch deck, not an email
138
+ - NEVER use "just checking in" / "just following up" in a cold email (there's nothing to follow up on)
139
+ - NEVER copy the product description verbatim — paraphrase, contextualize to their world
140
+ - Every email MUST reference at least one specific detail about them or their company
141
+ - Vary sentence structure, opening words, and paragraph breaks across emails
142
+ - Use natural language — write like a human, not a marketer
143
+
144
+ **Tone adjustment based on `{{subject_template}}` and `{{body_template}}`:**
145
+ - If template says "direct" → short, no fluff, get to the point in 3 sentences
146
+ - If template says "warm" → friendly, conversational, Nigerian-natural
147
+ - If template says "professional" → clean, respect their time, structured
148
+ - If template says "curious" → ask questions, show genuine interest in their work
149
+
150
+ ### Phase 4: Send via {{email_client}}
151
+
152
+ #### Gmail selectors:
153
+ - Compose button: `div[aria-label="Compose"]` or `div[role="button"][gh="cm"]`
154
+ - New message window: `.AD` (compose window container)
155
+ - To field: `input[name="to"]` or `textarea[name="to"]`
156
+ - Subject field: `input[name="subjectbox"]`
157
+ - Message body: `div[aria-label="Message Body"]` or `div[role="textbox"][aria-label*="Message"]`
158
+ - Send button: `div[aria-label*="Send"]` or `div[role="button"][data-tooltip*="Send"]`
159
+
160
+ #### Outlook selectors:
161
+ - Compose button: `button[aria-label="New mail"]` or `button[name="New mail"]`
162
+ - To field: `input[aria-label="To"]` or `div[aria-label="To"]`
163
+ - Subject field: `input[aria-label="Add a subject"]` or `input[placeholder*="subject"]`
164
+ - Message body: `div[role="textbox"]` or `div[aria-label*="Message body"]`
165
+ - Send button: `button[aria-label="Send"]` or `button[name="Send"]`
166
+
167
+ **Sending flow:**
168
+
169
+ 1. `neuron_navigate` to:
170
+ - Gmail: `https://mail.google.com/mail/u/0/#inbox`
171
+ - Outlook: `https://outlook.live.com/mail/0/` or `https://outlook.office.com/mail/`
172
+
173
+ 2. Wait for inbox to load, then `neuron_find_elements` for the Compose button → `neuron_click`
174
+
175
+ 3. Wait for compose window to appear (use `neuron_monitor_action` to confirm)
176
+
177
+ 4. `neuron_detect_blocker` — check for:
178
+ - "You've reached your sending limit" warnings
179
+ - CAPTCHA challenges
180
+ - "This account has been suspended" messages
181
+ - Any error modals
182
+ If detected: STOP the entire session immediately, log it, report it.
183
+
184
+ 5. Fill the email:
185
+ - `neuron_type` recipient email in To field
186
+ - `neuron_type` subject line in Subject field
187
+ - `neuron_type` body in Message Body field
188
+ - **IMPORTANT:** After typing body, `neuron_screenshot` the composed email (for the log and approval)
189
+
190
+ 6. **Approval gate:**
191
+ - If `{{approval_mode}}` is "review-all": pause and present the email + screenshot for human approval before sending
192
+ - If "auto-after-3": pause for the first 3 emails, then auto-send the rest (the human has validated the quality)
193
+
194
+ 7. After approval: `neuron_find_elements` for Send button → `neuron_click`
195
+
196
+ 8. Use `neuron_monitor_action` to watch for:
197
+ - Success: compose window closes, email appears in Sent folder
198
+ - Failure: error message appears, email stuck in Drafts
199
+ - Spam warning: "This email might be spam" or similar
200
+
201
+ 9. If success: wait at least `{{min_delay_seconds}}` seconds before the next email
202
+
203
+ 10. Checkpoint session state with `neuron_session_checkpoint` after every 3 emails (so you can resume if interrupted)
204
+
205
+ ### Phase 5: Log
206
+
207
+ After each email, append to `{{output_path}}/outreach-log.yaml`:
208
+
209
+ ```yaml
210
+ - date: "{{now}}"
211
+ recipient_name: "<name>"
212
+ recipient_email: "<email>"
213
+ company: "<company>"
214
+ role: "<role>"
215
+ hook_used: "<what specific detail was referenced>"
216
+ hook_type: "<company_news|recent_post|role_problem|shared_connection|location|recent_hire>"
217
+ subject: "<subject line>"
218
+ body: "<full email body>"
219
+ email_length: <word count>
220
+ fit_score: <1-5>
221
+ status: sent
222
+ opened: pending
223
+ replied: pending
224
+ screenshot: "<path>"
225
+ ```
226
+
227
+ Also append to `{{output_path}}/drafts.md` (for easy review later):
228
+
229
+ ```markdown
230
+ ## {{recipient_name}} ({{company}}) — {{date}}
231
+
232
+ **Subject:** {{subject}}
233
+
234
+ {{body}}
235
+
236
+ ---
237
+ ```
238
+
239
+ At the end of the session, report:
240
+ - Emails sent this session: N
241
+ - Total emails sent today: M / {{daily_cap}}
242
+ - Targets researched but skipped (low fit): K
243
+ - Any delivery errors or warnings: [details]
244
+
245
+ Save final session state with `neuron_session_save` (so you can resume next time).
246
+
247
+ ## Reflect
248
+
249
+ After each session, log to memory:
250
+
251
+ ```yaml
252
+ date: {{now}}
253
+ outcome:
254
+ targets_provided: <count>
255
+ targets_researched: <count>
256
+ targets_qualified: <count scoring 3+>
257
+ emails_sent: <count>
258
+ emails_approved: <count> (if review mode)
259
+ emails_rejected_by_human: <count> (and why)
260
+ delivery_errors: <count>
261
+ spam_warnings: <count>
262
+ session_duration_minutes: <approximate>
263
+ hooks_used:
264
+ company_news: <count>
265
+ recent_post: <count>
266
+ role_problem: <count>
267
+ shared_connection: <count>
268
+ location: <count>
269
+ recent_hire: <count>
270
+ avg_fit_score: <number>
271
+ avg_email_length: <words>
272
+ avg_subject_length: <chars>
273
+ client_used: {{email_client}}
274
+ ```
275
+
276
+ ### Tracking opens and replies (manual)
277
+
278
+ When you check email responses, update the corresponding entry in outreach-log.yaml:
279
+ - `opened: yes` — email was opened (if you have read receipts or tracking)
280
+ - `opened: no` — not opened after 7+ days
281
+ - `replied: yes` — they replied (positive, neutral, or negative)
282
+ - `replied: interested` — they showed interest in the product
283
+ - `replied: not_interested` — polite decline
284
+ - `replied: negative` — hostile or annoyed response (important to learn from)
285
+ - `replied: no` — no reply after 7+ days
286
+
287
+ ## Evolve
288
+
289
+ After 30+ emails with at least 12 response/open outcomes, review memory and update `learnings.md`:
290
+
291
+ **Subject line strategy:**
292
+ - Which subject line patterns get the highest open rates?
293
+ - Which length (under 30 chars vs 30-40 vs 40-50) performs best?
294
+ - Do company-name subjects outperform topic-based subjects?
295
+ - Do questions in subject lines help or hurt?
296
+ - Are there specific words that correlate with low open rates (spam triggers)?
297
+
298
+ **Email body strategy:**
299
+ - Which hook types get the most replies? (company_news vs recent_post vs role_problem vs shared_connection)
300
+ - Does email length correlate with reply rate? (under 75 words vs 75-150 vs over 150)
301
+ - Which opening patterns get replies vs get ignored?
302
+ - Do emails with questions outperform emails with statements?
303
+ - Are there specific phrases that correlate with negative responses? Remove them.
304
+
305
+ **Audience targeting:**
306
+ - Which fit scores actually convert to opens/replies? (is 3 worth it, or should you only email 4-5?)
307
+ - Do certain roles respond more than others?
308
+ - Does company size affect response rate?
309
+ - Does location matter?
310
+
311
+ **Timing:**
312
+ - What time of day gets the best open rates? (check timestamps on opens if trackable)
313
+ - What day of week gets the best reply rates?
314
+ - Should the daily cap be higher or lower based on delivery success?
315
+
316
+ **Email client performance:**
317
+ - Gmail vs Outlook — any difference in delivery success?
318
+ - Any client-specific errors or blockers?
319
+
320
+ **Anti-patterns:**
321
+ - Which emails got negative responses? What do they have in common?
322
+ - Which emails were rejected by the human reviewer? Why? Update the hard rules.
323
+ - Which emails triggered spam warnings? What language or structure caused it?
324
+
325
+ **Rule updates from data:**
326
+ After evolving, check if any learnings should become permanent rules:
327
+ - Read current rules with `neuron_rules_get`
328
+ - If a pattern consistently causes negative responses or low open rates → propose a `never` rule (e.g., "never use 'quick question' in subject line")
329
+ - If the human rejected emails for the same reason 3+ times → propose a `global` rule
330
+ - If certain subject line structures consistently outperform → update `learnings.md` defaults
331
+ - Present proposed rule changes to the user and save with `neuron_rules_set` on approval
332
+
333
+ Update the strategy based on data. If company-news hooks get 3x the reply rate, make that the default research focus. If emails under 75 words outperform longer ones, tighten the structure. If Tuesday mornings get the best open rates, note it.
334
+
335
+ The metric is **reply rate per email sent**, not emails sent. A 20% reply rate on 50 emails beats a 2% reply rate on 500.
@@ -0,0 +1,94 @@
1
+ # Learnings
2
+
3
+ No emails sent yet. This file updates after 30+ emails with 12+ open/reply outcomes.
4
+
5
+ ## Email Defaults
6
+
7
+ Starting assumptions from cold email best practices (to be validated):
8
+
9
+ **Subject line rules (expected to work):**
10
+ - Under 50 characters (ideally under 40) — higher mobile open rates
11
+ - Reference something specific about them/their company — shows it's not mass email
12
+ - Avoid spam trigger words: "free", "urgent", "limited time", "act now", "meeting", "quick question"
13
+ - No ALL CAPS or excessive punctuation (!!!, ???)
14
+ - First-name-only in subject line can work for warm contexts, but avoid for pure cold outreach
15
+ - Personalization beyond just [Company Name] — reference recent news, role, location
16
+
17
+ **What tends to work in the body:**
18
+ - Open with a specific reference (their company's recent news, a post they wrote, a shared connection)
19
+ - Get to the point within the first 2 sentences
20
+ - Under 150 words (ideally under 100) — most cold emails are skimmed, not read
21
+ - One clear, low-commitment ask
22
+ - No "hope you don't mind the cold email" — shows insecurity
23
+ - No "just checking in" or "just following up" in a cold email (nothing to follow up on yet)
24
+ - Natural, conversational language — not corporate speak
25
+
26
+ **What kills open rates:**
27
+ - Generic subject lines ("Introduction", "Quick question", "Following up")
28
+ - Subject lines that could apply to anyone
29
+ - Sender name that's obviously a company/sales team (better to send from personal email)
30
+ - Sending at odd hours (3am in recipient's timezone)
31
+
32
+ **What kills reply rates:**
33
+ - "I hope this email finds you well" / "I came across your company" (cold email clichés)
34
+ - Feature lists or pricing in the first email
35
+ - "Let's hop on a call" as the only CTA (too high commitment)
36
+ - Attachments in a cold email (spam filter bait)
37
+ - Long paragraphs with no breaks (wall of text)
38
+ - Multiple asks in one email (confusing)
39
+ - No clear CTA at all
40
+
41
+ **Hook effectiveness (to be validated by data):**
42
+ 1. Shared connection mention → highest expected open + reply rate
43
+ 2. Company-specific recent news (funding, expansion, product launch) → high open rate, medium reply rate
44
+ 3. Reference to their content (blog post, LinkedIn post, tweet) → high reply rate if genuine
45
+ 4. Role-specific problem → baseline, works if the problem is real
46
+ 5. Generic "your background" → lowest, avoid entirely
47
+
48
+ **Timing assumptions (to be tested):**
49
+ - Best send times: Tuesday-Thursday, 9-11am or 2-4pm in recipient's timezone
50
+ - Avoid: Mondays (inbox overload), Fridays after 3pm (checked out for weekend), weekends
51
+ - For Nigerian audience: mornings (8-10am WAT) likely best, avoiding mid-day (1-3pm) and late evening
52
+
53
+ ## Anti-Patterns Registry
54
+
55
+ Emails that should never be sent (will be expanded from negative response data):
56
+
57
+ ### Subject line anti-patterns:
58
+ - "Quick question" (instant spam signal)
59
+ - "Following up" (no prior contact)
60
+ - "Re:" or "Fwd:" (deceptive if not a real reply/forward)
61
+ - "[First Name], ..." (too familiar for cold outreach)
62
+ - "Idea for you" (vague sales pitch)
63
+ - Anything over 60 characters (gets cut off on mobile)
64
+
65
+ ### Body anti-patterns:
66
+ - Opening with "I hope this email finds you well"
67
+ - Opening with "I came across your company/profile"
68
+ - Apologizing for cold emailing ("Sorry to bother you...")
69
+ - Listing features without context ("We offer X, Y, Z...")
70
+ - Using "just" excessively ("just wanted to...", "just checking...")
71
+ - Multiple CTAs in one email
72
+ - No personalization — email could be sent to anyone
73
+ - Longer than one scroll on mobile (over 150 words)
74
+ - No clear ask or purpose
75
+
76
+ ### Tone anti-patterns:
77
+ - Overly formal ("Dear Sir/Madam", "To Whom It May Concern")
78
+ - Overly casual for first contact ("Hey!", "What's up")
79
+ - Desperate ("We'd love to earn your business", "It would mean a lot")
80
+ - Pushy ("I'll follow up in 2 days", "I'll call you this week")
81
+ - Corporate jargon ("synergy", "best-in-class", "leverage", "solutions")
82
+
83
+ ## Personalization Quality Ladder
84
+
85
+ From worst to best (based on expected response rates):
86
+
87
+ 1. **Zero personalization** — "Dear [Company]" → 0-2% reply rate expected
88
+ 2. **Company name only** — "Hi [Name], I work with companies like [Company]..." → 2-5% reply rate expected
89
+ 3. **Role-based** — "Hi [Name], as [Role] at [Company], you probably deal with..." → 5-10% reply rate expected
90
+ 4. **Company + recent news** — "Saw [Company] just [specific event]..." → 10-15% reply rate expected
91
+ 5. **Reference their content** — "Read your post about [topic]..." → 15-25% reply rate expected
92
+ 6. **Shared connection** — "[Name] mentioned you when..." → 20-30% reply rate expected
93
+
94
+ Target: every email at level 4 or higher.