Meinen Eigenen Newsletter mit Claude Erstellen

Tag zwei des Hacker News Traffic-Ansturms. Vierzigtausend Besucher, keine Möglichkeit, sie erneut zu erreichen. Ich brauchte eine Newsletter-Anmeldung.

Ich schaute mir Buttondown, Beehiiv, Substack, ConvertKit an. Alles übertrieben. Ich musste nur E-Mails sammeln. Ich brauchte keine Kampagnen, Analysen oder Abonnentenverwaltung. Und ich wollte Eigentümer meiner Daten sein.

Also bat ich Claude, es zu bauen.

flowchart LR
    User([User]) --> Form[Newsletter Form]
    Form -->|POST /api/subscribe| Worker[Cloudflare Worker]
    Worker --> KV[(Cloudflare KV)]
    KV -.->|Daily sync| GHA[GitHub Actions]
    GHA -.-> Repo[(subscribers.jsonl)]
flowchart TB
    User([User]) --> Form[Newsletter Form]
    Form -->|POST /api/subscribe| Worker[Cloudflare Worker]
    Worker --> KV[(Cloudflare KV)]
    KV -.->|Daily sync| GHA[GitHub Actions]
    GHA -.-> Repo[(subscribers.jsonl)]

Das Setup

Ich gab Claude ein Cloudflare API-Token über eine Umgebungsvariable und beschrieb, was ich wollte: ein Formular, das E-Mails sammelt und sie an einem Ort speichert, den ich kontrolliere.

Weniger als 30 Minuten später hatte ich einen funktionierenden Newsletter.

Was Claude Baute

KomponenteTechnologie
FormularHTML + vanilla JS
BackendCloudflare Worker
SpeicherCloudflare KV
SynchronisationGitHub Actions

Das Formular ist ein Hugo Partial, das an /api/subscribe postet:

<form id="newsletter-form">
  <input type="email" name="email" placeholder="[email protected]" required>
  <button type="submit">Subscribe</button>
</form>

Das Backend ist ein 42-zeiliger Cloudflare Worker:

export async function onRequestPost(context) {
  const { email } = await request.json();

  // Validate, normalize, check for duplicates
  const emailKey = email.trim().toLowerCase();
  const existing = await env.SUBSCRIBERS.get(emailKey);
  if (existing) {
    return Response.json({ success: true, message: "Already subscribed" });
  }

  // Store in KV with metadata
  await env.SUBSCRIBERS.put(emailKey, JSON.stringify({
    subscribedAt: new Date().toISOString(),
    source: sanitizedReferer
  }));

  return Response.json({ success: true }, { status: 201 });
}

Ein GitHub Actions Workflow läuft täglich, um Abonnenten von Cloudflare KV in eine JSONL-Datei im Repository zu synchronisieren. Meine Abonnentenliste lebt in der Versionskontrolle. Wenn Cloudflare morgen mein Konto schließt, habe ich meine Daten immer noch. Und es ist in einem Format, mit dem LLMs einfach arbeiten können.

Der Workflow

Claude iterierte lokal, bis alles funktionierte—Formularübermittlung, KV-Speicher, Fehlerbehandlung. Dann auf eine Preview-App gepusht, den kompletten Ablauf getestet und in main gemergt.

Das Formular ging live, während der Traffic noch floss.

Das Ganze wurde in einer Sitzung gebaut.

Warum Nicht SaaS?

Buttondown ist großartig, wenn man es braucht. Ich nicht. Meine Anforderungen:

  1. E-Mails sammeln
  2. Sie an einem Ort speichern, den ich kontrolliere
  3. Schnell ausliefern

Das ist alles. Ich brauche keine Drip-Kampagnen oder A/B-Tests oder ausgefallene Vorlagen. Ich brauche eine Liste von E-Mail-Adressen, die mir gehören.

42 Zeilen Code statt eines weiteren monatlichen Abonnements. Manchmal ist die einfache Lösung die richtige.

Die Erkenntnis: unvollkommen und live schlägt perfekt und geplant. Ich hätte Stunden damit verbringen können, Newsletter-Dienste zu bewerten, Funktionen zu vergleichen, Bewertungen zu lesen. Stattdessen habe ich in 30 Minuten etwas ausgeliefert und weitergemacht.