{"id":49072928,"url":"https://github.com/techievena/producthunt-wingman","last_synced_at":"2026-04-20T08:09:43.491Z","repository":{"id":352396910,"uuid":"1214846795","full_name":"techievena/producthunt-wingman","owner":"techievena","description":"ProductHunt outreach tool built with OpenClaw","archived":false,"fork":false,"pushed_at":"2026-04-19T11:29:14.000Z","size":86,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-19T12:28:06.641Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/techievena.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-19T06:00:07.000Z","updated_at":"2026-04-19T11:29:18.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/techievena/producthunt-wingman","commit_stats":null,"previous_names":["techievena/producthunt-wingman"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/techievena/producthunt-wingman","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/techievena%2Fproducthunt-wingman","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/techievena%2Fproducthunt-wingman/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/techievena%2Fproducthunt-wingman/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/techievena%2Fproducthunt-wingman/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/techievena","download_url":"https://codeload.github.com/techievena/producthunt-wingman/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/techievena%2Fproducthunt-wingman/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32038537,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-20T00:18:06.643Z","status":"online","status_checked_at":"2026-04-20T02:00:06.527Z","response_time":94,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-20T08:09:40.552Z","updated_at":"2026-04-20T08:09:43.484Z","avatar_url":"https://github.com/techievena.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ProductHunt Wingman 🪃\n\n\u003e AI-native LinkedIn outreach agent for ProductHunt launches.  \n\u003e Powered by **Crustdata APIs** + **browser-use** + **APScheduler**.\n\n## What it does\n\n1. **Discovers** PH community members via Crustdata's `/web/search/live` and `/person/search`\n2. **Scrapes** the PH streak leaderboard for active community members with LinkedIn profiles\n3. **Enriches** every prospect via Crustdata's `/person/enrich` (employment, skills, social handles)\n4. **Personalises** outreach messages per-prospect using LLM + enrichment context\n5. **Schedules** connection requests across a 20-day window (D-20 → D-3) at 13/day\n6. **Sends** connection requests via browser-use (a real Chrome session, no extension fingerprinting)\n7. **Scans** for accepted connections every 45-90 minutes\n8. **DMs** accepted connections with the personalised message on launch day\n\n## Quick Start\n\n1. **Setup**: Run the setup script to create a fresh virtual environment and install dependencies.\n   ```bash\n   cd server\n   ./setup.sh\n   ```\n2. **Activate**:\n   ```bash\n   source .venv/bin/activate\n   ```\n\n\n### 2. Configure\n\n```bash\ncp .env.example .env\n# Edit .env with your keys:\n#   CRUSTDATA_API_KEY   → get from app.crustdata.com\n#   OPENAI_API_KEY      → for LLM personalization\n#   LAUNCH_DATE         → your PH launch date (YYYY-MM-DD)\n#   PH_LAUNCH_URL       → your product's PH URL\n```\n\n### 3. Run\n\nMake sure the venv is active (step 1), then:\n\n```bash\npython main.py\n```\n\nOr without activating the venv:\n\n```bash\n# from the repo root\nserver/.venv/bin/python server/main.py\n\n# or from inside server/\n.venv/bin/python main.py\n```\n\nThe dashboard opens at **http://localhost:3847**\n\nFirst run: A browser window will open. **Log into LinkedIn manually.** The session is saved in `.browser_profile/` — you only do this once.\n\n### 4. Start your campaign\n\nFrom the dashboard:\n1. Click **\"Scrape PH\"** → imports streak leaderboard users with LinkedIn profiles\n2. Go to **Settings** → add your LinkedIn group URLs (PH-related groups you're in)\n3. Click **\"Run Enrichment\"** → Crustdata enriches profiles + LLM generates messages\n4. Click **\"Allocate Schedule\"** → distributes prospects across your send window\n5. Click **▶ Start Agent** → scheduler begins sending connections automatically\n\n## Architecture\n\n```\nserver/\n├── main.py           ← Entry point (FastAPI + APScheduler + browser-use)\n├── config.py         ← Environment config\n├── db.py             ← SQLite (prospects, groups, config, activity log)\n├── crustdata.py      ← Crustdata API client (enrich, search, web search)\n├── ph_scraper.py     ← PH leaderboard scraper (Playwright)\n├── linkedin_agent.py ← browser-use LinkedIn automation\n├── scheduler.py      ← Rate-limited scheduling engine\n├── personalizer.py   ← LLM message generation\n├── dashboard.py      ← FastAPI routes + templates\n└── templates/        ← Jinja2 HTML dashboards\n    ├── index.html\n    ├── prospects.html\n    └── config.html\n\nopenclaw/\n└── SKILL.md          ← OpenClaw skill wrapper\n```\n\n## Crustdata API Usage\n\n| Endpoint | Purpose | Cost |\n|---|---|---|\n| `/person/enrich` | Full profile from LinkedIn URL | ~1 credit/person |\n| `/person/search` | Find people by title/keywords | 0.03 credits/result |\n| `/web/search/live` | Find PH community members + personalization context | ~1 credit/query |\n| `/company/identify` | Resolve company names | **Free** |\n\nBudget: **5000 credits** → supports ~300 enriched + personalised prospects.\n\n## Rate Limits (LinkedIn Safety)\n\n| Action | Limit | What Wingman does |\n|---|---|---|\n| Connection requests | ~100/week | Sends max 13–15/day |\n| Send window | D-20 → D-3 | Stops 3 days before launch |\n| DMs | No hard limit (1st-degree) | Sends after acceptance |\n| Acceptance scanning | Human cadence | Randomized 45-90 min intervals |\n\n## OpenClaw Integration\n\nPH Wingman is fully compatible with **OpenClaw**. You can manage your entire launch campaign via voice or chat.\n\n### Install the Skill\nCopy `openclaw/SKILL.md` into your OpenClaw skills directory.\n\n### Voice/Chat Commands\n- *\"Start my PH outreach\"*\n- *\"Scrape ProductHunt streaks\"*\n- *\"How many connections did wingman send today?\"*\n- *\"Pause wingman\"*\n- *\"Check my launch outreach status\"*\n\n## Environment Variables\n\n| Variable | Required | Description |\n|---|---|---|\n| `CRUSTDATA_API_KEY` | ✅ Yes | From app.crustdata.com |\n| `OPENAI_API_KEY` | ✅ Yes (or Anthropic) | For LLM personalization |\n| `ANTHROPIC_API_KEY` | Alternative | Claude instead of GPT |\n| `LAUNCH_DATE` | ✅ Yes | `YYYY-MM-DD` |\n| `PH_LAUNCH_URL` | Recommended | Your product's PH launch URL |\n| `DAILY_CONNECTION_BUDGET` | Optional | Default: 13 |\n| `PORT` | Optional | Default: 3847 |\n\n## Hackathon Demo Script\n\n1. Open `http://localhost:3847`\n2. Show the countdown banner (D-N days to launch)\n3. Click **\"Scrape PH\"** → watch profiles populate in real-time\n4. Go to Prospects → show enrichment data from Crustdata\n5. Click Preview on a prospect's message → show AI-personalized DM\n6. Show the scheduler timeline with daily allocation\n7. Start the agent → demo 1 live connection request via browser-use\n8. Show the acceptance scanner detecting a connection\n9. Show the DM being prepared for launch day\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftechievena%2Fproducthunt-wingman","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftechievena%2Fproducthunt-wingman","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftechievena%2Fproducthunt-wingman/lists"}