The UnwritableEnglish
Project playbook

How unwritable.org became an English site

A permanent copy of the build-and-deploy guide, for whoever maintains this edition next. The public site you are reading is a set of plain HTML, CSS, and JavaScript files generated from a database of approved translations and uploaded to the en.unwritable.org document root — there is no application server behind it.

  1. Model the content as data, not as pages.

    Each post is one row carrying both content_fa and content_en, plus a status (pending, machine, human_review, approved) and an is_published_en flag. Categories, tags, and a glossary are their own tables. Side-by-side review is then trivial, and the translation can be versioned independently of the source.

  2. Lock the glossary before translating.

    Identify the thirty to fifty recurring Persian and Sufi terms and fix their English equivalents first — self-knower, knower of God, gratitude, theophany, contemplation, without judgment. The glossary is what keeps fifteen hundred translations from drifting.

  3. Translate with a literary model and a strict prompt.

    For Persian prose of this register, GPT-5 and Claude Opus 4.5 lead; Gemini 2 Pro is fine for bulk. Never use browser auto-translation — it is tuned for news and flattens Sufi idiom. The prompt injects the glossary and forbids summarising, additions, and machine-translation tone.

  4. Review every piece by hand.

    The review desk runs where Node can run (a sandbox, or a free Vercel project). It shows the Persian and English side by side, lets the editor rewrite, marks status, and writes an audit log. “Approve & publish” flips is_published_en.

  5. Bake the public site to static files.

    Run node scripts/build-static.mjs. It reads only the approved posts from the database and writes the whole site — home, every post, every category, every tag, the glossary, this guide, sitemap.xml, robots.txt — into public/out-hostinger/, and zips it for upload.

  6. Upload to the subdomain’s document root.

    In Hostinger’s File Manager, open /home/<user>/domains/en.unwritable.org/public_html/, remove the default placeholder page, and upload the contents of the generated folder (or upload the zip and extract). Because the site uses root-absolute URLs, it is built to live at the domain root, exactly here.

  7. Tell Google.

    Add the property in Search Console, verify by DNS, and submit https://en.unwritable.org/sitemap.xml. Every English page already carries a hreflang pair and a canonical link back to its Persian original, so the two editions are understood as one work in two languages.

  8. Keep it in sync.

    When a new post is approved, re-run the generator and re-upload. The whole site is small; overwriting the folder is safe and idempotent. A weekly cron that imports new Persian posts as pending closes the loop.