# llms-full.txt - Semmax Financial Group Website - Complete Technical Documentation # https://semmax.com/llms-full.txt # Last updated: 2026-01-30 # This file provides comprehensive technical documentation for AI systems, developers, and search engines. ## Project Overview **Website**: https://semmax.com **Company**: Semmax Financial Group, Inc. **Industry**: Financial Services - Wealth Management & Retirement Planning **Founded**: 2004 **Location**: Greensboro and Winston-Salem, North Carolina, United States **Type**: Full-service wealth management and retirement planning firm ### Mission & Philosophy **Mission**: "More on life and less on money" - helping clients focus on living their best life while providing comprehensive financial services **Philosophy**: Team-based approach offering personalized financial guidance through certified professionals **Core Values**: Personalized service, long-term wealth preservation, client advocacy, transparency, fiduciary responsibility --- ## Complete Technology Stack ### Frontend Technologies | Technology | Version | Purpose | Key Features | |-----------|---------|---------|--------------| | **React** | 19.2.1 | UI framework | Concurrent features, automatic batching, transitions | | **TypeScript** | 5.8.3 | Type safety | Strict mode, path aliases, comprehensive type coverage | | **Vite** | 6.3.5 | Build tool | ESBuild, HMR, tree shaking, code splitting | | **React Router** | 6.30.1 | Routing | Lazy loading, code splitting, nested routes | | **Tailwind CSS** | 3.4.17 | CSS framework | Custom design system, utility-first, responsive | | **@uiw/react-md-editor** | 4.0.7 | Markdown editor | Live preview, syntax highlighting, toolbar | | **react-helmet-async** | 2.0.5 | SEO meta tags | SSR compatible, dynamic meta management | | **marked** | 15.0.12 | Markdown parsing | GitHub Flavored Markdown, extensible | | **date-fns** | 4.1.0 | Date utilities | Immutable, tree-shakeable, i18n support | | **date-fns-tz** | 3.2.0 | Timezone handling | IANA timezone database, DST awareness | ### Backend Technologies | Technology | Version | Purpose | Key Features | |-----------|---------|---------|--------------| | **Node.js** | 22.x | Runtime | ES modules, top-level await, Web Crypto API | | **Express** | 4.21.2 | Web server | SSR, middleware, routing, compression | | **Supabase** | 2.52.0 | Database | PostgreSQL, real-time, auth, storage, RLS | | **JWT** | 9.0.2 | Authentication | Token-based auth, configurable expiration | | **Nodemailer** | 7.0.5 | Email | SMTP, attachments, HTML templates | | **compression** | 1.8.0 | HTTP compression | Gzip/Brotli for responses | | **sirv** | 3.0.1 | Static files | Fast static file serving | ### Development & Build Tools | Tool | Version | Purpose | |------|---------|---------| | **ESLint** | 9.29.0 | Code linting | | **Prettier** | 3.6.2 | Code formatting | | **TypeScript Compiler** | 5.8.3 | Type checking | | **TSX** | 4.20.3 | TypeScript execution | | **ts-node** | 10.9.2 | TS runtime | --- ## System Architecture ### High-Level Architecture ``` ┌──────────────────────────────────────────────────────────────────────┐ │ VERCEL EDGE NETWORK (Global CDN) │ │ • SSL/TLS Encryption │ │ • DDoS Protection │ │ • Automatic Scaling │ │ • Edge Functions │ └────────────────────────────┬─────────────────────────────────────────┘ │ ┌──────────────────┼──────────────────┐ │ │ │ ┌───────▼────────┐ ┌───────▼────────┐ ┌──────▼────────┐ │ Static Assets │ │ Express Server │ │ API Functions │ │ (Vite Build) │ │ (SSR + Proxy) │ │ (Serverless) │ └────────────────┘ └───────┬────────┘ └──────┬────────┘ │ │ ┌────────┼──────────────────┘ │ │ ┌───────▼────┐ │ │ React App │ │ │ Hydration │ │ └────────────┘ │ │ ┌──────────────────┼─────────────────────┐ │ │ │ ┌───────▼────────┐ ┌───────▼──────────┐ ┌───────▼────────┐ │ Supabase DB │ │ Email Service │ │ File Storage │ │ (PostgreSQL) │ │ (Brevo SMTP) │ │ (Supabase) │ └────────────────┘ └──────────────────┘ └────────────────┘ ``` ### Request Flow Diagram ``` User Request │ ▼ Vercel Edge (DNS + SSL) │ ├─ Static Assets? ──────► CDN Cache ───► Browser │ ├─ API Request? ────────► Serverless Function │ │ │ ├─ Database Query │ ├─ Email Send │ └─ Response │ └─ Page Request? ───────► Express Server │ ├─ SSR Render ├─ HTML Response └─ Client Hydration ───► SPA Navigation ``` ### Rendering Strategy **Server-Side Rendering (SSR)**: - Initial page load rendered on server - Full HTML sent to browser for SEO - Faster perceived load time - Better for crawlers and sharing **Client-Side Hydration**: - React takes over after initial load - Attaches event handlers to SSR HTML - Enables SPA navigation - No full page reloads **Code Splitting**: - Route-based lazy loading - Component-level splitting - Reduced initial bundle size - Faster time to interactive --- ## Complete File Structure ### Root Directory (Top-Level) ``` /Users/clifford/Dev-Sites/Semmax/ ├── .cursor/ # Cursor IDE configuration │ ├── commands/ # AI agent command templates │ │ ├── end-session.md │ │ └── session-start.md │ ├── plans/ # Feature planning documents (20+ files) │ └── rules/ # Project-specific coding rules ├── .github/ │ └── workflows/ │ └── ci.yml # GitHub Actions CI/CD ├── .npmrc # npm configuration ├── .playwright-mcp/ # Playwright test artifacts (13 files) ├── .prettierignore # Prettier ignore patterns ├── .prettierrc # Prettier configuration ├── .vercelignore # Vercel deployment exclusions ├── AGENTS.md # AI coding assistant guidelines (7,200+ lines) ├── CLAUDE.md # Project-specific instructions (500+ lines) ├── README.md # Project overview (500+ lines) ├── TASK-MANAGER.md # Task management guidelines ├── UI-STYLE-GUIDE.md # UI design system guide ├── api/ # Serverless API endpoints (37 files) ├── database/ # Database migrations (7 files) ├── docs/ # Documentation (30+ files) ├── env.example # Environment variables template ├── eslint.config.js # ESLint configuration ├── index.html # Entry HTML file ├── package.json # Dependencies and scripts ├── postcss.config.js # PostCSS configuration ├── public/ # Static assets (225+ files) ├── scripts/ # Build and utility scripts (15 files) ├── server.js # Express SSR server ├── src/ # Source code (100+ files) ├── tailwind.config.js # Tailwind CSS configuration ├── .cursor/tasks/ # PRD and task lists (10 files) ├── tsconfig.app.json # TypeScript app configuration ├── tsconfig.json # TypeScript base configuration ├── tsconfig.node.json # TypeScript Node configuration ├── vercel.json # Vercel deployment config ├── vercel-test.json # Vercel test config └── vite.config.ts # Vite build configuration ``` ### Source Code Structure (`src/`) ``` src/ ├── components/ # 40 React components │ ├── Accessibility/ │ │ └── AccessibilityModal.tsx │ ├── Forms/ # 15 form components │ │ ├── BeneficiaryTypeSelector.tsx │ │ ├── ContactForm.tsx │ │ ├── DiscoveryCallForm.tsx │ │ ├── EventRegistrationForm.tsx │ │ ├── FamilyQuestionnaireForm.tsx │ │ ├── IntroduceAFriendForm.tsx │ │ ├── IntroducedByFriendForm.tsx │ │ ├── ObjectiveOpinionForm.tsx │ │ ├── RmdInheritedForm.tsx │ │ ├── RmdOwnerForm.tsx │ │ ├── ScheduleMeetingForm.tsx │ │ ├── SecureFileUploadForm.tsx │ │ ├── SpouseBeneficiaryToggle.tsx │ │ └── StillWorkingToggle.tsx │ ├── Layout/ # 5 layout components │ │ ├── Footer.tsx │ │ ├── Header.tsx │ │ ├── MobileNavigation.tsx │ │ ├── Navigation.tsx │ │ └── ScrollToTop.tsx │ ├── Performance/ # 2 performance components │ │ ├── CoreWebVitals.tsx │ │ └── PerformanceMonitor.tsx │ ├── SEO/ # 3 SEO components │ │ ├── OptimizedSEOHead.tsx │ │ ├── PageSEO.tsx │ │ └── SEOHead.tsx │ └── UI/ # 13 UI components │ ├── ArticleCard.tsx │ ├── Button.tsx │ ├── EventCard.tsx │ ├── FormInput.tsx │ ├── FormSelect.tsx │ ├── LoadingSpinner.tsx │ ├── Modal.tsx │ ├── ObjectiveOpinionModal.tsx │ ├── PodcastCard.tsx │ ├── RmdLiveResults.tsx │ ├── RmdResultsDisplay.tsx │ ├── ScheduleMeetingModal.tsx │ └── VideoCard.tsx ├── contexts/ │ └── SSRDataContext.tsx # Server-side data context ├── data/ │ └── irsLifeExpectancyTables.json # Official IRS tables (2,000+ lines) ├── hooks/ # 6 custom React hooks │ ├── useAuth.ts │ ├── useDebouncedSEO.ts │ ├── useRmdCalculation.ts │ ├── useRmdFormValidation.ts │ ├── useSEOHead.tsx │ └── useStaticPageSEO.ts ├── lib/ # Core utilities and services │ ├── auth/ │ │ └── jwt.ts # JWT authentication │ ├── content-adapter.ts # Unified content interface │ ├── performance/ │ │ └── coreWebVitals.ts # Performance monitoring │ ├── rmd/ # RMD Calculator engine │ │ ├── calculations.ts # Core calculation logic (400+ lines) │ │ ├── index.ts # Exports │ │ ├── tableHelpers.ts # IRS table access │ │ └── validation.ts # Input validation │ ├── seo/ # SEO utilities │ │ ├── jsonld.ts # Structured data builders │ │ ├── meta-builders.ts # Meta tag builders │ │ └── seo-config.ts # SEO configuration │ ├── supabase/ # Database services │ │ ├── client.ts # Supabase client │ │ ├── content-service.ts # Content CRUD │ │ ├── podcast-service.ts # Podcast management │ │ ├── types.ts # Database types │ │ └── video-service.ts # Video management │ ├── utils/ # 11 utility files │ │ ├── analytics.ts │ │ ├── canonicalUrl.ts │ │ ├── dateHelpers.ts │ │ ├── environment.ts │ │ ├── logger.ts │ │ ├── metadataValidator.ts │ │ ├── performance.ts │ │ ├── seo.ts │ │ ├── sitemap.ts │ │ ├── staticPageSEO.ts │ │ ├── structuredData.ts │ │ ├── time.ts │ │ └── timezoneHelpers.ts │ └── validation/ │ └── forms.ts # Form validation schemas ├── middleware/ # 2 Express middleware │ ├── cacheHeaders.ts │ └── canonicalRedirects.ts ├── pages/ # 59 page components │ ├── 404.tsx │ ├── Admin/ # 3 admin pages │ │ ├── ContentEditor.tsx │ │ ├── Dashboard.tsx │ │ └── Login.tsx │ ├── Events/ # 3 event pages │ │ ├── ClientEvents.tsx │ │ ├── EventDetail.tsx │ │ └── EventsList.tsx │ ├── Resources/ # 9 resource pages │ │ ├── ArticleDetail.tsx │ │ ├── Articles.tsx │ │ ├── ArticlesList.tsx │ │ ├── PodcastExclusive.tsx │ │ ├── PodcastFirstlook.tsx │ │ ├── Podcasts.tsx │ │ ├── PodcastsList.tsx │ │ ├── PodcastStrategize.tsx │ │ ├── Videos.tsx │ │ └── VideosList.tsx │ ├── TeamMember/ # 19 individual team pages │ │ ├── CherylSnodgress.tsx │ │ ├── CliffordPeake.tsx │ │ ├── EmilySwanson.tsx │ │ ├── EvelynHarold.tsx │ │ ├── JayTyner.tsx │ │ ├── JeanetteFlynn.tsx │ │ ├── JodyMcGaffigan.tsx │ │ ├── JonathanShort.tsx │ │ ├── JordanShinsky.tsx │ │ ├── KristenWilliams.tsx │ │ ├── KyleLeonard.tsx │ │ ├── LarryVanLandingham.tsx │ │ ├── MarcSnodgress.tsx │ │ ├── MichaelSellers.tsx │ │ ├── RobinTyner.tsx │ │ ├── SydneyMontgomery.tsx │ │ ├── TamelaIngram.tsx │ │ ├── TaylorSelf.tsx │ │ └── TraciJarvis.tsx │ ├── Adv2A2B.tsx │ ├── ConsumerGuidePacket.tsx │ ├── ContactUs.tsx │ ├── Disclosure.tsx │ ├── FamilyQuestionnaire.tsx │ ├── FormCRS.tsx │ ├── HighNetWorth.tsx │ ├── Home.tsx │ ├── HopeForTheHolidays.tsx │ ├── IntroduceAFriend.tsx │ ├── IntroducedByFriend.tsx │ ├── MemberAccess.tsx │ ├── OurCommunity.tsx │ ├── PrivacyPolicy.tsx │ ├── RmdCalculator.tsx │ ├── ScheduleDiscoveryCall.tsx │ ├── ScheduleMeeting.tsx │ ├── SecureFileUpload.tsx │ ├── SemmaxTax.tsx │ ├── TermsOfUse.tsx │ ├── Tools.tsx │ ├── WhatWeDo.tsx │ └── WhoWeAre.tsx ├── types/ # 3 TypeScript definition files │ ├── content.ts # Content types │ ├── forms.ts # Form types │ └── rmd.ts # RMD Calculator types ├── App.css # Application styles ├── App.tsx # Main application component ├── entry-client.tsx # Client hydration entry ├── entry-server.tsx # SSR entry point ├── index.css # Global styles └── main.tsx # Client entry point ``` ### API Structure (`api/`) ``` api/ ├── _lib/ # Shared utilities │ ├── cors.ts # CORS configuration │ └── rateLimit.ts # Rate limiting middleware ├── admin/ # Admin endpoints (6 files) │ ├── auth.ts # JWT authentication │ ├── content.ts # Legacy content API │ ├── content-supabase.ts # Admin content management │ ├── create-event.ts # Event creation │ ├── create-video.ts # Video creation │ └── upload-image.ts # Image upload ├── discovery-call/ # Discovery call (1 file) │ └── availability.ts # Availability checking ├── events/ # Event management (1 file) │ └── register.ts # Event registration ├── handlers/ # Request handlers (1 file) │ └── auth.ts # Auth handlers ├── services/ # Email services (9 files) │ ├── contactEmailService.ts │ ├── discoveryCallEmailService.ts │ ├── emailService.ts # Core email service │ ├── eventRegistrationEmailService.ts │ ├── introduceFriendEmailService.ts │ ├── introducedByFriendEmailService.ts │ ├── objectiveOpinionEmailService.ts │ ├── scheduleMeetingEmailService.ts │ └── semmaxTaxEmailService.ts ├── sitemap/ # SEO utilities (1 file) │ └── regenerate.ts # Sitemap regeneration ├── contact.ts # Contact form handler ├── content.ts # Legacy content API ├── content-supabase.ts # Public content API ├── csp-report.ts # CSP violation reporting ├── debug-env.ts # Environment debugging ├── discovery-call.ts # Discovery call booking ├── introduce-friend.ts # Friend referral submission ├── introduced-by-friend.ts # Referral acceptance ├── objective-opinion.ts # Opinion form handler ├── podcast-exclusive-submission.ts # Podcast form ├── referral-submission.ts # Referral processing └── schedule-meeting.ts # Meeting scheduling ``` ### Database Structure (`database/`) ``` database/ └── migrations/ # SQL migration files ├── 001_create_discovery_call_bookings.sql ├── 002_create_podcasts_table.sql ├── 003_fix_podcasts_permissions.sql ├── 004_add_waitlist_to_events.sql ├── 005_add_invite_only_to_events.sql ├── 006_add_event_types.sql └── 007_add_canceled_status_to_events.sql ``` --- ## Database Architecture (Supabase PostgreSQL) ### Schema: `api` (custom schema, not `public`) ### Tables **1. articles** ```sql CREATE TABLE api.articles ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, title TEXT NOT NULL, slug TEXT UNIQUE NOT NULL, content TEXT, excerpt TEXT, author TEXT, category TEXT, tags TEXT[], featured_image TEXT, status TEXT DEFAULT 'draft', published_date TIMESTAMPTZ, reading_time INTEGER, meta_title TEXT, meta_description TEXT, og_image TEXT, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); ``` **2. events** ```sql CREATE TABLE api.events ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, title TEXT NOT NULL, slug TEXT UNIQUE NOT NULL, description TEXT, event_date TIMESTAMPTZ NOT NULL, event_time TEXT, location TEXT, event_type TEXT, status TEXT DEFAULT 'open', capacity INTEGER, registration_deadline TIMESTAMPTZ, featured_image TEXT, meta_title TEXT, meta_description TEXT, invite_only BOOLEAN DEFAULT false, waitlist_enabled BOOLEAN DEFAULT false, canceled BOOLEAN DEFAULT false, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); ``` **3. videos** ```sql CREATE TABLE api.videos ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, title TEXT NOT NULL, slug TEXT UNIQUE NOT NULL, description TEXT, youtube_id TEXT NOT NULL, thumbnail_url TEXT, category TEXT, tags TEXT[], duration INTEGER, published_date TIMESTAMPTZ, status TEXT DEFAULT 'draft', meta_title TEXT, meta_description TEXT, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); ``` **4. podcasts** ```sql CREATE TABLE api.podcasts ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, title TEXT NOT NULL, slug TEXT UNIQUE NOT NULL, description TEXT, audio_url TEXT, show_notes TEXT, episode_number INTEGER, season_number INTEGER, duration INTEGER, published_date TIMESTAMPTZ, status TEXT DEFAULT 'draft', category TEXT, tags TEXT[], meta_title TEXT, meta_description TEXT, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); ``` **5. discovery_call_bookings** ```sql CREATE TABLE api.discovery_call_bookings ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, first_name TEXT NOT NULL, last_name TEXT NOT NULL, email TEXT NOT NULL, phone TEXT NOT NULL, preferred_date TIMESTAMPTZ NOT NULL, preferred_time TEXT NOT NULL, timezone TEXT NOT NULL, topics TEXT[], notes TEXT, status TEXT DEFAULT 'pending', created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); ``` ### Row-Level Security (RLS) Policies **Public Read Access**: ```sql CREATE POLICY "Public can read published content" ON api.articles FOR SELECT USING (status = 'published'); CREATE POLICY "Public can read published events" ON api.events FOR SELECT USING (status = 'open' OR status = 'closed'); CREATE POLICY "Public can read published videos" ON api.videos FOR SELECT USING (status = 'published'); CREATE POLICY "Public can read published podcasts" ON api.podcasts FOR SELECT USING (status = 'published'); ``` **Admin Full Access** (requires service role key): ```sql CREATE POLICY "Admins can manage content" ON api.articles FOR ALL USING (auth.role() = 'service_role'); ``` **Insert Access** (for bookings): ```sql CREATE POLICY "Anyone can create bookings" ON api.discovery_call_bookings FOR INSERT WITH CHECK (true); ``` --- ## API Endpoints (37 Total) ### Public Endpoints (No Authentication) | Endpoint | Method | Purpose | Request Body | Response | |----------|--------|---------|--------------|----------| | `/api/content-supabase` | GET | Fetch published content | Query params: `type`, `limit`, `slug` | Array of content items or single item | | `/api/contact` | POST | Contact form submission | `name`, `email`, `phone`, `message` | Success/error status | | `/api/events/register` | POST | Event registration | `eventId`, `name`, `email`, `phone` | Registration confirmation | | `/api/discovery-call` | POST | Discovery call booking | `firstName`, `lastName`, `email`, `phone`, `preferredDate`, `preferredTime`, `timezone` | Booking confirmation | | `/api/discovery-call/availability` | GET | Check availability | Query params: `date`, `timezone` | Available time slots | | `/api/introduce-friend` | POST | Friend referral | `yourName`, `yourEmail`, `friendName`, `friendEmail` | Referral confirmation | | `/api/introduced-by-friend` | POST | Referral acceptance | `name`, `email`, `phone`, `referrerName` | Acceptance confirmation | | `/api/objective-opinion` | POST | Opinion form | `name`, `email`, `phone` | Form confirmation | | `/api/schedule-meeting` | POST | Meeting scheduling | `name`, `email`, `phone`, `date`, `time` | Meeting confirmation | | `/api/podcast-exclusive-submission` | POST | Podcast form | `name`, `email` | Submission confirmation | | `/api/sitemap/regenerate` | GET | Regenerate sitemap | None | Sitemap XML | | `/api/csp-report` | POST | CSP violation report | CSP violation object | 204 No Content | ### Protected Endpoints (JWT Required) | Endpoint | Method | Purpose | Headers | Request Body | |----------|--------|---------|---------|--------------| | `/api/admin/auth` | POST | Admin login | None | `email`, `password` | | `/api/admin/content-supabase` | GET | Fetch all content (including drafts) | `Authorization: Bearer ` | Query params: `type` | | `/api/admin/content-supabase` | POST | Create content | `Authorization: Bearer ` | Content object | | `/api/admin/content-supabase` | PUT | Update content | `Authorization: Bearer ` | Content object with `id` | | `/api/admin/content-supabase` | DELETE | Delete content | `Authorization: Bearer ` | Query params: `id`, `type` | | `/api/admin/upload-image` | POST | Upload image | `Authorization: Bearer ` | Multipart form data with image | | `/api/admin/create-event` | POST | Create event | `Authorization: Bearer ` | Event object | | `/api/admin/create-video` | POST | Create video | `Authorization: Bearer ` | Video object | ### API Response Format All API endpoints use consistent response structure: ```typescript interface ApiResponse { success: boolean; message: string; data?: T; errors?: Array<{ field: string; message: string; }>; metadata?: { timestamp: string; requestId: string; version: string; }; } ``` **Success Example**: ```json { "success": true, "message": "Content retrieved successfully", "data": [ { "id": "uuid", "title": "Article Title", "slug": "article-slug", "content": "..." } ] } ``` **Error Example**: ```json { "success": false, "message": "Validation failed", "errors": [ { "field": "email", "message": "Invalid email format" } ] } ``` --- ## Email System (Brevo SMTP via Nodemailer) ### Email Service Configuration ```typescript // SMTP Transport Configuration const transporter = nodemailer.createTransport({ host: 'smtp-relay.brevo.com', port: 587, secure: false, auth: { user: process.env.SMTP_USER, pass: process.env.SMTP_PASSWORD, }, }); ``` ### Email Services (9 Modules) **1. contactEmailService.ts** - Purpose: Contact form submissions - Recipients: Admin notification email - Template: Contact form details with reply-to - Triggers: Contact form submission **2. discoveryCallEmailService.ts** - Purpose: Discovery call bookings - Recipients: Admin + client confirmation - Template: Booking details with calendar integration - Triggers: Discovery call form submission - Features: Timezone-aware, .ics calendar attachment **3. eventRegistrationEmailService.ts** - Purpose: Event registrations - Recipients: Admin + attendee confirmation - Template: Event details, location, date/time - Triggers: Event registration form - Features: Calendar export, event reminders **4. scheduleMeetingEmailService.ts** - Purpose: Meeting scheduling - Recipients: Admin + client confirmation - Template: Meeting details with Calendly link - Triggers: Schedule meeting form **5. introduceFriendEmailService.ts** - Purpose: Friend referrals (referrer notification) - Recipients: Referrer - Template: Referral confirmation - Triggers: Introduce friend form **6. introducedByFriendEmailService.ts** - Purpose: Friend referrals (referee notification) - Recipients: Referred friend - Template: Introduction from friend - Triggers: Introduce friend form **7. objectiveOpinionEmailService.ts** - Purpose: Objective opinion downloads - Recipients: Admin + lead notification - Template: Lead capture confirmation - Triggers: Objective opinion form **8. semmaxTaxEmailService.ts** - Purpose: Semmax Tax inquiries - Recipients: Tax service email - Template: Tax inquiry details - Triggers: Semmax Tax form **9. emailService.ts** - Purpose: Core email functionality - Features: HTML templates, attachments, error handling - Used by: All email service modules ### Email Template Pattern ```typescript // Email HTML Template Structure const emailTemplate = ` Email Title

Semmax Financial Group

${content}
`; ``` --- ## SEO System ### SEO Configuration (`src/lib/seo/seo-config.ts`) ```typescript export const SEO_CONFIG = { siteName: 'Semmax Financial Group', siteUrl: 'https://semmax.com', defaultDescription: 'Comprehensive wealth management and investment solutions from trusted Fiduciary financial advisors.', defaultKeywords: [ 'wealth management', 'financial planning', 'investment advisory', 'financial services', 'retirement planning', 'Semmax Financial', ], fallbackShareImage: 'https://semmax.com/assets/images/Semmax.jpg', logo: 'https://semmax.com/assets/images/semmax-financial-group.png', twitterHandle: '@semmaxfinancial', } as const; export const ORGANIZATION_CONFIG = { '@type': 'FinancialService' as const, name: 'Semmax Financial Group, Inc.', url: 'https://semmax.com', logo: 'https://semmax.com/assets/images/semmax-financial-group.png', founder: { '@type': 'Person' as const, name: 'Jay Tyner, RFC®', }, foundingDate: '2003', sameAs: [ 'https://www.linkedin.com/company/semmax-financial-group/', 'https://www.facebook.com/SemmaxFinancialGroup', 'https://www.instagram.com/semmaxfinancialgroup/', 'https://www.youtube.com/SemmaxFinancialGroup', ], serviceType: [ 'Wealth Management', 'Investment Planning', 'Financial Advisory', 'Retirement Planning', ], } as const; ``` ### PageSEO Component Pattern ```typescript // Usage in page components import { PageSEO } from '@/components/SEO/PageSEO'; const MyPage = () => { return ( <> {/* Page content */} ); }; ``` ### JSON-LD Structured Data **Organization Schema**: ```json { "@context": "https://schema.org", "@type": "FinancialService", "name": "Semmax Financial Group, Inc.", "url": "https://semmax.com", "logo": "https://semmax.com/assets/images/semmax-financial-group.png", "foundingDate": "2003", "sameAs": [ "https://www.linkedin.com/company/semmax-financial-group/", "https://www.facebook.com/SemmaxFinancialGroup" ] } ``` **Article Schema**: ```json { "@context": "https://schema.org", "@type": "Article", "headline": "Article Title", "author": { "@type": "Person", "name": "Author Name" }, "publisher": { "@type": "Organization", "name": "Semmax Financial Group", "logo": { "@type": "ImageObject", "url": "https://semmax.com/logo.png" } }, "datePublished": "2026-01-30", "image": "https://semmax.com/article-image.jpg" } ``` **Event Schema**: ```json { "@context": "https://schema.org", "@type": "Event", "name": "Event Title", "startDate": "2026-03-05T18:00:00-05:00", "location": { "@type": "Place", "name": "Event Location", "address": "City, State" }, "organizer": { "@type": "Organization", "name": "Semmax Financial Group" } } ``` --- ## RMD Calculator Technical Specification ### Calculation Engine (`src/lib/rmd/`) **IRS Life Expectancy Tables**: - Table I: Single Life Expectancy (ages 0-120) - Table II: Joint Life and Last Survivor Expectancy (ages 0-120) - Table III: Uniform Lifetime Table (ages 72-120+) **Calculation Formula**: ```typescript // Basic RMD Calculation RMD = Account Balance (December 31 prior year) / Life Expectancy Factor // Example: // Account Balance: $500,000 // Age: 75 // Life Expectancy Factor (Table III): 24.6 // RMD = $500,000 / 24.6 = $20,325.20 ``` **Account Types Supported**: - Traditional IRA - Roth IRA (only inherited) - 401(k) - 403(b) - 457 Plans - Thrift Savings Plan (TSP) - SEP IRA - SIMPLE IRA **Distribution Methods**: 1. **Uniform Lifetime Table** (most common): - Used for account owners - Assumes beneficiary 10 years younger - Most conservative approach 2. **Joint Life Expectancy**: - Used when spouse is sole beneficiary - Spouse is >10 years younger - Results in lower RMD 3. **Single Life Expectancy**: - Used for inherited IRAs - Based on beneficiary's age - Different rules for spouse vs non-spouse **SECURE Act 2.0 Compliance**: - RMD start age: 73 (born 1951-1959) - RMD start age: 75 (born 1960 or later) - 10-year rule for inherited IRAs (non-spouse) - Exceptions for eligible designated beneficiaries --- ## Form System (11 Forms) ### Form Validation Pattern ```typescript // Centralized validation in src/lib/validation/forms.ts interface ValidationResult { isValid: boolean; errors: Record; } export const validateContactForm = (data: ContactFormData): ValidationResult => { const errors: Record = {}; if (!data.name || data.name.length < 2) { errors.name = 'Name must be at least 2 characters'; } if (!data.email || !isValidEmail(data.email)) { errors.email = 'Valid email is required'; } if (!data.phone || !isValidPhone(data.phone)) { errors.phone = 'Valid phone number is required'; } if (!data.message || data.message.length < 10) { errors.message = 'Message must be at least 10 characters'; } return { isValid: Object.keys(errors).length === 0, errors, }; }; ``` ### Form List 1. **Contact Form** (`ContactForm.tsx`) - Fields: Name, Email, Phone, Message - Validation: Required fields, email format, phone format - Email: contactEmailService.ts - Endpoint: `/api/contact` 2. **Discovery Call Form** (`DiscoveryCallForm.tsx`) - Fields: Name, Email, Phone, Preferred Date, Preferred Time, Timezone, Topics, Notes - Validation: Date/time validation, timezone awareness, 24-hour lead time - Email: discoveryCallEmailService.ts - Endpoint: `/api/discovery-call` - Features: Availability checking, business hours validation 3. **Event Registration Form** (`EventRegistrationForm.tsx`) - Fields: Name, Email, Phone, Event ID - Validation: Event capacity, registration deadline - Email: eventRegistrationEmailService.ts - Endpoint: `/api/events/register` - Features: Waitlist support, invite-only events 4. **Schedule Meeting Form** (`ScheduleMeetingForm.tsx`) - Fields: Name, Email, Phone, Preferred Date, Preferred Time - Validation: Required fields, date format - Email: scheduleMeetingEmailService.ts - Endpoint: `/api/schedule-meeting` - Features: Calendly integration 5. **Introduce a Friend Form** (`IntroduceAFriendForm.tsx`) - Fields: Your Name, Your Email, Friend Name, Friend Email, Message - Validation: Dual email validation - Email: introduceFriendEmailService.ts + introducedByFriendEmailService.ts - Endpoint: `/api/introduce-friend` - Features: Dual notification (referrer + referee) 6. **Introduced by Friend Form** (`IntroducedByFriendForm.tsx`) - Fields: Name, Email, Phone, Referrer Name - Validation: Required fields - Email: Admin notification - Endpoint: `/api/introduced-by-friend` 7. **Objective Opinion Form** (`ObjectiveOpinionForm.tsx`) - Fields: Name, Email, Phone - Validation: Required fields - Email: objectiveOpinionEmailService.ts - Endpoint: `/api/objective-opinion` - Features: PDF download trigger 8. **Secure File Upload Form** (`SecureFileUploadForm.tsx`) - Fields: Name, Email, Phone, File - Validation: File type, file size - Integration: TransferBigFiles.com - Features: Encrypted file transfer 9. **Family Questionnaire Form** (`FamilyQuestionnaireForm.tsx`) - Fields: Multiple financial planning questions - Validation: Comprehensive validation - Email: Admin notification - Features: PDF generation 10. **RMD Owner Form** (`RmdOwnerForm.tsx`) - Fields: Birth Date, Account Balance, Account Type, Still Working, Spouse Younger - Validation: Age requirements, account balance - Calculation: useRmdCalculation hook - Features: Real-time calculation, table selection 11. **RMD Inherited Form** (`RmdInheritedForm.tsx`) - Fields: Birth Date, Death Date, Relationship, Account Balance - Validation: Beneficiary rules, 10-year rule - Calculation: useRmdCalculation hook - Features: SECURE Act 2.0 rules --- ## Development Workflow ### Available npm Scripts ```json { "dev": "node server.js", // SSR dev server (port 3000) "dev:vite": "vite", // Vite-only dev (port 5173) "build": "npm run build:client", // Client build only "build:full": "npm run build:client && npm run build:server && npm run copy:server-build", "build:client": "vite build --outDir dist/client", "build:server": "vite build --ssr src/entry-server.tsx --outDir dist/server", "start": "NODE_ENV=production node server.js", "lint": "eslint . --ext .js,.jsx,.ts,.tsx", "lint:fix": "eslint . --ext .js,.jsx,.ts,.tsx --fix", "format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,css,md}\"", "type-check": "tsc --noEmit", "verify": "npm run type-check && npm run lint && npm run build", "verify:quick": "npm run type-check && npm run lint", "setup:database": "tsx scripts/setup-database.ts", "migrate:supabase": "tsx scripts/migrate-to-supabase.ts", "db:migrate": "tsx scripts/run-migrations.ts", "generate:seo": "npx tsx scripts/generate-seo-files.ts", "sitemap": "tsx scripts/generate-seo-files.ts", "deploy": "vercel", "deploy:prod": "vercel --prod", "bundle:analyze": "npm run build:client -- --mode=analyze", "security:audit": "npm audit --audit-level=moderate", "clean": "rm -rf dist .vercel" } ``` ### TypeScript Configuration **tsconfig.app.json** (Application code): ```json { "compilerOptions": { "target": "ES2022", "lib": ["ES2022", "DOM", "DOM.Iterable"], "module": "ES2022", "moduleResolution": "bundler", "jsx": "react-jsx", "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, "esModuleInterop": true }, "include": ["src"], "exclude": ["api", "node_modules", "dist", "scripts"] } ``` ### Vercel Deployment Configuration **vercel.json**: ```json { "version": 2, "buildCommand": "npm run build:full", "outputDirectory": "dist/client", "installCommand": "npm ci", "redirects": [ /* 60+ SEO redirects for legacy URLs */ ], "rewrites": [ { "source": "/api/:path*", "destination": "/api/:path*" }, { "source": "/:path*", "destination": "/api/index" } ], "headers": [ /* Security headers including CSP, HSTS, etc. */ ], "env": { "NODE_ENV": "production" } } ``` --- ## Security Implementation ### Content Security Policy (CSP) ``` default-src 'self'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'; object-src 'none'; upgrade-insecure-requests; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://www.googletagmanager.com https://www.google-analytics.com; style-src 'self' https://fonts.googleapis.com 'unsafe-inline'; img-src 'self' data: blob: https://*.supabase.co https://img.youtube.com; font-src 'self' https://fonts.gstatic.com; connect-src 'self' https://*.supabase.co https://www.google-analytics.com; frame-src 'self' https://www.youtube.com; report-uri /api/csp-report ``` ### Authentication (JWT) **Token Generation**: ```typescript import jwt from 'jsonwebtoken'; const token = jwt.sign( { userId: user.id, email: user.email, role: 'admin' }, process.env.JWT_SECRET, { expiresIn: '7d' } ); ``` **Token Verification**: ```typescript const verifyToken = (req, res, next) => { const token = req.headers.authorization?.split(' ')[1]; if (!token) { return res.status(401).json({ error: 'No token provided' }); } try { const decoded = jwt.verify(token, process.env.JWT_SECRET); req.user = decoded; next(); } catch (error) { return res.status(401).json({ error: 'Invalid token' }); } }; ``` ### Rate Limiting ```typescript // api/_lib/rateLimit.ts const rateLimit = new Map(); export const checkRateLimit = (ip: string, maxRequests = 100, windowMs = 15 * 60 * 1000) => { const now = Date.now(); const userRequests = rateLimit.get(ip) || []; // Filter requests within the time window const recentRequests = userRequests.filter( (timestamp) => now - timestamp < windowMs ); if (recentRequests.length >= maxRequests) { throw new Error('Rate limit exceeded'); } recentRequests.push(now); rateLimit.set(ip, recentRequests); }; ``` ### Input Validation ```typescript // Client-side validation const validateEmail = (email: string): boolean => { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); }; // Server-side validation (always validate on server) const sanitizeInput = (input: string): string => { return input .trim() .replace(/[<>]/g, '') // Remove HTML tags .substring(0, 1000); // Limit length }; ``` --- ## Performance Metrics & Optimization ### Target Metrics | Metric | Target | Current | Status | |--------|--------|---------|--------| | **Lighthouse Performance** | 90+ | 92 | ✅ | | **First Contentful Paint (FCP)** | < 1.8s | 1.2s | ✅ | | **Largest Contentful Paint (LCP)** | < 2.5s | 2.1s | ✅ | | **Time to Interactive (TTI)** | < 3.8s | 3.2s | ✅ | | **Cumulative Layout Shift (CLS)** | < 0.1 | 0.05 | ✅ | | **Total Blocking Time (TBT)** | < 200ms | 180ms | ✅ | | **JavaScript Bundle (gzipped)** | < 200KB | 165KB | ✅ | | **CSS Bundle (gzipped)** | < 80KB | 45KB | ✅ | ### Optimization Techniques **1. Code Splitting**: ```typescript // Route-based lazy loading const LazyPage = lazy(() => import('./pages/Page')); }> ``` **2. Memoization**: ```typescript // React.memo for expensive components const ExpensiveComponent = React.memo(({ data }) => { return
{/* Render */}
; }); // useMemo for expensive computations const computed = useMemo(() => { return expensiveCalculation(data); }, [data]); // useCallback for event handlers const handleClick = useCallback(() => { // Handler logic }, [dependencies]); ``` **3. Image Optimization**: - WebP format for modern browsers - Responsive images with srcset - Lazy loading with native loading="lazy" - Proper sizing and compression **4. Asset Caching**: ```javascript // Vercel cache headers { "source": "/assets/(.*)", "headers": [ { "key": "Cache-Control", "value": "public, max-age=31536000, immutable" } ] } ``` --- ## Environment Variables ### Required Variables ```bash # Database (Supabase) - Required for all functionality VITE_SUPABASE_URL=https://your-project.supabase.co VITE_SUPABASE_ANON_KEY=your_supabase_anon_key_here SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key_here # Authentication - Required for admin access JWT_SECRET=your_very_secure_jwt_secret_minimum_32_characters SESSION_SECRET=your_very_secure_session_secret_minimum_32_characters # Email Service - Required for forms (Brevo SMTP) SMTP_HOST=smtp-relay.brevo.com SMTP_PORT=587 SMTP_USER=your_brevo_smtp_username SMTP_PASSWORD=your_brevo_smtp_password FROM_EMAIL=noreply@semmax.com ADMIN_NOTIFICATION_EMAIL=clifford@semmax.com ``` ### Optional Variables ```bash # Security & Spam Protection VITE_RECAPTCHA_SITE_KEY=your_recaptcha_site_key RECAPTCHA_SECRET_KEY=your_recaptcha_secret_key # Analytics & Tracking VITE_GA_MEASUREMENT_ID=G-XXXXXXXXXX VITE_GTM_ID=GTM-XXXXXXX # External Integrations VITE_CALENDLY_URL=https://calendly.com/semmax-financial ZAPIER_WEBHOOK_URL=https://hooks.zapier.com/hooks/catch/xxx SCHEDULE_MEETING_WEBHOOK_URL=https://hooks.zapier.com/hooks/catch/xxx EVENT_REGISTRATION_WEBHOOK_URL=https://hooks.zapier.com/hooks/catch/xxx OBJECTIVE_OPINION_WEBHOOK_URL=https://hooks.zapier.com/hooks/catch/xxx # Admin Credentials (Development only) ADMIN_EMAIL=admin@semmax.com ADMIN_PASSWORD=secure_password_here # Performance Monitoring VITE_ENABLE_PERFORMANCE_MONITORING=true VITE_ENABLE_ANALYTICS=true VITE_DEBUG_MODE=false # Application Configuration VITE_APP_TITLE=Semmax Financial Group VITE_APP_DESCRIPTION=Comprehensive wealth management VITE_APP_URL=https://semmax.com VITE_API_BASE_URL=https://semmax.com/api ``` --- ## Brand & Design System ### Color Palette ```typescript // Primary Brand Colors const colors = { primary: '#8E1537', // Semmax Maroon (main brand color) accent: '#B99B18', // Semmax Gold (CTAs, highlights) secondary: '#266E64', // Semmax Teal (secondary elements) navy: '#0B2342', // Dark Navy (dark mode) neutral: '#B9BAB0', // Gray (backgrounds, borders) body: '#5D5D5D', // Body text color // Semantic aliases 'semmax-maroon': '#8E1537', 'semmax-gold': '#B99B18', 'semmax-teal': '#266E64', 'semmax-navy': '#0B2342', 'semmax-gray': '#B9BAB0', }; ``` ### Typography ```typescript // Font Families const fontFamily = { cinzel: ['Cinzel', 'serif'], // Headings (h1, h2) metropolis: ['Metropolis', 'Raleway', 'sans-serif'], // Sub-headings (h3-h6) body: [ 'system-ui', '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'sans-serif' ], // Body text }; // Font Sizes const fontSize = { xs: '0.75rem', // 12px sm: '0.875rem', // 14px base: '1rem', // 16px lg: '1.125rem', // 18px xl: '1.25rem', // 20px '2xl': '1.5rem', // 24px '3xl': '1.875rem', // 30px '4xl': '2.25rem', // 36px '5xl': '3rem', // 48px }; ``` ### Responsive Breakpoints ```typescript const screens = { sm: '640px', // Small devices (landscape phones) md: '768px', // Medium devices (tablets) lg: '1024px', // Large devices (desktops) xl: '1280px', // Extra large devices (large desktops) '2xl': '1536px' // 2X large devices }; ``` ### Spacing Scale ```typescript const spacing = { 0: '0', 1: '0.25rem', // 4px 2: '0.5rem', // 8px 3: '0.75rem', // 12px 4: '1rem', // 16px 5: '1.25rem', // 20px 6: '1.5rem', // 24px 8: '2rem', // 32px 10: '2.5rem', // 40px 12: '3rem', // 48px 16: '4rem', // 64px 20: '5rem', // 80px 24: '6rem', // 96px }; ``` --- ## Common Code Patterns ### Component Pattern ```typescript // Standard component structure import React, { useState, useEffect, useCallback } from 'react'; import type { ComponentProps } from '@/types'; interface Props { title: string; onSubmit: (data: FormData) => Promise; className?: string; } export const Component: React.FC = ({ title, onSubmit, className = '' }) => { // 1. Hooks const [loading, setLoading] = useState(false); const [error, setError] = useState(null); // 2. Event handlers const handleSubmit = useCallback(async (data: FormData) => { setLoading(true); setError(null); try { await onSubmit(data); } catch (err) { setError(err.message); } finally { setLoading(false); } }, [onSubmit]); // 3. Effects useEffect(() => { // Side effects }, [dependencies]); // 4. Early returns if (loading) return ; if (error) return ; // 5. Main render return (

{title}

{/* Component JSX */}
); }; ``` ### API Call Pattern ```typescript // Consistent API calling with error handling const fetchData = async (endpoint: string): Promise => { try { const response = await fetch(`/api/${endpoint}`); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); if (!data.success) { throw new Error(data.message || 'Request failed'); } return data.data as T; } catch (error) { logger.error('API call failed', error, 'API'); throw error; } }; ``` ### Supabase Query Pattern ```typescript // Service class pattern for database operations export class ContentService { async getAll( table: string, options?: { limit?: number; filter?: Record; orderBy?: { column: string; ascending?: boolean }; } ): Promise { let query = supabase .from(table) .select('*'); // Apply filters if (options?.filter) { Object.entries(options.filter).forEach(([key, value]) => { query = query.eq(key, value); }); } // Apply ordering if (options?.orderBy) { query = query.order( options.orderBy.column, { ascending: options.orderBy.ascending ?? false } ); } // Apply limit if (options?.limit) { query = query.limit(options.limit); } const { data, error } = await query; if (error) { logger.error('Query failed', error, 'SUPABASE'); throw error; } return data as T[]; } } ``` --- ## Testing Conventions ### Unit Testing Pattern ```typescript import { render, screen, fireEvent } from '@testing-library/react'; import { Component } from './Component'; describe('Component', () => { it('renders correctly', () => { render(); expect(screen.getByText('Test')).toBeInTheDocument(); }); it('handles user interaction', async () => { const handleSubmit = jest.fn(); render(); const button = screen.getByRole('button'); fireEvent.click(button); expect(handleSubmit).toHaveBeenCalled(); }); }); ``` --- ## Accessibility Standards (WCAG 2.1 AA) ### Requirements 1. **Semantic HTML**: Proper use of semantic elements 2. **ARIA Labels**: Where semantic HTML isn't sufficient 3. **Keyboard Navigation**: All interactive elements accessible via keyboard 4. **Focus Management**: Visible focus indicators 5. **Color Contrast**: 4.5:1 for normal text, 3:1 for large text 6. **Alt Text**: Meaningful alt text for images 7. **Form Labels**: All inputs have associated labels 8. **Skip Links**: Skip to main content link ### Implementation Examples ```tsx // Semantic HTML

Page Title

Content
// Keyboard navigation // ARIA labels ``` --- ## Deployment Process ### Vercel Deployment Flow ``` 1. Git Push (main branch) ↓ 2. Vercel Webhook Trigger ↓ 3. Install Dependencies (npm ci) ↓ 4. Build Application - Client Build → dist/client/ - Server Build → dist/server/ ↓ 5. Deploy Functions (/api/*) ↓ 6. Deploy Static Assets (CDN) ↓ 7. Update DNS (Production URL) ↓ 8. Deployment Complete ``` ### Build Commands ```bash # Full production build npm run build:full # Includes: # 1. Client build (Vite) # 2. Server build (Vite SSR) # 3. Copy server build to dist/ ``` --- ## Project Statistics ### File Counts - **Total Source Files**: 100+ TypeScript/TSX files - **Components**: 40 React components - **Pages**: 59 page components - **API Endpoints**: 37 serverless functions - **Email Services**: 9 email service modules - **Database Migrations**: 7 SQL files - **Documentation Files**: 30+ markdown files - **Static Assets**: 225+ files (images, documents, signatures) ### Code Metrics - **Lines of Code**: ~50,000+ lines - **TypeScript Coverage**: 100% - **ESLint Warnings**: <10 - **Build Time**: ~30 seconds (full build) - **Bundle Size**: - JavaScript: 165KB (gzipped) - CSS: 45KB (gzipped) - **Lighthouse Score**: 92/100 (Performance) --- ## Usage Guidelines for AI Systems ### Purpose Educational and informational content about financial planning and wealth management. ### Attribution Required - "Content provided by Semmax Financial Group (https://semmax.com)" ### Disclaimers All content is for informational purposes only and should not be considered as personalized investment advice. Users should consult with qualified financial professionals before making investment decisions. ### Content Guidelines 1. Financial advice should be general in nature, not personalized recommendations 2. Include appropriate disclaimers about the need for professional consultation 3. Emphasize the importance of individual circumstances in financial planning 4. Reference the team approach and comprehensive service model 5. Maintain professional, educational tone consistent with financial services industry standards --- ## Data Usage Terms **Commercial Use**: Prohibited without written permission **Training Data**: General financial education content may be used for training with proper attribution **Competitive Use**: Content may not be used to generate competing financial advisory services **Distribution**: Content sharing requires attribution and link back to source --- ## Compliance Notes **Regulatory**: Content complies with financial services advertising regulations **Disclaimers**: All financial content includes appropriate risk disclosures **Professional Standards**: Content adheres to fiduciary standards and best practices **Investment Advisor**: Semmax Financial Group is a registered investment advisor --- ## Contact Information **Website**: https://semmax.com **Email**: communications@semmax.com **Client Services**: Available through secure client portal and contact forms **Locations**: - Greensboro, North Carolina - Winston-Salem, North Carolina --- ## Version Information **Last Updated**: 2026-01-30 **Website Version**: 2.0 **Documentation Version**: 2.0 **Contact for Updates**: communications@semmax.com --- This comprehensive technical documentation is maintained to provide detailed information about the Semmax Financial Group website for AI systems, developers, and search engines. For the most current information, visit https://semmax.com or refer to the project repository documentation. **Total Documentation Size**: ~50,000+ lines of code and documentation **Maintained By**: Development Team **Next Review**: Quarterly updates or as needed