Outcropby Basalt

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.

  1. 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.
  2. 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: / under User-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).
  3. 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.
  4. 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.
  5. 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.
  6. 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 &amp; 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).
  7. 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/plain or text/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).
  8. 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.