A newsletter sender for one person is plain code: a subscriber list with double opt-in, a composer, batch sending through SES or SMTP and an unsubscribe link that works. An agent can write it in a weekend. The hard part is outside the code: mail has to reach inboxes, which means SPF, DKIM and DMARC on your domain, a one-click unsubscribe header, and keeping complaints under 0.3% if you send in bulk to Gmail, with a reputation you build yourself instead of borrowing a large sender's. Template builders, 300-plus integrations and automations beyond a welcome series stay out.
Before you buildMailchimp Free covers 250 contacts and 500 emails a month. EmailOctopus' free plan allows 2,500 subscribers and 10,000 emails a month if all you need is a sender.
Build me a personal newsletter sender to replace Mailchimp. Requirements:
- Node.js 22 + TypeScript: a Fastify server with server-rendered pages (Eta). `npm start` serves
http://localhost:4500 with admin at /admin and public routes /subscribe, /confirm/<token> and
/unsubscribe/<token>.
- Storage: better-sqlite3 in ./data/news.db: subscribers (email, status pending, active,
unsubscribed, bounced or complained, source, consent date), campaigns, a send log and tags.
- Double opt-in: the signup form emails a confirmation link and an address becomes active only after
the click. CSV import needs a consent date column; rows without one are refused.
- Composer: Markdown with {{first_name}} merge fields, turned into an HTML email with inlined CSS
(marked + juice) plus a plain-text part; a preview and a "send test to me" button.
- Sending: nodemailer over SMTP or the SES SMTP endpoint from .env, through a queue that sends at most
5 messages a second, retries soft failures with backoff and logs each recipient's result.
- Every message carries a visible unsubscribe link plus the List-Unsubscribe and List-Unsubscribe-Post
headers (RFC 8058); an unsubscribed address is never mailed again.
- Bounces and complaints arrive through a webhook that verifies SES notifications from SNS, marks the
address and stops mailing it. A campaign pauses itself if complaints pass 0.1% after 500 sends.
- Per-campaign stats: sent, failed, bounced, complained, unsubscribed. Open and click tracking stay off.
- One admin password in .env. No telemetry, local-first apart from SMTP and the webhook.
- Out of scope: a drag-and-drop editor, landing pages, automations, segments beyond tags, SMS.
- README: verifying the domain, SPF, DKIM and DMARC records, SES production access, exposing the public
routes over HTTPS, and a note that a new sending domain should start with small batches.Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Mailchimp.
Add a Mailchimp importer to the newsletter app in this folder. Requirements: - Take the ZIP or the CSV files from Mailchimp's audience export: one file each for subscribed, unsubscribed, non-subscribed and cleaned contacts. - Map subscribed to active, unsubscribed to unsubscribed and cleaned to bounced; import tags and the opt-in or confirmation time as the consent date. - Skip rows without a usable consent date or email and write them to skipped.csv. - Never create active subscribers from the non-subscribed file. - Dry run by default, --apply to write. Update the README.
Add a welcome series to the newsletter app in this folder. Requirements: - A sequence of up to 3 emails, each with a delay in days (for example 0, 2 and 5) written in Markdown. - A daily job sends the next step to people who confirmed, skips anyone unsubscribed, and records progress per subscriber. - Editing the sequence never resends emails that were already sent. - A dry-run flag that lists what would go out. - Update the README.
Add a hygiene page to the newsletter app in this folder. Requirements: - Show bounce, complaint and unsubscribe rates for each of the last 10 campaigns, with a warning colour above 2% bounces or 0.1% complaints. - List addresses with 3 or more soft bounces and subscribers who haven't opened or clicked in 12 months, only when tracking is enabled, with a button to move them to a suppression list. - Export the suppression list as CSV. - Update the README.
Add public signup to the newsletter app in this folder. Requirements: - A standalone /join page and a one-line script tag that renders the same form on another site. - Allow cross-origin posts only from origins listed in ALLOWED_ORIGINS in .env. - Honeypot field, a per-IP rate limit without storing the IP, and an optional consent checkbox text. - Show the same response for new and existing addresses so the list can't be probed. - Update the README.
A newsletter is only worth the share that reaches inboxes, so people pay Mailchimp to carry that risk, along with the editors, forms and store connections their team already uses. The price rises with every contact band, which is the usual reason a growing list starts looking at self-hosted tools.
Estimate · A small VPS or tunnel plus per-message fees from SES or another provider, which stay small at newsletter volumes. The build is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Free | $0 | $0 | 250 contacts, 500 sends a month or 250 a day, 1 user, 1 audience. |
| Essentials | $13 | — | At 0-500 contacts: 5,000 sends a month, 3 users and audiences, scheduling and testing, branding removed, automation flows up to 4 steps, 24/7 email and chat support. |
| Standard | $20 | — | At 0-500 contacts: 6,000 sends a month, 5 users and audiences, up to 200 automation flows, generative AI features, custom-coded and branded templates, custom reports, dynamic content, 1 onboarding session. |
| Premium | $350 | — | Unlimited users and audiences, 150,000 sends a month, SSO, phone and priority support, 4 onboarding sessions. |
Free covers up to 250 contacts and 500 emails a month (250 a day) for one user.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: The drag-and-drop email and landing-page builders and the ready-made templates, 300-plus integrations, including store and CRM connections.
About $13 a month on the Essentials plan, $156 a year (checked 2026-10-14).
The drag-and-drop email and landing-page builders and the ready-made templates; 300-plus integrations, including store and CRM connections; Automation flows with branching, and the predictive segments on Standard and Premium; Deliverability handled by a large sender's infrastructure and support; SMS and the A/B testing tools. If any of those matter to you, keep paying.
Yes: listmonk (open source), Keila (open source), Mautic (open source).