Open Source

Build email courses
that run themselves

No platform fees. No subscriber limits. Write in markdown, deploy once, and let your course deliver automatically — on your schedule, in your subscribers' timezones.

MIT Licensed · Self-Hosted · No Vendor Lock-In

Email
Subscribe

How It Works

From clone to first subscriber in 30 minutes.

01

Clone

Fork or clone the template. Standard Next.js — no custom tooling.

02

Write

Create a content pack: markdown files with YAML frontmatter, a schedule, and an email shell.

03

Deploy

Push to Vercel or any Node.js host. Set env vars. Done.

04

Drip

Subscribers choose their time. One lesson per day, in their timezone.

terminal

$

Content Packs

Write once. Render everywhere.

Focus on writing. We handle the delivery, scheduling, and unsubscribe links.

day-1.md
---
subject: "Day 1: Getting Started"
preview: "Your first lesson"
---

Good morning!

Today we're covering the
fundamentals of...

## The Key Idea

Content in **markdown**.

[Read online →]({{companionUrl}})
parse frontmatter
inject URLs
render email
Delivered email

Day 1: Getting Started

Your first lesson

Good morning!

Today we're covering the fundamentals of...

The Key Idea

Read online →
Manage·Pause·Unsubscribe
{{companionUrl}}

Web version of this lesson

{{assetUrl}}

Base URL for pack assets

{{manageUrl}}

Manage subscription page

{{pauseUrl}}

Pause delivery one-click

{{stopUrl}}

Unsubscribe one-click

Companion Pages

Every lesson lives on the web.

Every email becomes a permanent URL. Subscribers share content without forwarding emails. You keep control of formatting.

Email inbox
Day 1: Getting Started
Manage·Pause·Unsubscribe
linked pair
yoursite.com/p/course/day-1
Day 1: Getting Started
image / embed
Shareable · permanent · any device

Go Deeper

Pages aren't limited to what fits in an email. Add images, embeds, extended writing — no inbox constraints.

Permanent URLs

Every page has a shareable link. Subscribers share content without forwarding emails.

Optional Per Lesson

Add a companion page to any lesson or skip it entirely. Each step decides for itself.

Multi-Pack

One brand. Many courses. Each with its own style.

Each pack is fully independent. Own subscribers, own schedule, own branding. Deploy once, run as many courses as you want.

L
Learnwise2 packs · 1 deploy

The Art of Mindful Productivity

/mindful-productivity

A free 5-day email course on building sustainable focus and productivity habits.

6 lessonsdaily at 8am

emails/

welcome.md
day-1.md
day-2.md
day-3.md
day-4.md
day-5.md
142 subscribers
89 active53 completed

Deep Work Essentials

/deep-work

A free 2-day email course on mastering deep work.

3 lessonssubscriber picks

emails/

welcome.md
day-1.md
day-2.md
56 subscribers
41 active15 completed

Independent Subscribers

Each pack has its own subscriber list — no cross-talk, no shared state.

Namespaced URLs

Routes are scoped per pack. /mindful-productivity and /deep-work coexist cleanly.

Per-Pack Branding

Every pack gets its own email shell, colors, and companion page styling.

Features

Skip the email platform. Own your stack.

📁 my-course/
├── pack.ts
├── email-shell.tsx
├── emails/
│   ├── welcome.md
│   └── day-1.md
└── pages/
    └── day-1.md

Content Packs

Self-contained folders of markdown emails, web pages, and a branded email template.

subscriber picks a time
06:00
08:00
09:30
12:00
18:00

Scheduled Delivery

Subscribers choose their delivery hour. Emails arrive at the exact time they chose. No batching.

auto-detected via Intl API
America/New_YorkEST 08:00
Europe/LondonGMT 13:00
Asia/TokyoJST 22:00

Timezone Aware

8am means 8am wherever they are. Timezones are auto-detected and stored per subscription.

yoursite.com/p/my-course/day-1

Companion Pages

Every email gets a web-readable page. Subscribers share links and read on any device — no inbox digging.

EmailShell.tsx

Email Branding

Each pack has its own React Email shell. Full control over headers, footers, typography, and colors.

Pause & Resume

One click to pause, pick up exactly where they left off.

update time
change timezone
unsubscribe

Self-Serve Manage

Signed token links. No passwords, no accounts.

CAN-SPAM · GDPR

One-Click Unsub

Signed, cryptographically verified. Compliant out of the box.

PostmarkResend

Pluggable Adapters

Swap email providers with a single adapter. No vendor lock-in.

The Drip Flow

What happens after someone subscribes

Every subscription follows the same lifecycle. Zero configuration.

Subscribe

Visitor enters email + preferred delivery time

Confirm

Signed token email → click to activate

Welcome

Sent immediately on confirmation

Drip

One lesson per day at the chosen time & timezone

Complete

Marked as completed after final step

Pause

Resume exactly where they left off

Unsubscribe

One-click, signed link, instant

Signed Tokens

Every action link (confirm, manage, pause, stop) uses a cryptographically signed, single-use token. No passwords, no sessions.

Idempotent Delivery

The send log tracks every email sent. If the cron job runs twice, the same step is never sent again. Safe to retry, safe to overlap.

Status Machine

Subscriptions move through PENDING_CONFIRM → ACTIVE → PAUSED → COMPLETED or STOPPED. Every transition is logged and auditable.

Your Design

It's just Next.js. Customize everything.

No locked-down templates. Every surface is a React component you own.

Landing Page

Subscribe page, hero, social proof — all yours

Email Template

React Email shell — header, footer, styles

Companion Pages

Custom typography, layout, and navigation

Subscribe Form

Fields, validation, and styling — fully yours

email-shell.tsx
export function EmailShell({ children, packName, accentColor, logoUrl }) {
  return (
    <Html> <Body> <Container>
      <Header logo={logoUrl} /> // ← your component
      {children}
      <Footer />
    </Container> </Body> </Html>
  );
}

Dev Mode

Test a 7-day course in 7 minutes.

No waiting for real-time delivery. Fast-test mode compresses days into minutes so you can preview your entire course instantly.

Normal schedule

Day 1
Day 2
Day 3
Day 4
Day 5
1440× faster

Fast-test mode

1min
2min
3min
4min
5min

.env

DRIP_TIME_SCALE=1440

1 day → 1 minute

Test your entire 7-day course in 7 minutes.

Content Preview

Preview every email and page before you ship.

A built-in dev tool that renders your entire course — emails and companion pages — exactly as subscribers will see them. Send test emails to yourself with one click.

localhost:3000/content-previewdev only

Content Packs

my-course

welcome
day-1
day-2
day-1

System

confirm
manage-link

Day 1: Getting Started

Your first lesson awaits

Send Test

Live Rendering

Emails render in a sandboxed iframe using the same pipeline as production. Pages render as formatted prose.

Send Test Emails

Send any email to your inbox with one click. See exactly what your subscribers will receive — subject, preview, and all.

All Packs & Steps

Browse every registered pack, every email, every companion page, and system templates — all in one place.

Stack

Tools you already know.

Next.js

App Router, Server Actions, API Routes

React Email

Type-safe, cross-client email templates

Drizzle ORM

Type-safe SQL with zero-overhead

SQLite / Turso

Edge-ready, zero-config database

Postmark / Resend

Pluggable email adapters — bring your own provider

Tailwind CSS

Utility-first styling throughout

Why ContentDrip?

Own your email courses. Literally.

FeatureSaaS PlatformsContentDrip
Monthly fee$29-$199/mo$0 (hosting only)
Subscriber limits500-10K capUnlimited
Design controlTemplates onlyFull React codebase
Data ownershipPlatform ownsYou own everything
Email portabilityExport CSVGit repo

The Real Difference

Email platforms rent you their infrastructure. ContentDrip gives you the source code. When you clone the repo, you own the entire stack — database schema, email templates, subscriber management, everything. No API calls to a third party. No monthly fees that scale with your success.

Your course can be live in an hour.

Clone the repo, write your first lesson, deploy to Vercel. No credit card. No setup wizard. Just code.