Créer Ma Propre Newsletter avec Claude
Deuxième jour du pic de trafic Hacker News. Quarante mille visiteurs, aucun moyen de les recontacter. J’avais besoin d’un formulaire d’inscription à la newsletter.
J’ai regardé Buttondown, Beehiiv, Substack, ConvertKit. Tout était excessif. J’avais juste besoin de collecter des emails. Je n’avais pas besoin de campagnes, d’analyses ou de gestion d’abonnés. Et je voulais posséder mes données.
Alors j’ai demandé à Claude de le construire.
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)]
La Configuration
J’ai donné à Claude un token API Cloudflare via une variable d’environnement et j’ai décrit ce que je voulais : un formulaire qui collecte des emails et les stocke quelque part que je contrôle.
Moins de 30 minutes plus tard, j’avais une newsletter fonctionnelle.
Ce Que Claude A Construit
| Composant | Technologie |
|---|---|
| Formulaire | HTML + vanilla JS |
| Backend | Cloudflare Worker |
| Stockage | Cloudflare KV |
| Synchronisation | GitHub Actions |
Le formulaire est un partial Hugo qui poste vers /api/subscribe :
<form id="newsletter-form">
<input type="email" name="email" placeholder="[email protected]" required>
<button type="submit">Subscribe</button>
</form>
Le backend est un Cloudflare Worker de 42 lignes qui gère la validation, la normalisation, la détection des doublons et la sanitisation du referer :
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" });
}
// Sanitize referer (strip query params for privacy)
const referer = request.headers.get("Referer");
const source = referer ? new URL(referer).origin + new URL(referer).pathname : "direct";
// Store in KV with metadata
await env.SUBSCRIBERS.put(emailKey, JSON.stringify({
subscribedAt: new Date().toISOString(),
source
}));
return Response.json({ success: true }, { status: 201 });
}
La limitation de débit provient de la protection intégrée de Cloudflare—aucun code supplémentaire nécessaire.
Un workflow GitHub Actions s’exécute quotidiennement pour synchroniser les abonnés de Cloudflare KV vers un fichier JSONL dans le dépôt. Ma liste d’abonnés vit dans le contrôle de version. Si Cloudflare ferme mon compte demain, j’ai toujours mes données. Et elles sont dans un format avec lequel les LLM peuvent facilement travailler.
Le Workflow
Claude a itéré localement jusqu’à ce que tout fonctionne—soumission du formulaire, stockage KV, gestion des erreurs. Puis poussé vers une application de prévisualisation, testé le flux complet et fusionné avec main.
Le formulaire est devenu actif alors que le trafic continuait d’affluer.
Tout cela a été construit en une session.
Pourquoi Pas SaaS ?
Buttondown est génial si vous en avez besoin. Pas moi. Mes exigences :
- Collecter des emails
- Les stocker quelque part que je contrôle
- Livrer rapidement
C’est tout. Je n’ai pas besoin de campagnes goutte à goutte ou de tests A/B ou de modèles élégants. J’ai besoin d’une liste d’adresses email que je possède.
42 lignes de code au lieu d’un autre abonnement mensuel. Parfois, la solution simple est la bonne.
La leçon : imparfait et en ligne bat parfait et planifié. J’aurais pu passer des heures à évaluer des services de newsletter, comparer des fonctionnalités, lire des avis. Au lieu de cela, j’ai livré quelque chose en 30 minutes et je suis passé à autre chose.