<?xml version="1.0" encoding="UTF-8"?>
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36" version="29.3.7">
  <diagram name="ZForge.dev Complete Architecture" id="kzw0Q554C6Bv2PVqv7St">
    <mxGraphModel dx="2004" dy="1061" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-1" parent="1" style="points=[[0,0],[0.25,0],[0.5,0],[0.75,0],[1,0],[1,0.25],[1,0.5],[1,0.75],[1,1],[0.75,1],[0.5,1],[0.25,1],[0,1],[0,0.75],[0,0.5],[0,0.25]];outlineConnect=0;gradientColor=none;html=1;whiteSpace=wrap;fontSize=12;fontStyle=0;container=1;pointerEvents=0;collapsible=0;recursiveResize=0;shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_aws_cloud;strokeColor=#232F3E;fillColor=none;verticalAlign=top;align=left;spacingLeft=30;fontColor=#232F3E;dashed=0;" value="AWS Cloud" vertex="1">
          <mxGeometry height="490" width="1160" x="20" y="300" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-7" parent="dJxqMhgUhzbr0Nh0ujDD-1" style="outlineConnect=0;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.cloudfront;strokeWidth=2;" value="CloudFront Distribution&#xa;SSL via ACM (*.zforge.dev)&#xa;OAC for private S3&#xa;Cache behaviors" vertex="1">
          <mxGeometry height="78" width="78" x="70" y="60" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-8" parent="dJxqMhgUhzbr0Nh0ujDD-1" style="outlineConnect=0;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.s3;strokeWidth=2;" value="S3 Bucket (Private)&#xa;Static website files&#xa;cache-control headers&#xa;Bucket: zforge.dev" vertex="1">
          <mxGeometry height="78" width="78" x="70" y="280" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-19" edge="1" parent="dJxqMhgUhzbr0Nh0ujDD-1" source="dJxqMhgUhzbr0Nh0ujDD-7" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;fontSize=10;" target="dJxqMhgUhzbr0Nh0ujDD-8" value="OAC access">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-15" parent="dJxqMhgUhzbr0Nh0ujDD-1" style="outlineConnect=0;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.identity_and_access_management;strokeWidth=2;" value="IAM Role (OIDC)&#xa;zforge-github-actions-role&#xa;-static-site&#xa;Trust: GitHub OIDC&#xa;Repo: zambrano-luis/&#xa;zforge-site" vertex="1">
          <mxGeometry height="78" width="78" x="260" y="270" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-11" parent="dJxqMhgUhzbr0Nh0ujDD-1" style="outlineConnect=0;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.systems_manager;strokeWidth=2;" value="Systems Manager&#xa;Parameter Store&#xa;/cloudflare-turnstyle-key&#xa;Type: SecureString" vertex="1">
          <mxGeometry height="78" width="78" x="840" y="310" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-14" parent="dJxqMhgUhzbr0Nh0ujDD-1" style="outlineConnect=0;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.identity_and_access_management;strokeWidth=2;" value="IAM Role (OIDC)&#xa;zforge-github-actions-role&#xa;-contact-form-lambda&#xa;Trust: GitHub OIDC&#xa;Repo: zambrano-luis/&#xa;contact-form-lambda" vertex="1">
          <mxGeometry height="78" width="78" x="1030" y="310" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-42" edge="1" parent="1" source="dJxqMhgUhzbr0Nh0ujDD-2" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;curved=0;strokeWidth=2;" target="dJxqMhgUhzbr0Nh0ujDD-5">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="50" y="90" />
              <mxPoint x="185" y="90" />
              <mxPoint x="185" y="55" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-2" parent="1" style="shape=actor;verticalLabelPosition=bottom;verticalAlign=top;fontSize=12;" value="User / Browser" vertex="1">
          <mxGeometry height="80" width="40" x="30" y="120" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-3" parent="1" style="shape=rect;rounded=1;fillColor=#F38020;fontColor=#000000;fontSize=10;strokeWidth=2;" value="Cloudflare DNS&#xa;CNAME Flattening&#xa;zforge.dev" vertex="1">
          <mxGeometry height="60" width="160" x="150" y="140" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-4" parent="1" style="shape=rect;rounded=1;fillColor=#F38020;fontColor=#000000;fontSize=10;strokeWidth=2;" value="Cloudflare Turnstile&#xa;CAPTCHA Verification&#xa;Site Key: 0x4AAA...8-l" vertex="1">
          <mxGeometry height="60" width="160" x="400" y="140" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-5" parent="1" style="shape=rect;rounded=1;fillColor=#24292F;fontColor=#FFFFFF;fontSize=10;strokeWidth=2;" value="GitHub Actions&#xa;zforge-site repo&#xa;OIDC Role: S3 Deployment&#xa;Triggers: push to main" vertex="1">
          <mxGeometry height="70" width="160" x="290" y="20" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-6" parent="1" style="shape=rect;rounded=1;fillColor=#24292F;fontColor=#FFFFFF;fontSize=10;strokeWidth=2;" value="GitHub Actions&#xa;contact-form-lambda repo&#xa;OIDC Role: Lambda Deploy&#xa;Triggers: push to main" vertex="1">
          <mxGeometry height="70" width="180" x="810" y="10" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-9" parent="1" style="outlineConnect=0;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.api_gateway;strokeWidth=2;" value="API Gateway (REST)&#xa;POST /prod&#xa;CORS enabled&#xa;ID: 99g8cebk9b" vertex="1">
          <mxGeometry height="78" width="78" x="450" y="380" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-10" parent="1" style="outlineConnect=0;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.lambda;strokeWidth=2;" value="Lambda Function&#xa;contact-form&#xa;Runtime: Node.js 18&#xa;Timeout: 30s" vertex="1">
          <mxGeometry height="78" width="78" x="710" y="380" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-12" parent="1" style="outlineConnect=0;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.simple_email_service;strokeWidth=2;" value="Amazon SES&lt;br&gt;Email sending" vertex="1">
          <mxGeometry height="78" width="78" x="970" y="380" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-13" parent="1" style="outlineConnect=0;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.identity_and_access_management;strokeWidth=2;" value="IAM Role&#xa;lambda-contact-form&#xa;Policies:&#xa;• Lambda Basic Execution&#xa;• SES SendEmail&#xa;• SSM ReadOnly" vertex="1">
          <mxGeometry height="78" width="78" x="710" y="600" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-16" parent="1" style="outlineConnect=0;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.cloudwatch;strokeWidth=2;" value="CloudWatch Logs&#xa;/aws/lambda/&#xa;contact-form" vertex="1">
          <mxGeometry height="78" width="78" x="450" y="560" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-17" edge="1" parent="1" source="dJxqMhgUhzbr0Nh0ujDD-2" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" target="dJxqMhgUhzbr0Nh0ujDD-3">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-18" edge="1" parent="1" source="dJxqMhgUhzbr0Nh0ujDD-3" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;fontSize=10;" target="dJxqMhgUhzbr0Nh0ujDD-7" value="HTTPS traffic">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-20" edge="1" parent="1" source="dJxqMhgUhzbr0Nh0ujDD-7" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;fontSize=10;strokeColor=#FF6B00;" target="dJxqMhgUhzbr0Nh0ujDD-9" value="POST /prod&#xa;(form submission)">
          <mxGeometry relative="1" x="0.0071" y="29" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="350" y="419" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-21" edge="1" parent="1" source="dJxqMhgUhzbr0Nh0ujDD-9" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;fontSize=10;strokeColor=#FF6B00;" target="dJxqMhgUhzbr0Nh0ujDD-10" value="Invoke">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-22" edge="1" parent="1" source="dJxqMhgUhzbr0Nh0ujDD-10" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;fontSize=10;strokeColor=#0066CC;" target="dJxqMhgUhzbr0Nh0ujDD-11" value="Get secret">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-23" edge="1" parent="1" source="dJxqMhgUhzbr0Nh0ujDD-10" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;fontSize=10;strokeColor=#0066CC;dashed=1;" target="dJxqMhgUhzbr0Nh0ujDD-4" value="Verify token&#xa;via HTTPS API">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="749" y="320" />
              <mxPoint x="490" y="320" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-24" edge="1" parent="1" source="dJxqMhgUhzbr0Nh0ujDD-10" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;fontSize=10;strokeColor=#0066CC;" target="dJxqMhgUhzbr0Nh0ujDD-12" value="Send email">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-25" edge="1" parent="1" source="dJxqMhgUhzbr0Nh0ujDD-10" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;fontSize=10;dashed=1;" target="dJxqMhgUhzbr0Nh0ujDD-16" value="Logs">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="600" y="419" />
              <mxPoint x="600" y="599" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-26" edge="1" parent="1" source="dJxqMhgUhzbr0Nh0ujDD-10" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;fontSize=10;dashed=1;" target="dJxqMhgUhzbr0Nh0ujDD-13" value="Assumes role">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="749" y="680" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-27" edge="1" parent="1" source="dJxqMhgUhzbr0Nh0ujDD-5" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;fontSize=10;strokeColor=#24292F;" target="dJxqMhgUhzbr0Nh0ujDD-15" value="Assumes via OIDC">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="380" y="599" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-28" edge="1" parent="1" source="dJxqMhgUhzbr0Nh0ujDD-5" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;fontSize=10;strokeColor=#24292F;" target="dJxqMhgUhzbr0Nh0ujDD-8" value="Deploy files">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="230" y="520" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-29" edge="1" parent="1" source="dJxqMhgUhzbr0Nh0ujDD-6" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;fontSize=10;strokeColor=#24292F;" target="dJxqMhgUhzbr0Nh0ujDD-14" value="Assumes via OIDC">
          <mxGeometry relative="1" x="-0.0542" y="61" as="geometry">
            <mxPoint as="offset" />
          </mxGeometry>
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-30" edge="1" parent="1" source="dJxqMhgUhzbr0Nh0ujDD-6" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;fontSize=10;strokeColor=#24292F;" target="dJxqMhgUhzbr0Nh0ujDD-10" value="Update function code">
          <mxGeometry relative="1" x="0.2429" y="-20" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="1060" y="280" />
              <mxPoint x="850" y="280" />
              <mxPoint x="850" y="419" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-44" connectable="0" parent="1" style="group" value="" vertex="1">
          <mxGeometry height="140" width="300" x="20" y="820" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-31" parent="dJxqMhgUhzbr0Nh0ujDD-44" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;align=left;verticalAlign=top;fontSize=12;fontStyle=1;" value="Legend" vertex="1">
          <mxGeometry height="140" width="300" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-32" edge="1" parent="dJxqMhgUhzbr0Nh0ujDD-44" style="endArrow=block;html=1;strokeWidth=2;strokeColor=#000000;fillColor=#000000;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="20" y="30" as="sourcePoint" />
            <mxPoint x="70" y="30" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-33" parent="dJxqMhgUhzbr0Nh0ujDD-44" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" value="User request flow" vertex="1">
          <mxGeometry height="20" width="150" x="80" y="20" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-34" edge="1" parent="dJxqMhgUhzbr0Nh0ujDD-44" style="endArrow=block;html=1;strokeWidth=2;strokeColor=#FF6B00;fillColor=#FF6B00;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="20" y="60" as="sourcePoint" />
            <mxPoint x="70" y="60" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-35" parent="dJxqMhgUhzbr0Nh0ujDD-44" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" value="Contact form API flow" vertex="1">
          <mxGeometry height="20" width="150" x="80" y="50" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-36" edge="1" parent="dJxqMhgUhzbr0Nh0ujDD-44" style="endArrow=block;html=1;strokeWidth=2;strokeColor=#0066CC;fillColor=#0066CC;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="20" y="90" as="sourcePoint" />
            <mxPoint x="70" y="90" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-37" parent="dJxqMhgUhzbr0Nh0ujDD-44" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" value="Lambda integrations" vertex="1">
          <mxGeometry height="20" width="150" x="80" y="80" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-38" edge="1" parent="dJxqMhgUhzbr0Nh0ujDD-44" style="endArrow=block;html=1;strokeWidth=2;strokeColor=#24292F;fillColor=#24292F;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="20" y="120" as="sourcePoint" />
            <mxPoint x="70" y="120" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-39" parent="dJxqMhgUhzbr0Nh0ujDD-44" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" value="CI/CD deployment flow" vertex="1">
          <mxGeometry height="20" width="150" x="80" y="110" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-45" connectable="0" parent="1" style="group" value="" vertex="1">
          <mxGeometry height="140" width="760" x="420" y="820" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-40" parent="dJxqMhgUhzbr0Nh0ujDD-45" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;align=left;verticalAlign=top;fontSize=12;fontStyle=1;" value="Key Features" vertex="1">
          <mxGeometry height="140" width="760" as="geometry" />
        </mxCell>
        <mxCell id="dJxqMhgUhzbr0Nh0ujDD-41" parent="dJxqMhgUhzbr0Nh0ujDD-45" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=top;whiteSpace=wrap;rounded=0;fontSize=10;" value="• Security: OIDC for GitHub Actions (no long-term credentials), Turnstile CAPTCHA, origin validation, honeypot field&#xa;• Static Site: CloudFront CDN with OAC for private S3, custom SSL certificate from ACM&#xa;• Contact Form: API Gateway → Lambda → SES email sending, rate limiting on API Gateway&#xa;• Secrets: Parameter Store (SecureString) for Turnstile secret key, accessed by Lambda at runtime&#xa;• CI/CD: Automated deployments via GitHub Actions - static site to S3, Lambda function code updates&#xa;• Monitoring: CloudWatch Logs for Lambda execution, SES sending metrics&#xa;• Cost: Free tier eligible (S3, CloudFront, Lambda, SES sandbox limits sufficient for portfolio site)" vertex="1">
          <mxGeometry height="110" width="740" x="10" y="25" as="geometry" />
        </mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
