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’une 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 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 :
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 });
}
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 c’est dans un format avec lequel les LLMs peuvent facilement travailler.
Le Flux de Travail
Claude a itéré localement jusqu’à ce que tout fonctionne—soumission de formulaire, stockage KV, gestion des erreurs. Ensuite, poussé vers une app de prévisualisation, testé le flux complet et fusionné vers main.
Le formulaire est devenu actif pendant que le trafic affluait encore.
Tout cela a été construit en une seule 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
- Déployer rapidement
C’est tout. Je n’ai pas besoin de campagnes goutte à goutte ou de tests A/B ou de modèles sophistiqués. 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 les fonctionnalités, lire des avis. Au lieu de cela, j’ai déployé quelque chose en 30 minutes et je suis passé à autre chose.