A self-hosted cold email sender built with SvelteKit. Manage contact lists, create email templates with dynamic variables, and send personalized bulk emails. Easy to setup and free to fork.
- Contact Lists — Currently supporting CSV imports; Import contacts via CSV and map the fields; you can later add-on contacts manually trough UI
- Email Templates — Create reusable templates with variables like
{{firstName}},{{company}},{{industry}}, format them using html tags, etc. - Bulk Sending — Select contacts, pick a template, and send personalized emails
- Per-user SMTP — Each user configures their own SMTP credentials (encrypted at rest)
- Authentication — Email/password auth with email verification via Better Auth
- Frontend: SvelteKit & Tailwind CSS + DaisyUI
- Database: PostgreSQL via Prisma ORM
- Auth: Better Auth
- Email: Nodemailer
- Bun (recommended) or Node.js 20+
- PostgreSQL database
- SMTP server for sending verification and outbound emails
git clone https://github.com/your-username/cold0.git
cd cold0
bun installCopy the example env file and fill in your values:
cp .env.example .env| Variable | Description |
|---|---|
DATABASE_URL |
PostgreSQL connection string |
BETTER_AUTH_SECRET |
Random secret for session signing (min 32 chars) |
BETTER_AUTH_URL |
Your app's base URL (e.g. http://localhost:5173) |
ENCRYPTION_KEY |
Random secret for encrypting stored SMTP passwords (min 32 chars) |
SYSTEM_SMTP_HOST |
SMTP host for system emails (verification, password reset) |
SYSTEM_SMTP_PORT |
SMTP port (default: 465) |
SYSTEM_SMTP_EMAIL |
System sender email address |
SYSTEM_SMTP_PASSWORD |
System SMTP password |
The SYSTEM prefixed ones are used for sending verification emails upon registration
To generate random secrets:
openssl rand -base64 32bunx prisma migrate dev
bunx prisma generatebun devOpen http://localhost:5173.
- Register at
/register - Check your email for the verification link
- Verify and log in
- Go to Settings and configure your SMTP credentials for sending emails
When deploying make sure your build script is configured to generate prisma client and run migrations, like so:
prisma generate && prisma migrate deploy && vite build
The app can be deployed anywhere that runs Node.js/Bun — VPS with Coolify, Docker, Vercel, etc.
Make sure to:
- Set
BETTER_AUTH_URLto your production domain - Use strong, unique values for
BETTER_AUTH_SECRETandENCRYPTION_KEY - Use SSL/TLS for your PostgreSQL connection in production
MIT