A full-stack B2B outbound tool that generates hyper-personalized landing pages for every prospect in your list. Upload a CSV, configure your campaign branding, and HyperPage uses AI to research each company and write a unique, conversion-optimized page — at scale.
- Campaign management — create, pause, archive, and delete campaigns with full branding control
- CSV prospect upload — intelligent column mapping stored per campaign
- AI landing page generation — LLM researches each company and writes:
- Headline (≤8 words, names the prospect directly)
- Subheadline (1 sentence with concrete results)
- Body copy (2 paragraphs targeting pain points)
- 3 company-specific pain point bullets
- Custom CTA text
- Batch processing — 3 concurrent generations with progress tracking and per-prospect retry
- Real-time status — frontend polls every 2 seconds during active generation
- Template editor — custom HTML templates with AI analysis and generation
- Branding — primary/accent colors, background styles (gradient/mesh/solid), logo, calendar embed
- Unique URLs — each prospect gets a shareable slug-based landing page
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router) |
| UI | React 19, Tailwind CSS 4 |
| Language | TypeScript 5 |
| Database | SQLite via better-sqlite3 (WAL mode) |
| AI / LLM | OpenRouter API (default: openai/gpt-4o-mini) |
| CSV parsing | PapaParse |
| Icons | Lucide React |
| Deployment | Vercel / Node.js |
npm install
npm run dev # http://localhost:3000
npm run build
npm start| Variable | Required | Description |
|---|---|---|
OPENROUTER_API_KEY |
✅ | Your OpenRouter API key |
OPENROUTER_MODEL |
Optional | Model override (default: openai/gpt-4o-mini) |
NEXT_PUBLIC_BASE_URL |
Optional | Public URL used as the OpenRouter referer header |
| Method | Route | Description |
|---|---|---|
| GET / POST | /api/campaigns |
List or create campaigns |
| GET / PATCH / DELETE | /api/campaigns/[id] |
Get, update, or delete a campaign |
| POST | /api/campaigns/[id]/status |
Update campaign status |
| POST | /api/campaigns/[id]/template |
Save or fetch template HTML |
| POST | /api/campaigns/[id]/template/generate |
AI-generate a template |
| POST | /api/campaigns/[id]/template/analyze |
AI-analyze an existing template |
| POST | /api/prospects/upload |
Upload CSV and configure column mapping |
| GET | /api/prospects/list |
List prospects (polled during generation) |
| POST | /api/prospects/generate |
Batch-generate landing pages |
| POST | /api/prospects/bulk |
Bulk operations (delete, reset) |
| POST | /api/images/upload |
Upload campaign images |
campaigns — id, name, status, sender_name, sender_title, sender_company, value_prop, logo_url, primary_color, accent_color, background_style, cta_text, calendar_embed, column_mapping (JSON), custom_template_html, created_at
prospects — id, campaign_id, slug, raw_data (JSON), status, error_msg, headline, subheadline, body_copy, pain_points (JSON), cta_label, first_name, company_name, created_at, generated_at
src/
├── app/
│ ├── page.tsx # Campaign dashboard
│ ├── campaigns/[id]/page.tsx # Campaign detail + prospect table
│ └── api/
│ ├── campaigns/ # Campaign CRUD routes
│ └── prospects/ # Upload, list, generate, bulk routes
└── lib/
└── db.ts # SQLite schema init + CRUD helpers
Generation pipeline: CSV upload → column mapping → AI company research (optional web search) → personalized copy generation (3× concurrent) → SQLite storage → public /p/[slug] URL