Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
3ff1398
fix(public): self-declare clean /agents /pricing /specimen URLs in pa…
nish3451 Aug 14, 2026
022235d
docs(lane): report page-head self-declaration fix for lane 1
nish3451 Aug 14, 2026
c3e31b8
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 14, 2026
8dc8d10
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 14, 2026
ace8847
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 14, 2026
96fd47d
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 14, 2026
804c5d8
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 14, 2026
c7ce91c
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 14, 2026
f470adb
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 15, 2026
31fe41a
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 15, 2026
1f36b9b
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 15, 2026
ef77007
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 15, 2026
df7dec2
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 15, 2026
38fa077
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 15, 2026
026fa12
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 15, 2026
79914de
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 15, 2026
ca59e0c
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 15, 2026
afe608d
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 15, 2026
d0d4fc5
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 15, 2026
88e2abb
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 15, 2026
c278592
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 15, 2026
6b14da0
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 15, 2026
296c769
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 15, 2026
69e80bd
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 15, 2026
3184eb7
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 16, 2026
0f21bcf
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 17, 2026
8eb5ac1
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 17, 2026
272dd94
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 17, 2026
0d0862a
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 17, 2026
09c93b0
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 17, 2026
d0f6e2e
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 17, 2026
8b09683
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 17, 2026
dd4f633
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 17, 2026
ef46c9e
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 17, 2026
9e31a7c
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 17, 2026
355fc25
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 17, 2026
cca1bfc
Merge branch 'main' into fix/clean-pagehead-self-decl-2026-08-14
nish3451 Aug 18, 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
35 changes: 35 additions & 0 deletions .lane/reports/fix-clean-pagehead-self-decl-2026-08-14.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Lane 1: /agents, /pricing, /specimen page-head self-declaration

Branch: `fix/clean-pagehead-self-decl-2026-08-14`
PR: https://github.com/nish3451/TinyStudio.io/pull/210
Commit: `3ff1398`

## Change

All three pages now self-declare their clean extensionless URLs in the head
(the same form the worker serves at 200 and the sitemap lists), matching
`/audit`:

| Page | canonical / og:url / WebPage @id+url |
| --- | --- |
| /agents | `https://tinystudio.io/agents` (`agents#webpage`) |
| /pricing | `https://tinystudio.io/pricing` (`pricing#webpage`) |
| /specimen | `https://tinystudio.io/specimen` (`specimen#webpage`) |

Before: all three declared the `.html` twin, which the worker 307-redirects.

## Files touched

- `public/agents.html` — canonical, og:url, WebPage @id/url -> clean
- `public/pricing.html` — same
- `public/specimen.html` — same
- `scripts/check-site.mjs` — page-URL expectation tables (social share, structured data, canonical) now require the clean URL on all five pages; canonical comment updated

## Validation

- `node scripts/check-site.mjs` → "TinyStudio.io checks passed."
- `npm test` (full suite: check, headings, sitemap, worker, ui, contract, viewport, narrow-pages) → exit 0

## Notes

- The `.html` twins remain allow-listed and served; this change only fixes what the pages declare about themselves. No redirect/route behavior changed.
8 changes: 4 additions & 4 deletions public/agents.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Seven specialists, one human signature. Each does a single job on your actual pages and numbers; nothing reaches you until a person has read and signed it.">
<title>TinyStudio — The Desk</title>
<link rel="canonical" href="https://tinystudio.io/agents.html">
<link rel="canonical" href="https://tinystudio.io/agents">
<link rel="icon" href="/favicon.svg" type="image/svg+xml" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<meta property="og:title" content="TinyStudio — The Desk">
<meta property="og:description" content="Seven specialists, one human signature. Each does a single job on your actual pages and numbers; nothing reaches you until a person has read and signed it.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://tinystudio.io/agents.html">
<meta property="og:url" content="https://tinystudio.io/agents">
<meta property="og:image" content="https://tinystudio.io/og-image.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
Expand Down Expand Up @@ -42,8 +42,8 @@
},
{
"@type": "WebPage",
"@id": "https://tinystudio.io/agents.html#webpage",
"url": "https://tinystudio.io/agents.html",
"@id": "https://tinystudio.io/agents#webpage",
"url": "https://tinystudio.io/agents",
"name": "TinyStudio — The Desk",
"description": "Seven specialists, one human signature. Each does a single job on your actual pages and numbers; nothing reaches you until a person has read and signed it.",
"inLanguage": "en",
Expand Down
8 changes: 4 additions & 4 deletions public/pricing.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="One price, plainly stated: the appraisal is free, the desk is $2,500 a month on a three-month minimum, and the delivery guarantee is written out in full.">
<title>TinyStudio — Pricing &amp; terms</title>
<link rel="canonical" href="https://tinystudio.io/pricing.html">
<link rel="canonical" href="https://tinystudio.io/pricing">
<link rel="icon" href="/favicon.svg" type="image/svg+xml" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<meta property="og:title" content="TinyStudio — Pricing &amp; terms">
<meta property="og:description" content="One price, plainly stated: the appraisal is free, the desk is $2,500 a month on a three-month minimum, and the delivery guarantee is written out in full.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://tinystudio.io/pricing.html">
<meta property="og:url" content="https://tinystudio.io/pricing">
<meta property="og:image" content="https://tinystudio.io/og-image.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
Expand Down Expand Up @@ -42,8 +42,8 @@
},
{
"@type": "WebPage",
"@id": "https://tinystudio.io/pricing.html#webpage",
"url": "https://tinystudio.io/pricing.html",
"@id": "https://tinystudio.io/pricing#webpage",
"url": "https://tinystudio.io/pricing",
"name": "TinyStudio — Pricing & terms",
"description": "One price, plainly stated: the appraisal is free, the desk is $2,500 a month on a three-month minimum, and the delivery guarantee is written out in full.",
"inLanguage": "en",
Expand Down
8 changes: 4 additions & 4 deletions public/specimen.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="The appraisal, with the client's name removed: a real audit of a clinic homepage, four findings with evidence and fixes, read and signed by Nish.">
<title>TinyStudio — The Website Appraisal — specimen</title>
<link rel="canonical" href="https://tinystudio.io/specimen.html">
<link rel="canonical" href="https://tinystudio.io/specimen">
<link rel="icon" href="/favicon.svg" type="image/svg+xml" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<meta property="og:title" content="TinyStudio — The Website Appraisal, specimen">
<meta property="og:description" content="The appraisal, with the client's name removed: a real audit of a clinic homepage, four findings with evidence and fixes, read and signed by Nish.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://tinystudio.io/specimen.html">
<meta property="og:url" content="https://tinystudio.io/specimen">
<meta property="og:image" content="https://tinystudio.io/og-image.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
Expand Down Expand Up @@ -42,8 +42,8 @@
},
{
"@type": "WebPage",
"@id": "https://tinystudio.io/specimen.html#webpage",
"url": "https://tinystudio.io/specimen.html",
"@id": "https://tinystudio.io/specimen#webpage",
"url": "https://tinystudio.io/specimen",
"name": "TinyStudio — The Website Appraisal, specimen",
"description": "The appraisal, with the client's name removed: a real audit of a clinic homepage, four findings with evidence and fixes, read and signed by Nish.",
"inLanguage": "en",
Expand Down
23 changes: 11 additions & 12 deletions scripts/check-site.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -1557,9 +1557,9 @@ if (!worker.includes("https://cloudflareinsights.com")) {
const socialSharePages = [
["homepage", siteHome, "https://tinystudio.io/"],
["audit page", siteAudit, "https://tinystudio.io/audit"],
["desk page", read("public/agents.html"), "https://tinystudio.io/agents.html"],
["pricing page", read("public/pricing.html"), "https://tinystudio.io/pricing.html"],
["specimen page", read("public/specimen.html"), "https://tinystudio.io/specimen.html"]
["desk page", read("public/agents.html"), "https://tinystudio.io/agents"],
["pricing page", read("public/pricing.html"), "https://tinystudio.io/pricing"],
["specimen page", read("public/specimen.html"), "https://tinystudio.io/specimen"]
];
const SOCIAL_IMAGE_URL = "https://tinystudio.io/og-image.png";

Expand Down Expand Up @@ -1631,9 +1631,9 @@ for (const [pageName, pageHtml, pageUrl] of socialSharePages) {
const structuredDataPages = [
["homepage", siteHome, "https://tinystudio.io/"],
["audit page", siteAudit, "https://tinystudio.io/audit"],
["desk page", read("public/agents.html"), "https://tinystudio.io/agents.html"],
["pricing page", read("public/pricing.html"), "https://tinystudio.io/pricing.html"],
["specimen page", read("public/specimen.html"), "https://tinystudio.io/specimen.html"]
["desk page", read("public/agents.html"), "https://tinystudio.io/agents"],
["pricing page", read("public/pricing.html"), "https://tinystudio.io/pricing"],
["specimen page", read("public/specimen.html"), "https://tinystudio.io/specimen"]
];

const ORGANIZATION_ID = "https://tinystudio.io/#organization";
Expand Down Expand Up @@ -1863,15 +1863,14 @@ for (const [pageName, pageHtml] of internalLinkPages) {
// link sits inside the head and points at the absolute https://tinystudio.io
// address of the page. The deployed worker 307-redirects every .html form to
// its clean extensionless twin, so a canonical must name the address that
// serves 200, never the redirecting form: the audit page's canonical is the
// clean /audit, while the remaining pages keep their .html form here until
// they are migrated the same way.
// serves 200, never the redirecting form: every page's canonical is its clean
// extensionless address (/audit, /agents, /pricing, /specimen).
const canonicalPages = [
["homepage", siteHome, "https://tinystudio.io/"],
["audit page", siteAudit, "https://tinystudio.io/audit"],
["desk page", read("public/agents.html"), "https://tinystudio.io/agents.html"],
["pricing page", read("public/pricing.html"), "https://tinystudio.io/pricing.html"],
["specimen page", read("public/specimen.html"), "https://tinystudio.io/specimen.html"]
["desk page", read("public/agents.html"), "https://tinystudio.io/agents"],
["pricing page", read("public/pricing.html"), "https://tinystudio.io/pricing"],
["specimen page", read("public/specimen.html"), "https://tinystudio.io/specimen"]
];

const canonicalLinkPattern = /<link\b[^>]*\brel\s*=\s*["']canonical["'][^>]*>/gi;
Expand Down
Loading