Back to blog
Audit Log

We Ran AIOS Analyzer on Itself. The Score Was 32. Here Is What We Fixed.

A Machine Trust Score of 32 out of 100 means AI search engines can find your domain but cannot read, parse, or cite your content with confidence. That was the score AIOS Analyzer returned when we pointed the platform at aiosanalyzer.com — our own domain. After applying five fixes in a single session, the score moved to 90. This is the audit log: what the diagnostic found, why it happened, and the specific technical changes that resolved each failure.

What a score of 32 actually means

AIOS Analyzer calculates the Machine Trust Score across two axes. Visibility covers whether AI crawlers can access and parse the site. Credibility covers whether the content is dense and structured enough to cite. A score in the low 30s typically indicates a Visibility failure — the infrastructure is blocking AI engines from reading content that may otherwise be credible.

Our credibility signals were reasonable: the site had Organization and FAQPage JSON-LD schema in the <head>, a valid robots.txt explicitly permitting Gemini (Google-Extended), ChatGPT (GPTBot), Perplexity (PerplexityBot), Anthropic (anthropic-ai), and Cohere (cohere-ai). The content quality was not the problem.

The Visibility score was pulling the composite down to 32. The reason was architectural.

The root cause: a React SPA with a JS-gated redirect

aiosanalyzer.com is a React single-page application served by a Node/Express backend. When an unauthenticated visitor hits /, the server returns a 200 response with an HTML document containing exactly one line of meaningful body content:

<div id="root"></div>

React boots, checks authentication status, and redirects unauthenticated users to the marketing site via window.location.href. In a browser, this is seamless. For an AI crawler — which fetches the raw HTTP response and does not execute JavaScript — the page is empty.

What crawlers saw at aiosanalyzer.com: a <head> with schema and meta tags, a body with 11 characters of content. Zero paragraphs. Zero headings. Nothing to cite.

The blog content (/blog, /blog/*) had the same problem. The Express server was returning 302 Found with a Location header pointing to aiosanalyzer.com — a Replit-assigned URL with no custom domain and no brand authority. Crawlers that followed the redirect indexed the content under a .replit.app subdomain, not under aiosanalyzer.com.

The five fixes applied

Fix 1 — Static HTML pre-render inside <div id="root">

React replaces the contents of <div id="root"> on mount. Crawlers read the HTML before JavaScript executes. The fix was to populate <div id="root"> with a complete, structured HTML document using the real copy from the marketing site: the hero headline, the six assessment dimensions, the AIOS SPOTLIGHT and AIOS ENSEMBLE product descriptions, the Prashant Gokhale founder section, the SparkToro 58.5% stat with source link, and three blog post excerpts with links. When the marketing site proxy was not yet in place, this was the only crawlable content at the domain. It ensured Visibility regardless of JS execution.

Fix 2 — Replace /blog 302 redirects with a server-side proxy

The original Express server had three redirect routes registered before any other logic:

app.get("/blog", (_req, res) => res.redirect(302, "https://aiosanalyzer.com/blog"));
app.get("/blog/*", (req, res) => res.redirect(302, `https://aiosanalyzer.com/blog${rest}`));

These were replaced with a proxy (server/marketing-proxy.ts) that fetches the Next.js rendered response from aiosanalyzer.com and returns it directly under the aiosanalyzer.com domain — rewriting any hardcoded aiosanalyzer.com references in the HTML before serving. The result: aiosanalyzer.com/blog, aiosanalyzer.com/blog/google-ai-search-guide, and the other articles now return full server-rendered HTML with their own <title>, canonical tags pointing to aiosanalyzer.com, and complete body content — all served authoritatively from the brand domain.

The same proxy pattern was applied to / for unauthenticated requests, so crawlers landing on the home page receive the full Next.js marketing page rather than the empty React shell.

Fix 3 — Content freshness signals corrected

All three freshness signals were out of date, pointing to May 2026 rather than the current date:

  • dateModified in two JSON-LD blocks in <head> — updated to 2026-06-01
  • article:modified_time Open Graph tag — updated to 2026-06-01
  • <lastmod> in sitemap.xml — updated to 2026-06-01
  • Last-Modified HTTP header on HTML responses — added: Mon, 01 Jun 2026 00:00:00 GMT

Perplexity weights dateModified recency heavily when ranking sources for inclusion. Stale dates suppress citation probability even when content quality is high.

Fix 4 — JavaScript-gating removed from the marketing site animations

The Next.js marketing site used framer-motion with hidden: { opacity: 0 } as the initial animation state. Next.js applies initial variant styles during SSR, which meant the server was sending HTML with every content element styled invisible. A plain bot fetch of the marketing pages saw a full HTML structure with all text set to opacity: 0 in inline styles. The fix removed opacity: 0 from every hidden animation variant across all five pages, so the SSR HTML delivers content at full opacity. Slide and scale animations still play client-side via the visible variant transition.

Fix 5 — Schema graph expanded

The JSON-LD in <head> was updated from individual schema blocks to a single @graph array containing Organization, WebSite, and WebPage nodes with explicit @id references connecting them. A viewport meta tag was added. The FAQPage schema on the home page was expanded from two entries to four, each structured as a direct question-answer pair rather than statements.

What drove the score from 32 to 90

Three signals accounted for most of the Visibility gap:

SignalBeforeAfter
Crawlable body content at /11 characters (<div id="root"></div>)~1,400 words of structured HTML
Blog content domain authorityIndexed under .replit.app (no brand weight)Served under aiosanalyzer.com
Content freshness (dateModified)May 2026 — staleJune 2026 — current
Marketing page opacity (SSR)opacity: 0 on all content elementsFull opacity in server HTML
Machine Trust Score32 / 10090 / 100 — Elite

The robots.txt configuration was already correct and needed no changes. The schema in <head> was already present and valid. The platform was signalling correctly to crawlers that it wanted to be indexed — it was simply returning no content for them to index.

Why this matters beyond the score

The ghost citation risk for a product like AIOS Analyzer is particularly high. AI engines encounter the brand name in third-party coverage, marketing materials, and training data. Without a crawlable authoritative source to cite, they mention the brand in answers but link to a review site, a directory, or a competitor's comparison page instead. The brand appears in the AI's response; the traffic goes elsewhere.

Every fix above directly addresses one or more of the signals that determine whether an AI engine links to your domain or merely mentions your name.

The tool used to diagnose and fix this

The fixes were identified from an AIOS Analyzer audit of aiosanalyzer.com and implemented with Replit Agent — an AI software engineer embedded in the Replit development environment. The agent read the audit checklist, traced the problem to the Express routing layer and the React SPA architecture, built the proxy module, updated the static pre-render, and corrected the freshness metadata in a single session.

The turnaround from audit output to deployed fix was under two hours.

What to do if your site has a similar problem

If your Machine Trust Score is below 40 and your Credibility signals look reasonable, the likely cause is a Visibility failure in one of three places:

  • JavaScript-rendered content — your meaningful page content renders after JS executes. Crawlers see the skeleton. Fix: add a static pre-render or use server-side rendering.
  • Redirect chains off-domain — your canonical domain redirects crawlers to a subdomain or third-party URL that has no brand authority. Fix: proxy the content rather than redirecting.
  • Stale freshness metadatadateModified, Last-Modified, and sitemap lastmod are out of date. Fix: update them and keep them current with each content change.

Run your audit at aiosanalyzer.com/scan.

Find out where you actually stand

How does your brand appear to AI systems right now?

AIOS Analyzer audits how LLMs see your brand — what they know, what they get wrong, and where your competitors are being named instead of you.

Book a Discovery Call