Skip to content

Add HSTS, social image, touch icon, and structured data - #6

Merged
nish3451 merged 1 commit into
mainfrom
seo/audit-fixes
Aug 3, 2026
Merged

Add HSTS, social image, touch icon, and structured data#6
nish3451 merged 1 commit into
mainfrom
seo/audit-fixes

Conversation

@nish3451

@nish3451 nish3451 commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

Audit of tinystudio.io returned 7 findings. Every one was verified against the live host before changing anything — after finding two false positives on 0509, I no longer trust a report without checking.

Confirmed real, and fixed

Finding Verification Fix
No HSTS header curl -I showed no strict-transport-security Added, 1 year + subdomains. HTTPS already works on apex/www/app
No og:image / twitter:image Only og:title, og:type, og:url in the live head 1200×630 card added
No apple-touch-icon Only favicon.svg present 180×180 added
No JSON-LD Confirmed absent Plain Organization added

About the image

Built from the site's own palette (#fbfaf5 paper, #161614 ink, #0c8b63 green) and its existing logo mark, with copy lifted verbatim from the page's current description. It makes no claim the site doesn't already make.

The trap worth noting

The worker serves assets through an explicit PUBLIC_ASSET_PATHS allowlist. Both new images are registered there — without it they'd 404 and the social card would silently stay broken, which is precisely the bug this PR removes. Same shape as the font allowlist issue on inish.in earlier today.

Left alone

Thin home content (213 rendered words) and the related AI-readiness finding are copy decisions, not mechanical fixes. Flagged, not guessed at.

npm run check passes.

From an audit of tinystudio.io (7 findings). Each item below was verified
against the live host first rather than trusted from the report.

- Strict-Transport-Security was genuinely absent; curl confirmed no such
  header on the live response. HTTPS already works on the apex, www, and app
  hosts, so a year-long max-age with includeSubDomains is safe.
- og:image and twitter:image were missing entirely, so shared links rendered
  with no card. Added a 1200x630 image built from the site's own palette
  (#fbfaf5 paper, #161614 ink, #0c8b63 green) and its existing logo mark, with
  copy taken verbatim from the page's own description. No new claims.
- apple-touch-icon was missing; added at 180x180 from the same mark.
- No JSON-LD at all. Added a plain schema.org Organization carrying only the
  name, url, logo, and the description already in the head.

Both new files are registered in PUBLIC_ASSET_PATHS. The worker serves assets
through an explicit allowlist, so without that they would 404 and the social
card would silently stay broken -- the exact failure this commit removes.

Thin content on the home page (213 rendered words) is left alone: that is a
copy decision, not a mechanical fix.

Verified: npm run check passes.

@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 3, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@nish3451, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 19 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 55427351-17d3-4419-9cd7-074e19cfa8c6

📥 Commits

Reviewing files that changed from the base of the PR and between fa4f276 and 7c53bc2.

⛔ Files ignored due to path filters (2)
  • public/apple-touch-icon.png is excluded by !**/*.png
  • public/og-image.png is excluded by !**/*.png
📒 Files selected for processing (2)
  • public/index.html
  • src/worker.js

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

@nish3451
nish3451 merged commit 3b1243d into main Aug 3, 2026
1 check passed
@nish3451
nish3451 deleted the seo/audit-fixes branch August 3, 2026 17:05
nish3451 added a commit that referenced this pull request Aug 9, 2026
The original og-image.png (PR #6) was built while the root page was the
retired TinyStudio Agent Desk, so its copy advertised the legacy product —
sharing the home page after the tag fix would render a card for the wrong
offer. Rebuild it with the current site's palette (index.css cream/ink/
brass), the existing favicon.svg mark, and copy verbatim from the current
home page headline and description. No new claims.

scripts/generate-og-image.mjs renders the card in real Chromium at exactly
1200x630 and refuses to write unless the Google Fonts load, every element
sits inside the canvas, and the pixels contain the cream background, ink
text, and brass accents. The check-site.mjs social guard keeps all five
pages pointed at this file with dimensions matching its PNG header.
nish3451 added a commit that referenced this pull request Aug 9, 2026
)

* seo: complete the social share image on home and every public page

The leak audit this site sells flags a homepage whose served HTML cannot
tell a social platform what to show when shared. The dogfood audit run
20260808T074205Z-msk2fl3n found exactly that on this site's own home page
(finding d87d715be3d0, 'Social share image incomplete on home'):
public/index.html served zero og:/twitter: tags even though
public/og-image.png exists and is allow-listed in the worker.

Add the complete Open Graph + Twitter Card set (og:title, og:description,
og:type, og:url, og:image with width/height/alt, twitter:card
summary_large_image, twitter:title/description/image) to the heads of all
five public pages, mirroring each page's meta description and pointing
og:image at the absolute https://tinystudio.io/og-image.png (1200x630,
matching the PNG header).

Add a source-string CI guard in scripts/check-site.mjs (social share tags
section) so the fault cannot return: each page must carry each tag exactly
once inside <head>, og:description must equal the page's meta description,
og:image must be the absolute og-image.png URL, and the declared dimensions
must match the actual PNG bytes.

* seo: regenerate the social share image for the current offer

The original og-image.png (PR #6) was built while the root page was the
retired TinyStudio Agent Desk, so its copy advertised the legacy product —
sharing the home page after the tag fix would render a card for the wrong
offer. Rebuild it with the current site's palette (index.css cream/ink/
brass), the existing favicon.svg mark, and copy verbatim from the current
home page headline and description. No new claims.

scripts/generate-og-image.mjs renders the card in real Chromium at exactly
1200x630 and refuses to write unless the Google Fonts load, every element
sits inside the canvas, and the pixels contain the cream background, ink
text, and brass accents. The check-site.mjs social guard keeps all five
pages pointed at this file with dimensions matching its PNG header.

* ci: require the correct attribute per social tag (og:=property, twitter:=name)
@nish3451
nish3451 restored the seo/audit-fixes branch August 19, 2026 06:39
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