1.37.0 — a report that says a site-wide problem once
Added
-
The Raycast extension can ask Search Console. The engine has had
--search-consolesince 1.21.0 and the extension never exposed it — a
launcher showing every finding except the one number that is not a proxy for
attention. A checkbox switches it on and a field names the property, the same
shape the flag has: bare means the site being crawled, a value names a
property.It does not ask for credentials. Getting them opens a browser and writes a
file, which is a terminal errand rather than a control in a window — the same
answer the macOS app gives. Without them the engine reports
search-console-unconfiguredand names what is missing, so this fails in the
report rather than going quiet.Checked in both directions, because both failures are silent: a preference
the code reads and the manifest never declares is a control nobody can reach,
and one declared but never read is a control that does nothing. -
--reportslists the runs kept on this machine, and--reports 2026-08-01lists what was kept since. The library was reachable from the
macOS window and the served list and from nowhere on the command line, which
is the one place the rest of this tool lives./reportsgains the same filter
as a date control, and both call one function so the browser and the terminal
cannot disagree about what "since" means.That function is not in
src/library.mjs. That module opens files, so it
importsnode:fs, and the Worker showing the same list has no filesystem and
would not have survived the import —src/kept.mjsis the pure half both
sides need.A date it cannot read is refused rather than ignored, because listing every
run when somebody asked for one week looks like an answer. A date that hides
everything says how many it hid, since an empty list and an empty library read
identically and only one of them means "widen the date". -
A check that fires on every page is one thing to change, not one per
section. Grouping by URL prefix is right when a check hits part of a site —
that is the Shopify/products/insight this project's grouping was built on
— and wrong when it hits all of it. gohugo.io produced 200 things to change
and 104 of them were four checks that each applied to all 150 pages;
canonical-missingalone arrived as twenty-six separate pieces of work, one
per prefix, making the reader do the arithmetic that tells them it was
site-wide. The same report is now 100 things to change, and those four read
every page crawled (150), 1,695 links in.Exactly every page, never nearly. On 149 of 150 "every page" is a false
sentence, and a report is only worth reading because its sentences are true.
It costs no extra requests — the grouping was already computed.
Fixed
-
"1 image(s) without width/height" was the most repeated finding title in a
real report and read like a form nobody finished. Fifty of these across seven
files now pick the right word. Zero is plural, which is the case that gets
written wrong by reaching forn > 1. -
"1 links in" — the same defect one line further on, hardcoded rather than
spelled(s), so no search for the first would have found it. It had been
shipping for as long as reach has been reported, and no fixture ever had
exactly one inbound link. Found by running the tool against a real site and
reading the output, which is the only way anything here has ever been found. -
A PDF's section headings could be left alone at the foot of a page, with
the findings they introduce overleaf. A cause block listing every affected
page can be most of a page tall, so a heading placed just before one had
nowhere to go — the packer was greedy and had no keep-with-next rule. Three
of the 53 pages in a gohugo.io export ended that way:Content 79,
Indexability 26,Images 52.A heading now travels with the block it introduces.
PDF.paginatecame out
ofwriteto make it testable without a renderer, because the bug is
arithmetic rather than drawing — including the cases that must not move a
heading, and the one where a page holds nothing but headings and must not be
emitted blank.It does not make the document shorter, and the page count is unchanged at 53.
The white space above a page break comes from cause blocks being atomic and
nearly page-tall; only splitting them would reclaim it, and a finding split
across a page break is worse than a short page.
Installing on macOS
brew tap nurkamol/seo-audit https://github.com/nurkamol/seo-audit
brew trust nurkamol/seo-audit
brew install --cask seo-auditHomebrew verifies the download against the checksum below and clears the
quarantine flag for you, so the app opens the first time.
Downloading the zip instead? macOS may say "SEO Audit is damaged and
can't be opened." It is not damaged. The app is ad-hoc signed rather than
notarised — notarising needs a paid Apple Developer account this project
does not have — and macOS refuses quarantined apps without a notarisation
ticket. Check what you downloaded first:
shasum -a 256 seo-audit-1.37.0-macos.zip
# a350802df8f5f4bdf808909aab22a88d5313d1b3ffd50c543f41e8d8545fc2bbThen, once it matches, clear the flag — no sudo needed:
xattr -dr com.apple.quarantine "/Applications/SEO Audit.app"That is what right-click → Open does in the Finder, without the dialog.
Apple Silicon, macOS Tahoe or newer.
Windows and Linux
The setup.exe, .deb and .AppImage below are attached by a separate
job and may appear a few minutes after this release does.
The Windows installer is unsigned, so SmartScreen shows "Windows protected
your PC" — More info → Run anyway. Same reason as macOS: a code-signing
certificate is a paid, per-year thing this project does not have. The
.AppImage needs chmod +x before it will run.
Check any of them first. A SHA256SUMS.txt covering every file here is
attached alongside them, and the same checksums are listed at the end of
these notes:
shasum -a 256 --ignore-missing -c SHA256SUMS.txtChecksums
Verify a download before you wave a warning away. With SHA256SUMS.txt
saved beside the file, in the same folder:
shasum -a 256 --ignore-missing -c SHA256SUMS.txt8e4e289a09f72481a476afcd194af08395b22966f801510db8a75fd5f70e3fd2 SEO.Audit_1.37.0_amd64.AppImage
649b24e6c2434637061bc6e103f4c85c8f067da3bdad33f94baa29f12cbb1bcd SEO.Audit_1.37.0_amd64.deb
a8b061f31ffd6f39a4492de1ab6d4a0dcbd882491eb44044a50836ab8691a8e4 SEO.Audit_1.37.0_x64-setup.exe
a350802df8f5f4bdf808909aab22a88d5313d1b3ffd50c543f41e8d8545fc2bb seo-audit-1.37.0-macos.zip
The macOS line appears twice in these notes on purpose: once above, computed
when the app was built, and once here, computed from what is actually attached.
They should agree.