FrostByte at /Users/imorgado/Desktop/Workspace/projects/frostbyte/ is production-ready (14 integrations). Needs: LLM layer refactor for GLM-4.7, API key setup via Chrome DevTools, VPS provisioning, domain/DNS creation, frontend fixes.
| Service | Cost | Notes |
|---|---|---|
| Hetzner VPS (CX22) | $7-12 | 2 vCPU, 4GB RAM, Ubuntu |
| GLM-4.7 | $0 | Yearly plan, OpenAI-compatible API |
| Apollo.io Basic | $49 | 5K credits + unlimited emails |
| Cal.com (free cloud) | $0 | 30-min meetings, Google Calendar |
| RapidAPI LinkedIn | $0 | Free tier |
| Cartesia (voice) | Usage-based | TTS + voice clone |
| SyncLabs (lip sync) | Usage-based | Lip sync API |
| Cloudflare R2 | ~$0-5 | Video/thumbnail storage |
| Launch total | ~$56-61 | |
| With video | ~$65-80 | Depends on volume |
Completed in
dc2f622. Provider abstraction added, GLM-4.7 support via OpenAI-compatible client. 351 tests pass.
Changes made:
frostbyte/personalization/llm.py—LLMProviderABC +AnthropicProvider,GroqProvider,OpenAICompatProvider. Config-driven routing with fallback.frostbyte/config.py— Addedglm_api_key,glm_base_url,glm_model,first_touch_provider,followup_provider,classify_providerpyproject.toml— Addedopenai>=1.0.0.env.example— Added GLM env vars- Tests updated to match new provider architecture
ln -s /Users/imorgado/Desktop/Workspace/projects/frostbyte \
/Users/imorgado/Desktop/Workspace/projects/BillionMail/frostbyteVerify Dockerfile EXPOSE vs docker-compose port 8001.
- Navigate to hetzner.com -> Cloud Console
- Create CX22 server (2 vCPU, 4GB, Ubuntu 22.04)
- Note public IP
- Configure rDNS to match sending domain
- Navigate to admin.google.com -> Account -> Domains -> Manage domains -> Add domain
- Purchase/add sending domain
- Verify domain ownership (DNS TXT record)
- Create josh@ user account
- This is a prerequisite for DNS records + Gmail app password
On the domain registrar, add:
- SPF:
v=spf1 ip4:<vps-ip> include:_spf.google.com ~all - DKIM: Generated by BillionMail after deploy
- DMARC:
v=DMARC1; p=none; rua=mailto:dmarc@<domain> - MX: Point to VPS IP
- rDNS: Set on Hetzner to match domain
Use Chrome DevTools MCP to log into each dashboard and get keys:
| # | Service | URL | Free? |
|---|---|---|---|
| 1 | GLM / Z.AI | api.z.ai | Yes (yearly plan) |
| 2 | Apollo.io | app.apollo.io -> Settings -> API | $49/mo Basic |
| 3 | RapidAPI | rapidapi.com -> Fresh LinkedIn Profile Data | Free tier |
| 4 | Cal.com | cal.com -> Settings -> Security -> API Key | Free |
| 5 | Gmail App Password | myaccount.google.com -> Security -> App Passwords | Free |
| 6 | Cartesia | cartesia.ai (voice clone + TTS) | Usage-based |
| 7 | SyncLabs | synclabs.so (lip sync) | Usage-based |
| 8 | Cloudflare R2 | dash.cloudflare.com (video storage) | ~$0-5/mo |
Write to /Users/imorgado/Desktop/Workspace/projects/frostbyte/.env:
# LLM (GLM-4.7 via yearly plan)
GLM_API_KEY=<from zhipu>
GLM_BASE_URL=https://api.z.ai/api/paas/v4/
GLM_MODEL=glm-4.7
FIRST_TOUCH_PROVIDER=glm
FOLLOWUP_PROVIDER=glm
CLASSIFY_PROVIDER=glm
# Keep as fallbacks (empty until needed)
ANTHROPIC_API_KEY=
GROQ_API_KEY=
OPENAI_API_KEY=
# Enrichment
APOLLO_API_KEY=<from apollo>
RAPIDAPI_KEY=<from rapidapi>
HUNTER_API_KEY=
PROSPEO_API_KEY=
# Video Pipeline (Cartesia + SyncLabs + R2)
ANTHROPIC_API_KEY=
CARTESIA_API_KEY=
SYNCLABS_API_KEY=
R2_ACCOUNT_ID=
R2_ACCESS_KEY_ID=
R2_ACCESS_KEY_SECRET=
R2_BUCKET_NAME=
R2_PUBLIC_URL=
VOICE_SAMPLE_URL=
VOICE_DEFAULT_ID=
# Booking
CALCOM_API_KEY=<from cal.com>
# Gmail
GMAIL_APP_PASSWORDS={"josh@<domain>":"<app password>"}
# Config
SENDING_BACKEND=billionmail
SECRET_KEY=<generate>
NOTIFICATION_EMAIL=josh@<domain>
SENDER_NAME=Josh Izzy
SENDER_COMPANY=Douro Digital- Navigate to BillionMail instance on VPS
- Login
- Settings > AI Model: Add GLM-4.7 supplier (base URL + API key)
- Settings > SMTP Relay: Configure Gmail relay
- Domain Management: Add sending domain, generate DKIM keys, verify DNS
- Delete:
core/frontend/src/views/automation/index.vue - Delete:
core/frontend/src/router/modules/automation.ts - Remove import from router index
- File:
core/frontend/src/views/sequences/list/index.vue:4— removedisabled - File:
core/frontend/src/api/modules/sequences.ts— addcreateSequence(),toggleSequence() - New:
core/frontend/src/views/sequences/list/components/SequenceForm.vue(modal pattern)
- Delete:
core/frontend/src/views/contacts/group/temp.vue
- Files:
core/frontend/src/i18n/lang/{en,zh,ja}.json— sequence form keys
- Josh creates Cal.com account with Workspace email
- Connect Google Calendar via OAuth
- Create "30-Minute Meeting" event type
- Copy API key + event type ID -> frostbyte
.env - Apple Calendar: syncs via Google Calendar bridge
- Push code to VPS,
docker-compose up -d - Verify FrostByte:
curl http://<vps>:8001/health - Test sequence creation from frontend
- Test lead scraping via enrichment UI
- Send test email through sequence engine
- Verify tracking webhooks
- VPS provisioned, rDNS configured
- Domain created, DNS records set (SPF/DKIM/DMARC)
- FrostByte containers running (api, worker, beat)
-
/healthreturns 200 - GLM-4.7 responds via LLM layer
- Sequences list loads + create works
- Leads list loads
- Enrichment scraper runs
- Gmail relay sends test email
- Cal.com booking link -> Google Calendar
- Automation route gone from nav
- Record voice sample (clear audio, 30s+) for Cartesia voice clone
- Set VOICE_SAMPLE_URL or VOICE_DEFAULT_ID in env
- Create Cloudflare R2 bucket + generate API tokens
Full pipeline implemented in core/internal/service/video_gen/. Per contact:
- Enrichment populates lead data (website_url, business_name, signals)
- Screenshots — Playwright captures homepage, contact, Google pages
- Annotate — ImageMagick overlays signal callouts on screenshots
- Script — Claude Sonnet generates personalized 15-30s narration
- Voice — Cartesia TTS with cloned or default voice
- Composite — FFmpeg stitches annotated images + audio into video
- Lip Sync — SyncLabs adds lip sync (optional, if API key set)
- Upload — Cloudflare R2 storage, generates landing page URL
- Update — Stores video_url, thumbnail_url, landing_page_url in contact attribs
- Leads detail/edit view (frontend only has list)
- Sequences edit UI (can create but not edit)
- Enrichment data results view (UI shows config only)
- Richer video scripts using full enrichment data
- Excel export returns 500 —
core/internal/controller/contact/contact_v1_export_contacts.go:86 - SSL cert listing returns
CodeNotImplemented
- Anthropic Claude as fallback LLM (if GLM quality insufficient for English copy)
- Apollo upgrade tiers as credit usage grows
- Alternative TTS providers as fallback to Cartesia
- GLM endpoint: api.z.ai (international), model: glm-4.7
- Domain: needs creation in Google Workspace (done in Phase 2c via Chrome DevTools)
- What domain name for Josh's sending email? (need to pick/purchase before Phase 2c)