Guide ·
SEO for a new software site: the order we’d do it in
Eight steps for a maker starting SEO on a new SaaS, app or developer-tool site, in the order we would do them. Each has what to do, a check that takes under 5 minutes, and what we found when we did the same on Basalt Studio’s own 8 sites.
How to use it
In order, one step at a time
Steps 1 to 4 make sure search engines and AI crawlers can find and read the site at all; nothing after them works without them. Steps 5 and 6 decide which searches you can show up for. Steps 7 and 8 are about being named in AI answers.
The checks use curl, grep, sed and perl, which come with macOS and most Linux systems. Set your site’s address once, without a slash at the end, as in the AI crawler check:
site=https://example.com
The checklist
Eight steps, most important first
Each step ends with what we found when we did it on Basalt Studio’s own sites, with the real number and the date.
Verify Google Search Console and Bing Webmaster Tools on day one
- Do
Verify the site in both on launch day and submit your sitemap in each. They are where you see which searches find your pages, which pages are indexed and what is broken. Bing can import a site from Search Console in a few clicks.
- Check
In Search Console, open Indexing, then Sitemaps: your sitemap should show Success. Check Sitemaps in Bing Webmaster Tools the same way. Your robots.txt should point to the sitemap too:
curl -s "$site/robots.txt" | grep -i '^sitemap:'- On our sites
- All 8 are verified in both, with every sitemap submitted by 20 Oct 2026. Their Search Console numbers go on the proof page at 2, 4 and 8 weeks after each change.
Make sure robots.txt blocks nothing you want found
- Do
Read it line by line, AI crawlers included. A
Disallow: /left over from staging, or a rule for GPTBot, ClaudeBot or PerplexityBot copied from a template, keeps pages out of search results or AI answers.- Check
Look for
Disallow: /underUser-agent: *or under a crawler you want in. The AI crawler check explains each crawler name.curl -s "$site/robots.txt" | grep -i -E -A3 '^user-agent: *(\*|gptbot|claudebot|perplexitybot)'- On our sites
- 0 of 8 of our sites blocked GPTBot, ClaudeBot or PerplexityBot in the 19 Oct baseline (proof page).
Serve a sitemap that returns 200 and lists only real pages
- Do
List every page you want indexed and nothing else: no redirects, no missing pages, no test pages. Every URL in the sitemap should answer 200 on its own.
- Check
The first command should print 200. The second prints every listed URL that does not answer 200; on a small site it takes under a minute, and no output is what you want.
curl -s -o /dev/null -w '%{http_code} %{content_type}\n' "$site/sitemap.xml" curl -s "$site/sitemap.xml" | grep -o '<loc>[^<]*' | sed 's/<loc>//' | while read -r u; do printf '%s %s\n' "$(curl -s -o /dev/null -w '%{http_code}' "$u")" "$u" done | grep -v '^200'- On our sites
- 8 of 8 of our sitemaps returned 200 (proof page). A sitemap listing URLs that redirect is a common finding in our audits.
Put the main text in the HTML, not only in JavaScript
- Do
The H1 and the first paragraphs should be in the HTML the server sends. Google renders JavaScript, but most AI crawlers do not, so a page drawn only in the browser reaches them empty.
- Check
This counts the words in the raw HTML. A page that reads as a full article in your browser should come back with hundreds of words, not a few dozen. Step 3 of the AI crawler check has a loop for several pages.
curl -s "$site/" | perl -0777 -pe 's/<(script|style)\b.*?<\/\1>//gis; s/<[^>]+>/ /g' | wc -w- On our sites
- One of our pages had no H1 and under 80 words without JavaScript (proof page). It has an H1 now.
Write buyer pages before blog posts
- Do
Start with the pages people read just before they choose: “[competitor] alternative”, “[you] vs [them]” and “best [category] for [who]”. Fewer people search these than broad topics, and the ones who do are close to picking a tool.
- Check
Search “[your main competitor] alternative” in a private window and see whether you appear. Then count the buyer pages in your sitemap:
curl -s "$site/sitemap.xml" | grep -c -i -E 'alternative|-vs-|best-'- On our sites
- Upright got 4 comparison pages on 18–19 Oct: a “Logi Options+ alternatives” page and three “Upright vs” pages (proof page, change log). Their Search Console numbers come at 8 weeks.
Fix titles and descriptions in the template, not page by page
- Do
Most titles and descriptions come from one template, so one fault repeats on every page it builds. Fix the pattern there: titles of about 60 characters, descriptions of about 160, each page filling in its own name.
- Check
This prints the title and description length of every page in your sitemap. Look for titles over 60, descriptions over 160 and the same title on many pages. Counts are rough: an entity such as
&counts as several characters. A full audit checks this on every page.curl -s "$site/sitemap.xml" | grep -o '<loc>[^<]*' | sed 's/<loc>//' | while read -r u; do curl -s "$u" | perl -CS -0777 -ne '($t) = /<title[^>]*>(.*?)<\/title>/is; ($d) = /<meta\s+name="description"\s+content="([^"]*)"/is; printf "%3d %3d ", length($t), length($d)' echo "$u" done- On our sites
- On a coffee catalogue we run, 145 of 300 crawled pages had descriptions too long to show in full (proof page, first audit).
Add llms.txt
- Do
A short Markdown file at /llms.txt that says what the product is, who it is for, what it costs, what it does not do and which pages matter. No AI company has confirmed reading it, so treat it as a cheap test, not a ranking factor.
- Check
You want 200 and
text/plainortext/markdown. The llms.txt guide shows what we put in ours.curl -s -o /dev/null -w '%{http_code} %{content_type}\n' "$site/llms.txt"- On our sites
- 0 of 8 of our sites had one on 19 Oct, and 8 of 8 on 20 Oct (proof page).
Get listed where “alternatives” searches and AI answers look
- Do
Add the product to AlternativeTo next to the tools it replaces, give its GitHub repo topics that name the category, ship a Homebrew formula or cask for a Mac or command-line tool, and join the directories your buyers read. AI answers and alternatives searches often cite these pages instead of the product’s own site.
- Check
Search your main competitor on AlternativeTo and see whether you are in its list of alternatives. Open your repo’s About box to see its topics. For a Mac or command-line tool:
brew search your-app-name- On our sites
- In our AI check of Upright on 20 Oct, Upright was named in 0 of 30 answers. The apps that were named have those listings.
Left out
What this list leaves out
Backlinks, page speed, structured data and keyword research all matter, and an audit covers them. None of them helps much until the eight steps above are done. If you would rather have someone run the whole list on every page, here is what an SEO audit costs.