From b117084e17725f8a4708edf97800a181df641eee Mon Sep 17 00:00:00 2001 From: Nish <257724087+nish3451@users.noreply.github.com> Date: Fri, 14 Aug 2026 13:00:18 +0530 Subject: [PATCH 1/2] fix(public): disambiguate Tiny Studio identity across every page and llms.txt Google AI answers still conflate tinystudio.in with unrelated apps and studios named Tiny Studio because only the homepage carried the identity statement. Extend the disambiguation to the AI surfaces that ground those answers: - Every public page's Organization JSON-LD node now carries alternateName tinystudio.in and the description stating 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. - llms.txt and its generator template state the same identity up front, so LLM clients reading the site corpus get the disambiguation first. - The brand disambiguation test now guards every public page, llms.txt, and the generator template, not just the homepage. Co-authored-by: CommandCodeBot --- 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 +- scripts/test-public-brand-disambiguation.mjs | 56 +++++++++++++++----- 14 files changed, 78 insertions(+), 24 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 3917f378..106c07e9 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 6d045153..6f32a693 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 33c28bbf..e97c9e3a 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 281cc9f5..b5b9b80b 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 c9d2573a..ca29cfca 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 419d8c2b..211f536b 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 diff --git a/scripts/test-public-brand-disambiguation.mjs b/scripts/test-public-brand-disambiguation.mjs index 1abba576..dfb82a20 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 test). +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"), From ca2283ef3beaa70d106ca6e4e83f6689ccd63bb8 Mon Sep 17 00:00:00 2001 From: Nish <257724087+nish3451@users.noreply.github.com> Date: Fri, 14 Aug 2026 13:06:38 +0530 Subject: [PATCH 2/2] docs(lane1): record brand disambiguation lane report Co-authored-by: CommandCodeBot --- ...-google-ai-answers-brand-disambiguation.md | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 .lane/reports/fix-lane1-google-ai-answers-brand-disambiguation.md diff --git a/.lane/reports/fix-lane1-google-ai-answers-brand-disambiguation.md b/.lane/reports/fix-lane1-google-ai-answers-brand-disambiguation.md new file mode 100644 index 00000000..2299f4ab --- /dev/null +++ b/.lane/reports/fix-lane1-google-ai-answers-brand-disambiguation.md @@ -0,0 +1,59 @@ +# Lane report: fix/lane1-google-ai-answers-brand-disambiguation + +## Item + +Google AI answers confuse Tiny Studio / tinystudio.in with unrelated "tiny studio" brands. + +## Root cause + +Only the homepage carried the Tiny Studio identity statement. Google AI answers are +grounded by AI-facing surfaces — every page's Organization JSON-LD and `llms.txt` — +and those surfaces had no disambiguation. `public/llms.txt` in particular said only +"Tiny Studio is a small product company behind Promptly, Drishti, and 0509" with no +`tinystudio.in` home and no not-affiliated statement. + +## Fix + +Extended the brand identity statement to every public surface: + +- Every public page's Organization JSON-LD node now carries `alternateName: tinystudio.in` + plus a 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." +- `public/llms.txt` and its generator template in + `scripts/prepare-static-site-bundle.mjs` state the same identity up front, so LLM + clients reading the site corpus get the disambiguation first. +- `scripts/test-public-brand-disambiguation.mjs` now guards every public page, + llms.txt, and the generator template, not just the homepage (92 checks). + +## Files changed (14) + +- public/contact/index.html — Org JSON-LD alternateName + description +- public/drishti/index.html — same +- public/drishti/privacy/index.html — same +- public/drishti/support/index.html — same +- public/llms.txt — identity statement up front +- public/privacy-choices/index.html — Org JSON-LD alternateName + description +- public/privacy/index.html — same +- public/promptly/index.html — same +- public/promptly/privacy/index.html — same +- public/promptly/support/index.html — same +- public/support/index.html — Org JSON-LD alternateName + description +- public/terms/index.html — same +- scripts/prepare-static-site-bundle.mjs — llms.txt generator template keeps identity +- scripts/test-public-brand-disambiguation.mjs — guards every page + llms.txt + template + +## Verification + +- `node scripts/test-public-brand-disambiguation.mjs` — 92 checks, 0 failures +- `node scripts/test-public-structured-data.mjs` — 127 checks, 0 failures +- `node scripts/test-public-deploy-bundle.mjs` — 63 checks, 0 failures +- `node --check` on changed scripts — OK +- `git diff --check` — OK +- Full `npm test` — all checks pass except `check-retention-automation.mjs`, + which fails identically on clean origin/main (stale canonical-workspace state + + checkout ahead of remote main). Pre-existing, unrelated. + +## Outcome + +Branch pushed and PR opened: fix/lane1-google-ai-answers-brand-disambiguation