We handed our SEO checklist to our bots. Here's the week.

On Saturday evening I pasted a checklist into one of our team threads. It's the one going around: render server-side, generate a sitemap, fix the 404s, one H1 per page, FAQ schema, alt text, under two seconds, real author bio, quality backlinks. "Rank #1 by Friday. Make no mistakes." Underneath it I asked our bots to make a plan and do it.

Caret runs on five bots: a chief of staff (plans), an engineer (code and infra), a designer, a marketer and a generalist (everything in between). Each one took a part of it.

#marketing thread
You
You

"Rank #1 by Friday. Make no mistakes." Checklist above. Make a plan and do it.

Chief of staff

Before the checklist: when Googlebot asks for caretbot.com it gets an empty <div id="root">, a title and about 80 words. No H1 and none of our copy. Five to-dos below, each with an owner and a date.

The start of the thread, shortened and reworded. Our bots go by their roles here.

The audit: Google was seeing an empty page

The chief of staff answered first, and the answer wasn't on the checklist. Our landing page is a React app rendered in the browser. When Googlebot asked for caretbot.com, it got a <div id="root"></div>, a title, a meta description and about 80 words. No H1, and none of the copy.

<!-- What Googlebot got from caretbot.com before the fix -->
<body>
  <div id="root"></div>
  <script type="module" src="/assets/index.js"></script>
</body>

<!-- What it gets now: the page, already drawn -->
<body>
  <div id="root">
    <h1>Put a bot on it.</h1>
    <p class="hero-sub">AI teammates for small startups, with a computer of their own.</p>
    …about 1,600 words of copy and FAQ…

The rest of the audit:

  • robots.txt and sitemap.xml didn't exist as files, so the server returned the homepage HTML for both, with a 200.
  • Pages that didn't exist also returned 200, so every typo looked like a real page to Google.
  • http://www reached the site in two redirects, not one.
  • No canonical tag. That one mattered more than it looks, because every launch link we'd shared carries a ?utm_source=… query, and each of those can count as a separate page.
  • No noindex tags anywhere, so one item on the checklist was already done.

The chief of staff turned that into five to-dos with an owner and a date each, and put them at the top of the thread.

The part no checklist mentions: is the name even winnable?

The marketer's job was keywords and copy. Its first finding changed the goal: "Caret" is a crowded name. Searching it brings up a meeting assistant at caret.so, a Discord bot, a Mac autocomplete tool, a VS Code agent, a legal software company and a well-known R package. We weren't going to beat all of them by Friday.

"caretbot" was different. Nobody else uses it, and it's our domain. So the target became the brand query first, with three or four specific phrases that describe what we do (AI teammates, bots with their own computer, Claude Code and Codex bots for a team) for the longer run.

From there the copy was concrete: a title with the brand and the category in it, a meta description under 155 characters, our headline "Put a bot on it." kept as the H1 with the category beside it, two new FAQ answers (one of them "Is Caret the same as caret.so?"), and structured data with no price in it.

Design: the slow part was text

The designer ran Lighthouse on mobile before touching anything: performance 62, largest contentful paint 4.0 seconds. The slowest thing to appear wasn't an image. It was the hero paragraph, which stayed invisible until a 105 KB JavaScript bundle loaded and ran. Render-blocking Google Fonts cost about another 1.6 seconds, and a 72 KB animation file was preloaded at high priority.

So "convert images to WebP" turned out not to matter for us: we have one small raster logo. The fixes were prerendering, self-hosting the two font weights we use, loading the animation after first paint, and a proper 1200×630 share card in place of the logo. The designer also caught the only accessibility failure, footer text at 3.7:1 contrast, below the 4.5:1 minimum.

Engineering: prerender, then put a CDN in front

The engineer took the build: a real robots.txt and sitemap.xml, real 404s, a single-hop redirect, a canonical tag that ignores query strings, and a prerendered home page with the new copy and FAQ schema. Then we added a blog (this post is the third on it) and moved the site to S3 behind CloudFront, so the HTML is served from an edge near whoever asks for it.

It all went live the same evening in one pull request. After the switch, the engineer checked the parts that a site move tends to break: app downloads, the Mac app's update feed, analytics and the waitlist link. One item didn't fully land. http://www still takes two hops because of how CloudFront handles redirects, so it's on the list for next week. Rolling back would take one DNS change.

The numbers

4.0 s → 1.6 sLargest contentful paint on mobile
~80 → ~1,600Words Google sees on the home page
0 → 1H1 tags in the raw HTML
3rd"caretbot" on Google's page 1
Before (Sat 3 Oct) After
Words Google sees on the home page ~80 ~1,600
H1 tags in the raw HTML 0 1
Lighthouse mobile performance 62 99
Largest contentful paint (mobile) 4.0 s 1.6 s
Lighthouse accessibility / SEO 97 / 92 100 / 100
"caret bot" on Google not on page 1 not on page 1 yet
"caretbot" on Google not measured 3rd on page 1

What people still did

The bots did the audit, the writing, the design spec and the code. People did two things: I verified the domain in Google Search Console (it needs a DNS record on an account only I can reach), and I approved anything that went out under my name. The shortcuts were left out on purpose. The backlink plan says it plainly: no bought links and no mass directory blasts. "Make no mistakes" mostly means not doing the things that get a domain penalized.

What we'd tell you if your site is vibe-coded too

Start by looking at what Google gets: curl your homepage and read the raw HTML. If your copy isn't in it, nothing else on the checklist matters yet. Then check that /robots.txt and /sitemap.xml are real files and that a made-up URL returns a 404. Then search your own name and see who you're up against before you promise anyone #1.

We build Caret so a team can hand this kind of work to bots and stay in charge of what goes out. Team is $40 a bot a month, with people free and a 7-day trial. Get started.

More from the blog

Account research before a sales call: a one-page brief templateAn AI agent approval policy template you can copy todayHow to organize AI agents on a small team: our five-bot org chart