Squeeze Design Doc
Squeeze
DM-to-Lead Intelligence Pipeline
Squeeze the value out of every conversation.
The Problem
Every DM conversation with a potential client, referral partner, or recruiter is a business opportunity sitting in a locked inbox. The current workflow has four failure modes that compound on each other:
Capture failure: Conversations stay in LinkedIn and never make it into any tracking system. This is worst during high-volume weeks when the number of DMs spikes and there is no spare bandwidth to document them.
Classification failure: When conversations do get captured, there is no structured way to determine whether a person is a coaching client, a B2B decision-maker, or a recruiter partnership prospect. Each type requires different follow-up strategies.
Response failure: Drafting thoughtful, on-brand responses to multiple DM threads takes significant time and mental energy, especially when switching between prospect types that need different tones and strategies.
Follow-up failure: Without a pipeline view, promising conversations go cold. There is no system to surface what needs attention today, what has been idle too long, or what the next action should be.
Core insight: The capture moment is the only moment that matters. If the tool can make capture immediately rewarding by returning a draft response you can use right now, every other failure mode gets solved downstream.
The Solution
Squeeze is a CLI tool that turns DM capture into a two-way interaction. Paste a conversation, get back three things instantly: a lead classification, a suggested response in your voice, and a structured lead card written to your repo. The capture step stops being homework and starts being the moment you get help.
Core Flow
| Step | Action | What Happens |
|---|---|---|
| 1. Capture | squeeze | Opens editor. Paste the DM conversation. Save and close. |
| 2. Process | (automatic) | AI parses the conversation, classifies the lead, identifies signals from the Client Scout profile schema, determines prospect type and service tier fit. |
| 3. Respond | (automatic) | Generates 1-2 draft responses in your voice, strategically aligned to the lead classification. Displayed in terminal for immediate copy-paste back into LinkedIn. |
| 4. Store | (automatic) | Writes a structured markdown lead card to learnwithoj-internal/leads/ with frontmatter metadata. Commits to git. |
| 5. Track | squeeze status | Pipeline view: open leads, follow-ups due today, conversations gone cold. Rendered from markdown files. |
Voice Profile System
Squeeze generates responses that sound like you, not like a chatbot. This requires a voice profile built from your actual messaging patterns, separate from your post-writing voice.
DM Voice vs Post Voice
| Dimension | Post Voice | DM Voice |
|---|---|---|
| Formality | Professional but accessible | Casual, direct, conversational |
| Length | Structured, multi-paragraph | Short bursts, 1-3 sentences |
| Personality | Authoritative, experienced | Irreverent, warm, real |
| Strategy | Establish thought leadership | Build relationship, move to call |
| Rules | No em dashes, parallel short sentences joined with "and" | Same style rules apply. Contractions encouraged. Questions welcome. |
Voice Profile Construction
The voice profile is a JSON document built from your actual DM history. It captures patterns across several dimensions:
- Greeting patterns: How you open conversations with different prospect types.
- Pivot patterns: How you move from casual conversation to business value without being salesy.
- CTA patterns: How you suggest next steps ("Let's Talk First" call, Focused Hour, etc.) and at what stage.
- Closing patterns: How you end messages to keep the door open.
- Vocabulary: Words and phrases you naturally use vs. avoid. Industry-specific language you deploy.
- Tone calibration: How your tone shifts based on whether you are talking to a peer engineer, a C-level, or a recruiter.
Bootstrap: Export your LinkedIn messages via data download. Run the initial corpus through a voice extraction prompt. Review and refine the profile manually. This is a one-time setup with periodic updates as your style evolves.
Lead Card Schema
Every captured conversation produces a markdown file with YAML frontmatter. The schema maps directly to the Client Scout profile schema fields so the two systems can share data.
Frontmatter Fields
| Field | Type | Description |
|---|---|---|
| name | string | Contact name as it appears on LinkedIn |
| linkedin_url | string | Profile URL |
| prospect_type | enum | coaching_client, b2b_decision_maker, recruiter_partner, referral_source, unclear |
| service_tier_fit | enum | focused_hour, career_accelerator, fresh_squeeze, b2b_contract, not_applicable |
| stage | enum | new, qualifying, warm, proposal, closed_won, closed_lost, dormant |
| signals | list | Key signals detected: title frustration, promotion block, job search, team scaling, etc. |
| next_action | string | Recommended next step with rationale |
| follow_up_date | date | When to re-engage if no response |
| captured_at | datetime | When the conversation was captured |
| last_contact | date | Date of most recent message in thread |
| confidence | float | AI confidence score (0-1) for the classification |
| tags | list | Free-form tags for custom filtering |
Example Lead Card
---
name: Jordan Rivera
linkedin_url: linkedin.com/in/jordanrivera
prospect_type: coaching_client
service_tier_fit: career_accelerator
stage: qualifying
signals: [title_gap, promotion_block, sr_eng_aspirant]
next_action: Suggest Let's Talk First call
follow_up_date: 2026-03-27
captured_at: 2026-03-20T14:30:00
last_contact: 2026-03-20
confidence: 0.85
tags: [kubernetes, fintech]
---
## Conversation
[raw transcript]
## Analysis
[AI-generated notes on signals, gaps, and strategy]
Response Generation Engine
The response engine is the feature that makes Squeeze worth using. It generates draft replies that are strategically informed by the lead classification and voiced in your actual DM style.
Response Strategy Matrix
| Prospect Type | Strategy | CTA Direction |
|---|---|---|
| Coaching client | Validate their experience, name the gap, offer a path forward. | Move toward Let's Talk First. If urgency is high, suggest Focused Hour directly. |
| B2B decision-maker | Lead with business impact. Reference relevant case study or war story. | Offer to scope the engagement. Position as low-risk first step. |
| Recruiter partner | Frame the value of technical evaluation expertise. | Propose a pilot: evaluate 2-3 candidates, show accuracy delta. |
| Referral source | Express genuine appreciation. Ask about their network context. | Make the referral easy: provide a link or intro message they can forward. |
| Unclear | Ask a clarifying question that doubles as qualification. | No CTA yet. Gather information. |
Response Options
Squeeze generates two response drafts per conversation:
- Option A (Advance): Moves the conversation forward toward a business outcome. More direct, includes a CTA.
- Option B (Nurture): Keeps the relationship warm without pushing. Asks a question, shares something useful, or validates their situation.
Both options are displayed in the terminal. You pick one, adjust if needed, and paste into LinkedIn. The tool logs which option you chose to refine future suggestions.
Architecture Options
Squeeze can be built as a standalone tool or as a module within the Client Scout system. Both options are specced below with tradeoffs.
Option A: Standalone Tool
Structure:
- Repository: squeeze/ (separate repo, own package.json)
- Runtime: Node.js CLI application
- AI backend: Anthropic API (Claude) for conversation parsing and response generation
- Storage: Markdown files in learnwithoj-internal/leads/
- Config: ~/.squeezerc for voice profile path, repo location, API keys
Commands:
| Command | Description |
|---|---|
squeeze | Open editor, paste conversation, process, display response options, save lead card |
squeeze status | Pipeline view of all leads: new, qualifying, warm, proposal, closed |
squeeze followup | Show leads needing follow-up today with suggested messages |
squeeze update <n> | Add new conversation to existing lead, update stage and next action |
squeeze import | Batch process LinkedIn data export (messages.csv) |
squeeze voice | Rebuild or update voice profile from message corpus |
squeeze cold | List leads that have gone dormant with re-engagement suggestions |
Pros: Ships faster, no dependency on Client Scout, can start using immediately.
Cons: Lead data lives only in markdown, potential migration problem later, voice engine not reusable without duplication.
Option B: Client Scout Module
Structure:
- Repository: client-scout/ with modules: scout-core, squeeze, (future modules)
- Shared layer: Profile schema, voice engine, prospect classifier, and lead storage shared across modules
- Storage: SQLite database for structured queries with markdown export for git/Obsidian compatibility
Module Boundaries:
| Layer | Owns | Used By |
|---|---|---|
| scout-core | Profile schema, prospect classifier, lead storage, voice engine | All modules |
| squeeze | DM capture CLI, response generation, follow-up tracking | End user via terminal |
| scout (future) | Candidate sourcing, match scoring, outreach queue | End user via web UI |
| intake (future) | Pre-session intake form, career readiness assessment | Clients via web form |
Pros: Structured from day one, shared voice engine, SQLite query power, still git compatible.
Cons: More upfront work, Client Scout decisions not resolved, risk of over-engineering.
Recommendation
Build standalone first, with a clean extraction path. Start with Option A to validate the capture workflow and voice profile quickly. Structure the code so the AI layer (classifier, voice engine, response generator) lives in its own module from day one. When Client Scout reaches Phase 2, extract that module into scout-core and make Squeeze a consumer of it. This gives you speed now and a clean integration path later without throwaway work.
LinkedIn API Integration
Squeeze is designed around what the LinkedIn official API permits. It does not scrape, crawl, or automate any activity that violates the Terms of Service.
What the Official API Supports
| Capability | API Product | Status |
|---|---|---|
| Post creation (text, image, video, carousel, poll) | Community Management API | Available with approval |
| Post scheduling | Community Management API | Available with approval |
| Read/write comments and reactions | Community Management API | Available with approval |
| Post analytics | Community Management API | Available with approval |
| Follower statistics | Community Management API | Available with approval |
| Share on behalf of user | w_member_social (open) | Self-service |
| Read own posts | r_member_social | Closed, not accepting requests |
| Messaging / DM access | Compliance API (enterprise only) | Not available |
| Profile browsing / search | Sales Navigator API (SNAP) | Partner approval required |
| Connection management | Not available via API | Not available |
Squeeze Data Capture Strategy
Since DM access is not available through the official API, Squeeze uses two compliant capture methods:
- Manual paste (primary): You copy-paste the conversation from LinkedIn into your terminal. This is the fastest path for real-time use when you want an immediate response suggestion.
- Data export (batch): LinkedIn allows you to download your data including messages via Settings > Get a copy of your data. Squeeze can batch-process this export to backfill historical conversations or catch ones you missed.
Both methods involve you accessing your own data through legitimate means. No scraping, no browser automation, no ToS risk.
Future API Integration
If Learn with O.J. is approved for the Community Management API, Squeeze gains additional capabilities: automatic post scheduling tied to the five named content days, post analytics pulled into the pipeline view to correlate content performance with lead activity, and comment tracking to identify when target accounts engage with your posts.
The Community Management API requires a registered business entity, a use case review, and a screencast demo. Learn with O.J. qualifies. The application process can run in parallel with Squeeze development.
Implementation Phases
Phase 0: Voice Profile Bootstrap Export LinkedIn messages. Run the corpus through a voice extraction prompt to build the initial DM voice profile. Review and refine manually. Estimated time: one session.
Phase 1: Capture and Classify
Build the squeeze command. Paste conversation, get back a lead classification and structured lead card written to learnwithoj-internal/leads/. No response generation yet. Validate that the classification is accurate across your three prospect types.
Phase 2: Response Engine Add the response generation layer. Voice profile integration, the two-option response format (Advance and Nurture), and copy-paste output. This is the feature that makes the tool sticky. Log which response option you choose for future refinement.
Phase 3: Pipeline View
Build squeeze status and squeeze followup. Render pipeline stages from markdown frontmatter. Surface leads needing attention today. Add squeeze cold for dormant re-engagement.
Phase 4: Batch Import
Build squeeze import to process LinkedIn data exports. Useful for backfilling historical conversations and catching missed DMs. Deduplicate against existing lead cards.
Phase 5: Client Scout Integration Extract the classifier, voice engine, and lead schema into a shared module. Restructure Squeeze as a consumer of scout-core. This phase triggers when Client Scout reaches Phase 2 (Scout MVP) and the two systems need to share data.
Open Questions
- What AI model and prompting strategy works best for the voice profile? Should the voice profile be a static document or a dynamic few-shot prompt built from recent messages?
- How should Squeeze handle multi-thread conversations with the same person? One lead card that grows over time, or separate cards per conversation?
- Should the response engine include a "decline gracefully" option for conversations where the person is not a fit? What does that look like in your voice?
- What is the right follow-up cadence by prospect type? Coaching clients may need a nudge in 3 days while a B2B decision-maker might need 2 weeks.
- Should lead cards be committed to git automatically on capture or batched at end of day?
- How do we handle the voice profile evolving over time? Periodic re-extraction from recent messages, or manual updates when you notice drift?
- Is there value in a "squeeze practice" mode where you can paste old conversations and compare Squeeze's suggested response to what you actually sent? This would be a way to calibrate the voice profile.
- For the Community Management API application: should Learn with O.J. apply now to start the approval process, or wait until the post scheduling feature is designed?
- What is the privacy policy for lead data? How long should conversation transcripts be retained? Should there be an auto-purge for leads marked closed_lost?
- Should Squeeze integrate with the Tailoring Blueprint architecture or remain independent of the resume tooling?
Squeeze | Learn with O.J. | learnwithoj.com