<svg xmlns="http://www.w3.org/2000/svg" width="960" height="430" viewBox="0 0 960 430" role="img" aria-labelledby="title desc">
<title id="title">Full-stack application request flow</title><desc id="desc">A browser reaches the nginx ingress. The frontend host routes to React served by nginx, while the API host routes to FastAPI. The browser makes the cross-origin API request and FastAPI permits the frontend origin through CORS.</desc>
<defs><marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto"><path d="M0 0L10 5L0 10z" fill="#3976a8"/></marker></defs><rect width="960" height="430" rx="24" fill="#f4f9fd"/><g font-family="system-ui,sans-serif" fill="#15304a"><rect x="45" y="165" width="150" height="100" rx="18" fill="#fff" stroke="#3976a8" stroke-width="4"/><text x="120" y="208" text-anchor="middle" font-size="22" font-weight="700">Browser</text><text x="120" y="237" text-anchor="middle" font-size="14">user interface</text><rect x="310" y="165" width="180" height="100" rx="18" fill="#fff" stroke="#3976a8" stroke-width="4"/><text x="400" y="208" text-anchor="middle" font-size="22" font-weight="700">Ingress</text><text x="400" y="237" text-anchor="middle" font-size="14">host routing</text><rect x="640" y="55" width="250" height="110" rx="18" fill="#fff" stroke="#087f5b" stroke-width="4"/><text x="765" y="98" text-anchor="middle" font-size="22" font-weight="700">Frontend</text><text x="765" y="128" text-anchor="middle" font-size="14">nginx serves React</text><rect x="640" y="270" width="250" height="110" rx="18" fill="#fff" stroke="#087f5b" stroke-width="4"/><text x="765" y="313" text-anchor="middle" font-size="22" font-weight="700">Backend</text><text x="765" y="343" text-anchor="middle" font-size="14">FastAPI + CORS</text></g><g stroke="#3976a8" stroke-width="5" fill="none" marker-end="url(#arrow)"><path d="M195 215H300"/><path d="M490 195C560 195 560 110 630 110"/><path d="M490 235C560 235 560 325 630 325"/></g><g font-family="system-ui,sans-serif" font-size="13" fill="#547086"><text x="525" y="120">simple-app.test</text><text x="520" y="350">api.simple-app.test</text></g></svg>