From aaad67c7d7dd31acf91c20d53f0b891c718521d4 Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Sat, 12 Sep 2026 11:30:09 +0700 Subject: [PATCH 1/2] seo: harden Google site name signals --- site/index.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/site/index.html b/site/index.html index 2072bad..8a80467 100644 --- a/site/index.html +++ b/site/index.html @@ -37,7 +37,8 @@ "inLanguage": "en", "alternateName": [ "ArSonKuPik VST", - "Mas Ari Audio Enhancer" + "ArSonKuPik Audio Enhancer", + "arsonkupik.pages.dev" ] }, { From e04b6a7a81e1e54ff002dcceeeb17211585ecc0d Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Sat, 12 Sep 2026 11:30:48 +0700 Subject: [PATCH 2/2] test: lock ArSonKuPik site name contract --- tools/validate-seo.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/tools/validate-seo.py b/tools/validate-seo.py index 1583c3f..481acc6 100644 --- a/tools/validate-seo.py +++ b/tools/validate-seo.py @@ -14,6 +14,8 @@ ROOT = "https://arsonkupik.pages.dev/" SOCIAL = ROOT + "assets/arsonkupik-guide-social-1200x630.png" WEBSITE_ID = ROOT + "#website" +SITE_NAME = "ArSonKuPik" +SITE_NAME_ALTERNATES = ["ArSonKuPik VST", "ArSonKuPik Audio Enhancer", "arsonkupik.pages.dev"] NS = "http://www.sitemaps.org/schemas/sitemap/0.9" PAGES = [ @@ -180,8 +182,9 @@ def validate_page(root: Path, spec, global_types: Counter[str]) -> None: } for key, expected in expected_props.items(): require(one(parser.props.get(key, []), key, url) == expected, f"{key} mismatch: {url}") - for key in ("og:title", "og:description", "og:image:alt", "og:site_name", "og:locale"): + for key in ("og:title", "og:description", "og:image:alt", "og:locale"): require(bool(one(parser.props.get(key, []), key, url)), f"empty {key}: {url}") + require(one(parser.props.get("og:site_name", []), "og:site_name", url) == SITE_NAME, f"og:site_name mismatch: {url}") expected_meta = { "twitter:card": "summary_large_image", @@ -196,6 +199,17 @@ def validate_page(root: Path, spec, global_types: Counter[str]) -> None: global_types.update(types) require(required_types.issubset(types), f"schema {sorted(required_types)} missing at {url}; got {sorted(types)}") + website_nodes = nodes_of_type(parser.json_ld, "WebSite") + if url == ROOT: + require(len(website_nodes) == 1, f"expected one WebSite node on homepage, got {len(website_nodes)}") + website = website_nodes[0] + require(website.get("@id") == WEBSITE_ID, "WebSite @id mismatch") + require(website.get("url") == ROOT, "WebSite url mismatch") + require(website.get("name") == SITE_NAME, "WebSite name mismatch") + require(website.get("alternateName") == SITE_NAME_ALTERNATES, "WebSite alternateName preference mismatch") + else: + require(not website_nodes, f"WebSite entity must only exist on the domain root: {url}") + for node in nodes_of_type(parser.json_ld, "WebPage"): is_part_of = node.get("isPartOf") require( @@ -301,7 +315,7 @@ def main() -> int: print( "[PASS] 14 canonical pages satisfy P0 indexing/runtime guards and P1/P2 " - "metadata, schema, social-image, sitemap and release contracts." + "metadata, schema, site-name, social-image, sitemap and release contracts." ) return 0