Website Analyzer logo

Website Analyzer

Community
luongnv89
website-analyzer

Analyze a website's UI/UX, category, style, performance, surface security, and SEO; emit structured JSON. Use for URL audits or website-cloner input. Don't use for penetration tests, full SEO audits, or App Store ASO.

Overview

Publisherluongnv89
Repositoryskills
Skill namewebsite-analyzer
Stars
124
Forks
18
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by luongnv89 on GitHub. Read the source before you install it.

Installation

Install the Website Analyzer AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/luongnv89/skills.git /tmp/skills
mkdir -p .claude/skills
cp -r /tmp/skills/skills/website-cloner/website-analyzer .claude/skills/website-analyzer
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Website Analyzer in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Website Analyzer on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Website Analyzer is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Website Analyzer

Analyzes any website URL across 6 dimensions and produces structured JSON output for downstream skills in the website-cloner suite.

When to Use

Trigger when the user asks to:

  • Analyze, audit, or scan a website
  • Get a performance, SEO, security, or UI/UX assessment of a URL
  • Understand a website's structure, style, or category

Do not use for full penetration testing, deep security audits, or App Store ASO.

Prerequisites

  1. Require a valid http:// or https:// URL and an output path or stdout destination.
  2. Confirm page-fetch access is available; never bypass authentication, paywalls, or bot protections.
  3. When an output path is supplied, validate that its directory exists and is writable; skip this check for stdout.
  4. If any prerequisite fails, return a descriptive error with the failing input and corrective action.

Workflow

1. Fetch page content via WebFetch
2. Extract HTML structure, metadata, headings, links, images, scripts
3. Estimate performance metrics (LCP, CLS, TTFB, page weight, request count)
4. Run surface-level security checks
5. Score SEO across 5 weighted dimensions
6. Classify UI/UX layout, category, and style
7. Output structured JSON

Output

Produce structured JSON at the requested output path (or stdout):

json
{
  "url": "https://example.com",
  "timestamp": "2026-05-07T12:00:00Z",
  "ui_ux": {
    "layout": "single-column | two-column | grid | ...",
    "visual_hierarchy": "what draws attention first",
    "components": ["nav", "hero", "cta", "footer", ...],
    "responsive": "desktop-first | mobile-first | adaptive | unknown",
    "friction_points": ["slow nav", "missing CTA", ...]
  },
  "category": "saas-landing | portfolio | e-commerce | blog | docs | dashboard | ...",
  "category_confidence": 0.9,
  "style": {
    "typography": "brief description",
    "palette": ["#hex", ...],
    "spacing": "compact | comfortable | spacious",
    "motion": "minimal | moderate | heavy",
    "aesthetic": "vibe description"
  },
  "performance": {
    "lcp_estimate_seconds": 2.5,
    "cls_estimate": 0.05,
    "ttfb_estimate_seconds": 0.3,
    "total_page_weight_kb": 1200,
    "request_count": 45,
    "notes": "estimated from static analysis"
  },
  "security": {
    "https": true,
    "mixed_content": false,
    "security_headers": ["strict-transport-security", ...],
    "exposed_metadata": [],
    "note": "Surface-level check only. Not a full security audit."
  },
  "seo": {
    "score": 72,
    "title_tag": "present | missing | duplicate",
    "meta_description": "present | missing | too-short",
    "heading_structure": "h1:N h2:N ...",
    "alt_text_coverage": 0.85,
    "structured_data": "present | missing",
    "canonical_url": "present | missing",
    "robots_sitemap": "robots=ok | sitemap=found | ...",
    "dimension_scores": {
      "meta_tags": 80,
      "heading_structure": 60,
      "image_alt_text": 90,
      "structured_data": 50,
      "crawlability": 75
    }
  }
}

Step 1: Fetch the Page

Use WebFetch to retrieve content:

WebFetch(url=<url>, prompt="Extract all HTML structure, meta tags, headings, links, images, scripts, styles, and any structured data (JSON-LD, Open Graph, etc.)")

If WebFetch fails (4xx, 5xx, timeout), return immediately:

json
{"url": "<url>", "error": "unreachable", "detail": "<error>"}

For JS-heavy SPAs where WebFetch returns minimal content, note: {"note": "SPA detected — analysis based on crawlable content only; some metrics may be incomplete"}

Step 2: Extract Structure

From fetched content, extract:

  • <title>, <meta> tags (description, keywords, OG, Twitter)
  • Heading hierarchy (<h1><h6>)
  • Images with alt attributes
  • Link structure and count
  • Script/style count and sizes
  • JSON-LD structured data
  • Canonical URL
  • Robots meta tag

Step 3: Estimate Performance

MetricMethod
Page weightSum of referenced resource sizes; estimate image sizes from layout
Request countCount <img>, <link rel="stylesheet">, <script>, font refs
LCP (lcp_estimate_seconds)Inferred from above-fold content size; seconds, with a 0.5-second minimum for bare HTML
CLS (cls_estimate)Estimated from layout shift indicators (missing dimensions, late loaders); unitless
TTFB (ttfb_estimate_seconds)Inferred from hosting signals; seconds; static → low, dynamic → moderate

All metrics are estimates from static analysis. Note this in output.

Step 4: Security Check (Surface-Level Only)

Check:

  • HTTPS usage
  • Mixed content (HTTP resources on HTTPS page)
  • Security headers: HSTS, X-Content-Type-Options, X-Frame-Options, CSP
  • Exposed metadata (dev tools, debug endpoints, sensitive data in comments)

Always label as surface-level.

Step 5: SEO Scoring

Compute each dimension's 0–100 sub-score using the rubrics below, then combine with the weights to yield the overall seo.score. Round each sub-score to the nearest integer; the final score is round(Σ weight_i × sub_i).

DimensionWeightSub-score rubric (0–100)
Meta tags (title + description)20%Start at 0. +50 if <title> is present and 10–60 chars. +50 if <meta name="description"> is present and 50–160 chars. Subtract 25 each for: title outside 10–60, description outside 50–160, duplicate title across siblings (when crawlable). Floor at 0.
Heading structure15%100 if exactly one <h1> and at least one <h2>. 70 if exactly one <h1> but no <h2>. 40 if zero or multiple <h1>s. Subtract 20 if any heading level is skipped (e.g. h2 → h4). Floor at 0.
Image alt text coverage15%round(100 × non_empty_alt_count / total_img_count). If total_img_count == 0, report 100 (no images = no alt-text debt). Decorative images using alt="" count as "non-empty intent" only when paired with role="presentation"; otherwise count as missing.
Structured data20%100 if at least one valid JSON-LD block is present and parses (any schema). 60 if only Open Graph or Twitter Card meta tags are present (no JSON-LD). 30 if only microdata or RDFa. 0 if none.
Crawlability (canonical, robots, sitemap)30%Start at 0. +40 if a <link rel="canonical"> resolves to an absolute URL. +30 if robots.txt is fetchable and not Disallow: /. +30 if a sitemap is referenced (via robots.txt Sitemap: directive, <link rel="sitemap">, or a fetchable /sitemap.xml). Cap at 100.

When a sub-score cannot be computed (e.g. robots.txt unreachable), record the dimension as null in dimension_scores and exclude it from the weighted sum, redistributing its weight proportionally across the remaining dimensions. Note any nulls in seo.notes.

Step 6: UI/UX, Category, Style

  • Layout: Infer from HTML structure (divs, sections, nav, main, footer)
  • Category: saas-landing | portfolio | e-commerce | blog | docs | dashboard | marketing-site | web-app | other
  • Style: Typography, color palette, spacing density, motion indicators, aesthetic vibe

Edge Cases and Error Handling

FailureBehavior
Unreachable (4xx/5xx/timeout){"error": "unreachable"} — stop
JS-heavy SPANote limitation, proceed with crawlable content
Paywall / login{"error": "paywall"} — stop
Redirect loop{"error": "redirect-loop"} — stop
Empty page{"error": "empty"} — stop

Acceptance Criteria

Verify the expected output before reporting success:

  • JSON parses and contains url, timestamp, ui_ux, category, style, performance, security, and seo.
  • seo.score is an integer from 0 through 100 and matches the weighted, null-adjusted dimension calculation.
  • Performance estimates use lcp_estimate_seconds, unitless cls_estimate, ttfb_estimate_seconds, and total_page_weight_kb, plus an explicit static-analysis limitation.
  • Every unavailable measurement is null or an error field, never an invented value.
  • The output is written to the requested destination; assert the file exists and can be parsed when a path is supplied.

Step Completion Report

Emit this after analysis:

text
◆ Analyze Website
··································································
  Input fetched:        √ pass | × fail ([reason])
  Six dimensions:      √ pass | × partial ([missing])
  SEO calculation:     √ pass | × partial ([null dimensions])
  Output JSON:         √ pass ([path or stdout])
  Result:              PASS | PARTIAL | FAIL

Report PASS only when the JSON is valid and all six top-level dimensions are present; use PARTIAL for explicitly labeled crawlability gaps.

Frequently asked questions

What does the Website Analyzer AI skill do?

Analyze a website's UI/UX, category, style, performance, surface security, and SEO; emit structured JSON. Use for URL audits or website-cloner input. Don't use for penetration tests, full SEO audits, or App Store ASO.

Why use Website Analyzer on TypingMind?

Because you install it once and use it with any model. Website Analyzer is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Website Analyzer in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/luongnv89/skills/tree/main/skills/website-cloner/website-analyzer. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Website Analyzer?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Website Analyzer?

As many as you like. As long as a model supports skills, you can use Website Analyzer with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Website Analyzer AI skill free?

Yes. It is published on GitHub by luongnv89 under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇