Pular para o conteΓΊdo
MCP ThesaurusMCP Thesaurus

thechrisgrey

ComunidadeIncomplete39/100Reivindicar

streamable-httpupdated 9d ago

Personal website for Christian Perez (@thechrisgrey) | Founder & CEO of Altivum Inc. | Former Green Beret (18D Special Forces Medical Sergeant) | Bronze Star Recipient | Host of The Vector Podcast | Author of "Beyond the Assessment"

CΓ³digoSite

O que dΓ‘ para fazer com thechrisgrey?

thechrisgrey.com

TypeScript React Vite Tailwind CSS AWS Amplify Amazon Bedrock CI License

Personal website for Christian Perez (@thechrisgrey) | Founder & CEO of Altivum Inc. | Former Green Beret (18D Special Forces Medical Sergeant) | Bronze Star Recipient | Host of The Vector Podcast | Author of "Beyond the Assessment"

https://thechrisgrey.com


Table of Contents


Technology Stack

Layer Technology
Frontend React 19, TypeScript 5, Vite 5 (Vitest 4, ESLint 10 flat config)
Styling Tailwind CSS 4 (CSS-first @theme config, Oxide engine)
Routing React Router 7
CMS Sanity.io (blog content)
AI Chat Amazon Bedrock (Claude Haiku 4.5) + RAG
Auth Amazon Cognito (admin panel)
Hosting AWS Amplify
CDN/Analytics Cloudflare Web Analytics
Testing Vitest + React Testing Library + Cypress
Code Quality ESLint, strict TypeScript

Features

Pages

  • Home : Scroll-based animations with sticky profile sections
  • About : Personal biography and military background
  • Altivum Inc : Company showcase and services
  • The Vector Podcast : YouTube embeds, Spotify player, collapsible episode list
  • Beyond the Assessment : Book information and purchase links
  • Blog : Sanity CMS-powered with categories, tags, series, and reading progress
  • AI Chat : Full-viewport conversational AI with RAG-enhanced responses
  • Claude : AWS certifications and Claude expertise showcase
  • AWS : AWS partnership and community builder profile
  • Admin : Cognito-authenticated KB management and site health dashboard
  • Links : Linktree-style quick links
  • Contact : Contact form, speaking topics, downloadable press kit

Technical Highlights

  • SEO : JSON-LD structured data, Open Graph, dynamic sitemap, RSS feed
  • AI Chat with RAG : Bedrock Knowledge Base retrieval with streaming responses
  • Podcast Auto-Sync : YouTube Data API fetches episodes at build time
  • Chat Widget : Floating chat widget available across all pages
  • Metrics Dashboard : CloudWatch and DynamoDB-backed operational metrics
  • Error Boundaries : Page-level error handling with custom fallback UIs
  • Accessibility : Focus trapping, keyboard navigation, ARIA labels, skip links
  • Performance : Image optimization (Sharp/SVGO), lazy loading, code splitting, manual chunking

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        FRONTEND (React)                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚  β”‚   Home   β”‚ β”‚  Podcast β”‚ β”‚   Blog   β”‚ β”‚   Chat   β”‚   ...     β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚               β”‚              β”‚              β”‚
        β–Ό               β–Ό              β–Ό              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Amplify  β”‚   β”‚  YouTube  β”‚   β”‚  Sanity   β”‚   β”‚    Bedrock    β”‚
β”‚  Hosting  β”‚   β”‚  Data API β”‚   β”‚    CMS    β”‚   β”‚  + RAG (KB)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                (build-time)     (runtime)       (Lambda stream)

AI Chat Request Flow

User Message
    β”‚
    β–Ό
Lambda Function URL (streaming)
    β”‚
    β”œβ”€β”€> Bedrock Knowledge Base (retrieve context)
    β”‚         β”‚
    β”‚         β–Ό
    β”‚    S3 Vectors (autobiography chunks)
    β”‚
    β”œβ”€β”€> Bedrock Guardrails (content filtering)
    β”‚
    └──> Bedrock ConverseStream API (Claude Haiku 4.5)
              β”‚
              β–Ό
         Streaming Response -> Client

AWS Infrastructure

Service Resource Region Purpose
Amplify d3du8eg39a9peo us-east-2 Hosting, CI/CD
Lambda thechrisgrey-chat-stream us-east-1 AI chat streaming
Lambda thechrisgrey-contact-email us-east-2 Contact form
Lambda thechrisgrey-newsletter-subscription us-east-2 Newsletter
Lambda thechrisgrey-kb-sync us-east-1 KB auto-sync on S3 changes
Lambda thechrisgrey-kb-builder us-east-1 KB admin CRUD operations
Lambda thechrisgrey-metrics us-east-1 Metrics collection and reporting
Bedrock KB ARFYABW8HP us-east-1 RAG knowledge base
Cognito User Pool us-east-1 Admin authentication
S3 thechrisgrey-kb-source us-east-1 KB source documents
S3 thechrisgrey-vectors us-east-1 Vector embeddings
DynamoDB thechrisgrey-chat-ratelimit us-east-1 Rate limiting (20 req/hr/IP)
Secrets Manager thechrisgrey/youtube-api-key us-east-1 YouTube API key
CloudWatch tcg-AI-chat us-east-1 Bedrock invocation logs

Getting Started

Prerequisites

  • Node.js 20.x (see .nvmrc)
  • npm
  • AWS CLI (for deployment)

Installation

git clone https://github.com/thechrisgrey/thechrisgrey.git
cd thechrisgrey
npm install

Development

npm run dev             # Start dev server at http://localhost:5173
npm run build           # Full production build
npm run preview         # Preview production build
npm run lint            # Run ESLint

Build Pipeline

The production build runs these steps in sequence:

validate-env -> podcast-episodes -> lint -> tsc -> vite build -> sitemap -> rss

Testing

Framework Scope Command
Vitest Unit + Integration npm test
Vitest Watch mode npm run test:watch
Vitest Coverage report npm run test:coverage
Cypress E2E (headless) npm run cy:run
Cypress E2E (interactive) npm run cy:open
node:test Lambda unit + contract npm run test:lambda

The test suite includes unit tests for components, hooks, and utilities; integration tests for page-level behavior; and end-to-end tests covering navigation, chat, blog, and contact flows.

Live-API contract tests (opt-in)

Critical external boundaries β€” Cognito admin auth, the live Sanity client, Bedrock KB retrieval, and the Bedrock guardrail β€” are also covered by opt-in contract tests that exercise the real services (green mocks alone can drift from reality). They skip cleanly during npm run test:lambda and CI, and only run when their flag + AWS/Sanity credentials are present:

COGNITO_CONTRACT_TESTS=1 COGNITO_CLIENT_ID=… COGNITO_TEST_EMAIL=… COGNITO_TEST_PASSWORD=… \
  node --test lambda/shared/__tests__/cognito-contract.test.mjs
SANITY_CONTRACT_TESTS=1      node --test lambda/chat-stream/__tests__/sanity-contract.test.mjs
KB_RETRIEVE_CONTRACT_TESTS=1 node --test lambda/chat-stream/__tests__/kb-retrieve-contract.test.mjs
BEDROCK_CONTRACT_TESTS=1     node --test lambda/blueprint/__tests__/guardrail-contract.test.mjs

See .env.example for the full list of flags and required permissions. Run these before a release (or on a scheduled job) to catch response-shape/schema drift that unit mocks can't.


Environment Variables

Set in AWS Amplify console or in a local .env file:

Variable Description Required
VITE_CHAT_ENDPOINT Lambda Function URL for AI chat Yes
VITE_CONTACT_ENDPOINT Lambda Function URL for contact form Yes
VITE_NEWSLETTER_ENDPOINT Lambda Function URL for newsletter Yes
VITE_COGNITO_USER_POOL_ID Cognito User Pool ID (admin auth) Yes
VITE_COGNITO_CLIENT_ID Cognito App Client ID Yes
VITE_KB_BUILDER_ENDPOINT Lambda Function URL for KB admin Yes
VITE_CHAT_SIGNING_KEY HMAC signing key for chat requests Yes
VITE_METRICS_ENDPOINT Lambda Function URL for metrics Yes
YOUTUBE_API_KEY YouTube Data API v3 key (build-time only) Yes

VITE_ prefixed variables are bundled into the frontend. YOUTUBE_API_KEY is only used during the build step.


Deployment

Push to main triggers automatic Amplify deployment:

git push origin main

Manual Rebuild

aws amplify start-job \
  --app-id d3du8eg39a9peo \
  --branch-name main \
  --job-type RELEASE \
  --region us-east-2

Lambda Deployment

Each Lambda function is deployed independently via a single verified script. The script installs from the lockfile, dereferences the lambda-shared symlink into the bundle, and verifies the entire module graph resolves before upload β€” so a deploy can no longer ship a Lambda that crashes on cold start.

# Verify the bundle builds and resolves, without uploading:
npm run deploy:lambda -- chat-stream --dry-run

# Deploy for real:
npm run deploy:lambda -- chat-stream

Works for any Lambda under lambda/ (e.g. chat-stream, blueprint, kb-builder, metrics, kb-sync, mcp-server). Pass --region <r> to override the default (us-east-1). Do not hand-build function.zip β€” the manual zip glob omits the sibling modules each handler imports and produces a broken artifact.


Project Structure

thechrisgrey/
β”œβ”€β”€ public/                          # Static assets (served as-is)
β”‚   β”œβ”€β”€ assets/documents/            # Downloadable PDFs
β”‚   β”œβ”€β”€ press-kit/                   # Press materials + archive
β”‚   β”œβ”€β”€ .well-known/security.txt
β”‚   β”œβ”€β”€ robots.txt
β”‚   β”œβ”€β”€ og.png                       # Open Graph image
β”‚   └── favicon.png
β”‚
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ admin/                   # Admin panel (login, KB entries, site health)
β”‚   β”‚   β”œβ”€β”€ chat/                    # AI chat (message, input, suggestions, widget)
β”‚   β”‚   β”œβ”€β”€ ui/                      # Base UI (Button, FormInput, IconButton)
β”‚   β”‚   β”œβ”€β”€ Navigation.tsx
β”‚   β”‚   β”œβ”€β”€ Footer.tsx
β”‚   β”‚   β”œβ”€β”€ SEO.tsx                  # Meta tags + JSON-LD
β”‚   β”‚   β”œβ”€β”€ ErrorBoundary.tsx
β”‚   β”‚   β”œβ”€β”€ ErrorFallbacks.tsx
β”‚   β”‚   β”œβ”€β”€ EpisodeCard.tsx
β”‚   β”‚   β”œβ”€β”€ NewsletterForm.tsx
β”‚   β”‚   β”œβ”€β”€ ReadingProgressBar.tsx
β”‚   β”‚   └── ...
β”‚   β”‚
β”‚   β”œβ”€β”€ pages/                       # Route-level page components
β”‚   β”‚   β”œβ”€β”€ Home.tsx, About.tsx, Altivum.tsx, Podcast.tsx
β”‚   β”‚   β”œβ”€β”€ BeyondTheAssessment.tsx, Blog.tsx, BlogPost.tsx
β”‚   β”‚   β”œβ”€β”€ Chat.tsx, Claude.tsx, AWS.tsx, Admin.tsx
β”‚   β”‚   β”œβ”€β”€ Contact.tsx, Links.tsx, Privacy.tsx
β”‚   β”‚   └── NotFound.tsx
β”‚   β”‚
β”‚   β”œβ”€β”€ hooks/                       # Custom React hooks
β”‚   β”‚   β”œβ”€β”€ useAuth.ts               # Cognito authentication
β”‚   β”‚   β”œβ”€β”€ useChatEngine.ts         # Chat state and streaming
β”‚   β”‚   β”œβ”€β”€ useFocusTrap.ts          # Modal focus management
β”‚   β”‚   β”œβ”€β”€ useKbAdmin.ts            # KB admin operations
β”‚   β”‚   β”œβ”€β”€ usePageContext.ts        # Page-level context for chat
β”‚   β”‚   β”œβ”€β”€ useSessionStorage.ts     # Typed sessionStorage with Date revival
β”‚   β”‚   └── useSiteHealth.ts         # Site health monitoring
β”‚   β”‚
β”‚   β”œβ”€β”€ sanity/                      # Sanity CMS client, queries, types, cache
β”‚   β”œβ”€β”€ utils/                       # Typography, schemas, validators, web vitals
β”‚   β”œβ”€β”€ constants/                   # Social links
β”‚   β”œβ”€β”€ types/                       # TypeScript interfaces
β”‚   β”œβ”€β”€ data/                        # Podcast episode data (generated + fallback)
β”‚   β”œβ”€β”€ assets/                      # Optimized images (Vite processed)
β”‚   β”‚
β”‚   β”œβ”€β”€ __tests__/
β”‚   β”‚   β”œβ”€β”€ integration/             # Page-level integration tests
β”‚   β”‚   └── setup.ts
β”‚   β”‚
β”‚   β”œβ”€β”€ App.tsx                      # Routes, layout, error boundaries
β”‚   β”œβ”€β”€ main.tsx                     # Entry point
β”‚   └── index.css                    # Tailwind directives
β”‚
β”œβ”€β”€ lambda/
β”‚   β”œβ”€β”€ shared/                      # Shared utilities (auth, rate limiting, response)
β”‚   β”œβ”€β”€ chat-stream/                 # Bedrock streaming Lambda
β”‚   β”œβ”€β”€ kb-sync/                     # Knowledge Base auto-sync
β”‚   β”œβ”€β”€ kb-builder/                  # KB admin CRUD
β”‚   └── metrics/                     # Metrics collection
β”‚
β”œβ”€β”€ scripts/
β”‚   β”œβ”€β”€ validate-env.js              # Build-time env validation
β”‚   β”œβ”€β”€ generate-podcast-episodes.js # YouTube API fetch
β”‚   β”œβ”€β”€ generate-sitemap.js          # Sitemap from Sanity
β”‚   └── generate-rss.js             # RSS feed from Sanity
β”‚
β”œβ”€β”€ cypress/                         # E2E tests
β”‚   β”œβ”€β”€ e2e/                         # Test specs
β”‚   β”œβ”€β”€ fixtures/                    # Test data
β”‚   └── support/                     # Custom commands
β”‚
β”œβ”€β”€ docs/                            # Internal documentation and plans
β”œβ”€β”€ .github/workflows/ci.yml        # GitHub Actions CI
β”œβ”€β”€ amplify.yml                      # Amplify build config
β”œβ”€β”€ tailwind.config.js
β”œβ”€β”€ vite.config.ts
β”œβ”€β”€ vitest.config.ts
β”œβ”€β”€ cypress.config.ts
└── tsconfig.json

Key Integrations

Sanity CMS (Blog)

  • Project ID: k5950b3w | Dataset: production
  • Content includes blog posts with categories, tags, series, and Portable Text rich content
  • Client-side caching via postCache.ts with Date revival

YouTube Data API (Podcast)

Episodes are fetched at build time from the @AltivumPress channel.

  1. generate-podcast-episodes.js runs during the build step
  2. Fetches channel, uploads playlist, and video details
  3. Generates src/data/generatedEpisodes.json
  4. Falls back to static data if the API is unavailable

Amazon Bedrock (AI Chat)

  • Model: Claude Haiku 4.5 (us.anthropic.claude-haiku-4-5-20251001-v1:0)
  • Knowledge Base: ARFYABW8HP (autobiography chunks)
  • Guardrail: 5kofhp46ssob (content filtering)
  • Rate Limit: 20 requests/hour per IP (DynamoDB-backed)
  • Streaming responses via Lambda Function URL with RAG retrieval (5 chunks per query)

Cloudflare Web Analytics

Privacy-friendly, cookie-free analytics with no personal data collection.


Design System

Color Palette

Name Hex Usage
altivum-dark #0A0F1C Backgrounds
altivum-navy #1A2332 Cards, nav
altivum-blue #2E4A6B Accents
altivum-slate #4A5A73 Borders, muted
altivum-silver #9BA6B8 Body text
altivum-gold #C5A572 Highlights, CTAs

Typography

SF Pro Display with system font fallbacks. Ultra-light weight (200) throughout. Defined in src/utils/typography.ts.

Animations

  • animate-fade-in : Hero entrance (1.2s)
  • animate-nav-fade-in : Nav delayed entrance (0.8s, 2s delay)
  • shimmer : Background shimmer effect
  • widget-open : Chat widget expansion (250ms)

License

Copyright 2026 Christian Perez. All rights reserved.

For inquiries, use the contact form or email via the website.