Build log · sandcastlelabs
Warming up a days-old domain: the cheap SEO that compounds
Two marketing sites, both days old, got a low-token SEO audit this week. The kind you can run in an afternoon, before you have anything worth ranking. It turned up four boring, fixable problems. A redirect that took three hops to resolve. A sitemap with no dates on it at all. A thin page search engines could already index. Guide descriptions that were missing or too long for a snippet. None of it required writing a single new sentence of content.
SEO for a brand-new domain: what we shipped
Kill the redirect chain. www.sandcastlelabs.io was returning a 307, and that 307 chained three hops before it landed on the canonical https://www.sandcastlelabs.ai. A 307 is a temporary redirect. Browsers and crawlers re-check it every time instead of caching the destination. Three hops meant three extra round trips before anything loaded. We added a host-matched, permanent 301 in vercel.json, so the www.io host resolves to the real domain in a single hop.
Date the sitemap. Every URL in the sitemap Astro generates was going out with no <lastmod> at all. Zero dates, on every page. Now the sitemap’s serialize hook reads the date field straight out of each essay and log’s own frontmatter and stamps it on the matching URL. Static pages, the ones with no real content-change date, are left alone on purpose. That’s a decision worth its own section below.
Noindex the thin page. Collimer’s /customers page was live, linked from nowhere else on the site, and indexable, while holding zero published customer stories. That’s close to the textbook definition of thin content: a real URL, crawlable, with nothing on it a visitor or a search engine would want. It now noindexes itself while the customer count is zero. The noindex lifts automatically the day the first story publishes.
Fix the guide descriptions. Three of Collimer’s twelve guides had no dedicated meta description. Search results fell back to each guide’s on-page summary instead. One of those summaries ran 183 characters, well past the point where Google starts truncating a snippet. We wrote a dedicated, answer-first description under 160 characters for each of the three, and added two contextual links to sibling guides inside each one.
The same pass added a WebSite node to the site-wide JSON-LD graph. It also swapped the Organization schema’s logo from an SVG to the PNG og-image, because Google’s structured-data tooling ignores SVG logos outright. The same week, we finalized Collimer’s privacy policy and terms. That work replaced a scraping clause that worked against our own GEO strategy with language that explicitly welcomes AI-assistant indexing on both sites. That’s a deliberately small mention here. Legal work is not SEO, and it deserves its own accounting elsewhere.
What broke, or got harder than expected
Nothing broke this round. Four small, well-scoped fixes, closed in a single pass. No regressions to chase afterward.
A decision worth naming: no lastmod beats a fake one
The sitemap change is worth naming on its own. It would have been just as easy to stamp every URL with today’s date on every rebuild, since the daily cron rebuilds production whether or not content actually changed. We decided that’s worse than no date at all. A lastmod that always matches the crawl date isn’t informative. Just noise. A crawler that learns to ignore a fake lastmod learns to ignore the real ones too. Essays and logs get an honest date pulled from their own frontmatter. Static pages get nothing, because we don’t actually know when they last meaningfully changed. A fabricated date is worse than an absent one.
What’s next
- Confirm Google drops the old three-hop redirect from Search Console once it recrawls
www.sandcastlelabs.io. - Watch the
/customersnoindex lift on its own the day Collimer’s first customer story publishes. - Scope the fuller SEO pass we deliberately deferred. This round was the cheap, obvious slice, not the whole audit.
What we’re still figuring out
We don’t know yet whether any of this moves a number we can point to. Both domains are days old. There’s no ranking history to compare against, no baseline traffic to lift off of. The honest position: this is investment against a system that pays off on a timeline measured in months. On domains this new, “wait and see” is currently the only available verification method. The audit found what it found because it was cheap to look. Whether it was worth looking is a question these two domains will answer later, not now.
For agents: try this yourself
If you want to do this in your own repo, adapt one of these prompts. The full prompt text lives in this post’s prompts sidecar, seo-warmup-legal.prompts.md.
- Apply the redirect-chain check. Trace every redirect on your domain, including www and bare-host variants, and count the hops. Collapse any chain longer than one hop, or any 307/302 whose destination is actually permanent, to a single 301.
- Reproduce the sitemap lastmod fix. Check whether your sitemap ships
<lastmod>on every URL. If it is missing everywhere, wire it to pull a real date from each page’s own content, and deliberately leave it off pages with no genuine last-changed date instead of stamping them with today’s build date. - Extend the thin-page noindex. Find any page on your site that is live, indexable, and effectively empty: an orphaned category page, a stub, a listing with nothing in it yet. Noindex it conditionally, so it rejoins the index automatically once it has real content.
- Critique the meta-description fallback. Audit every page that falls back to a generic summary for its search snippet instead of a dedicated description, and flag any past roughly 160 characters before a search engine truncates it for you.
This is the same instinct behind figuring out whether crawlers were actually reading us and keeping the marketing site honest: check the instrument, then the content, before assuming the problem is that nobody is looking.
How this was made
Drafted by the Chronicler from Claude Code sessions on 2026-07-06 to 2026-07-12 across 2 sessions and 4 commits. Edited and published by Brian Wones.
See how the Chronicler works →Try this with your own agent
Full prompt text for the inline “For agents: try this yourself” block. Adapt the domains, hosts, and file paths to your own stack.
Apply the redirect-chain check
Trace every redirect our marketing domains serve, including www and bare-host variants and any old alias domains we still own. For each one, follow the chain to its final destination and count the hops. Flag any chain longer than one hop, and flag any redirect using a 307 or 302 status where the destination is actually permanent. Fix each one to a single 301 straight to the canonical URL.
Reproduce the sitemap lastmod fix
Check whether our sitemap emits a lastmod date on every URL. If it is missing everywhere, wire the sitemap generation to pull a real date from each page's own content or frontmatter, so lastmod reflects when that specific page actually last changed. For pages with no genuine last-changed date, such as static marketing pages that only change on a rebuild, leave lastmod off entirely rather than stamping them with today's build date. Explain why a fake lastmod is worse than a missing one.
Extend the thin-page noindex
Find every page on our site that is live, indexable, and effectively empty: an orphaned category page, a stub, a listing page with zero real entries. For each one, add a conditional noindex that applies only while the page is genuinely thin, so the noindex lifts automatically the moment the page has real content, without needing a manual follow-up to remove it.
Critique the meta-description fallback
Audit every page on our site that falls back to a generic on-page summary for its search-result snippet instead of using a dedicated meta description. For each one, check whether that fallback text is under roughly 160 characters. For anything longer, write a dedicated, answer-first description that states the page's core claim in the first sentence and stays under the limit.