<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>learnstuff_today-money.txt</title>
  <script>
    (() => {
      let storedTheme = null;
      try {
        storedTheme = localStorage.getItem("theme");
      } catch (error) {}

      if (storedTheme === "dark") {
        document.documentElement.dataset.theme = "dark";
      }
    })();
  </script>
  <link rel="stylesheet" href="/%25latex/styles.css">
</head>
<body class="document-page">
  <button class="theme-toggle" type="button" aria-label="Switch to dark mode" title="Dark mode">
    <svg class="theme-icon theme-icon-moon" viewBox="0 0 24 24" aria-hidden="true">
      <path d="M20.4 14.5A8.2 8.2 0 0 1 9.5 3.6a8.7 8.7 0 1 0 10.9 10.9Z"></path>
    </svg>
    <svg class="theme-icon theme-icon-sun" viewBox="0 0 24 24" aria-hidden="true">
      <circle cx="12" cy="12" r="4"></circle>
      <path d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"></path>
    </svg>
  </button>
  <script>
    (() => {
      const button = document.querySelector(".theme-toggle");

      const setTheme = (theme) => {
        const isDark = theme === "dark";
        if (isDark) {
          document.documentElement.dataset.theme = "dark";
        } else {
          document.documentElement.removeAttribute("data-theme");
        }

        button.setAttribute("aria-label", isDark ? "Switch to light mode" : "Switch to dark mode");
        button.setAttribute("aria-pressed", String(isDark));
        button.title = isDark ? "Light mode" : "Dark mode";

        try {
          localStorage.setItem("theme", isDark ? "dark" : "light");
        } catch (error) {}
      };

      setTheme(document.documentElement.dataset.theme === "dark" ? "dark" : "light");
      button.addEventListener("click", () => {
        setTheme(document.documentElement.dataset.theme === "dark" ? "light" : "dark");
      });
    })();
  </script>
  <header class="site-header">
    <a class="back-link" href="/outline/learnstuff_today/">Back to directory</a>
    <h1>learnstuff_today-money.txt</h1>
    <p class="path-label">outline/learnstuff_today/learnstuff_today-money.txt</p>
  </header>
  <main class="document-shell">
    <pre class="document-text">## Money

	the site itself is always free to host for unlimited visitors
	monthly costs scale only with how many voice notes are sent in
	own GPU = lowest cost but more work
	Cloudflare = simpler but about 2× the cost
	either way, global intake and processing only costs a few hundred dollars/month at peak volume

	pilot
		~$1.1k domain snag
		~$8/month hosting
		WhatsApp intake free
		voice notes cost fractions of a cent

	scale
		own GPU path → 100k notes/month ≈ $225
		Cloudflare path → 100k notes/month ≈ $425
		infra glue (workers, queues, R2) → ~$50/month


| Cost                             | Pilot                        | At Scale (100k notes/mo)                    |
|----------------------------------|------------------------------|---------------------------------------------|
| Domain                           | ~$1,054 one-off              | ~$25/year renewal                           |
| Hosting                          | ~$8/month (Obsidian Publish) | Free (GitHub Pages + Cloudflare)            |
| WhatsApp number                  | ~$3/month                    | ~$3/month                                   |
| Voice processing                 | ~$0.003/note                 | Own GPU: ~$225/mo; Cloudflare: ~$425/mo     |
| Infra glue (workers, queues, R2) | ~$5/month                    | ~$50/month                                  |
| Storage (summaries only)         | ~$0.01/month                 | ~$0.06/month                                |
| **Monthly total**                | **~$16/mo** (excl. domain)   | **Own GPU: ~$280/mo; Cloudflare: ~$480/mo** |


### Baseline site costs

	domain
		GoDaddy snag (one-off) → ~$1,054
		renewal → ~$25/year

	hosting
		phase one → Obsidian Publish (~$8/month)
		phase two → GitHub Pages + Svelte + Cloudflare (essentially free)

	intake
		WhatsApp user-initiated → free
		number rental only (~$3/month)


### Transcribing and summarising voice notes

	assumptions
		voice notes are capped at 10 minutes
		average length is ~6.5 minutes
		costs below assume typical notes of around 6.5 minutes

	option A – own GPU
		we rent a pool of GPUs (graphics cards) to do both transcription and summarising
		per note cost → ~$0.0025 (fractions of a cent)
		processing time → ~4 minutes for a 6.5 min note
		upgrade path → if load grows, one pool can handle transcription and another can handle summaries
		storage → nothing kept beyond the short summary text

	option B – Cloudflare Workers AI
		we send the note to Cloudflare’s servers, which run speech-to-text and then a small model to summarise
		per note cost → ~$0.0035 (still fractions of a cent)
		processing time → close to real-time, depending on demand
		overhead → a few dollars/month for the serverless “glue” (queues, workers)
		storage → same as Option A, only short summaries kept

	cost comparison

	| Volume        | Hours audio (avg 6.5 min each) | Own GPU (T4 cluster) | Cloudflare Workers AI |
	|---------------|--------------------------------|----------------------|-----------------------|
	| 1,000 notes   | ~108 hrs                       | ~$2.50               | ~$3.50                |
	| 100,000 notes | ~10,833 hrs                    | ~$225                | ~$425                 |

	notes
		own GPU = cheapest but needs more setup and maintenance
		Cloudflare = about 2× the price, but simpler and always available
		
	we'd prefer the cloudflare option (option B)	

	and we'd retire it as the thing grew larger

#### Voice infrastructure

	could use whatsapp transport
		messages arrive through Meta’s Cloud API and go straight to a Cloudflare Worker
		replies are free as long as we answer within 24 hours of the user’s last message
		every time the user sends something, the 24-hour clock resets
		if we want to message them after that window, Meta charges per message (new rules from Jul 2025)

	storage
		raw audio is deleted immediately
		transcripts are also deleted immediately
		only summaries are stored → even at 10M notes total, that’s just ~4 GB compressed
		storage cost ≈ **~$0.06/month**

	bandwidth
		traffic between WhatsApp and Cloudflare is free
		site visits are also free, no matter how many people come
</pre>
  </main>
  <footer class="site-footer">
    <a class="back-link" href="/outline/learnstuff_today/">Back to directory</a>
  </footer>
</body>
</html>
