Skip to main content

Design Review

When to use: Before shipping any page. During design critiques. Weekly self-audits. When reviewing someone else's work.

The test: Can you answer "why" for every element on the page?


The 5-Question Audit

Before any detailed review, answer these five. If you can't answer all five, the page isn't ready for detailed review.

#QuestionWhat a Good Answer Looks Like
1Who is this for?A specific person, not "everyone"
2What do they need to know?One essential piece of information
3What do they need to do?One clear action
4Why should they trust us?Specific proof (testimonial, logo, number)
5What's stopping them?The real objection, not the stated one

First Impression

Look at the page cold. No context. Answer immediately:

  • Can you state what this page is about in one sentence?
  • Can you name the target audience?
  • Can you identify the single primary action?
  • Can you summarize the page message without scrolling?
  • Can you describe the intended feeling in one word?

Measurement

CheckThresholdHow to Measure
Five-second test5/5 people identify purpose, audience, actionTest with 5 real people who haven't seen it
First meaningful contentVisible within 1.5s (FCP)Lighthouse
Above-fold valueFull value proposition visible without scrollingLoad page at 768px viewport height

Message Clarity

Is It Clear?

  • Ask 3 people to restate the page's message -- do all 3 match your intent?
  • Can you state the one takeaway in under 10 words?
  • Zero terms used without definition or link
  • Removing any sentence still communicates the core message
  • Zero repeated ideas across sections (search for synonym overlap)

Is It Necessary?

  • Every section earns its place (removing it would lose something)
  • No element pulls attention from the primary goal
  • Missing this section would change the outcome
  • Removing it wouldn't go unnoticed

Visual Design Pass

Hierarchy

CheckQuestionPass If
DominanceWhat matters most here?One element is 1.5x+ larger than everything else per viewport
OrderWhy are things in this order?Sections match: problem before solution, proof before CTA
ClarityCan you see hierarchy at 25% zoom?Screenshot at 25%: 3+ distinct size tiers visible
ImportanceHow would someone know what's important?Important elements are largest, highest-contrast, or topmost

Elements

For each element on the page, ask:

  • Can you name the specific problem this element solves?
  • Does removing this element break the page's goal?
  • Is the format optimal? (data = table, process = diagram, emotion = image)
  • Does every edge align to the grid? (DevTools: check for sub-pixel misalignment)

User Flow Pass

Actions

  • Every link/button leads to content that delivers on its label
  • Each scroll-length contains at least one new idea, proof point, or CTA
  • At the bottom of every viewport, the next action is visible
  • Every button label describes what will happen ("Save draft" not "OK")
  • After every action, a visible confirmation appears within 200ms

Friction

  • Ask 3 people: "Where would you leave?" -- fix every point they name
  • Each step requires fewer decisions than the previous step
  • Ask 3 people to complete the goal -- zero hesitations longer than 5 seconds
  • Count clicks from landing to goal completion -- can you reduce by 1?

Review Workflow

Solo Review

PhaseDurationWhat to Do
Fresh eyes2 minLook at page cold, write first impressions
5-Question Audit3 minAnswer all five questions, note gaps
Message clarity5 minRead every word, check for redundancy and confusion
Visual hierarchy5 minSquint test, check focal points, scan headings only

Team Review

PhaseDurationWhat to Do
Context5 minDesigner presents intent (not execution)
Silent observation3 minEveryone looks at the page in silence
First impressions5 minEach person shares first impressions uninfluenced
Structured questions15 minWalk through 5-Question Audit as a group
Action items2 minDocument specific changes with owners

Critique Rules

  • Ask "why" before suggesting "what if"
  • Questions before solutions
  • Discuss intent before execution
  • One speaker at a time
  • Critique the work, not the person

Automated Audit Script

Run this in browser console for a quick technical audit:

(function designAudit() {
const results = { pass: [], fail: [], warn: [] };

// 1. Check contrast on text elements
document.querySelectorAll('p, h1, h2, h3, h4, span, a, li, td, th, label, button').forEach(el => {
const styles = getComputedStyle(el);
if (styles.color === styles.backgroundColor && el.textContent.trim()) {
results.fail.push(`Invisible text: "${el.textContent.substring(0, 40)}..."`);
}
});

// 2. Check images for alt text
const imgsWithoutAlt = document.querySelectorAll('img:not([alt])');
if (imgsWithoutAlt.length > 0) {
results.fail.push(`${imgsWithoutAlt.length} images missing alt text`);
} else {
results.pass.push('All images have alt text');
}

// 3. Check heading hierarchy
let lastLevel = 0;
let headingIssues = 0;
document.querySelectorAll('h1, h2, h3, h4, h5, h6').forEach(h => {
const level = parseInt(h.tagName[1]);
if (level > lastLevel + 1 && lastLevel !== 0) headingIssues++;
lastLevel = level;
});
if (headingIssues > 0) {
results.fail.push(`${headingIssues} skipped heading levels`);
} else {
results.pass.push('Heading hierarchy intact');
}

// 4. Check H1 count
const h1Count = document.querySelectorAll('h1').length;
if (h1Count !== 1) {
results.fail.push(`Found ${h1Count} H1 elements (expected 1)`);
} else {
results.pass.push('Single H1 present');
}

// 5. Check touch targets
document.querySelectorAll('a, button, input, select, textarea, [role="button"]').forEach(el => {
const rect = el.getBoundingClientRect();
if (rect.width > 0 && rect.height > 0 && (rect.width < 44 || rect.height < 44)) {
results.warn.push(`Small target (${Math.round(rect.width)}x${Math.round(rect.height)}): ${el.textContent.substring(0, 30) || el.tagName}`);
}
});

// 6. Check for horizontal overflow
if (document.documentElement.scrollWidth > document.documentElement.clientWidth) {
results.fail.push('Page has horizontal overflow');
} else {
results.pass.push('No horizontal overflow');
}

// 7. Check links without accessible names
document.querySelectorAll('a[href]').forEach(a => {
const name = a.textContent.trim() || a.getAttribute('aria-label') || a.getAttribute('title');
if (!name) {
results.fail.push(`Link without accessible name: ${a.href.substring(0, 50)}`);
}
});

// Output
console.log('%c DESIGN AUDIT RESULTS', 'font-size: 16px; font-weight: bold;');
console.log(`%c PASS (${results.pass.length})`, 'color: green; font-weight: bold;');
results.pass.forEach(r => console.log(`${r}`));
console.log(`%c FAIL (${results.fail.length})`, 'color: red; font-weight: bold;');
results.fail.forEach(r => console.log(`${r}`));
console.log(`%c WARN (${results.warn.length})`, 'color: orange; font-weight: bold;');
results.warn.forEach(r => console.log(` ! ${r}`));
})();

Anti-Patterns in Feedback

Bad FeedbackBetter Question
"I don't like it""What problem does this element solve?"
"Make it pop""What should draw attention first?"
"It feels off""What's competing for attention?"
"Users won't get it""What might confuse someone at this step?"
"We need more""What information is missing for the decision?"
"Can we make it bigger?""What's the hierarchy of importance here?"

Quick Reference Card

Print this for reviews:

FIRST LOOK (30 sec)
[ ] What is it?
[ ] Who's it for?
[ ] What do I do?

MESSAGE (2 min)
[ ] Is it clear?
[ ] Is it necessary?
[ ] Is it simple?

VISUAL (2 min)
[ ] What's most important?
[ ] Why this order?
[ ] Why this element?

FLOW (2 min)
[ ] Worth a click?
[ ] Obvious next step?
[ ] Why would someone leave?

TECHNICAL (2 min)
[ ] Does it render correctly?
[ ] Is it accessible?
[ ] Is it fast?

Context