Skip to content

fix(public): disambiguate Tiny Studio identity across every public page and llms.txt - #101

Closed
nish3451 wants to merge 62 commits into
mainfrom
fix/lane1-public-brand-disambiguation-ai-surface
Closed

fix(public): disambiguate Tiny Studio identity across every public page and llms.txt#101
nish3451 wants to merge 62 commits into
mainfrom
fix/lane1-public-brand-disambiguation-ai-surface

Conversation

@nish3451

@nish3451 nish3451 commented Aug 11, 2026

Copy link
Copy Markdown
Collaborator

What

Google AI answers (AI Overviews / Gemini) still conflate tinystudio.in with unrelated apps and studios named "Tiny Studio". PR #29 added the disambiguation only to the homepage; the surfaces that ground AI answers — every page's Organization structured data and the LLM-facing llms.txt — did not carry it.

Changes

  • All 12 public pages: the Organization JSON-LD node now carries alternateName: tinystudio.in and a 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 that uses the name Tiny Studio.
  • public/llms.txt and its generator template (scripts/prepare-static-site-bundle.mjs) open with the same identity statement, so any LLM reading the site corpus gets the disambiguation first.
  • scripts/test-public-brand-disambiguation.mjs extended from homepage-only to guard every public page's Organization entity, plus the llms.txt and generator template content.

Verification

  • npm test passes end to end (service + public chains).
  • Brand disambiguation test: 92 checks, 0 failures (was 15 checks on homepage only).
  • Structured-data test still green: 127 checks, 0 failures.
  • Deploy-bundle test regenerates llms.txt from the updated template and passes.

Closes the unreviewed-by-grok item: Google AI answers confuse Tiny Studio / tinystudio.in with unrelated tiny studio brands.

Summary by CodeRabbit

  • SEO & Metadata
    • Clarified Tiny Studio’s identity, products, alternate name, and independence across site pages.
    • Improved organization information used by search engines and AI tools.
  • Documentation
    • Updated public company descriptions to distinguish Tiny Studio from unrelated entities with the same name.
  • Tests
    • Expanded validation to check brand identity information across all public pages and generated site metadata.

…ge 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.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 7946dd55-4020-4e2e-8183-057bcb14ae8d

📥 Commits

Reviewing files that changed from the base of the PR and between d75595f and 3bb8495.

📒 Files selected for processing (2)
  • public/drishti/index.html
  • public/promptly/index.html
🚧 Files skipped from review as they are similar to previous changes (2)
  • public/drishti/index.html
  • public/promptly/index.html

📝 Walkthrough

Walkthrough

The change standardizes Tiny Studio identity metadata across public Organization JSON-LD, llms.txt, and the static-site bundle template. Validation now checks all public pages and identity statements.

Changes

Brand disambiguation

Layer / File(s) Summary
Public Organization metadata
public/contact/index.html, public/drishti/..., public/privacy..., public/promptly/..., public/support/index.html, public/terms/index.html
Organization JSON-LD entries now include alternateName: "tinystudio.in" and descriptions that identify Tiny Studio and state its non-affiliation with similarly named entities.
Generated identity content
public/llms.txt, scripts/prepare-static-site-bundle.mjs
The Tiny Studio description identifies the company as independent and includes its website and non-affiliation statement.
Site-wide identity validation
scripts/test-public-brand-disambiguation.mjs
Validation recursively discovers public pages and checks Organization metadata, public/llms.txt, and the bundle generator template.

Estimated code review effort: 2 (Simple) | ~10 minutes

Merge Risk: ⚪ Minimal · up to 3bb84

The PR adds consistent Tiny Studio identity disambiguation to public structured data and llms.txt without changing application behavior; no actionable merge-blocking risk remains after normal checks and review.

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main change: disambiguating Tiny Studio’s identity across public pages and llms.txt.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/lane1-public-brand-disambiguation-ai-surface

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 31fe3189a4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread public/support/index.html
Comment on lines +38 to +40
"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.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve the support identity in the static-site generator

When npm run site:prepare is run, prepare-static-site-bundle.mjs removes this generated support schema and rebuilds it from supportSchema, which still lacks both alternateName and the new identity description. The prepared public/support/index.html therefore loses these additions; reproducing that sequence makes test-public-brand-disambiguation.mjs fail four checks. Add the same fields to supportSchema so preparation remains idempotent and does not undo the support-page fix.

Useful? React with 👍 / 👎.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@scripts/test-public-brand-disambiguation.mjs`:
- Around line 71-96: Update the Organization description assertions in the
publicHtmlFiles loop to require the canonical independence wording, including
the exact phrase “independent product company,” alongside the existing domain,
product, and non-affiliation checks. Ensure pages missing this core identity
statement fail validation.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 6ad08ca5-9140-4572-871d-f7a33242ed6f

📥 Commits

Reviewing files that changed from the base of the PR and between d898707 and 31fe318.

📒 Files selected for processing (14)
  • public/contact/index.html
  • public/drishti/index.html
  • public/drishti/privacy/index.html
  • public/drishti/support/index.html
  • public/llms.txt
  • public/privacy-choices/index.html
  • public/privacy/index.html
  • public/promptly/index.html
  • public/promptly/privacy/index.html
  • public/promptly/support/index.html
  • public/support/index.html
  • public/terms/index.html
  • scripts/prepare-static-site-bundle.mjs
  • scripts/test-public-brand-disambiguation.mjs

Comment on lines +71 to 96
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`
)
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Assert the complete Organization identity statement.

The check validates the domain, product names, and the generic not affiliated substring. It does not validate independent product company. A page can omit the core independence claim and still pass this test. Require the specific identity phrases or compare the description with a canonical value.

Proposed validation
   ok(
     org.description &&
+      org.description.includes("independent product company at tinystudio.in") &&
       org.description.includes("tinystudio.in") &&
       org.description.includes("Promptly") &&
       org.description.includes("Drishti") &&
       org.description.includes("0509"),
     `${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"),
+    org.description &&
+      org.description.includes("It is not affiliated with other apps or studios that use the name Tiny Studio"),
     `${file} organization description states it is not affiliated with other tiny studio brands`
   )
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
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("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,
`${file} organization carries a description`
)
ok(
org.description &&
org.description.includes("independent product company at tinystudio.in") &&
org.description.includes("tinystudio.in") &&
org.description.includes("Promptly") &&
org.description.includes("Drishti") &&
org.description.includes("0509"),
`${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("It is not affiliated with other apps or studios that use the name Tiny Studio"),
`${file} organization description states it is not affiliated with other tiny studio brands`
)
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/test-public-brand-disambiguation.mjs` around lines 71 - 96, Update
the Organization description assertions in the publicHtmlFiles loop to require
the canonical independence wording, including the exact phrase “independent
product company,” alongside the existing domain, product, and non-affiliation
checks. Ensure pages missing this core identity statement fail validation.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 202f30e494

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

)
const bundle = read("scripts/prepare-static-site-bundle.mjs")
ok(
bundle.includes("independent product company at tinystudio.in"),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Scope the assertion to the llmsTxt template

Once supportSchema is updated with the same organization description required by public/support/index.html, this whole-file bundle.includes(...) check can succeed from that unrelated schema even if the independent-company wording is removed from llmsTxt. In that scenario the test remains green while npm run site:prepare publishes a regressed llms.txt; inspect the llmsTxt template specifically or validate the generator's output instead.

Useful? React with 👍 / 👎.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@nish3451

Copy link
Copy Markdown
Collaborator Author

Superseded by #146100% of this PR's changes are contained in it. Closing in favour of #146.

@nish3451 nish3451 closed this Aug 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant