Safi Site Audit

by Abdulkader Safi
5
4
3
2
1
Score: 50/100

Description

Obsidian plugin that audits any website for SEO, content, links, images, security and crawlability, and saves each run to your vault as Markdown, JSON and HTML.

Reviews

No reviews yet.

Stats

2
stars
188
downloads
0
forks
101
days
74
days
74
days
2
total PRs
0
open PRs
0
closed PRs
2
merged PRs
0
total issues
0
open issues
0
closed issues
35
commits

Latest Version

2 months ago

Changelog

A cleanup release. No behaviour changes, nothing new to learn: if you are on 0.6.0 everything works the same.

What this fixes

Obsidian's app.css was in the 0.6.0 source tarball. While working on 0.6.0 I extracted Obsidian's own stylesheet to check a CSS specificity question, and it was written into the repository root and committed by accident. It was never part of the plugin, never loaded, and never shipped in the release assets (main.js, manifest.json, styles.css were always correct), but it did end up inside the tag.

That file is also the reason the community scorecard reported 185 CSS warnings. All of them, the 66 !important uses, the 14 :has selectors, the webview and mjx-container selectors, came from linting Obsidian's stylesheet rather than this plugin's. The plugin's own styles.css has none of them.

The last !important is gone. The reduced-motion override was the one place in the stylesheet using it. It now names the elements that actually animate and matches the base rules' specificity, which is the approach the rest of the file already takes.

Added a contributing guide, including a note about Obsidian styling bare button elements at specificity (0,1,1), which quietly beats any single-class rule. That one cost an afternoon during 0.6.0 and is worth writing down.

Upgrading

Nothing to do. Audits saved by 0.6.0 and by 0.5.x both open unchanged.

README file from

Github

Safi Site Audit

An Obsidian plugin that runs website audits from inside your vault. It wraps the Safi-Studio-Scanner engine, which crawls a site and scores it across SEO, content, links, images, structured data, security, crawlability and more: 94 rules in 15 categories.

Safi Site Audit dashboard

What it does

  • Runs an audit on any URL and reports progress live while it crawls and checks.
  • Saves every run as three exports in a folder named after the site.
  • Shows the report full width in a main tab: overall score, category breakdown, every issue with its fix, per-page findings, and the scanner's per-page measurements.
  • Keeps your audit history in the sidebar, grouped by site.

Where audits are saved

Each run writes three siblings under the audit folder you set in settings:

Site Audits/
  example.com/
    2026-06-28-15-30.md      readable report, opens in Obsidian
    2026-06-28-15-30.json    full report data, what the dashboard reads
    2026-06-28-15-30.html    standalone report, opens outside Obsidian

The note holds small frontmatter and the rendered Markdown, nothing else. Versions up to 0.5.x embedded the entire report as JSON inside the note, which on a large crawl meant megabytes of JSON in a Markdown file and a note that took a long time to open. Audits saved that way still open in the dashboard.

Usage

  1. Enable the plugin, then open settings and set the Audit folder.
  2. Click the gauge ribbon icon, or run the command Safi Site Audit: Open dashboard.
  3. Enter a URL, optionally set how many pages to crawl (empty uses the default, 20), and run. The report saves to your folder and opens in the dashboard.

Open note opens the Markdown. HTML report hands the HTML export to your browser. Run again starts a fresh audit of the same site.

PageSpeed Insights (optional)

To add Core Web Vitals and accessibility checks, paste a Google PageSpeed Insights API key in settings. Local-browser auditing (Playwright) is not supported inside Obsidian; PSI is the enrichment path.

How it works

The scanner calls fetch directly with manual redirects, which Obsidian's renderer blocks under CORS. During an audit the plugin swaps window.fetch for a shim backed by Obsidian's requestUrl(), which bypasses CORS, then restores it. One known trade-off: redirects are auto-followed, so the redirect-chain rule reports 0.

Progress comes from the scanner's auditStream(), which emits an event per page fetched and per check completed.

Development

npm install        # pulls safi-studio-scanner from npm
npm run build      # esbuild -> main.js
npm run dev        # watch build
npm test           # report-file self-checks

Styling lives in styles.css, hand-written and scoped under .safi-site-audit and .safi-site-audit-list. It is built entirely on Obsidian's theme variables, with no colour literals and no bundled fonts, so the plugin follows whatever theme you have installed. It is not generated, so edits to it need a plugin reload, not a rebuild.