I built a free audit tool that runs 12 checks in parallel against any domain. Here is the architecture. The article describes the architecture of Canopy Guard, a free website audit tool built by the author that runs 12 parallel checks on any domain, combining SEO, AEO, and GEO visibility scoring with a security posture assessment. The backend uses a Node.js Express server on Railway with TypeScript, while the frontend is a React app on Vercel, executing all scan modules simultaneously via `Promise.all` to produce a single report in about 15 seconds. Each module checks specific aspects like DNS resolution, TLS, security headers, HTML structure, schema markup, and AI crawl risk, with results normalized into 0-1 scores for visibility and security. I spent the past few months building Canopy Guard, a free website audit tool that combines SEO, AEO, and GEO visibility scoring with a full security posture check. One scan, one report, about 15 seconds. This is the technical breakdown of how it works. The problem I audit websites for clients as part of my regular work. Every engagement started with the same routine: run the site through an SEO checker, then a separate security header scanner, then manually check for structured data, then look at robots.txt. Four tools, four tabs, four different report formats, and none of them cross-referenced their findings. I wanted a single scan that checked everything and surfaced the gaps between visibility and security. Architecture The backend is a Node.js Express server written in TypeScript, deployed on Railway. The frontend is a React app on Vercel. When a user enters a domain, the frontend POSTs to /api/scan on the Railway backend. The backend runs 12 scan modules in parallel using Promise.all: const dns, tls, headers, htmlStructure, schema, qa, geo, crawlRisk, endpoints, links, vulns, bizLogic = await Promise.all checkDNS domain , checkTLS domain , checkSecurityHeaders domain , checkHTMLStructure domain , checkSchemaMarkup domain , checkQADensity domain , checkGEO domain , checkAICrawlRisk domain , checkExposedEndpoints domain , checkInternalLinking domain , checkVulnerabilities domain , checkBusinessLogic domain , ; Each module is an async function that fetches specific data from the target domain and returns structured results. The scan modules DNS: Resolves the domain via Google's public DNS API dns.google/resolve . Returns whether the domain resolves and the IP address. TLS: Checks HTTPS reachability, HSTS header presence and max-age value, and whether HTTP redirects to HTTPS. Security Headers: Checks for all six critical headers: Content-Security-Policy, Strict-Transport-Security, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, and Permissions-Policy. HTML Structure: Fetches the full page HTML and parses it for H1 count, meta description presence and length, canonical URL match, and page title. Schema Markup: Extracts all blocks, parses them, identifies FAQPage and Organization types, and flags structural errors like missing @context.