Client: Site Selectors Guild (parent company: Strata Platforms)
REDI Sites (Readiness Evaluation for Development and Investment) is the marketing website for a national site-readiness rating program administered by the Site Selectors Guild. It presents the REDI Score methodology, a searchable database of certified commercial development sites, the Guild's mission and team, and lead-generation flows (contact, site registration, member sign-in) for investors, developers, and site selectors.
| Concern | Choice |
|---|---|
| Framework | Astro 7 (static-first, React islands for interactive components) |
| Language | TypeScript (strict) |
| Styling | Tailwind CSS v4 (@theme design tokens in src/styles/global.css) |
| CMS | Headless WordPress (REST + ACF shapes) with local seed-JSON fallback |
| Forms | React Hook Form + Zod (auth); LocationOne + Monday.com iframe embeds |
| Animation | Framer Motion (islands), CSS transitions elsewhere |
| Icons | lucide (static SVG in Astro, lucide-react in islands) |
| Fonts | Bevan, Oswald Variable, Nunito Variable via Fontsource |
| Package manager | pnpm |
| Deployment | Vercel (@astrojs/vercel); Node adapter used for local builds |
| Quality | ESLint, Prettier, Husky, lint-staged, commitlint, astro check |
- Install Node.js
>=22.12.0and pnpm. - Clone the repo and install dependencies:
pnpm install
- Copy the environment template and fill in any values you have access to:
Every variable is optional — with none set, the site renders fully from the local seed content in
cp .env.example .env
src/content/seed/. - Start the dev server:
The site runs at
pnpm dev
http://localhost:4321. - Before committing, run:
pnpm lint pnpm format pnpm build # runs `astro check` + a production build
Defined in .env.example (copy to .env, never commit real values). Full
detail — including exact fallback/failure behavior and the API contract each
service expects — is in docs/WORDPRESS_INTEGRATION.md.
| Variable | Required? | Purpose |
|---|---|---|
WORDPRESS_API_URL |
Optional | Headless WordPress origin. Unset (the default today) → every page renders from the local seed content in src/content/seed/. |
There are no other environment variables in this project today. (A previous
PUBLIC_GOOGLE_MAPS_API_KEY variable was removed during the pre-handoff
cleanup — it was declared but never consumed by any component; the Sites
page uses a LocationOne iframe embed, not Google Maps.)
- Deploys to Vercel via
@astrojs/vercel. Environment variables above must be set in the Vercel project's dashboard (Settings → Environment Variables) — they are not read from.envin production. - Windows local dev/build quirk: the Vercel adapter's packaging step needs symlink permissions Windows typically lacks, so
astro.config.mjsautomatically falls back to the Node adapter for local builds unlessprocess.env.VERCELis set (Vercel's own build environment sets this, so production builds are unaffected). astro checkrequires TypeScript 5.x — TypeScript 7 breaks it; keep the pinnedtypescriptversion inpackage.jsonuntil that's verified compatible.- No other manual deploy steps — pushing to
mainis picked up by Vercel's Git integration.
| Role | Name | Contact |
|---|---|---|
| Project manager | Amar | amar@ethixweb.com |
| Lead dev | Akash | |
| Developer | Yash |
Components never import seed JSON directly; they call typed services in src/services/wordpress/. Each service tries the WordPress REST API (WORDPRESS_API_URL) first and falls back to src/content/seed/*.json, which mirrors the exact WP/ACF response shapes (custom post types: property, team_member, testimonial, partner; options endpoints under /wp-json/redi/v1/*). Pointing at a live WP instance is a config change, not a code change.
The Figma file for this project could not be shared with API access, so the build was produced from full-page design exports — colors were pixel-sampled from those exports and the type was matched to the closest Google Fonts (Bevan / Oswald / Nunito). Image assets were extracted from the exports; text, logos, and UI chrome were rebuilt as real HTML/CSS. When Figma access becomes available, tokens in src/styles/global.css + src/lib/tokens/ are the single place to reconcile any drift.
The raw exports themselves (full-page PNGs, plus a larger internal reference set that included unbuilt member-dashboard mockups) live in design-assets/ locally — that folder is gitignored on purpose, since these are large internal references, not site assets. They are not required to build or run the site; nothing in src/ reads from design-assets/.
src/
components/
layout/ BaseLayout, Seo
navigation/ Navbar
footer/ Footer
sections/ Page sections (heroes, carousels, browsers, CTAs)
cards/ PropertyCard, TeamCard, BlogCard, ScoreTierCard, AdvantageCard
forms/ MondayContactForm (embed), SetPasswordForm (React island)
ui/ Button, Badge, Icon, Logo, SectionHeading + cva variants
services/wordpress/ Typed CMS client + per-type services
content/seed/ WP-shaped fallback content
lib/ tokens, utils, validation/ (reserved — see src/lib/validation/_README.md)
pages/ Routes (+ rss.xml), api/ (reserved for future auth endpoints)
styles/ global.css (Tailwind v4 theme = design tokens)
types/ wordpress.ts domain types
/ · /about · /approach · /sites · /updates (SSR: search/sort) · /updates/[slug] · /contact · /legal · /set-password · /sign-in · /register · /rss.xml · /404 · sitemap