Skip to content
This repository was archived by the owner on Oct 12, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
b117084
fix(public): disambiguate Tiny Studio identity across every page and …
nish3451 Aug 14, 2026
ca2283e
docs(lane1): record brand disambiguation lane report
nish3451 Aug 14, 2026
4df0041
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 14, 2026
b949b64
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 14, 2026
374bbab
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 14, 2026
6960480
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 14, 2026
9d2e304
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 14, 2026
d02ee95
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 14, 2026
9a524d4
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 14, 2026
e989466
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 14, 2026
1788a4b
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 14, 2026
006c26b
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 14, 2026
ec768fc
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 14, 2026
aa7cd45
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 15, 2026
a8ada29
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 15, 2026
3f250ea
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 15, 2026
cb3fcf3
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 15, 2026
b78aef9
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 15, 2026
822c17f
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 15, 2026
6b60bde
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 15, 2026
6b4e22b
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 15, 2026
96e7ac2
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 15, 2026
198f879
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 15, 2026
68f4014
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 15, 2026
9e27ea6
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 15, 2026
ecb42cb
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 15, 2026
282b60c
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 15, 2026
526c4ad
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 15, 2026
035f064
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 17, 2026
9619de2
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 17, 2026
bd7e8a3
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 17, 2026
d1ba13f
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 17, 2026
63e425b
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 17, 2026
f0a7990
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 17, 2026
45bd845
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 17, 2026
3051d01
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 18, 2026
176bc95
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 19, 2026
cfee974
Merge branch 'main' into fix/lane1-google-ai-answers-brand-disambigua…
nish3451 Aug 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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
4 changes: 3 additions & 1 deletion public/contact/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
4 changes: 3 additions & 1 deletion public/drishti/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
4 changes: 3 additions & 1 deletion public/drishti/privacy/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
4 changes: 3 additions & 1 deletion public/drishti/support/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
2 changes: 1 addition & 1 deletion public/llms.txt
Original file line number Diff line number Diff line change
@@ -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

Expand Down
4 changes: 3 additions & 1 deletion public/privacy-choices/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
4 changes: 3 additions & 1 deletion public/privacy/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
4 changes: 3 additions & 1 deletion public/promptly/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
4 changes: 3 additions & 1 deletion public/promptly/privacy/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
4 changes: 3 additions & 1 deletion public/promptly/support/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
2 changes: 2 additions & 0 deletions public/support/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
4 changes: 3 additions & 1 deletion public/terms/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
2 changes: 1 addition & 1 deletion scripts/prepare-static-site-bundle.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
56 changes: 44 additions & 12 deletions scripts/test-public-brand-disambiguation.mjs
Original file line number Diff line number Diff line change
@@ -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"

Expand Down Expand Up @@ -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")
Expand All @@ -58,32 +68,54 @@ 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 &&
org.description.includes("tinystudio.in") &&
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"),
Expand Down