{"slug": "continual-outreach-a-self-refining-customer-discovery-process", "title": "Continual Outreach – A self refining customer discovery process", "summary": "A new open-source repository called Continual Outreach packages a reusable \"agent distro\" that turns a general-purpose AI agent such as OpenAI Codex or Claude Code into a customer-discovery and outreach workflow, covering ideal-customer-profile refinement, internet research, personalized outreach, response tracking and a feedback loop that improves each batch. The package, inspired by kunchenguid's Firstmate, keeps private campaign data separate from the reusable instructions, skills, scripts and state conventions, and sends outreach only within an authorization the user approves. The repository's worked example has a founder seeking 15-minute interviews with support operations leads at B2B SaaS companies who review recurring tickets and update help articles weekly.", "body_md": "**Continual Outreach is an agent distro for customer discovery and outreach.**\nTell it your product idea and who you want to learn from. It helps sharpen your ideal\ncustomer profile, researches people on the internet, personalizes outreach, tracks\nresponses, and uses what it learns to improve the next batch.\n\nAn **agent distro** is a portable package that gives a general-purpose AI agent a\nspecialized job: instructions define how it works, skills handle particular tasks,\nscripts make repeated operations reliable, and state conventions let it resume later.\n\n**This repository is that package.** Open Codex, Claude Code or another harness\nin it—or load its instructions from your existing workspace—and that agent follows the\ncontinual-outreach workflow. Your chosen agent supplies the model, browser access and\nconnected tools. This repo supplies the outreach expertise, campaign tracking, scheduling\nhelpers and feedback loop. Private campaign data stays separate from the reusable package.\n\nThe agent distro approach is inspired by [Firstmate](https://github.com/kunchenguid/firstmate),\ncreated by [kunchenguid](https://github.com/kunchenguid).\n\nStart with a hypothetical idea or an existing product. Optionally add GitHub repos, documents or interview notes as context. You approve the outreach scope; the agent works within it and keeps exploring new profiles alongside those that get useful responses.\n\n[Open video with pause and scrub controls](https://github.com/giga-james/continual-outreach/blob/main/assets/walkthrough.mp4)\n\n<sub>Mock Codex-style workspace. Fictional people and data; no real outreach.</sub>\n\n**The example:** a founder building a support documentation tool wants 15-minute\ninterviews with support operations leads at B2B SaaS companies who personally review\nrecurring tickets and update help articles every week. The agent turns that brief into\nqualification criteria, researches candidates on the internet, verifies a LinkedIn profile and prepares\nan approved, specific invitation.\n\n[Start](#start) ·\n  [Architecture](#architecture) ·\n  [Feedback loop](#the-feedback-loop) ·\n  [Scheduling](https://github.com/giga-james/continual-outreach/blob/main/docs/scheduling.md) ·\n  [Exports](https://github.com/giga-james/continual-outreach/blob/main/docs/exports.md)\n\nClone or fork the repo, open your preferred agent in it, and say:\n\nHelp me figure out who to reach out to for my product idea.\n\nOr bring context:\n\nI’m exploring a product for support teams. Use this GitHub repo and these interview notes to help sharpen the ICP, then find people I can learn from.\n\nThat is the front door. The agent asks about your goal, offers useful starting directions and handles its internal skills, campaign files and optional scheduling. There is no mandatory codebase selection or setup questionnaire.\n\n**Already working in another workspace?** Tell your agent to read this clone's\n`OUTREACH.md`. It takes on the same outreach role while preserving that workspace's\ninstructions. [Optional workspace integration](https://github.com/giga-james/continual-outreach/blob/main/docs/portable.md) makes it discoverable\nin later sessions; it is not required to begin.\n\nThe agent helps you define:\n\n| Decision | What you work out together | \n|---|---|\n| Ideal customers | Product, painful workflow, ownership evidence and disqualifiers | \n| Outreach | Channel, account, existing contacts, authorization and sending budget | \n| Messaging | Your voice, verified work references and call to action | \n| Tracking | Google Sheets, local CSV or another available export connector | \n| Learning | What counts as a useful response, observation window and exploration budget | \n\nOnce your ICP and messaging direction are clear, the agent opens its own supported computer-use browser session and researches the web to find leads. It follows sources, verifies who actually owns the relevant work, saves a private campaign and shows personalized drafts. It also checks export access. Sending begins only within your authorization; that authorization carries forward within its scope.\n\n**No specific agent runtime is required.** [OUTREACH.md](https://github.com/giga-james/continual-outreach/blob/main/OUTREACH.md) is the portable\nentrypoint. In the distro itself, [AGENTS.md](https://github.com/giga-james/continual-outreach/blob/main/AGENTS.md) and [CLAUDE.md](https://github.com/giga-james/continual-outreach/blob/main/CLAUDE.md) route\nto it. Every instruction is ordinary Markdown, so agents without skill discovery can\nread the same workflow directly.\n\nComputer use is the default: the current agent navigates the web to research prospects, verify their work and interact with the chosen channel. Search tools and export connectors complement that browser workflow. Local scripts keep state and enforce operational gates. A scheduler wakes the agent; it does not send messages itself. During sending pauses, the agent audits outcomes and prepares the next batch.\n\n| Component | Responsibility | \n|---|---|\n| Agent instructions | Interview, research, qualification, messaging and recovery | \n| Your agent and tools | Web research, supported computer use and export connectors | \n| Campaign ledger | Duplicate protection, reservations, send caps and audit holds | \n| Selection planner | Rank qualified segments using observed outcomes and exploration | \n| Scheduled runner | Deliver prompts, serialize local runs, enforce timeouts and save logs | \n| Private campaign and exports | Preserve prospects, exact messages, outcomes and policy changes | \n\n**Research → qualify → personalize → send → observe → audit → tune.**\n\nSuccess means a useful response defined during onboarding. Acceptance, relevant replies, booked conversations and substantive feedback remain separate outcomes, so optimizing for connections does not silently replace learning from customers.\n\nThe initial policy uses **80% posterior-guided selection and 20% exploration** among\nqualified profiles. [The planner](https://github.com/giga-james/continual-outreach/blob/main/scripts/select_batch.py) uses segment-level Thompson\nsampling with Beta posteriors. It learns only from comparable, fully observed windows;\nrecent and unknown outcomes remain unobserved rather than becoming failures.\n\nThe agent interprets conversation feedback, researches similar profiles and records selection changes. This is a delayed-feedback bandit approximation, not a trained model over individual prospects. The planner proposes a batch; authorization and send gates still decide whether it can run.\n\nTell your agent:\n\nKeep this campaign running. Set up the schedule for me.\n\nThe agent discovers its runtime, checks the tools available to scheduled sessions and\nsets up the appropriate scheduler. It reuses an existing schedule or configures its own\nlaunch command, writes the private runner configuration and verifies setup. You choose\nthe cadence; **you do not need to assemble commands or edit configuration files**.\n\nWhen available, an app scheduler can retain the current session's tools. For CLI-based scheduling, the included runner supplies prompts, serializes local runs, saves logs and enforces timeouts. Failed runs are not automatically retried.\n\nIf authentication or a required tool is missing, the agent asks for that specific step.\nSee [Scheduling](https://github.com/giga-james/continual-outreach/blob/main/docs/scheduling.md) for the agent setup procedure and manual reference.\n\n- **The agent handles browser startup.** It discovers and starts the computer-use tools\nin its environment. If access or login is missing, it asks for that specific step and\ncontinues any available read-only research. Cloning the repo does not install a browser\nintegration.\n- **Channel support is explicit.** The included send guard supports LinkedIn profile\nidentity. Other channels can be researched and drafted, but need a tested identity\nadapter before automated sending.\n- **Pacing is not platform permission.** LinkedIn prohibits third-party automated\nactivity. Use manual sending when appropriate and stop on platform warnings.\n- **Scheduled access can differ.** A cron-launched CLI may lack desktop browser tools.\nThe POSIX runner supports Linux/macOS; unavailable capabilities produce a checkpoint.\n- **Local locks are local.** Reconcile account-wide sends and serialize senders across\ncampaigns and machines. An uncertain send stops further sending until reconciled.\n\nPortable campaigns keep configuration, prospects, messages, replies, audits and run logs\noutside the product workspace, by default under `~/.local/share/continual-outreach/`.\nStandalone campaigns can use ignored `campaigns/` in the distro. Keep a private backup:\nthese records are not included in your fork.\nThe repository contains only a [generic, draft-mode example](https://github.com/giga-james/continual-outreach/blob/main/examples/campaign.json).\n\nEach campaign has its own `campaign.json` with four core settings:\n\n| Setting | Field | Purpose | \n|---|---|---|\n| ICP profile | `icp` | Qualification criteria and target profiles; `icp.md` holds supporting rationale | \n| Outreach message | `message_template` | The approved template personalized for each prospect | \n| Tracker | `tracker` | The campaign's sheet/tab, local file or other export destination | \n| Outreach channel | `channel` | For example, `linkedin` ; selected during onboarding | \n\nThe agent saves these during the interview. Separate campaigns keep separate settings, prospect records, sent messages and outcomes. When campaigns share a sender account, account-wide limits and duplicate checks still need reconciliation across campaigns.\n\nExports use stable IDs and are verified after each send or skip. If synchronization\nfails, sending pauses until the tracker is repaired. See [Exports](https://github.com/giga-james/continual-outreach/blob/main/docs/exports.md).\n\n```\n# Inspect your campaign\npython3 scripts/campaign.py --campaign campaigns/my-campaign status\n\n# Run the offline checks; no real outreach is sent\npython3 -m unittest discover -s tests -v\n```\n\nSee [CONTRIBUTING.md](https://github.com/giga-james/continual-outreach/blob/main/CONTRIBUTING.md) for setup, validation and pull-request guidelines.", "url": "https://wpnews.pro/news/continual-outreach-a-self-refining-customer-discovery-process", "canonical_source": "https://github.com/giga-james/continual-outreach", "published_at": "2026-10-01 04:41:55+00:00", "updated_at": "2026-10-01 04:48:48.226777+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "ai-products"], "entities": ["Continual Outreach", "OpenAI Codex", "Claude Code", "Firstmate", "kunchenguid", "GitHub", "LinkedIn", "Google Sheets"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/continual-outreach-a-self-refining-customer-discovery-process", "markdown": "https://wpnews.pro/news/continual-outreach-a-self-refining-customer-discovery-process.md", "text": "https://wpnews.pro/news/continual-outreach-a-self-refining-customer-discovery-process.txt", "jsonld": "https://wpnews.pro/news/continual-outreach-a-self-refining-customer-discovery-process.jsonld"}}