From 2c2e628097c13297eadee43b0f2932c3abd8c034 Mon Sep 17 00:00:00 2001 From: Nish <257724087+nish3451@users.noreply.github.com> Date: Tue, 11 Aug 2026 03:58:11 +0530 Subject: [PATCH 1/2] fix(public): disambiguate Tiny Studio identity across every public page and llms.txt PR #29 fixed only the homepage. Google AI Overviews can surface any tinystudio.in page, so the Organization entity on the other 11 public pages and the AI-facing llms.txt now carry the same identity statement: Tiny Studio is the independent product company at tinystudio.in behind Promptly, Drishti, and 0509 and is not affiliated with any other app or studio using the name. Keeps the generator template in prepare-static-site-bundle.mjs in sync with the committed llms.txt. --- public/contact/index.html | 4 +++- public/drishti/index.html | 4 +++- public/drishti/privacy/index.html | 4 +++- public/drishti/support/index.html | 4 +++- public/llms.txt | 2 +- public/privacy-choices/index.html | 4 +++- public/privacy/index.html | 4 +++- public/promptly/index.html | 4 +++- public/promptly/privacy/index.html | 4 +++- public/promptly/support/index.html | 4 +++- public/support/index.html | 2 ++ public/terms/index.html | 4 +++- scripts/prepare-static-site-bundle.mjs | 2 +- 13 files changed, 34 insertions(+), 12 deletions(-) diff --git a/public/contact/index.html b/public/contact/index.html index df85e51d..32b7d31e 100644 --- a/public/contact/index.html +++ b/public/contact/index.html @@ -35,7 +35,9 @@ "@type": "Organization", "@id": "https://tinystudio.in/#organization", "name": "Tiny Studio", - "url": "https://tinystudio.in/" + "alternateName": "tinystudio.in", + "url": "https://tinystudio.in/", + "description": "Tiny Studio is the independent product company at tinystudio.in behind Promptly, Drishti, and 0509. It is not affiliated with other apps or studios that use the name Tiny Studio." }, { "@type": "ContactPage", diff --git a/public/drishti/index.html b/public/drishti/index.html index 9ef4bf15..f2af6963 100644 --- a/public/drishti/index.html +++ b/public/drishti/index.html @@ -35,7 +35,9 @@ "@type": "Organization", "@id": "https://tinystudio.in/#organization", "name": "Tiny Studio", - "url": "https://tinystudio.in/" + "alternateName": "tinystudio.in", + "url": "https://tinystudio.in/", + "description": "Tiny Studio is the independent product company at tinystudio.in behind Promptly, Drishti, and 0509. It is not affiliated with other apps or studios that use the name Tiny Studio." }, { "@type": "WebPage", diff --git a/public/drishti/privacy/index.html b/public/drishti/privacy/index.html index 94236ccf..47bb7550 100644 --- a/public/drishti/privacy/index.html +++ b/public/drishti/privacy/index.html @@ -35,7 +35,9 @@ "@type": "Organization", "@id": "https://tinystudio.in/#organization", "name": "Tiny Studio", - "url": "https://tinystudio.in/" + "alternateName": "tinystudio.in", + "url": "https://tinystudio.in/", + "description": "Tiny Studio is the independent product company at tinystudio.in behind Promptly, Drishti, and 0509. It is not affiliated with other apps or studios that use the name Tiny Studio." }, { "@type": "WebPage", diff --git a/public/drishti/support/index.html b/public/drishti/support/index.html index d78d6bc2..81920598 100644 --- a/public/drishti/support/index.html +++ b/public/drishti/support/index.html @@ -35,7 +35,9 @@ "@type": "Organization", "@id": "https://tinystudio.in/#organization", "name": "Tiny Studio", - "url": "https://tinystudio.in/" + "alternateName": "tinystudio.in", + "url": "https://tinystudio.in/", + "description": "Tiny Studio is the independent product company at tinystudio.in behind Promptly, Drishti, and 0509. It is not affiliated with other apps or studios that use the name Tiny Studio." }, { "@type": "ContactPage", diff --git a/public/llms.txt b/public/llms.txt index a0b2c63d..1a31bd69 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -1,6 +1,6 @@ # Tiny Studio -Tiny Studio is a small product company behind Promptly, Drishti, and 0509. +Tiny Studio is the independent product company at tinystudio.in behind Promptly, Drishti, and 0509. It is not affiliated with any other app or studio that uses the name Tiny Studio. ## Public pages diff --git a/public/privacy-choices/index.html b/public/privacy-choices/index.html index 3bb6d950..a09b1e3b 100644 --- a/public/privacy-choices/index.html +++ b/public/privacy-choices/index.html @@ -35,7 +35,9 @@ "@type": "Organization", "@id": "https://tinystudio.in/#organization", "name": "Tiny Studio", - "url": "https://tinystudio.in/" + "alternateName": "tinystudio.in", + "url": "https://tinystudio.in/", + "description": "Tiny Studio is the independent product company at tinystudio.in behind Promptly, Drishti, and 0509. It is not affiliated with other apps or studios that use the name Tiny Studio." }, { "@type": "WebPage", diff --git a/public/privacy/index.html b/public/privacy/index.html index 0081a536..f96c53b4 100644 --- a/public/privacy/index.html +++ b/public/privacy/index.html @@ -35,7 +35,9 @@ "@type": "Organization", "@id": "https://tinystudio.in/#organization", "name": "Tiny Studio", - "url": "https://tinystudio.in/" + "alternateName": "tinystudio.in", + "url": "https://tinystudio.in/", + "description": "Tiny Studio is the independent product company at tinystudio.in behind Promptly, Drishti, and 0509. It is not affiliated with other apps or studios that use the name Tiny Studio." }, { "@type": "WebPage", diff --git a/public/promptly/index.html b/public/promptly/index.html index c151f290..f74977cf 100644 --- a/public/promptly/index.html +++ b/public/promptly/index.html @@ -35,7 +35,9 @@ "@type": "Organization", "@id": "https://tinystudio.in/#organization", "name": "Tiny Studio", - "url": "https://tinystudio.in/" + "alternateName": "tinystudio.in", + "url": "https://tinystudio.in/", + "description": "Tiny Studio is the independent product company at tinystudio.in behind Promptly, Drishti, and 0509. It is not affiliated with other apps or studios that use the name Tiny Studio." }, { "@type": "WebPage", diff --git a/public/promptly/privacy/index.html b/public/promptly/privacy/index.html index 41e3e4a0..6e5f8138 100644 --- a/public/promptly/privacy/index.html +++ b/public/promptly/privacy/index.html @@ -35,7 +35,9 @@ "@type": "Organization", "@id": "https://tinystudio.in/#organization", "name": "Tiny Studio", - "url": "https://tinystudio.in/" + "alternateName": "tinystudio.in", + "url": "https://tinystudio.in/", + "description": "Tiny Studio is the independent product company at tinystudio.in behind Promptly, Drishti, and 0509. It is not affiliated with other apps or studios that use the name Tiny Studio." }, { "@type": "WebPage", diff --git a/public/promptly/support/index.html b/public/promptly/support/index.html index ab170a87..0f2a33aa 100644 --- a/public/promptly/support/index.html +++ b/public/promptly/support/index.html @@ -35,7 +35,9 @@ "@type": "Organization", "@id": "https://tinystudio.in/#organization", "name": "Tiny Studio", - "url": "https://tinystudio.in/" + "alternateName": "tinystudio.in", + "url": "https://tinystudio.in/", + "description": "Tiny Studio is the independent product company at tinystudio.in behind Promptly, Drishti, and 0509. It is not affiliated with other apps or studios that use the name Tiny Studio." }, { "@type": "ContactPage", diff --git a/public/support/index.html b/public/support/index.html index 6e221376..40b7d8b6 100644 --- a/public/support/index.html +++ b/public/support/index.html @@ -35,7 +35,9 @@ "@type": "Organization", "@id": "https://tinystudio.in/#organization", "name": "Tiny Studio", + "alternateName": "tinystudio.in", "url": "https://tinystudio.in/", + "description": "Tiny Studio is the independent product company at tinystudio.in behind Promptly, Drishti, and 0509. It is not affiliated with other apps or studios that use the name Tiny Studio.", "contactPoint": { "@type": "ContactPoint", "contactType": "customer support", diff --git a/public/terms/index.html b/public/terms/index.html index b597bfc6..a0e07995 100644 --- a/public/terms/index.html +++ b/public/terms/index.html @@ -35,7 +35,9 @@ "@type": "Organization", "@id": "https://tinystudio.in/#organization", "name": "Tiny Studio", - "url": "https://tinystudio.in/" + "alternateName": "tinystudio.in", + "url": "https://tinystudio.in/", + "description": "Tiny Studio is the independent product company at tinystudio.in behind Promptly, Drishti, and 0509. It is not affiliated with other apps or studios that use the name Tiny Studio." }, { "@type": "WebPage", diff --git a/scripts/prepare-static-site-bundle.mjs b/scripts/prepare-static-site-bundle.mjs index a8ddeb2c..8fcedce5 100644 --- a/scripts/prepare-static-site-bundle.mjs +++ b/scripts/prepare-static-site-bundle.mjs @@ -55,7 +55,7 @@ const supportSchema = { const llmsTxt = `# Tiny Studio -Tiny Studio is a small product company behind Promptly, Drishti, and 0509. +Tiny Studio is the independent product company at tinystudio.in behind Promptly, Drishti, and 0509. It is not affiliated with any other app or studio that uses the name Tiny Studio. ## Public pages From b2521ad89925948e1bc4b00c2fd22b720cd2d04f Mon Sep 17 00:00:00 2001 From: Nish <257724087+nish3451@users.noreply.github.com> Date: Tue, 11 Aug 2026 04:01:36 +0530 Subject: [PATCH 2/2] test(public): guard brand disambiguation on every page and llms.txt Extends the brand disambiguation test from homepage-only to the whole public surface: every deployed page's Organization entity must carry the alternateName and the not-affiliated description, and both the committed llms.txt and its generator template must keep the identity statement, so the AI-facing file cannot silently drift back. --- scripts/test-public-brand-disambiguation.mjs | 56 +++++++++++++++----- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/scripts/test-public-brand-disambiguation.mjs b/scripts/test-public-brand-disambiguation.mjs index 1abba576..b21b364f 100644 --- a/scripts/test-public-brand-disambiguation.mjs +++ b/scripts/test-public-brand-disambiguation.mjs @@ -1,4 +1,4 @@ -import { readFileSync } from "node:fs" +import { readFileSync, readdirSync } from "node:fs" import { fileURLToPath } from "node:url" import { dirname, join } from "node:path" @@ -45,6 +45,16 @@ const bodyText = (html) => .replace(/\s+/g, " ") .trim() +// Every deployed HTML page (index.html under public/, mirroring the +// structured-data and link-target tests). +const publicHtmlFiles = (dir = "public") => + readdirSync(join(ROOT, dir), { withFileTypes: true }).flatMap((entry) => { + const path = join(dir, entry.name) + if (entry.isDirectory()) return publicHtmlFiles(path) + if (entry.isFile() && entry.name === "index.html") return [path] + return [] + }) + console.log("test-public-brand-disambiguation: Tiny Studio entity stays distinct from unrelated tiny studio brands") console.log("A. the homepage says plainly what Tiny Studio is and is not") @@ -58,16 +68,18 @@ ok( "homepage copy states Tiny Studio is not affiliated with other apps or studios using the name" ) -console.log("B. the homepage Organization entity carries distinguishing identity") -const org = orgNode(HOME) -ok(org !== null, "homepage JSON-LD carries the Tiny Studio organization node") -if (org) { - ok(org.name === "Tiny Studio", "organization name is Tiny Studio") - ok(org.alternateName === "tinystudio.in", "organization alternateName is tinystudio.in") - ok(org.url === "https://tinystudio.in/", "organization url is the tinystudio.in home") +console.log("B. every public page's Organization entity carries distinguishing identity") +for (const file of publicHtmlFiles()) { + const html = read(file) + const org = orgNode(html) + ok(org !== null, `${file} carries the Tiny Studio organization node`) + if (!org) continue + ok(org.name === "Tiny Studio", `${file} organization name is Tiny Studio`) + ok(org.alternateName === "tinystudio.in", `${file} organization alternateName is tinystudio.in`) + ok(org.url === "https://tinystudio.in/", `${file} organization url is the tinystudio.in home`) ok( typeof org.description === "string" && org.description.length > 0, - "organization carries a description" + `${file} organization carries a description` ) ok( org.description && @@ -75,15 +87,35 @@ if (org) { org.description.includes("Promptly") && org.description.includes("Drishti") && org.description.includes("0509"), - "organization description names the unique products and home so the entity cannot be mistaken for another tiny studio" + `${file} organization description names the unique products and home so the entity cannot be mistaken for another tiny studio` ) ok( org.description && org.description.includes("not affiliated"), - "organization description states it is not affiliated with other tiny studio brands" + `${file} organization description states it is not affiliated with other tiny studio brands` ) } -console.log("C. npm test/ci wiring") +console.log("C. the AI-facing llms.txt carries the same identity statement") +const llmsTxt = read("public/llms.txt") +ok( + llmsTxt.includes("independent product company at tinystudio.in"), + "llms.txt identifies Tiny Studio as the independent product company at tinystudio.in" +) +ok( + llmsTxt.includes("not affiliated with any other app or studio that uses the name Tiny Studio"), + "llms.txt states Tiny Studio is not affiliated with other apps or studios using the name" +) +const bundle = read("scripts/prepare-static-site-bundle.mjs") +ok( + bundle.includes("independent product company at tinystudio.in"), + "the llms.txt generator template keeps the independent-company identity" +) +ok( + bundle.includes("not affiliated with any other app or studio that uses the name Tiny Studio"), + "the llms.txt generator template keeps the non-affiliation statement" +) + +console.log("D. npm test/ci wiring") const pkg = JSON.parse(read("package.json")) ok( pkg.scripts.test.includes("test-public-brand-disambiguation.mjs"),