Static Astro website for the selected client direction.
The theme is intentionally frozen to the current locked choice:
- Palette:
Terracotta Calm - Font:
Nunito
Production does not include runtime palette/font switching.
All previous chooser/lab work is preserved on:
archive/theme-lab-choices
Use that branch only if you intentionally want to revisit palette/font exploration.
- Astro 5 static output
- React integration for shadcn components
- Tailwind CSS v4
- shadcn-ui
- pnpm
- Node.js 20+
- Corepack (recommended)
corepack pnpm installCopy .env.example to .env before expecting the public contact form to submit or the local CMS config to use project-specific overrides:
Copy-Item .env.example .envRequired variable:
PUBLIC_CONTACT_FORM_ENDPOINT: the site-specificform.taxiendpoint for the public contact form. It must be configured in Form.taxi to deliver to the same inbox used by themailto:contact item insrc/content/therapy-practice-website-content.ts.- The current configured endpoint is
https://form.taxi/s/tb10t33e. - GitHub Pages production builds inject the same endpoint from
.github/workflows/pages.yml.
Optional Decap/DecapBridge overrides are also documented in .env.example.
corepack pnpm devFor a clean rerun that clears Astro/Vite caches before starting dev:
corepack pnpm dev:cleanManual cache cleanup only:
corepack pnpm clean:dev-cacheCache targets: .astro, node_modules/.astro, node_modules/.vite.
CMS local development on an isolated port:
corepack pnpm cms:devThis starts the Astro dev server on http://localhost:4322/ateleia.gr/ and the local Decap proxy on http://127.0.0.1:8082/api/v1, so the admin works without live login at http://localhost:4322/ateleia.gr/admin/.
The generated admin config uses backend: proxy on localhost, so local editing works without DecapBridge. Production builds emit the DecapBridge git-gateway config instead.
corepack pnpm check
corepack pnpm build
corepack pnpm perf:budgetnpm --prefix .codex-pipeline install
npm --prefix .codex-pipeline run setup:browsers
$env:BASE_URL="https://coding-tree-io.github.io/ateleia.gr/"
npm --prefix .codex-pipeline run verify:allFor local dev verification, point BASE_URL to your local URL (for example http://localhost:4321/ateleia.gr/).
corepack pnpm svg:noun:normalizeThis command now runs a full pipeline for the tracked Noun SVG assets:
- Inkscape CLI plain-SVG export pass (when available)
- Attribution text stripping from embedded SVG source text
- SVGO optimization into
src/assets/noun/normalized/ svger-cliconversion validation pass (output is temporary and removed)
Notes:
- GraphicsMagick is probed and reported, but not required for successful normalization.
- Public attribution remains on
/creditsandATTRIBUTIONS.md.
The production homepage is intentionally limited to:
HeroWhatIsWhoIsItForAboutServicesAnnouncementsContact
The homepage is static-first. Only three interactive islands are hydrated:
MobileNavigationMenu.tsxviaclient:media="(max-width: 767px)"HeaderCtaVisibilityObserver.tsxviaclient:loadContactForm.tsxviaclient:visible
Detailed conventions are documented in ISLANDS_POLICY.md.
A Lighthouse-backed mobile budget is enforced locally and in CI:
- config:
performance-budget.json - command:
corepack pnpm perf:budget - script:
scripts/check-lighthouse-budget.mjs
astro.config.mjs is configured for GitHub project pages deployment:
site: "https://coding-tree-io.github.io"base: "/ateleia.gr/"output: "static"
Deployment workflow on main publishes the homepage artifact from dist to:
https://coding-tree-io.github.io/ateleia.gr/
The CMS admin is served from the same deployment at:
https://coding-tree-io.github.io/ateleia.gr/admin/
This repo includes a static Decap CMS admin configured for the full client-editable homepage/site copy plus the services and announcements sections.
- admin entry:
src/pages/admin/index.astro - generated config:
src/pages/admin/config.yml.ts - editable content:
src/data/site-content.json,src/data/services.json,src/data/announcements.json - content schema/query helpers:
src/content.config.ts,src/content/therapy-practice-website-content.ts,src/content/services.ts,src/content/announcements.ts - local unauthenticated mode:
corepack pnpm cms:dev
Local development and production intentionally use different backends:
- localhost:
backend: proxyviadecap-server, with no DecapBridge dependency - deployed GitHub Pages: DecapBridge PKCE via
git-gateway, for Google login
Decap editor labels remain Greek only where the client edits site content. The surrounding code, docs, and configuration stay in English. The CMS is split into three documents:
-
Περιεχόμενο ιστοσελίδας: branding, navigation, hero, what-is, who-is-it-for, about, FAQ, contact, footer, and homepage SEO copy -
Υπηρεσίες: a single list-based document so the client can add, delete, and drag to reorder service cards without managing separate files -
Νέα & Ανακοινώσεις: a small list-based document for current workshops, group launches, or short site notices; the homepage shows the first two published entries -
correct GitHub Pages login URL:
https://coding-tree-io.github.io/ateleia.gr/admin/index.html -
site_urlin the generated CMS config intentionally includes/ateleia.gr/, because this repo is deployed as a GitHub Pages project site, not a root site
Optional build-time overrides:
DECAPBRIDGE_BASE_URLDECAPBRIDGE_AUTH_ENDPOINTDECAPBRIDGE_AUTH_TOKEN_ENDPOINTDECAPBRIDGE_GATEWAY_URLDECAP_LOGO_URLDECAP_REPOSITORY,DECAP_BRANCH,DECAP_SITE_URL
Committed defaults target the current DecapBridge site:
base_url: https://auth.decapbridge.comauth_endpoint: /sites/1731d52f-3a01-4de9-8c6f-98598c438922/pkceauth_token_endpoint: /sites/1731d52f-3a01-4de9-8c6f-98598c438922/tokengateway_url: https://gateway.decapbridge.com
Remaining DecapBridge dashboard checks:
- confirm Google is the only enabled sign-in provider
- confirm the DecapBridge site login URL is exactly
https://coding-tree-io.github.io/ateleia.gr/admin/index.html
The project now has a centralized metadata layer in:
src/config/site-metadata.ts
Current strategy:
- temporary
noindex, nofollowuntil the final production domain is known - canonical, Open Graph, Twitter metadata, and JSON-LD emitted from
PublicDocumentLayout.astro robots.txtgenerated fromsrc/pages/robots.txt.ts- sitemap generation enabled via
@astrojs/sitemap
Launch-day SEO switch:
- update the canonical origin in
src/config/site-metadata.ts - switch temporary noindex off in
src/config/site-metadata.ts - confirm generated
robots.txt, canonical tags, and sitemap URLs - redeploy
An initial English privacy-first legal page lives at:
/legal/
It covers:
- contact-form data collected
- Form.taxi as the delivery processor
- retention and privacy rights
- cookies / analytics status
- basic copyright / credits notice
src/config/site-branding.ts: frozen Terracotta Calm + Nunito brand/typography configurationsrc/config/site-metadata.ts: canonical origin, robots mode, OG defaults, structured-data helperssrc/config/contact.ts: shared contact email extraction and Form.taxi endpoint wiringsrc/config/legal-content.ts: English privacy/legal copy sourcesrc/content/therapy-practice-website-content.ts: typed site-content adapter consumed by the homepage sections and metadatasrc/content/site-content-schema.ts: shared Zod schema for the editable site-content documentsrc/content.config.ts: Astro content-collection definitionssrc/content/announcements.ts: ordered announcements collection query helpersrc/content/services.ts: ordered services collection query helpersrc/data/site-content.json: editable site-wide homepage content and shared labelssrc/data/announcements.json: editable announcements document used by the homepage notices sectionsrc/data/services.json: editable services document used by the services cardssrc/components/sections/SiteHeader.astro: static header shell with mobile menu island boundarysrc/components/sections/MobileNavigationMenu.tsx: mobile-only shadcn Sheet islandsrc/components/sections/HeaderCtaVisibilityObserver.tsx: CTA visibility island tied to hero/header statesrc/components/sections/ContactSection.astro: production contact section shellsrc/components/sections/ContactForm.tsx: visible-on-demand contact form island that posts to Form.taxisrc/pages/admin/index.astro: static Decap admin shellsrc/pages/admin/config.yml.ts: generated Decap config with local backend and DecapBridge settingssrc/pages/legal.astro: initial English privacy/legal noticesrc/pages/robots.txt.ts: generated robots filesrc/pages/index.astro: production entry pagescripts/start-cms-dev.mjs: isolated local CMS/dev runner on port4322scripts/start-decap-proxy.mjs: local Decap proxy runner on port8082performance-budget.json: mobile performance budget thresholdsscripts/check-lighthouse-budget.mjs: budget enforcement script.codex-pipeline/README.md: sidecar verification details and visual baseline workflow