What it does
The engine fetches pages from your site the way a search engine does — one request at a
time, same host only, respecting robots.txt — parses the HTML, and measures what
is actually on the page. Nothing is assumed and nothing is estimated from a third-party
index. Every line in the report comes from a measurement taken during that crawl.
It then scores five categories, ranks the failures by severity, and writes a PDF you can send to a client as it is.
Anyone who has to explain, in writing, why a website is not ranking — and what to fix first. It is built for one-site-at-a-time agency work, not for crawling ten thousand pages.
Install
Python 3.9 or newer. Four libraries, no API keys.
pip install requests beautifulsoup4 lxml reportlab matplotlib
Download kovik_audit.py and requirements.txt from the
repository, then install:
pip install -r requirements.txt
Run an audit
The shortest version — crawl up to ten pages and write a PDF next to the script:
python kovik_audit.py https://client-site.in --out client-audit.pdf
The terminal prints the crawl, the score for each category and the first six findings while the PDF is being written:
KOVIK · SEO AUDIT ENGINE
[1/10] https://client-site.in/
[2/10] https://client-site.in/services
...
Overall score 84/100 (Good, with gaps)
Technical 74
On-page 81
Content 100
Structured data 100
Performance 68
3 failing · 3 to improve
FIX [critical] HTTPS on every page
FIX [high ] XML sitemap present
PDF → client-audit.pdf
Done in 1.6s
All options
| Flag | What it does |
|---|---|
| --pages 12 | How many pages to crawl. Eight to twelve suits a small business site. |
| --depth 2 | How many link hops from the home page the crawl may go. |
| --out report.pdf | Where to write the PDF. Defaults to audit-<host>-<date>.pdf. |
| --json data.json | Also dump every measurement as JSON, for a dashboard or a database. |
| --csv issues.csv | Also dump the issue list as CSV, for a spreadsheet. |
| --client "Sharma Dental" | Client name printed on the cover. |
| --label https://client-site.in | Public URL to show when you audit a staging copy or a local mirror. |
| --delay 0.5 | Seconds between requests. Keep it at 0.4 or higher on shared hosting. |
| --brand "Your Agency" | Replaces the brand name on the cover and in the footer. |
| --quiet | Suppresses the crawl progress in the terminal. |
What it checks
Twenty-six checks across five weighted categories.
| Category | Weight | Checks |
|---|---|---|
| Technical | 30% | HTTPS, robots.txt, XML sitemap, 404 handling, broken pages, redirect chains, canonical tags, accidental noindex, mobile viewport, page language |
| On-page | 25% | Title tags and their length, duplicate titles, meta descriptions, duplicate descriptions, a single H1, H2 structure, image alt coverage |
| Content | 20% | Word count per page, thin pages, internal links per page |
| Structured data | 15% | JSON-LD present and valid, schema types found, Open Graph tags, LocalBusiness or Organization identity |
| Performance | 10% | Server response time, HTML weight, gzip or brotli compression, cache headers |
A pass scores 1, an improvement scores 0.5 and a failure scores 0. Each check carries its
own weight inside the category, so a missing title hurts more than a missing
lang attribute. Categories are then weighted into the overall score out of 100.
Reading the report
The PDF is six pages, in this order:
- Cover — site, date, score ring, what is inside.
- Executive summary — score card, category chart, the five things to fix first.
- Findings — grouped critical to low. Each one states what was measured, which pages were affected, and what to do about it.
- Page-by-page table — status, page score, title and description length, H1 count, words, missing alt text, response time, page weight.
- Method and limits — what the audit does not cover.
Every page carries a diagonal watermark and a footer line, so a report that leaves your inbox still says where it came from.
JSON and CSV output
Useful when you want to store the result, chart it over months, or feed it into a client portal.
python kovik_audit.py https://client-site.in --pages 10 --out audit.pdf --json audit.json --csv audit.csv
The JSON carries the crawl summary, the scores, every check with its status and fix text, and a row per page. The CSV carries the issue list only — severity, category, check, status, what was found, what to do, which pages.
Your own branding
python kovik_audit.py https://client-site.in --pages 12 --client "Sharma Dental Clinic, Hajipur" --out sharma-dental.pdf
Colours, the watermark text and the footer line live at the top of the report module — four constants. If you white-label the engine for another agency, that is the only file you need to touch.
Limits
- One crawl, from one location, at one moment. Response times are a signal, not a benchmark — run it twice before quoting a number.
- No backlink data, no search volume, no rank tracking, no Core Web Vitals field data. Those need Search Console, Analytics and a rank tracker.
- JavaScript-rendered content is not executed. A site that builds its content in the browser will look almost empty to the crawler — which is worth reporting on its own.
- It crawls one host. Subdomains and external pages are counted as outbound links, not crawled.
Troubleshooting
“Could not fetch the site”
Check the URL includes https://, that the site is reachable from your network,
and that a proxy is not intercepting the request. On a corporate network, set
HTTPS_PROXY before running.
Every page comes back with zero words
The site is rendering its content with JavaScript. Try a server-rendered page, or treat the empty result as the finding it is.
PDF looks wrong, fonts missing
The report uses Helvetica, which ships with reportlab. If you have edited the styles and
introduced a custom font, register it with pdfmetrics.registerFont first.
Questions
Do I need any API key or paid SEO tool to run this?
No. The engine talks to the website directly. It needs Python and four libraries (requests, beautifulsoup4, lxml, reportlab). There is no account, no subscription and no third-party SEO service involved.
How many pages should I crawl?
Eight to twelve pages is right for a small business site. That covers the home page, every service page and the main about and contact pages. Crawling more than that on a small site mostly repeats the same findings.
Can I put my own branding on the report?
Yes. Pass --brand "Your Agency" and --client "Client Name". The footer line, the cover and the metadata all follow those values. The Kovik watermark is the default; it is one string in the code if you want to change it.
Will it work on a site built with React or Next.js?
Only if the HTML is server-rendered. If the page is empty until JavaScript runs, the crawler sees an empty page — and that is itself a finding worth reporting, because so do some search engine crawlers.
Is it safe to run on a client's live site?
Yes, if you keep --delay at 0.4 seconds or higher. The engine sends one request at a time, identifies itself as KovikAuditBot and respects robots.txt.