Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"dev": "wrangler dev --remote --ip 127.0.0.1 --port 8788 --persist-to /tmp/tinystudio-agent-worker",
"check": "node scripts/check-site.mjs",
"check:render-blocking": "node scripts/check-render-blocking.mjs",
"test": "npm run check && npm run test:worker && npm run test:ui",
"test": "npm run check && npm run test:headings && npm run test:worker && npm run test:ui",
"test:headings": "node --test scripts/test-heading-hierarchy.mjs",
"test:worker": "node --test scripts/test-agent-worker.mjs",
"test:ui": "node --test scripts/test-agent-ui.mjs",
"leads:list": "wrangler d1 execute tinystudio_email_signups --remote --command \"SELECT email, source, page_path, created_at, updated_at FROM email_signups ORDER BY updated_at DESC LIMIT 100;\"",
Expand Down
4 changes: 2 additions & 2 deletions public/agents.css
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
transition:padding-left var(--mid) var(--ease),background var(--mid) var(--ease)}
.ag:hover{padding-left:14px;background:rgba(255,253,248,.5)}
.ag .n{font-family:'Fraunces',serif;font-style:italic;font-weight:200;font-size:30px;color:var(--brass-lt);line-height:1}
.ag h3{font-size:19px;font-weight:600;letter-spacing:-.012em}
.ag h2{font-size:19px;font-weight:600;letter-spacing:-.012em}
.ag .job{margin-top:7px;font-size:14.5px;line-height:1.65;color:var(--muted)}
.ag .reads{font-size:14px;line-height:1.72;color:var(--soft)}
.ag .reads b{display:block;font-size:10px;letter-spacing:.22em;text-transform:uppercase;
Expand All @@ -16,7 +16,7 @@
border-radius:14px;overflow:hidden;background:linear-gradient(172deg,rgba(255,253,248,.9),rgba(235,225,207,.5))}
.gatebox>div{padding:38px 42px}
.gatebox>div:first-child{border-right:1px solid var(--line)}
.gatebox h4{font-family:'Fraunces',serif;font-weight:300;font-size:25px;letter-spacing:-.02em}
.gatebox h2{font-family:'Fraunces',serif;font-weight:300;font-size:25px;letter-spacing:-.02em}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Remove the unnecessary quotes from Fraunces.

Stylelint reports font-family-name-quotes on Line 19. Remove the quotes around this single-word family name. The computed font-family value remains unchanged.

Proposed fix
-  .gatebox h2{font-family:'Fraunces',serif;font-weight:300;font-size:25px;letter-spacing:-.02em}
+  .gatebox h2{font-family:Fraunces,serif;font-weight:300;font-size:25px;letter-spacing:-.02em}
📝 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
.gatebox h2{font-family:'Fraunces',serif;font-weight:300;font-size:25px;letter-spacing:-.02em}
.gatebox h2{font-family:Fraunces,serif;font-weight:300;font-size:25px;letter-spacing:-.02em}
🧰 Tools
🪛 Stylelint (17.14.0)

[error] 19-19: Expected no quotes around "Fraunces" (font-family-name-quotes)

(font-family-name-quotes)

🤖 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 `@public/agents.css` at line 19, Update the .gatebox h2 font-family declaration
to use the single-word Fraunces family name without quotes, preserving the
existing fallback serif and all other typography properties.

Source: Linters/SAST tools

.gatebox ul{margin-top:18px;list-style:none}
.gatebox li{font-size:15px;line-height:1.55;color:var(--soft);padding:9px 0 9px 26px;position:relative}
.gatebox li::before{content:'';position:absolute;left:0;top:16px;width:9px;height:1px;background:var(--brass)}
Expand Down
18 changes: 9 additions & 9 deletions public/agents.html
Original file line number Diff line number Diff line change
Expand Up @@ -46,44 +46,44 @@ <h1>Seven specialists, <em>one human signature.</em></h1>

<div class="roster">
<div class="ag"><div class="n">i</div>
<div><h3>Landing Page Fixer</h3><p class="job">Turns a vague page into one with a clear audience, offer, proof and next action.</p></div>
<div><h2>Landing Page Fixer</h2><p class="job">Turns a vague page into one with a clear audience, offer, proof and next action.</p></div>
<div class="reads"><b>Reads</b>Your page, your buyer, your offer details, your reviews, an analytics snapshot, competitor pages.</div>
<div class="gate">Human-approved</div></div>

<div class="ag"><div class="n">ii</div>
<div><h3>Product Page Fixer</h3><p class="job">The same discipline applied to the pages that carry a price and a decision.</p></div>
<div><h2>Product Page Fixer</h2><p class="job">The same discipline applied to the pages that carry a price and a decision.</p></div>
<div class="reads"><b>Reads</b>Page copy, objections, proof assets, pricing context, comparable pages.</div>
<div class="gate">Human-approved</div></div>

<div class="ag"><div class="n">iii</div>
<div><h3>Site Architecture Fixer</h3><p class="job">Fixes the order and hierarchy a first-time visitor actually moves through.</p></div>
<div><h2>Site Architecture Fixer</h2><p class="job">Fixes the order and hierarchy a first-time visitor actually moves through.</p></div>
<div class="reads"><b>Reads</b>Site structure, internal links, search intent, service hierarchy.</div>
<div class="gate">Human-approved</div></div>

<div class="ag"><div class="n">iv</div>
<div><h3>Ad Angle Generator</h3><p class="job">Builds testable angles from real customer language — and marks any claim you cannot prove.</p></div>
<div><h2>Ad Angle Generator</h2><p class="job">Builds testable angles from real customer language — and marks any claim you cannot prove.</p></div>
<div class="reads"><b>Reads</b>Reviews, objections, winning and losing ads, competitor hooks, channel notes.</div>
<div class="gate">Human-approved</div></div>

<div class="ag"><div class="n">v</div>
<div><h3>Competitor Watcher</h3><p class="job">Turns competitor research into moves you can make — explicitly without copying anyone.</p></div>
<div><h2>Competitor Watcher</h2><p class="job">Turns competitor research into moves you can make — explicitly without copying anyone.</p></div>
<div class="reads"><b>Reads</b>Three to eight competitor URLs, your positioning, reviews and objections.</div>
<div class="gate">Human-approved</div></div>

<div class="ag"><div class="n">vi</div>
<div><h3>Email &amp; SMS Generator</h3><p class="job">Writes the follow-up sequence in your voice, from your own proof.</p></div>
<div><h2>Email &amp; SMS Generator</h2><p class="job">Writes the follow-up sequence in your voice, from your own proof.</p></div>
<div class="reads"><b>Reads</b>Brand voice, offer, objections, prior sends, customer replies.</div>
<div class="gate">Human-approved</div></div>

<div class="ag"><div class="n">vii</div>
<div><h3>Weekly Performance Analyst</h3><p class="job">Turns the week's numbers and what shipped into a report and a next-action list.</p></div>
<div><h2>Weekly Performance Analyst</h2><p class="job">Turns the week's numbers and what shipped into a report and a next-action list.</p></div>
<div class="reads"><b>Reads</b>Weekly analytics, changes shipped, channel notes, client replies, last week's learnings.</div>
<div class="gate">Human-approved</div></div>
</div>

<div class="gatebox">
<div>
<h4>What the desk does</h4>
<h2>What the desk does</h2>
<ul>
<li>Research, drafting, quality checks, packaging and routing</li>
<li>Reads your real pages, reviews, ads and numbers</li>
Expand All @@ -92,7 +92,7 @@ <h4>What the desk does</h4>
</ul>
</div>
<div class="never">
<h4>What it is never allowed to do</h4>
<h2>What it is never allowed to do</h2>
<ul>
<li>Send anything to anyone</li>
<li>Publish anything to your site</li>
Expand Down
4 changes: 2 additions & 2 deletions public/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@
background:var(--cream);border:1px solid var(--brass)}
.stop.filled::before{background:var(--brass)}
.stop .d{margin-top:32px;color:var(--brass);font-size:10.5px;letter-spacing:.22em;text-transform:uppercase;font-weight:700}
.stop h4{margin-top:11px;font-size:17px;font-weight:600;letter-spacing:-.008em}
.stop h3{margin-top:11px;font-size:17px;font-weight:600;letter-spacing:-.008em}
.stop p{margin-top:8px;font-size:14.5px;line-height:1.68;color:var(--muted);max-width:26ch}

/* ── who ───────────────────────────────────────── */
Expand Down Expand Up @@ -153,7 +153,7 @@
.faq h2{font-family:'Fraunces',serif;font-weight:200;font-size:44px;letter-spacing:-.028em;margin-bottom:40px}
.q{display:grid;grid-template-columns:.9fr 1.1fr;gap:56px;padding:26px 0;border-top:1px solid var(--hair)}
.q:last-child{border-bottom:1px solid var(--hair)}
.q h4{font-size:18px;font-weight:600;letter-spacing:-.01em;max-width:24ch}
.q h3{font-size:18px;font-weight:600;letter-spacing:-.01em;max-width:24ch}
.q p{font-size:15.5px;line-height:1.74;color:var(--muted)}

footer{margin-top:110px;padding:30px 0 66px;border-top:1px solid var(--hair);
Expand Down
28 changes: 14 additions & 14 deletions public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -114,13 +114,13 @@ <h2>What we actually look at</h2>
<section class="method" id="method">
<h2>How the work runs</h2>
<div class="track">
<div class="stop filled"><div class="d">Day 0</div><h4>Everything on the table</h4>
<div class="stop filled"><div class="d">Day 0</div><h3>Everything on the table</h3>
<p>Payment, access, the approval owner and the implementation owner, all recorded. The clock starts here and nowhere earlier.</p></div>
<div class="stop"><div class="d">Days 1–5</div><h4>The read</h4>
<div class="stop"><div class="d">Days 1–5</div><h3>The read</h3>
<p>The four passes, by hand. You get each fault named, in order of what it costs you.</p></div>
<div class="stop"><div class="d">Days 6–14</div><h4>The fix</h4>
<div class="stop"><div class="d">Days 6–14</div><h3>The fix</h3>
<p>The highest-leverage page rewritten or rebuilt, plus a dev-ready handoff if your team ships it.</p></div>
<div class="stop"><div class="d">Months 2–3</div><h4>The loop</h4>
<div class="stop"><div class="d">Months 2–3</div><h3>The loop</h3>
<p>Weekly checks, one revision, and tracking that tells you whether the fix held.</p></div>
</div>
</section>
Expand All @@ -135,27 +135,27 @@ <h2>How the work runs</h2>
<h2>This one. tinystudio.io.</h2>
<div data-ai-identity>
<div class="q" data-ai-question="q1-what-tinystudio-does">
<h4>What TinyStudio does</h4>
<h3>What TinyStudio does</h3>
<p>The free leak audit of high-ticket service homepages — and the desk that closes what the audit finds, with a person's name on every audit.</p>
</div>
<div class="q" data-ai-question="q2-what-tinystudio-charges q7-what-tinystudio-io-charges">
<h4>What TinyStudio charges</h4>
<h3>What TinyStudio charges</h3>
<p>The audit is free and yours to keep. The desk that closes findings runs at $2,500 a month, on a three-month minimum.</p>
</div>
<div class="q" data-ai-question="q3-where-tinystudio-is-based">
<h4>Where TinyStudio is based</h4>
<h3>Where TinyStudio is based</h3>
<p>No base city or office address is stated.</p>
</div>
<div class="q" data-ai-question="q4-who-tinystudio-works-with">
<h4>Who TinyStudio works with</h4>
<h3>Who TinyStudio works with</h3>
<p>High-ticket service businesses — clinics, surgeons, dentists, spas, dealers, brokers — and clients are never named.</p>
</div>
<div class="q" data-ai-question="q5-what-is-tinystudio-io">
<h4>What is tinystudio.io</h4>
<h3>What is tinystudio.io</h3>
<p>This site: the leak audit and the desk behind it.</p>
</div>
<div class="q" data-ai-question="q6-client-work">
<h4>Does TinyStudio publish client work</h4>
<h3>Does TinyStudio publish client work</h3>
<p>No. No logos, no case studies, no testimonials, no "as seen at".</p>
</div>
</div>
Expand Down Expand Up @@ -191,13 +191,13 @@ <h2>Or have it <em>closed</em>, not merely found.</h2>

<section class="faq">
<h2>Before you ask</h2>
<div class="q"><h4>What exactly do I get for free?</h4>
<div class="q"><h3>What exactly do I get for free?</h3>
<p>A written appraisal on one page of your choosing — each fault named, in order of what it costs you, with the fix beside each. Yours to keep and to hand to any developer, including one who is not us.</p></div>
<div class="q"><h4>Why only six a month?</h4>
<div class="q"><h3>Why only six a month?</h3>
<p>Because they are done by hand and we are also delivering paid work. Six is what we can do properly. When the month is full, you go on the list for the next one.</p></div>
<div class="q"><h4>Do you guarantee more customers?</h4>
<div class="q"><h3>Do you guarantee more customers?</h3>
<p>No, and be wary of anyone who does. We guarantee the work is delivered on time or month one is refunded. What the market does with a better page is not ours to promise.</p></div>
<div class="q"><h4>What if I only want the appraisal?</h4>
<div class="q"><h3>What if I only want the appraisal?</h3>
<p>Then take it and go, with our blessing. It is not bait. Most of what we find is fixable by a competent developer in an afternoon.</p></div>
</section>

Expand Down
4 changes: 2 additions & 2 deletions public/pricing.css
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@
background:var(--cream);border:1px solid var(--brass)}
.stop.filled::before{background:var(--brass)}
.stop .d{margin-top:30px;color:var(--brass);font-size:10.5px;letter-spacing:.22em;text-transform:uppercase;font-weight:700}
.stop h4{margin-top:10px;font-size:17px;font-weight:600;letter-spacing:-.008em}
.stop h3{margin-top:10px;font-size:17px;font-weight:600;letter-spacing:-.008em}
.stop p{margin-top:8px;font-size:14.5px;line-height:1.68;color:var(--muted);max-width:26ch}

.q{display:grid;grid-template-columns:.85fr 1.15fr;gap:52px;padding:26px 0;border-top:1px solid var(--hair)}
.q:last-of-type{border-bottom:1px solid var(--hair)}
.q h4{font-size:18px;font-weight:600;letter-spacing:-.01em;max-width:26ch}
.q h3{font-size:18px;font-weight:600;letter-spacing:-.01em;max-width:26ch}
.q p{font-size:15.5px;line-height:1.74;color:var(--muted)}

/* extracted from inline style attributes — CSP style-src 'self' blocks those */
Expand Down
18 changes: 9 additions & 9 deletions public/pricing.html
Original file line number Diff line number Diff line change
Expand Up @@ -65,28 +65,28 @@ <h2>The Growth Desk</h2>
<h2>How the clock is counted</h2>
<p class="lede">The clock only starts when we genuinely have everything, and it stops whenever the ball is back in your court.</p>
<div class="track">
<div class="stop filled"><div class="d">Day 0</div><h4>Everything on the table</h4>
<div class="stop filled"><div class="d">Day 0</div><h3>Everything on the table</h3>
<p>Payment, access, the approval owner and the implementation owner, all recorded. Nothing starts earlier.</p></div>
<div class="stop"><div class="d">Stage two</div><h4>The read</h4>
<div class="stop"><div class="d">Stage two</div><h3>The read</h3>
<p>Four passes by hand. Each fault named, in order of what it costs you.</p></div>
<div class="stop"><div class="d">Stage three</div><h4>The fix</h4>
<div class="stop"><div class="d">Stage three</div><h3>The fix</h3>
<p>The page rewritten or rebuilt, plus the handoff, in your hands.</p></div>
<div class="stop"><div class="d">Months 2–3</div><h4>The loop</h4>
<div class="stop"><div class="d">Months 2–3</div><h3>The loop</h3>
<p>Weekly checks, one revision, and tracking that tells you whether the fix held.</p></div>
</div>
</section>

<section>
<h2>Before you ask</h2>
<div class="q"><h4>Why is the appraisal free?</h4>
<div class="q"><h3>Why is the appraisal free?</h3>
<p>Because it is the only honest way to show you we can do the work. You keep it either way, and most of what we find is fixable by a competent developer in an afternoon — including one who is not us.</p></div>
<div class="q"><h4>Do you guarantee more customers?</h4>
<div class="q"><h3>Do you guarantee more customers?</h3>
<p>No, and be wary of anyone who does. We guarantee the work is delivered on time or month one is refunded. What the market does with a better page is not ours to promise.</p></div>
<div class="q"><h4>What if I am unhappy but you delivered?</h4>
<div class="q"><h3>What if I am unhappy but you delivered?</h3>
<p>Then you tell us, we use the revision, and you leave at the end of the three months. We would rather write that plainly than pretend a satisfaction clause we could not honour.</p></div>
<div class="q"><h4>Why only six audits a month?</h4>
<div class="q"><h3>Why only six audits a month?</h3>
<p>They are done by hand and we are also delivering paid work. Six is what we can do properly. When the month is full you go on the list for the next one.</p></div>
<div class="q"><h4>Who actually does the work?</h4>
<div class="q"><h3>Who actually does the work?</h3>
<p>Seven specialist agents do the research, drafting and checking. A person reviews fit, every claim, all client-facing work, delivery and renewal. Automation never sends, publishes, spends or approves. <a class="xp1" href="agents.html">See the desk →</a></p></div>
</section>

Expand Down
4 changes: 2 additions & 2 deletions public/specimen.css
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
.f{padding:34px 0;border-bottom:1px solid var(--hair)}
.f .top{display:flex;gap:18px;align-items:baseline}
.f .idx{font-family:'Fraunces',serif;font-style:italic;font-weight:200;font-size:30px;color:var(--brass-lt);line-height:1}
.f h3{font-size:22px;font-weight:600;letter-spacing:-.014em;line-height:1.3}
.f h2{font-size:22px;font-weight:600;letter-spacing:-.014em;line-height:1.3}
.f .body{margin-left:48px}
.f p{margin-top:12px;font-size:16px;line-height:1.74;color:var(--soft)}
.ev{margin-top:16px;background:rgba(255,253,248,.75);border:1px solid var(--hair);border-left:2px solid var(--brass);
Expand All @@ -17,7 +17,7 @@
.fix b{color:var(--brass);font-weight:600}
.notrun{margin-top:40px;background:rgba(176,74,46,.05);border:1px solid rgba(176,74,46,.22);
border-radius:10px;padding:26px 30px}
.notrun h4{font-family:'Fraunces',serif;font-weight:300;font-size:21px;letter-spacing:-.018em;color:var(--sig)}
.notrun h3{font-family:'Fraunces',serif;font-weight:300;font-size:21px;letter-spacing:-.018em;color:var(--sig)}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Remove the unnecessary quotes from Fraunces.

Stylelint reports font-family-name-quotes on Line 20. Remove the quotes around this single-word family name. The computed font-family value remains unchanged.

Proposed fix
-  .notrun h3{font-family:'Fraunces',serif;font-weight:300;font-size:21px;letter-spacing:-.018em;color:var(--sig)}
+  .notrun h3{font-family:Fraunces,serif;font-weight:300;font-size:21px;letter-spacing:-.018em;color:var(--sig)}
📝 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
.notrun h3{font-family:'Fraunces',serif;font-weight:300;font-size:21px;letter-spacing:-.018em;color:var(--sig)}
.notrun h3{font-family:Fraunces,serif;font-weight:300;font-size:21px;letter-spacing:-.018em;color:var(--sig)}
🧰 Tools
🪛 Stylelint (17.14.0)

[error] 20-20: Expected no quotes around "Fraunces" (font-family-name-quotes)

(font-family-name-quotes)

🤖 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 `@public/specimen.css` at line 20, Update the .notrun h3 rule to remove the
unnecessary quotes around the single-word Fraunces font-family name, leaving the
remaining font declaration unchanged.

Source: Linters/SAST tools

.notrun p{margin-top:11px;font-size:15px;line-height:1.72;color:var(--soft)}

/* extracted from inline style attributes — CSP style-src 'self' blocks those */
Expand Down
Loading
Loading