# LinkedIn Outreach Message Generation Mode and Personalization in Career-Ops

> Discover LinkedIn outreach message generation mode and personalization in Career-Ops. Learn how to craft effective, brief messages for recruiters, hiring managers, and peers with our rigid three-sentence template.

- Repository: [Santiago Fernández de Valderrama/career-ops](https://github.com/santifer/career-ops)
- Tags: how-to-guide
- Published: 2026-06-13

---

**The `contacto` mode generates personalized LinkedIn outreach messages using a rigid three-sentence template that shifts emphasis based on whether you are contacting a recruiter, hiring manager, peer, or interviewer, while enforcing a strict 300-character limit and stripping corporate jargon.**

The `contacto` mode (also referred to as the *LinkedIn Power Move*) is a specialized workflow in the `santifer/career-ops` repository that automates the creation of concise, highly targeted outreach messages. This mode analyzes the target contact type and dynamically adjusts the message content to maximize relevance and response rates, all while maintaining the conversational constraints of LinkedIn's connection request interface.

## How the Contacto Mode Works

The LinkedIn outreach message generation mode follows a structured execution pipeline defined in [`modes/contacto.md`](https://github.com/santifer/career-ops/blob/main/modes/contacto.md). When invoked, the system executes a five-step process to produce the final message.

### Target Discovery and Classification

First, the mode uses `WebSearch` functionality to identify the most relevant contacts at a target company, including hiring managers, recruiters, peers, or potential interviewers. The system then classifies the contact into one of four specific types, either by asking the candidate directly or inferring from the available context.

### Message Generation Framework

Once the primary target is selected, the mode applies a **three-sentence template** that remains structurally consistent across all contact types. According to lines 19-38 of [`modes/contacto.md`](https://github.com/santifer/career-ops/blob/main/modes/contacto.md), the template enforces:
- A **Fit/Hook/Interest** opening sentence
- A **Proof** sentence with quantifiable achievements
- A **Call-to-Action (CTA)** sentence

The specific emphasis of each sentence shifts based on the contact type, but the overall skeleton remains identical.

### Localization and Constraints

The mode enforces a hard limit of **300 characters** (line 48 of [`contacto.md`](https://github.com/santifer/career-ops/blob/main/contacto.md)) to comply with LinkedIn's connection request constraints. It also strips corporate buzzwords, removes phrases like "I'm passionate about...", and excludes phone numbers (lines 49-52). The system supports both English (default) and Spanish outputs (lines 41-44), with extensibility for additional locales.

## Personalization Logic by Contact Type

The personalization engine in [`modes/contacto.md`](https://github.com/santifer/career-ops/blob/main/modes/contacto.md) applies distinct strategies for each of the four contact categories:

**Recruiter**
- **Sentence 1 (Fit):** Direct alignment with the role, citing specific experience, location, and availability
- **Sentence 2 (Proof):** Quantified evidence answering typical screening questions (e.g., "5 years building ML pipelines, Berlin, available immediately")
- **Sentence 3 (CTA):** "Happy to share my CV if this aligns with what you're looking for"

**Hiring Manager**
- **Sentence 1 (Hook):** Specific reference to a challenge the team faces, extracted from the job description, company blog, or recent news
- **Sentence 2 (Proof):** The candidate's biggest quantifiable achievement that solves a similar problem
- **Sentence 3 (CTA):** "Would love to hear how your team is approaching `{specific challenge}`"

**Peer (Referral)**
- **Sentence 1 (Interest):** Genuine reference to the peer's work (blog post, talk, open-source contribution, or publication)
- **Sentence 2 (Connection):** What the candidate is doing in the same space, explicitly avoiding job pitches
- **Sentence 3 (CTA):** "I've been working on similar problems at `{company}`, would love to hear your take on `{topic}`"

**Interviewer (Pre-Interview)**
- **Sentence 1 (Research):** Concrete reference to the interviewer's work or career path
- **Sentence 2 (Context):** Light link to the candidate's experience in that specific area
- **Sentence 3 (CTA):** "Looking forward to our conversation on `{date}`"

If the primary contact is unavailable, the mode can suggest secondary contacts with justification (line 45 of [`contacto.md`](https://github.com/santifer/career-ops/blob/main/contacto.md)).

## Usage Examples

### Command Line Invocation

Execute the mode from your terminal to generate a message for a specific company:

```bash
career-ops contacto AcmeCorp

```

**Sample Output (Recruiter target, English):**

```

5 years building ML pipelines, Berlin, available immediately. Happy to share my CV if this aligns with what you're looking for.

```

### Programmatic Integration

You can invoke the mode programmatically within Node.js applications:

```javascript
import { execSync } from 'child_process';

// Generate LinkedIn outreach message
const message = execSync('career-ops contacto AcmeCorp', { encoding: 'utf8' });
console.log('Generated message:', message);

```

### Customizing for New Locales

To add support for a new language, create a localized template file (e.g., [`modes/contacto.es.md`](https://github.com/santifer/career-ops/blob/main/modes/contacto.es.md) for Spanish) and modify the loader logic in [`modes/contacto.md`](https://github.com/santifer/career-ops/blob/main/modes/contacto.md):

```javascript
if (userLocale === 'es') {
  template = loadTemplate('contacto.es.md');
}

```

## System Integration and Architecture

The `contacto` mode is registered as a core skill in the Career-Ops ecosystem. It appears in the skill manifest at [`.agents/skills/career-ops/SKILL.md`](https://github.com/santifer/career-ops/blob/main/.agents/skills/career-ops/SKILL.md) and is documented as a system-layer feature in [`DATA_CONTRACT.md`](https://github.com/santifer/career-ops/blob/main/DATA_CONTRACT.md).

Higher-level workflows such as `auto-pipeline`, `apply`, and `followup` (defined in [`modes/followup.md`](https://github.com/santifer/career-ops/blob/main/modes/followup.md)) reuse the same three-sentence framework to ensure consistent tone across all outreach activities. This modular design allows the personalization logic to remain centralized while supporting multiple entry points in the job application workflow.

## Summary

- The **`contacto` mode** generates LinkedIn outreach messages using a strict three-sentence template that adapts emphasis based on four contact types: recruiter, hiring manager, peer, and interviewer.
- All messages are constrained to **300 characters** and automatically strip corporate jargon and phone numbers.
- The mode supports **English and Spanish** localization out of the box, with extensible architecture for additional languages.
- Integration points include the CLI command `career-ops contacto {company}`, programmatic execution via Node.js, and reuse by higher-level modes like `followup` and `apply`.
- Source configuration and templates reside in [`modes/contacto.md`](https://github.com/santifer/career-ops/blob/main/modes/contacto.md), with system registration in [`.agents/skills/career-ops/SKILL.md`](https://github.com/santifer/career-ops/blob/main/.agents/skills/career-ops/SKILL.md).

## Frequently Asked Questions

### What is the maximum length for messages generated by the contacto mode?

The mode enforces a strict **300-character limit** (line 48 of [`modes/contacto.md`](https://github.com/santifer/career-ops/blob/main/modes/contacto.md)) to ensure compatibility with LinkedIn's connection request message field. This constraint forces concise, high-impact language and prevents the inclusion of unnecessary contact information like phone numbers.

### How does the contacto mode handle different languages?

The mode supports **English as the default** and **Spanish** through localized template files (lines 41-44 of [`modes/contacto.md`](https://github.com/santifer/career-ops/blob/main/modes/contacto.md)). To add a new language, you create a localized markdown file (e.g., [`contacto.fr.md`](https://github.com/santifer/career-ops/blob/main/contacto.fr.md) for French) and extend the conditional loader logic to select the appropriate template based on the user's locale setting.

### Can I customize the message templates for specific industries?

While the base template structure remains fixed (three sentences), you can customize the content for specific industries by modifying [`modes/contacto.md`](https://github.com/santifer/career-ops/blob/main/modes/contacto.md). The personalization logic allows you to adjust the "Proof" sentence content and the specific challenges referenced in the "Hook" sentence to align with industry-specific terminology and priorities.

### How does the contacto mode integrate with other Career-Ops workflows?

The mode is designed as a reusable component that higher-level workflows invoke via the CLI or programmatic API. According to [`modes/followup.md`](https://github.com/santifer/career-ops/blob/main/modes/followup.md), the `apply`, `followup`, and `auto-pipeline` modes all leverage the same three-sentence framework to maintain tone consistency across different stages of the job application process, ensuring that outreach messages remain coherent regardless of which automation entry point triggers them.