Kreado de Mia Propra Novaĵletero kun Claude
Dua tago de la trafika pinto de Hacker News. Kvardek mil vizitantoj, neniu maniero atingi ilin denove. Mi bezonis novaĵletero-aliĝilon.
Mi rigardis Buttondown, Beehiiv, Substack, ConvertKit. Ĉio troigita. Mi nur bezonis kolekti retpoŝtadresojn. Mi ne bezonis kampanjojn, analizadon aŭ administradon de abonantoj. Kaj mi volis posedi miajn datumojn.
Do mi petis Claude konstrui ĝin.
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 Agordo
Mi donis al Claude Cloudflare API-ĵetonon per media variablo kaj priskribis kion mi volis: formularon kiu kolektas retpoŝtadresojn kaj stokas ilin ie ajn kiun mi regas.
Sub 30 minutoj poste, mi havis funkcianta novaĵleteron.
Kion Claude Konstruis
| Komponanto | Teknologio |
|---|---|
| Formularo | HTML + vanilla JS |
| Backend | Cloudflare Worker |
| Stokado | Cloudflare KV |
| Sinkronigo | GitHub Actions |
La formularo estas Hugo partial kiu afiŝas al /api/subscribe:
<form id="newsletter-form">
<input type="email" name="email" placeholder="[email protected]" required>
<button type="submit">Subscribe</button>
</form>
La backend estas 42-linia 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 });
}
GitHub Actions laborfluo funkcias ĉiutage por sinkronigi abonantojn de Cloudflare KV al JSONL-dosiero en la deponejo. Mia abonantlisto vivas en versikontrolo. Se Cloudflare fermos mian konton morgaŭ, mi ankoraŭ havos miajn datumojn. Kaj ĝi estas en formato kun kiu LLM-oj povas facile labori.
La Laborfluo
Claude ripetis loke ĝis ĉio funkciis—formularo-sendo, KV-stokado, eraradministrado. Poste puŝis al antaŭvida aplikaĵo, testis la kompletan fluon kaj kunfandis al main.
La formularo fariĝis viva dum la trafiko ankoraŭ fluis.
Ĉi tio tute estis konstruita en unu sesio.
Kial Ne SaaS?
Buttondown estas bonega se vi bezonas ĝin. Mi ne bezonis. Miaj postuloj:
- Kolekti retpoŝtadresojn
- Stoki ilin ie ajn kiun mi regas
- Publikigi rapide
Jen ĉio. Mi ne bezonas gutad-kampanjojn aŭ A/B-testojn aŭ fantaziajn ŝablonojn. Mi bezonas liston de retpoŝtadresoj kiujn mi posedas.
42 liniojn de kodo anstataŭ alian monatan abonon. Foje la simpla solvo estas la ĝusta.
La konkludo: neperfekta kaj viva venkas perfektan kaj planitan. Mi povus pasigi horojn taksante novaĵletero-servojn, komparante funkciojn, legante recenzojn. Anstataŭe mi publikigis ion en 30 minutoj kaj antaŭeniris.