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.
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.
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.
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.
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.
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.
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.
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.
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.