liansofer.online
Professional website for a parenting coach. Astro, Tailwind CSS v4, custom i18n with RTL, plus a git-backed CMS secured with MFA (TOTP, Authenticator) and Netlify Functions.
Tech Stack
Overview
A professional website for Lian Sofer, a parenting coach based in Israel. The site needed to support two languages - Hebrew (RTL, default) and English (LTR) - with completely separate routes, content, and UI strings.
Publishing is git-based, not a third-party headless CMS: a private browser admin (not indexed, not in the sitemap) lets Lian draft and publish Markdown blog posts. Netlify Functions verify a shared password plus an optional TOTP code (Google Authenticator and any compatible RFC 6238 app) and then create or update files in the repo via the GitHub Contents API, which triggers the usual static deploy. Hebrew posts use a mandatory English slug for stable URLs and filenames ({slug}-he.md). Drafts persist in the browser for convenience, with no passwords or OTP secrets stored in localStorage.
Challenges
The main challenge was building a seamless bilingual experience without a heavy framework. Astro’s built-in i18n support handled URL routing, while a custom translations.ts file powered all UI copy. RTL layout was achieved by dynamically setting dir="rtl" on the <html> element and carefully using Tailwind’s logical properties.
A second challenge was adding a simple, maintainable publishing path: serverless auth, rate-friendly Git operations, Markdown sanitization and light HTML stripping on the server so user-supplied content stays safe, and UX touches such as a time-bounded edit session, internal link picker to existing posts, and a standard CTA phrase that becomes a contact-page link on publish.
What I built
- Full i18n system with Astro’s native i18n config + custom translation hooks
- RTL-aware layouts using Tailwind logical properties
- Markdown blog with paired HE/EN posts and
hreflangalternates - Service cards with pricing, feature lists, and WhatsApp deep links
- Schema.org structured data for SEO (Person, WebSite, BlogPosting)
- Custom admin UI at
/admin: Hebrew-first form, Markdown body with preview, tags, internal “link to post” picker (authenticated list from the repo), and publish flow to GitHub - MFA-ready auth: password plus TOTP (Authenticator) when
TOTP_SECRETis configured; validation aligned between client session timing and server otpauth window - Netlify Functions for
create-post,list-posts, and shared verify-admin (CORS, JSON guards, optional TOTP) - Deployed to Netlify with automatic builds on git push; Node 22 build pipeline