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

KomponantoTeknologio
FormularoHTML + vanilla JS
BackendCloudflare Worker
StokadoCloudflare KV
SinkronigoGitHub 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:

  1. Kolekti retpoŝtadresojn
  2. Stoki ilin ie ajn kiun mi regas
  3. 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.