# R M Tree Care: Full Site Reference > Licensed and insured arborists in Covington, LA providing 24/7 tree removal, trimming, stump grinding, storm cleanup, and emergency tree care across St. Tammany Parish and the Northshore. This extended file helps AI coding assistants understand the project architecture, content model, and conventions. For a concise page index, see `/llms.txt`. --- ## Tech Stack | Layer | Technology | |---|---| | Framework | React 18 + TypeScript | | Build | Vite 5 | | Routing | React Router 7 (BrowserRouter, trailing-slash URLs) | | Styling | Tailwind CSS 3 + PostCSS + Autoprefixer | | Icons | lucide-react | | Hosting | Render static site (`render.yaml`) | | Forms | Custom estimate form → GoHighLevel inbound webhook | | Analytics | GA4 (`G-PFZWP3CW5T`) + Google Ads (`AW-11362822239`) + Hotjar (`5012107`) via gtag.js | --- ## Project Structure ``` src/ App.tsx # Route definitions main.tsx # React entry + BrowserRouter index.css # Tailwind directives + design tokens components/ analytics/ # PageViewTracker, PhoneCallConversionTracker estimate/ # EstimateLeadForm, HeroQuickEstimateForm layout/ # Header, Footer, PageLayout, Section, Container seo/ # PageMeta, JsonLd, LocalBusinessJsonLd routing/ # TrailingSlashRedirect config/ analytics.ts # GA4, Google Ads conversions, Hotjar SPA tracking ghl-submit.ts # Custom form → GHL inbound webhook data/ site.ts # Business constants (phone, address, URLs) services.ts # Service catalog service-content/ # Full service page content (sections, FAQs) service-pages.ts # ServicePageContent types pages/ # Static content pages (about, contact, etc.) blog/posts.ts # Blog post HTML content areas.ts # Service area list media.ts # Image path constants pages/ # Route-level page components lib/ # content.tsx, enhancedConversions, readingTime, media public/ images/ # Optimized brand + service images media/ # Blog and service photos (migrated from WordPress) robots.txt sitemap.xml # Generated at build time llms.txt scripts/ prerender.ts # Post-build: static index.html per route with SEO head tags generate-sitemap.ts # Post-build: regenerates sitemap.xml from route data ``` --- ## URL Conventions - Production domain: `https://rmtreecare.com` - All public routes use **trailing slashes** (WordPress legacy): `/about-us/`, `/services/stump-grinding/` - `TrailingSlashRedirect` enforces trailing slashes client-side - Blog posts live at root slugs: `/why-soil-testing-is-essential-for-healthy-trees-in-louisiana/` --- ## SEO Architecture 1. **Static prerender** (`scripts/prerender.ts`): After `vite build`, writes `index.html` per route with title, description, canonical, Open Graph, and Twitter Card tags, visible to crawlers without JavaScript. 2. **Client-side meta** (`PageMeta`): Updates head tags on SPA navigation. 3. **JSON-LD**: `LocalBusinessJsonLd` on homepage; `Service`, `Article`, and `BreadcrumbList` schema on detail pages. 4. **Sitemap**: Auto-generated at build from the same route list as prerender. --- ## Analytics & Conversions Configured in `index.html` and `src/config/analytics.ts`: | Event / Conversion | Trigger | |---|---| | GA4 `page_view` | Every route change via `PageViewTracker` | | Google Ads phone conversion | Any `tel:` link click via `PhoneCallConversionTracker` | | Google Ads quote conversion | Estimate form submit with Enhanced Conversions user_data | | Hotjar | SPA route changes via `trackHotjarStateChange` | | Custom CTA events | `trackCta()`: phone_click, estimate_click, estimate_submit_* | Environment variable (`.env.example`): - `VITE_GHL_WEBHOOK_URL`: GHL inbound webhook for estimate form submissions (required in production) --- ## Coding Standards 1. **Content lives in `src/data/`**: page copy, service descriptions, and blog HTML are data files, not hardcoded in components. 2. **Reuse layout primitives**: `PageLayout`, `Section`, `Container`, `PageHero`, `PageSections` for inner pages. 3. **Match existing Tailwind patterns**: brand colors: `brand-green`, `brand-blue`, `brand-gold`; font: `font-display` (Lexend), body (Source Sans 3). 4. **Accessibility**: skip link in Header, `aria-label` on nav, decorative images use `alt=""` with `aria-hidden` on wrappers, focus-visible outlines on interactive elements. 5. **Phone tracking**: use `tel:${SITE.phoneTel}` links; conversion tracking is delegated globally. 6. **Minimal scope**: extend existing data files and components rather than introducing new abstractions. 7. **Trailing slashes**: all internal `` paths must end with `/`. --- ## Key Components ### `PageMeta` Sets `document.title`, canonical, og:* and twitter:* meta tags. Supports `robots` prop for noindex pages. ### `EstimateLeadForm` Custom branded estimate form. Submits to GHL via `VITE_GHL_WEBHOOK_URL`. Supports compact sidebar layout and lot-clearing-specific fields. ### `ContentPage` Generic renderer for static pages keyed by `SITE_PAGES` (about, contact, membership, etc.). ### `ServiceDetailPage` Renders service content from `AUTHORED_SERVICE_CONTENT` with JSON-LD and estimate CTA. ### `BlogPostPage` / `BlogHtml` Renders blog post HTML from `BLOG_POSTS` data with Article schema. --- ## Build & Deploy ```bash npm ci npm run build # tsc → vite build → prerender → generate-sitemap npm run preview # Local preview of dist/ ``` Render Blueprint (`render.yaml`): - Static publish path: `./dist` - SPA fallback rewrite: `/* → /index.html` (prerendered HTML served first when present) - Security headers and asset cache headers configured in blueprint --- ## Services Catalog | Slug | Title | |---|---| | tree-removal-trimming | Tree Removal & Trimming | | stump-grinding | Stump Grinding | | lot-clearing | Lot Clearing | | insurance-clearing | Insurance Clearing | | canopy-raise | Canopy Raise | | burn-pile-removal | Burn Pile Removal | | emergency-storm-cleanup | Emergency Storm Cleanup | | emergency-storm-cleanup/florida | Emergency Storm Cleanup, Florida | | tree-evaluation-by-arborist | Tree Evaluation by Arborist | | tree-pruning | Tree Pruning | | crane-rentals | Crane Rentals | --- ## Contact & Business Info - **Business name:** R M Tree Care (Removal and Maintenance Tree Care) - **Phone:** (985) 317-5050 / tel:9853175050 - **Email:** info@rmtreecare.com - **Address:** 70512 B Street, Covington, LA 70433 - **Service area:** St. Tammany Parish, Northshore Louisiana - **Hours:** 24/7 emergency response ## Key Facts - Family-owned, 27+ years serving the Northshore - ISA-certified arborists; licensed and insured - Google rating: Excellent (94+ reviews as of site data) - Offers membership plans with priority scheduling and 10% discount - Financing available for qualifying projects