{"id":50841008,"url":"https://github.com/meysam81/scry","last_synced_at":"2026-06-14T06:35:00.043Z","repository":{"id":344168784,"uuid":"1179799621","full_name":"meysam81/scry","owner":"meysam81","description":"Your website has problems you can't see. Scry finds them. Crawl your entire website across SEO, security, performance, and accessibility. No browser, no subscription.","archived":false,"fork":false,"pushed_at":"2026-06-13T16:02:38.000Z","size":406,"stargazers_count":5,"open_issues_count":16,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-13T18:08:31.203Z","etag":null,"topics":["accessibility","cli","command-line-tool","crawler","devops","golang","hreflang","lighthouse","link-checker","pagespeed","sarif","security-headers","seo","seo-tools","site-audit","structured-data","technical-seo","web-performance","web-security","website-audit"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/meysam81.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"meysam81","patreon":"meysam81","buy_me_a_coffee":"meysam"}},"created_at":"2026-03-12T11:50:16.000Z","updated_at":"2026-05-30T13:19:02.000Z","dependencies_parsed_at":"2026-06-13T18:05:18.580Z","dependency_job_id":null,"html_url":"https://github.com/meysam81/scry","commit_stats":null,"previous_names":["meysam81/scry"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/meysam81/scry","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/meysam81%2Fscry","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/meysam81%2Fscry/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/meysam81%2Fscry/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/meysam81%2Fscry/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/meysam81","download_url":"https://codeload.github.com/meysam81/scry/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/meysam81%2Fscry/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34312072,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-14T02:00:07.365Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["accessibility","cli","command-line-tool","crawler","devops","golang","hreflang","lighthouse","link-checker","pagespeed","sarif","security-headers","seo","seo-tools","site-audit","structured-data","technical-seo","web-performance","web-security","website-audit"],"created_at":"2026-06-14T06:34:59.419Z","updated_at":"2026-06-14T06:35:00.035Z","avatar_url":"https://github.com/meysam81.png","language":"Go","funding_links":["https://github.com/sponsors/meysam81","https://patreon.com/meysam81","https://buymeacoffee.com/meysam"],"categories":[],"sub_categories":[],"readme":"# scry\n\n\u003c!-- TODO: uncomment when ready --\u003e\n\u003c!-- ![scry demo](assets/demo.gif) --\u003e\n\n**A fast, thorough website auditor for your terminal.**\n94 checks. 11 categories. One command.\n\n[![CI](https://img.shields.io/github/actions/workflow/status/meysam81/scry/ci.yml?branch=main\u0026label=CI\u0026logo=githubactions\u0026logoColor=white)](https://github.com/meysam81/scry/actions/workflows/ci.yml)\n[![Go Report Card](https://goreportcard.com/badge/github.com/meysam81/scry)](https://goreportcard.com/report/github.com/meysam81/scry)\n[![Go Reference](https://pkg.go.dev/badge/github.com/meysam81/scry.svg)](https://pkg.go.dev/github.com/meysam81/scry)\n[![Latest Release](https://img.shields.io/github/v/release/meysam81/scry?logo=github\u0026label=release)](https://github.com/meysam81/scry/releases/latest)\n[![Go Version](https://img.shields.io/github/go-mod/go-version/meysam81/scry?logo=go)](https://github.com/meysam81/scry/blob/main/go.mod)\n[![License](https://img.shields.io/github/license/meysam81/scry)](LICENSE)\n[![Downloads](https://img.shields.io/github/downloads/meysam81/scry/total?logo=github\u0026label=downloads)](https://github.com/meysam81/scry/releases)\n\n[![Homebrew](https://img.shields.io/badge/homebrew-meysam81%2Ftap%2Fscry-FBB040?logo=homebrew\u0026logoColor=white)](https://github.com/meysam81/homebrew-tap)\n[![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-blue?logo=linux\u0026logoColor=white)](#quick-start)\n[![Last Commit](https://img.shields.io/github/last-commit/meysam81/scry?logo=github)](https://github.com/meysam81/scry/commits/main)\n[![GitHub Stars](https://img.shields.io/github/stars/meysam81/scry?style=flat\u0026logo=github)](https://github.com/meysam81/scry/stargazers)\n[![Issues](https://img.shields.io/github/issues/meysam81/scry?logo=github)](https://github.com/meysam81/scry/issues)\n\n## Quick Start\n\nInstall scry:\n\n```bash\n# Homebrew\nbrew install meysam81/tap/scry\n\n# Go\ngo install github.com/meysam81/scry@latest\n```\n\nOr grab a [pre-built binary](https://github.com/meysam81/scry/releases) for your platform.\n\nRun your first audit:\n\n```bash\nscry crawl https://example.com\n```\n\nThat's it. You'll get a colorized terminal report with a site health score,\ncategorized issues, and actionable recommendations.\n\n## Why Scry\n\n### For SEO professionals\n\n- **94 audit checks** across SEO, structured data, hreflang, links, images, performance, security, accessibility, health, external links, and TLS\n- **Site health score** (0-100) with per-category breakdowns\n- **Structured data validation** for 9 Schema.org types (Article, Product, FAQPage, LocalBusiness, BreadcrumbList, Event, Recipe, VideoObject, BlogPosting)\n- **Hreflang cross-validation** with return-link and x-default checks\n- **Content quality metrics** - reading level, word count, content-to-HTML ratio, thin content detection\n- **Content duplication** - SimHash near-duplicate and exact-duplicate detection\n- **Internal PageRank** - see which pages concentrate link equity\n\n### For developers\n\n- **CI/CD native** - SARIF for GitHub PR annotations, JUnit for Jenkins/GitLab, `--fail-on critical` for exit codes\n- **Baseline comparison** - track regressions across deploys with `--save-baseline` / `--compare-baseline`\n- **9 output formats** - terminal, JSON, CSV, Markdown, HTML, SARIF, JUnit, JSONL, PDF\n- **Custom rules** - write your own checks with CEL expressions\n- **Prometheus metrics** - push audit results to Pushgateway for dashboards and alerting\n- **Watch mode** - re-run checks on interval during development\n\n## What Scry Checks\n\n| Category        | Checks      | Highlights                                                                 |\n| --------------- | ----------- | -------------------------------------------------------------------------- |\n| SEO             | 18          | title, meta description, canonical, Open Graph, viewport, duplicate titles |\n| Performance     | 14          | HTML size, compression, render-blocking, DOM size, cache headers, HTTP/2   |\n| Security        | 13          | HSTS, CSP, cookies, CORS, SRI, security.txt                                |\n| Accessibility   | 13          | form labels, ARIA, landmarks, heading hierarchy, keyboard, video captions  |\n| Health          | 9           | 4xx/5xx, TTFB, redirect chains, mixed content, charset                     |\n| Images          | 8           | alt text, broken src, large images, lazy loading, responsive, WebP/AVIF    |\n| Links           | 5           | broken internal, orphan pages, deep pages, generic anchor text             |\n| Structured Data | 5 + 10 deep | JSON-LD for 9 Schema.org types, date/URL validation, microdata detection   |\n| TLS             | 5           | weak protocol, certificate expiry, self-signed, hostname mismatch          |\n| Hreflang        | 4           | language codes, x-default, return links, self-reference                    |\n| External Links  | 3           | broken outbound, redirects, timeouts                                       |\n\n\u003e See the full [Checks Catalog](docs/checks-catalog.md) for every check with severity levels.\n\n## Commands\n\n**`scry crawl \u003curl\u003e`** - Crawl and audit an entire site.\n\n```bash\nscry crawl https://example.com --output json,html --output-file report\n```\n\n**`scry check \u003curl\u003e`** - Audit a single page.\n\n```bash\nscry check https://example.com/blog/post --filter-category seo,performance\n```\n\n**`scry lighthouse \u003curl\u003e`** - Run Lighthouse analysis.\n\n```bash\nscry lighthouse https://example.com --psi-key $PSI_API_KEY\n```\n\n**`scry validate`** - Validate your configuration file.\n\n```bash\nscry validate\n```\n\n## Output Formats\n\n| Format   | Flag                | Use case                                        |\n| -------- | ------------------- | ----------------------------------------------- |\n| Terminal | `--output terminal` | Human-readable, colorized tables                |\n| JSON     | `--output json`     | Machine-readable, API integrations              |\n| CSV      | `--output csv`      | Spreadsheets, data analysis                     |\n| Markdown | `--output markdown` | Documentation, wikis                            |\n| HTML     | `--output html`     | Self-contained visual report                    |\n| SARIF    | `--output sarif`    | GitHub/GitLab PR annotations                    |\n| JUnit    | `--output junit`    | CI test result integration                      |\n| JSONL    | `--output jsonl`    | Streaming, log pipelines                        |\n| PDF      | `--output pdf`      | Client deliverables (requires headless browser) |\n\nCombine formats in a single run:\n\n```bash\nscry crawl https://example.com --output terminal,json,html --output-file report\n```\n\n## CI/CD Integration\n\n### GitHub Actions\n\n```yaml\n- name: Audit website\n  run: |\n    go install github.com/meysam81/scry@latest\n    scry crawl ${{ vars.SITE_URL }} \\\n      --output sarif,terminal \\\n      --output-file results \\\n      --fail-on critical\n\n- name: Upload SARIF\n  if: always()\n  uses: github/codeql-action/upload-sarif@v3\n  with:\n    sarif_file: results.sarif\n```\n\n### GitLab CI\n\n```yaml\nwebsite-audit:\n  image: golang:latest\n  script:\n    - go install github.com/meysam81/scry@latest\n    - scry crawl $AUDIT_URL --output terminal,json --output-file audit-report --fail-on critical\n  artifacts:\n    paths:\n      - audit-report.*\n    when: always\n```\n\n### Baseline Comparison\n\nTrack regressions across deploys:\n\n```bash\n# Save a baseline after deploy\nscry crawl https://example.com --save-baseline baseline.json\n\n# Compare on next run\nscry crawl https://example.com --compare-baseline baseline.json\n```\n\nNew issues are flagged, resolved issues are reported, and existing issues stay quiet.\n\n## Advanced Features\n\n### Custom Rules (CEL)\n\nWrite audit rules in YAML using Common Expression Language:\n\n```yaml\n# rules/my-rules.yml\nrules:\n  - name: \"custom/missing-csp\"\n    severity: warning\n    condition: |\n      page.status_code == 200 \u0026\u0026\n      !('content-security-policy' in page.headers)\n    message: \"Missing Content-Security-Policy header\"\n```\n\n```bash\nscry crawl https://example.com --rules rules/my-rules.yml\n```\n\n### Parallel Domain Crawling\n\nAudit multiple domains at once:\n\n```bash\nscry crawl --urls-file domains.txt --parallel-domains 4\n```\n\n### Checkpoint \u0026 Resume\n\nInterrupt large crawls and pick up where you left off:\n\n```bash\nscry crawl https://large-site.com --checkpoint crawl.json\n# Ctrl+C, then later:\nscry crawl https://large-site.com --resume crawl.json\n```\n\n### Incremental Crawling\n\nOnly re-crawl pages that changed since the last run:\n\n```bash\nscry crawl https://example.com --incremental cache.json\n```\n\n### Prometheus Metrics\n\nPush audit results to a Prometheus Pushgateway:\n\n```bash\nscry crawl https://example.com --metrics-push http://pushgateway:9091\n```\n\n### Watch Mode\n\nRe-run a single-page audit on interval during development:\n\n```bash\nscry check https://localhost:3000 --watch --filter-category seo\n```\n\n## Configuration\n\nScry reads configuration from three sources (highest precedence first):\n\n1. **CLI flags**\n2. **Environment variables** (`SCRY_*`)\n3. **`scry.yml` config file**\n\nMinimal example:\n\n```yaml\n# scry.yml\ncrawl:\n  max_depth: 3\n  max_pages: 200\n  concurrency: 8\n  exclude:\n    - \"/admin/*\"\n    - \"/api/*\"\n\noutput:\n  formats:\n    - terminal\n    - json\n  file: report\n  fail_on: critical\n```\n\nValidate your config without crawling:\n\n```bash\nscry validate\n```\n\n\u003e See the full [Configuration Reference](docs/configuration.md) for all options.\n\n## Contributing\n\nContributions are welcome!\n\n```bash\ngit clone https://github.com/meysam81/scry.git\ncd scry\ngo build\ngo test -race ./...\n```\n\nPlease open an issue before submitting large changes.\n\n## License\n\n[Apache 2.0](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmeysam81%2Fscry","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmeysam81%2Fscry","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmeysam81%2Fscry/lists"}