Live work · AI Website Audit Tool
AI Website Audit Tool.
Tells any business in 20 seconds why their site isn't converting.
Tells any business in 20 seconds why their site isn't converting and what to fix. Free, full report by email. (Scores eight quality dimensions against PageSpeed.)
Demo · Try it
See it in action.
This is the actual live tool, embedded. Try it.
I · About
I built this because most site-audit tools either push you into a sales funnel or hand you a 200-row CSV that nobody reads. This one runs in 20 seconds, scores eight dimensions, and writes plain-English fixes. Scoring is deterministic: rule-based checks against the scraped page and Google PageSpeed metrics, so the same site always gets the same score. The LLM's only job is the part that needs judgment, turning the findings into prioritized, plain-English recommendations.
II · How it works
The pipeline.
- 01User submits any URL through the input field
- 02Server fetches and parses the homepage HTML
- 03Google PageSpeed Insights API runs on the URL for performance and mobile metrics
- 04Rule-based scorers grade eight dimensions: speed, mobile, SEO, content, trust, accessibility, security, social
- 05Llama 3.3 70B (via Groq) turns the findings into prioritized fix recommendations, parsed from JSON
- 06The report renders in the browser and a full version goes out by email
III · Sample
The real recommendation call, from src/lib/analyzer.ts.
const res = await fetch(GROQ_API, {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.GROQ_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'llama-3.3-70b-versatile',
messages: [
{ role: 'system', content: 'You are a website optimization expert. Return only valid JSON arrays.' },
{ role: 'user', content: prompt },
],
temperature: 0.3,
max_tokens: 1500,
}),
});
if (!res.ok) throw new Error(`Groq ${res.status}`);
const data = await res.json();
const content = data.choices[0].message.content.trim();
const jsonMatch = content.match(/\[[\s\S]*\]/);
return JSON.parse(jsonMatch ? jsonMatch[0] : content);