Rebuild of shevet-imahot.co.il off WordPress onto a lean, low-cost stack.
WEBSITE_SPEC.md— current-site spec (verified against WP admin) + rebuild scope.ARCHITECTURE.md— target architecture + decisions.pitch/— Hebrew client pitch deck (shevet-pitch.html).studio/— Sanity CMS (content model / schemas).web/— Astro static front-end.
Astro (static) · Sanity (Free) · Netlify · Responder (forms/email) · Meshulam (payments). $0 fixed/mo.
Config in netlify.toml (base web/, publish dist). One-time setup:
- Netlify → Add new site → Import from Git → pick this repo (private is fine).
- Site settings → Environment variables → add
SANITY_TOKEN= a Sanity read token (dataset is private).SANITY_PROJECT_ID/DATASETcome fromnetlify.toml. - Domain → add
shevet-imahot.co.il; point DNS at Netlify (their apex/ALIAS records) — auto-HTTPS. - Auto-rebuild on content publish: Netlify → Build hooks → create one → copy the URL. In Sanity (manage.sanity.io → API → Webhooks) add a webhook to that URL, POST, no headers, no body (uncheck drafts). Publishing in Studio then redeploys the site (~1-2 min).
No PAT, no GitHub Pages, repo stays private.
cd studio
npm install
npx sanity init # create/link a project; copy the projectId
npm run dev # studio at http://localhost:3333Set SANITY_STUDIO_PROJECT_ID (or edit sanity.config.ts / sanity.cli.ts).
cd web
npm install
cp .env.example .env # fill SANITY_PROJECT_ID, dataset, GTM id
npm run dev # http://localhost:4321cd studio
npx sanity login # interactive, one-time (only the owner can do this)
npx sanity deploy # pick a hostname → https://<name>.sanity.studioThen invite editors at manage.sanity.io (Free plan = up to 20 seats). Keren edits there — no terminal.
The WXR export (not committed — contains practitioner PII) loads into Sanity via tools/import:
cd tools/import
npm install
echo "SANITY_TOKEN=<write token>" >> .env # plus SANITY_PROJECT_ID/DATASET; .env is gitignored
npm run dry-run -- --dir /path/to/wxr # parse + preview, writes nothing
npm run import -- --dir /path/to/wxr # writes; idempotent (createOrReplace)Imports practitioners, articles, benefits + hospital/field/region taxonomy terms. --no-images skips asset upload. Re-running is safe (deterministic ids).
Private dataset: it holds practitioner contact info, so it is not public. Both the build and the import need a Sanity token. For CI, add a read token as the
SANITY_TOKENGitHub Actions secret (Settings → Secrets → Actions). Without it, CI still passes — the site builds empty.
- Two search engines —
/doulas/(hospital · due date · support style · budget) and/professionals/(field · region · language). Client-side, instant. - Converting doula profile —
/doulas/[slug]with video embed + sticky WhatsApp CTA + reviews. - Brand locked: Oron Yad font (
web/public/fonts/) + raspberry/peach/cream tokens (src/styles/brand.css).
- Confirm with Keren:
supportStylevalues,budgetbands, due-date matching rule, GTM id. - Pages:
/articles/,/benefits/,/community/,/doulas/join/(self-serve), sale pages. - Embed Rav-Messer forms (matchmaking + profile contact) from
siteSettings. - Import script: WXR export → Sanity docs.
_redirectsfrom old URLs + the 301-plugin map.