create-image-fal
Generate or edit an image via any FAL image model (nano-banana edit, gpt-image, flux, ...), ROUTED THROUGH THE fal-proxy so it bills the Ads agent. image_urls…
End-to-end LinkedIn outreach campaign builder. Takes leads from Supabase, upstream skills, or CSV. Aligns on campaign goal and tone, writes personalized LinkedIn message sequences (connection request + follow-ups + optional InMail), presents for review, and exports for the
$ npx -y skills add gooseworks-ai/goose-skills --skill linkedin-outreach --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/linkedin-outreachContext preview
The summary Claude sees to decide when to auto-load this skill.
End-to-end LinkedIn outreach campaign builder. Takes leads from Supabase, upstream skills, or CSV. Aligns on campaign goal and tone, writes personalized LinkedIn message sequences (connection request + follow-ups + optional InMail), presents for review, and exports for the
name: linkedin-outreach description: > End-to-end LinkedIn outreach campaign builder. Takes leads from Supabase, upstream skills, or CSV. Aligns on campaign goal and tone, writes personalized LinkedIn message sequences (connection request + follow-ups + optional InMail), presents for review, and exports for the user's outreach tool (Dripify, Botdog, Expandi, or manual CSV). Logs to Supabase outreach_log. tags: [outreach]
The LinkedIn counterpart to `cold-email-outreach`. Takes qualified leads from Supabase, builds personalized LinkedIn message sequences, exports for the user's LinkedIn outreach tool, and logs everything back to Supabase.
**Tool-agnostic:** Asks the user which LinkedIn tool they use. All tools are CSV-import based — no API/MCP automation for LinkedIn tools (they're browser-based). Adapters handle column mapping and format differences per tool.
Load this skill when:
This skill does NOT assume a specific tool. It asks first, then adapts.
| Tool | Integration | How It Works | |------|------------|--------------| | **Dripify** | CSV import | Generate CSV matching Dripify's import format, user uploads manually | | **Botdog** | CSV import | Generate CSV with Botdog-compatible columns | | **Expandi** | CSV import | Generate CSV matching Expandi import format | | **PhantomBuster** | CSV import | Generate CSV for PhantomBuster LinkedIn sequences | | **Manual / Other** | CSV + instructions | Export leads + messages as generic CSV, provide setup instructions |
**Tool selection logic:** 1. Ask user in Phase 0: "Which LinkedIn outreach tool do you use?" 2. Generate tool-specific import CSV based on selection 3. If **Other or unknown** → generate generic CSV (`linkedin_url`, `first_name`, `last_name`, `company`, `title`, `connection_request`, `followup_1`, `followup_2`, `followup_3`, `inmail_subject`, `inmail_body`) and ask user for their tool's import requirements
People must be stored in Supabase with the schema from `tools/supabase/schema.sql`. The `people` and `outreach_log` tables must exist. Run `python3 tools/supabase/setup_database.py` if setting up fresh.
Environment variables in `.env`:
SUPABASE_URL=https://xxx.supabase.co SUPABASE_SERVICE_ROLE_KEY=eyJ...
Just need CSV export — no API keys required. The user imports the CSV into their tool manually.
LinkedIn enforces strict character limits. **All generated messages must respect these.**
| Message Type | Limit | Notes | |-------------|-------|-------| | Connection request note | 300 characters | Hard limit. Every character counts. | | Regular message | 8,000 characters | Sent after connection accepted | | InMail subject | 200 characters | Only for InMail (premium feature) | | InMail body | 1,900 characters | Only for InMail |
**Enforcement:** After generating any message, count characters. If over the limit, rewrite — do not truncate. Truncated messages look broken.
Ask all questions at once. Organize by category. Skip any already answered by an upstream skill.
1. What's the objective? (book meetings, drive demo requests, get replies, build relationships, nurture) 2. What's the outreach angle or hook? (hiring signal, competitor displacement, event-based, pain-based, cold database, KOL engagement, mutual connection) 3. What should we name this campaign?
4. Which LinkedIn outreach tool do you use? (Dripify / Botdog / Expandi / PhantomBuster / Other / Just give me a CSV)
5. Which leads should we target? Options:
6. Any exclusions? (specific companies, recently contacted leads, certain titles) 7. Max campaign size? (default: 100 — LinkedIn tools have lower daily limits than email)
8. Which tone preset? Present these options:
9. Any reference messages that have worked well? (paste examples — these override tone presets)
10. How many follow-ups after connection? (default: 3) 11. Timing between messages? (default: Day 0 connection / Day 3 FU1 / Day 7 FU2 / Day 14 FU3) 12. Include InMail as a separate step for leads who don't accept the connection? (default: yes)
13. What signal data is available for these leads? (comment text, post they engaged with, mutual connections, hiring signals, event attendance) 14. Any proof points or case studies to reference? (customer names, metrics, testimonials)
Use the shared Supabase client:
import sys, os
sys.path.insert(0, os.path.join("tools", "supabase"))
from supabase_client import SupabaseClient
client = SupabaseClient(os.environ["SUPABASE_URL"], os.environ["SUPABASE_SERVICE_ROLE_KEY"])Map
Put your AI agent on the growth team. Research customers and competitors, analyze what is working, create the next campaign, and learn from the result.
Repo: gooseworks-ai/goose-skills
Generate or edit an image via any FAL image model (nano-banana edit, gpt-image, flux, ...), ROUTED THROUGH THE fal-proxy so it bills the Ads agent. image_urls…
Generate a single photoreal or designed image with OpenAI gpt-image via fal.ai. Supports gpt-image-1 (default, fixed sizes — the FAL fallback for Higgsfield's…
Generate an instrumental music bed via ElevenLabs Music, ROUTED THROUGH THE elevenlabs-proxy so it bills the Ads agent. Trims any sparse intro, loudnorm, fades…
Image-to-video (or text-to-video) via any FAL video model (Kling, Seedance, Veo), ROUTED THROUGH THE GooseWorks fal-proxy so the call bills the Ads agent. The…
Generate a voiceover (VO) clip via ElevenLabs text-to-speech, ROUTED THROUGH THE elevenlabs-proxy so it bills the Ads agent. Voice id + script text come from…
Scrape competitor ads from Google Ads by domain. Returns ad creatives, formats, and campaign details. Use for competitive ad research and messaging analysis.