Skip to main content

sameness

Do the pages of one site look like one template?

Detectors for the AI look score one page at a time: the purple gradient, Inter, three feature cards. But when people are asked what gives a machine-made site away, the two answers at the top are not features. In a Reddit corpus of 3,033 on-topic comments, "screams AI" (6.4%) and "they all look the same" (6.1%) each beat every specific feature; purple, gradients, animations and glass together add up to about 7%. Sameness is a property of a set of pages. sameness compares the pages of one site with each other.

pip install git+https://github.com/tsurutanmen/sameness

No dependencies. Python 3.9 or later.

Thirty seconds

$ sameness tests/fixtures/clone_*.html

4 pages

sameness    1.00   mean similarity of the content skeleton across page pairs (1 = one template)
shells      1      distinct header/nav/footer structures (1 = one site)
palette     1.00   mean overlap of hex colours between pages (1 = one palette)

near-clones (content skeleton >= 90% similar):
  clone_0.html  ~  clone_1.html  ~  clone_2.html  ~  clone_3.html

same meta description on several pages:
    4 page(s)  "One platform to elevate your workflow."

headings that appear on several pages (outside header/nav/footer):
    4x  Ready?

page           words emoji grad   sym  repeated blocks
clone_0.html      36     0    0   3x3  cardx3
...
note: pages share one content skeleton; a reader will see one template with the words swapped
note: 4 pages reuse a meta description; search results will show the same sentence for each

Or crawl a live site, same host only, linked stylesheets included:

sameness --site https://example.com --max 20

What it measures

line meaning
sameness Mean similarity of the content skeleton (the tag sequence of the page with header, nav and footer removed) over all page pairs. 1.00 means every page is the same template.
near-clones Groups of pages whose content skeletons are at least 90% similar. Pages of one kind (articles, product pages) are expected to share a skeleton; the question is whether pages of different kinds do too.
shells Number of distinct header/nav/footer structures. A site has one. When it has four, the pages do not read as one place, which is the opposite failure and just as visible.
font sets, palette Fonts declared and hex colours used, per page and their overlap across pages.
same meta description, same <title> Copy reused across pages, usually a default that was never replaced.
sym Perfectly symmetric blocks on a page: 3x3 means three lists of exactly three items.
--pairs The full pairwise table: skeleton similarity, shared headings, shared repeated block classes.

Everything comes from the markup and the stylesheet text. Nothing is rendered, so layout that only exists after JavaScript runs is not seen.

Two real sites

A 15-page site of ours that had been built in four sittings. No page-level detector complained; the Tell Score was A or B on every page. sameness reported:

sameness    0.26
shells      8      distinct header/nav/footer structures (1 = one site)
palette     0.26
font sets:  5
note: 8 different shells on one site: the pages do not read as one place

That was the finding a reader had already made ("it looks like four different sites"), now as a number. The other direction, a small research site with one shell:

sameness    0.51
shells      1
palette     1.00
near-clones: the six research notes share one article skeleton
same meta description on several pages:  2 page(s)  "aaaaaaaaaaaaaa"

The near-clones are articles and are supposed to look alike. The placeholder description was real and had been missed.

Python

import sameness

pages = [sameness.extract(html, name=url) for url, html in docs]
rep = sameness.compare(pages)
print(rep)
rep.to_dict()                      # everything, JSON-serialisable

for p in rep.pairs:                # pairwise numbers
    print(p.a, p.b, p.skeleton, p.headings, p.classes)

for url, html, css in sameness.crawl("https://example.com", max_pages=20):
    ...

Claude Code skill

skill/sameness/SKILL.md tells Claude Code to run this after building or editing more than one page of a site, and how to read the result. Install by copying the folder:

cp -r skill/sameness ~/.claude/skills/sameness

Related tools

Per-page detectors, which this complements rather than replaces: ai-design-tells (Tell Score, 27 tells), avoid-ai-design (a rewrite skill), vibecoded-audit (49 tells, crawls but scores per page). The Reddit corpus is from vibecoded-design-tells.

License

MIT.

Metadata

Release files for sameness 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sameness 0.1.0
File Size Uploaded
sameness-0.1.0.tar.gz 14.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for sameness 0.1.0
File Interpreter ABI Platform
sameness-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 28.2 kB

Release files / sameness-0.1.0.tar.gz

Download URL sameness-0.1.0.tar.gz
Size 14.7 kB
Tags Source
SHA-256 checksum
How to use checksums
974f86525c996d3a482e31e55d082e9c568bb3f36ba6836c04785d593632b395
BLAKE2b-256 checksum
How to use checksums
11dae4bf5461a256d6cb32b83a816387fc7e7a0e86f6fa83662284195e0f3a23
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 13, 2026.

Transparency log

Release files / sameness-0.1.0-py3-none-any.whl

Download URL sameness-0.1.0-py3-none-any.whl
Size 13.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a2bb4b19ec3cd3b8dd6b0cebc744333188cd7179978e31a4419a3f2d81b6a9e8
BLAKE2b-256 checksum
How to use checksums
273ac63b6cfe84c427764649c3ef077a900d0ee77645c60b53eaf7c4703d29ec
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 13, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page