
Architecture
Pulse is a Next.js app sitting on an API written in Go. The split is deliberate: anything to do with data stays in Go, anything that renders stays in Next.
The blog you are reading is a small instance of that same pattern. Its content lives in a headless CMS we wrote in Go. Posts are Markdown, and they are turned into safe HTML the moment they are saved, not the moment they are read — so the cost of parsing and sanitising is paid once, not on every visit.
Caching
Pages are generated at build time and then stay put. When someone publishes, the CMS fires a webhook and only the affected pages are rebuilt — no redeploy.
What we learned in practice: when the app runs several replicas, that webhook only ever reaches one of them, and the rest keep serving the old copy. So instead of caching forever, every loader gets a short stale-while-revalidate window. Each replica refreshes itself within seconds, and the webhook still gives an instant update to whichever replica it lands on.
Bilingual from day one
Persian and English are not two views of one document. They are independent posts joined by a translation key. That is why each language has its own slug, and why switching language takes a reader to the same post in the other language rather than back to the index.
Right-to-left is not just dir="rtl" either: spacing is written logically so it mirrors itself, and Persian gets its own pair of typefaces — the script is connected, and the tight letter-spacing that flatters Latin makes it unreadable.
