fix(public): disambiguate Tiny Studio identity across every public page and llms.txt - #101
fix(public): disambiguate Tiny Studio identity across every public page and llms.txt#101nish3451 wants to merge 62 commits into
Conversation
…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.
There was a problem hiding this comment.
nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (2)
📝 WalkthroughWalkthroughThe change standardizes Tiny Studio identity metadata across public Organization JSON-LD, ChangesBrand disambiguation
Estimated code review effort: 2 (Simple) | ~10 minutes Merge Risk: ⚪ Minimal · up to 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)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
💡 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".
| "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.", |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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
📒 Files selected for processing (14)
public/contact/index.htmlpublic/drishti/index.htmlpublic/drishti/privacy/index.htmlpublic/drishti/support/index.htmlpublic/llms.txtpublic/privacy-choices/index.htmlpublic/privacy/index.htmlpublic/promptly/index.htmlpublic/promptly/privacy/index.htmlpublic/promptly/support/index.htmlpublic/support/index.htmlpublic/terms/index.htmlscripts/prepare-static-site-bundle.mjsscripts/test-public-brand-disambiguation.mjs
| 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` | ||
| ) | ||
| } |
There was a problem hiding this comment.
🎯 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.
| 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.
There was a problem hiding this comment.
nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
There was a problem hiding this comment.
nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
There was a problem hiding this comment.
nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
There was a problem hiding this comment.
nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
There was a problem hiding this comment.
nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
💡 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"), |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
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
alternateName: tinystudio.inand adescriptionstating 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.txtand 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.mjsextended from homepage-only to guard every public page's Organization entity, plus the llms.txt and generator template content.Verification
npm testpasses end to end (service + public chains).Closes the unreviewed-by-grok item: Google AI answers confuse Tiny Studio / tinystudio.in with unrelated tiny studio brands.
Summary by CodeRabbit