An automated, end-to-end cold-outreach CLI that takes a single seed company.domain input and runs a multi-stage outreach campaign autonomously on its lookalike companies.
video.webm
This is Relay, an automated cold-outreach assistant that automates the process of finding lookalike companies, identifying key decision-makers, resolving contact details, validating safety and cooldown rules, and dispatching personalized outbound emails:
flowchart LR
A[Seed Company Domain] --> B[Discover Similar Companies]
B --> C[Find Decision-Makers]
C --> D[Resolve Verified Emails]
D --> E[Send Personalized Emails]
- Discover Similar Companies: Finds companies that are similar to a given target company.
- Find Decision-Makers: Identifies senior people (such as executives and managers) working at those discovered companies.
- Resolve Verified Emails: Searches for and validates the professional email addresses of those contacts.
- Send Personalized Emails: Generates custom email copies tailored to each recipient and dispatches them automatically.
For a detailed overview of the system design, database schema, and API request/response specifications, refer to the Architectural Breakdown.
- Node.js 20+
- SQLite3
-
Install dependencies:
npm install
-
Configure your environment: Copy
.env.exampleto.envand fill in your API credentials:cp .env.example .env
-
Initialize the Database: Set up your SQLite schema using Prisma:
npm run prisma:generate
Apply the database schema directly to your local file:
npm run prisma:push
-
Verify setup: Compile the TypeScript code and execute tests to ensure a clean setup:
npm run build # Run Vitest test suite npm test
To run the full outreach pipeline with all stages active:
npm run relay -- run <company.domain>Modify pipeline behavior by passing the following flags after the -- separator:
| Flag | Description |
|---|---|
--live |
Sends real outreach emails to discovered contacts. If omitted, the pipeline runs in simulation mode, displaying the progress on the CLI but redirecting emails to shryansh2024@gmail.com. |
--no-cache |
Disables reading cached lookups (companies, contacts, and emails) from previous completed runs. It forces fresh API lookups and stores the new data in the database. |
Example: Run the pipeline for stripe.com in live mode, disabling lookups from previous run database cache:
npm run relay -- run stripe.com --live --no-cache