SEO CLI: Script the Same Eight-Module Page Check

By the SEO Health Team · Last updated: 2026-08-16 · We build the SEO Health checker at aimeetup.center. Methods below come from the product’s page audits, sitemap samples, and GSC export math — not from a claimed Google score.

Table of Contents

  1. TL;DR
  2. What a scriptable check is
  3. The same eight modules in a pipeline
  4. How a CI check should work
  5. Adjacent work after the command
  6. Implementation order
  7. Failure modes
  8. Frequently Asked Questions
  9. Conclusion

TL;DR

Direct answer: An seo cli is a scriptable command that runs the same eight-module check as the web paste — title, meta, headings, density, images, links, tech, and speed — and writes machine-readable output a pipeline can store or fail on. It is not an agent essay.

What you'll learn

  • A 45-word definition of an seo cli you can quote
  • Why CI must use the same eight modules as the paste box
  • What JSON and exit codes should look like
  • Where to hang the command on a pull request
  • The three failures that turn a CLI into a second score

If you already have a URL, run a free page check once in the browser so you know the rule list. Then call the same list from the command line. Do not invent a ninth module because the invocation was a flag.

What a scriptable check is

Key Definition: An seo cli is a scriptable command that runs the same eight-module check as the web paste — title, meta, headings, density, images, links, tech, and speed — and writes machine-readable output a pipeline can store or fail on. It is not an agent essay.

Illustrative grouped bar chart: CLI eight-module lights matching the web paste

Quick answer: An seo cli runs the same eight-module check as the web paste — title, meta, headings, density, images, links, tech, and speed — and writes machine-readable output a pipeline can store or fail on. It is not an agent essay. Key terms

TermMeaning
Exit codeZero when agreed reds are absent; non-zero when the job should fail.
Module parityThe same eight rules on web paste and in the command.
Traffic lightGreen / amber / red per module instead of one vanity 100.
Stored reportJSON a pipeline can archive next to the commit. (#588)

People type seo cli when they want the page check inside a script, a Makefile, or a pull-request job. They are not asking for an agent that chats about the page. That essay is seo agent. They are not asking which SKU to buy. That buyer page is onpage SEO software. This page is the command: same eight modules, machine-readable output.

A useful seo cli answers three questions. What URL did you pass. Which of the eight lights are red. What should the pipeline do — store the JSON, fail the job, or both. If the output is a colorized essay in the terminal and nothing a machine can parse, you still have the original problem.

A command-line interface is just a program you invoke with arguments instead of a form. That Wikipedia page is the category. It is not a scoring philosophy. An seo cli should reuse the philosophy that already exists on the web paste.

Key definition, applied

The unit of work is still one URL — or a short list of URLs a job can finish. The surface is how you invoke the check. Write the findings as module, light, and next edit. If you cannot name the edit, the seo cli is not finished. Software can fetch. A person or a later job still has to change the HTML.

CLI versus an agent essay

An agent plans, calls tools, and writes a note. A CLI is the tool. Keep them apart. The agent page can say “call the same command.” This page writes the command. An seo cli that opens with a persona and never prints JSON is the wrong URL.

We run the command on the same URLs we paste into the web form. What follows is from those paired runs, not from a vendor score we cannot reproduce.

The same eight modules in a pipeline

Parity is the product. An seo cli that invents a ninth score for CI is selling confusion. Walk the same eight lights you would walk after a paste.

OrderModulePass whenFail when
1TitleUnique, intent-true, usable as a title linkEmpty, duplicated, stuffed
2MetaPlausible snippet, not a second H1Empty or keyword soup
3HeadingsOne H1, outline a human can scanMissing H1, skipped levels
4DensityPrimary phrase in a readable bandStuffing, or a page that never states the topic
5ImagesReal alt text, working filesFilename leftovers
6LinksLive internal and outbound hrefs4xx/5xx targets
7TechHTTPS, indexable, coherent headAccidental noindex
8SpeedUsable first responseA shell that never becomes a document

Title through density

These four are the copy lights. The command should fetch the document and score title, meta, headings, and the primary-phrase band. If a pull request changes the <title> and the title light does not move, the seo cli is reading a cached artifact, not the URL you passed.

Desk samples on preview deploys show why the command exists. The editor pasted the production URL and saw green. The pull request shipped a missing H1 on the preview host. CI is how that gap becomes a failed check instead of a surprise.

Images through speed

These four are the eligibility and asset lights. The command should still request in-page hrefs, still flag empty alts, still read robots and canonical, still notice a document that never arrived. A script that only greps the HTML for a phrase will skip all four.

If the web paste marks a dead CTA red and the command marks it green, believe the conflict and fix the fetch. Seo cli work that cannot request a link is grep with extra flags.

JSON you can store

RFC 8259 is the JSON spec a pipeline can trust: one object, UTF-8, no trailing-comma surprises. Print module, light, and evidence. Print the request URL and the final URL. Do not print a 100 and hide the reds.

If a later system wants an activity log, the Activity Streams 2.0 core vocabulary can wrap “actor checked object at time.” That wrapper is optional. The seo cli still has to emit the eight lights first. Do not replace the punch list with an activity type and call the job done.

After you wire the command, run the free page check on one of the same URLs and confirm the JSON and the paste agree.

How a CI check should work

A finished seo cli is a punch list a job can fail on, not a pretty terminal theme. Sort by light. Fail on agreed reds. Store the JSON either way.

What you pass

Pass the exact URL the job should judge: scheme, host, path, and query if the query is part of the document. Do not pass a homepage and hope the command invents the article path. Do not let the script “helpfully” rewrite preview hosts to production unless you documented that rewrite.

curl’s man page is the fetch client most jobs already have. Use it — or a wrapper that behaves like it — with a hop cap, a timeout, and a recorded status. An seo cli that hides the hop list will green-light a loop you cannot see.

What the command requests

Request the URL. Follow redirects with a hop cap. Score eight modules. Write JSON to stdout or to a file the job artifacts. Set an exit code your pipeline already understands. That is the whole command. An seo cli that also opens a browser window on the CI runner is mixing jobs.

Decide once whether the command scores the first HTML or a rendered DOM. Write it down. If the web paste fetches the first HTML, the seo cli should too, unless you documented a render step. Silent switches flip the image and link lights on the same URL.

The GNU Bash manual is enough of a home for the glue: a loop over a URL list, a failed set -e on a red you agreed to block, a stored artifact. You do not need a new shell. You need a stable seo cli exit code.

Where the job hangs

GitHub Actions is the usual place teams hang the command so a pull request cannot ship a missing H1 without a light turning red. Run it on the preview URL, not only on production after merge. Store the JSON next to the job log.

The category hub in On Page SEO Tool already said the surfaces share a rule list. This page is that sentence applied to CI. An seo cli that only exists on a laptop is a demo. Hang it where the merge happens.

Do not fail the job on every amber on day one. Pick the reds that mean “do not ship” — empty title, noindex on a keep URL, dead CTA on the template you changed. Expand the fail set when the team can stand it. An seo cli that fails the world gets bypassed.

Adjacent work after the command

The command is the core. Two adjacent jobs sit next to it. They are not substitutes.

When a person still pastes

CI does not replace the first look. If a writer has one URL and no pipeline, the paste box is faster. Run a free page check on that URL, then add the seo cli when the same template will ship again tonight. The buyer grid for surfaces stays on onpage SEO software.

A person still has to read a red that the job cannot auto-fix. Exit codes stop the merge. They do not write the H1.

When an agent should call the same rules

Agents should call this command, not invent a tenth module in prose. The essay for that handoff is seo agent. Keep the rule list here. If the agent’s note and the CLI JSON disagree, believe the JSON and fix the agent.

Do not start that essay on this URL. This page stays a scriptable check.

Implementation order

Use this sequence on every job so an seo cli stays a command, not a second score.

  1. Paste one URL on the web form. Save the eight lights as the contract.
  2. Call the command on the same URL. Diff the JSON against that contract.
  3. Hang the command on the preview URL in CI.
  4. Fail on the reds you agreed to block. Store JSON on pass and fail.
  5. Loop a short URL list only after one URL matches.
  6. Re-paste after a red fix. Confirm both surfaces moved.

If step 2 disagrees, stop. Fix parity before you schedule a nightly crawl of pages you will not edit.

Failure modes

These are CLI failures, not scoring-theater failures.

  1. Second score. The command prints a 100 the paste box does not use. Tickets then argue about which number is real. Delete the extra score. Keep the lights. An seo cli that cannot name eight modules is curl plus a vibe.
  2. Production-only. The job runs after merge, on the live host, when the missing H1 is already public. Hang it on the preview URL. GitHub Actions is wasted if it only narrates yesterday.
  3. Unparseable output. The terminal looks friendly and CI cannot read a light. Emit RFC 8259 JSON. Color is optional. The object is not.

None of these are “the runner was unreliable.” They are command failures. Fix the command.

Frequently Asked Questions

Is the CLI a different product from the paste box?

Bottom line: No. An seo cli is the same eight-module check with a different invocation. If the modules fork, you do not have a pipeline. You have two products.

Should I fail the build on every amber?

Bottom line: Not on day one. Fail on the reds that mean do not ship. Expand the set when the team can stand it. A job that fails the world gets skipped.

Can I just curl the HTML and grep a phrase?

Bottom line: That is a phrase check, not title, meta, headings, density, images, links, tech, and speed. curl is the fetch. The seo cli is the eight lights on top of the fetch.

Where does an agent fit?

Bottom line: The agent calls this command. It does not replace it. Keep the essay on the agent URL. Keep the flags, JSON, and exit codes here.

Do I need Bash, or will any runner do?

Bottom line: Any runner that can invoke the command, read JSON, and honor an exit code will do. The Bash manual is the common glue, not a requirement to rewrite your stack.

Conclusion

An seo cli is a scriptable eight-module check. Pass a URL. Emit JSON. Fail on agreed reds. Match the paste box. Start with a free page check so the contract is visible, then hang the same list in CI. For the agent that should call this command, stay on seo agent.

About the author — SEO Health Team. Reviewer: William Zhu (GitHub). Published and updated 2026-08-16. Credentials appear only here.

SEO CLI: Script the Same Eight-Module Page Check