
Page Cro
Run a fast structural conversion audit on a landing page HTML file or live URL before you spend on ads or ship a major page rewrite.
Install
npx skills add https://github.com/alirezarezvani/claude-skills --skill page-croWhat is this skill?
- Audits local HTML with --file or live pages with --url via urllib
- CROParser counts CTA-like buttons/links, form fields, and approximate above-the-fold element density
- Checks social proof markers, logo images, trust-language hints, and viewport meta for mobile readiness
- Supports --json output plus a no-args demo mode for quick smoke tests
- Python 3 CLI using html.parser—no browser automation required
Adoption & trust: 548 installs on skills.sh; 17.5k GitHub stars; 2/3 security scanners passed (skills.sh audits).
Recommended Skills
Journey fit
Landing validation is the canonical shelf because solo builders most often invoke CRO checks while proving a page converts—not after production is stable. The script targets HTML landing artifacts (CTAs, forms, above-fold density, trust cues), which maps directly to validate/landing page readiness.
Common Questions / FAQ
Is Page Cro safe to install?
skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.
SKILL.md
READMESKILL.md - Page Cro
#!/usr/bin/env python3 """ conversion_audit.py — CRO audit for HTML pages Usage: python3 conversion_audit.py --file page.html python3 conversion_audit.py --url https://example.com python3 conversion_audit.py --json python3 conversion_audit.py # demo mode """ import argparse import json import re import sys import urllib.request from html.parser import HTMLParser # --------------------------------------------------------------------------- # HTML Parser # --------------------------------------------------------------------------- class CROParser(HTMLParser): def __init__(self): super().__init__() self._depth = 0 self._above_fold_depth = 3 # approximate first screenful self._above_fold_elements = 0 self._total_elements = 0 self.buttons = [] # {"text": str, "position": int} self.links_as_cta = [] # a tags with CTA-like classes/text self.form_fields = 0 self.forms = 0 # Social proof self.testimonial_markers = 0 self.logo_images = 0 self.social_numbers = [] # "X customers", "X reviews", etc. # Trust signals self.ssl_mentions = 0 self.guarantee_mentions = 0 self.privacy_mentions = 0 # Viewport meta self.viewport_meta = False # Tracking state self._in_body = False self._above_fold_done = False self._body_element_count = 0 self._in_script = False self._in_style = False self._current_tag = None self._current_text = [] self._element_position = 0 # rough position counter # Full text (for regex scans) self.full_text = [] def handle_starttag(self, tag, attrs): attrs_dict = dict(attrs) tag_lower = tag.lower() if tag_lower == "script": self._in_script = True return if tag_lower == "style": self._in_style = True return if tag_lower == "body": self._in_body = True return if tag_lower == "meta": if attrs_dict.get("name", "").lower() == "viewport": self.viewport_meta = True if not self._in_body: return self._element_position += 1 # Buttons if tag_lower == "button": self._current_tag = "button" self._current_text = [] elif tag_lower == "input": input_type = attrs_dict.get("type", "text").lower() if input_type == "submit": val = attrs_dict.get("value", "Submit") self.buttons.append({"text": val, "position": self._element_position}) elif input_type not in ("hidden", "submit"): self.form_fields += 1 elif tag_lower == "textarea" or tag_lower == "select": self.form_fields += 1 elif tag_lower == "form": self.forms += 1 elif tag_lower == "a": cls = attrs_dict.get("class", "").lower() href = attrs_dict.get("href", "") cta_classes = {"btn", "button", "cta", "call-to-action", "signup", "register"} if any(c in cls for c in cta_classes): self._current_tag = "a_cta" self._current_text = [] elif tag_lower == "img": src = attrs_dict.get("src", "").lower() alt = attrs_dict.get("alt", "").lower() cls = attrs_dict.get("class", "").lower() if any(kw in src or kw in alt or kw in cls for kw in ("logo", "partner", "client", "badge", "seal", "award", "cert")): self.logo_images += 1 def handle_endtag(self, tag): tag_lower = tag.lower() if tag_lower == "script": self._in_script = False elif tag_lower == "style": self._in_style = False elif tag_lower == "button" and self._current_tag == "button":