SEO audit for stefanzhang.com
Stefan的自留地 – 好记性不如烂笔头
Health 65/100 (fair) · 50 pages crawled · generated 2026-08-26
Download Markdown report (feed to ChatGPT / Claude / Cursor)好记性不如个烂笔头
| Category | Score | Errors | Warnings | Notices |
|---|---|---|---|---|
| Agent Readiness | 70 | 0 | 50 | 50 |
| Images | 70 | 0 | 50 | 50 |
| Performance | 70 | 0 | 50 | 183 |
| Headings | 72 | 0 | 47 | 1 |
| Duplicate | 98 | 0 | 3 | 0 |
| Canonical | 99 | 0 | 1 | 0 |
| Cache | 100 | 0 | 0 | 50 |
| Content | 100 | 0 | 0 | 58 |
| Links | 100 | 0 | 0 | 50 |
| Meta Description | 100 | 0 | 0 | 13 |
| Security | 100 | 0 | 0 | 100 |
| Social | 100 | 0 | 0 | 1 |
| Structured Data | 100 | 0 | 0 | 50 |
Warnings (6 rules)
warning Control has no accessible name
Rule agent.control_no_name · Agent Readiness · 50 occurrence(s)
- https://stefanzhang.com/ — 7 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/105/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/177/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/187/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/195/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/205/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/21/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/23/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/25/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/253/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/29/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/290/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/295/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/300/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/302/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/311/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/323/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/327/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/330/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/332/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/341/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/352/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/354/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/52/ — 6 button/link(s) with no text or aria-label — an agent can't target them
- https://stefanzhang.com/54/ — 6 button/link(s) with no text or aria-label — an agent can't target them
warning Missing canonical tag
Rule canonical.missing · Canonical · 1 occurrence(s)
warning Near-duplicate page content
Rule duplicate.near · Duplicate · 3 occurrence(s)
- https://stefanzhang.com/253/ — near-duplicate of 2 page(s): https://stefanzhang.com/323/, https://stefanzhang.com/361/
- https://stefanzhang.com/323/ — near-duplicate of 2 page(s): https://stefanzhang.com/253/, https://stefanzhang.com/361/
- https://stefanzhang.com/361/ — near-duplicate of 2 page(s): https://stefanzhang.com/253/, https://stefanzhang.com/323/
warning Missing <h1>
Rule h1.missing · Headings · 47 occurrence(s)
- https://stefanzhang.com/
- https://stefanzhang.com/105/
- https://stefanzhang.com/177/
- https://stefanzhang.com/205/
- https://stefanzhang.com/21/
- https://stefanzhang.com/23/
- https://stefanzhang.com/25/
- https://stefanzhang.com/253/
- https://stefanzhang.com/29/
- https://stefanzhang.com/290/
- https://stefanzhang.com/295/
- https://stefanzhang.com/300/
- https://stefanzhang.com/302/
- https://stefanzhang.com/311/
- https://stefanzhang.com/323/
- https://stefanzhang.com/327/
- https://stefanzhang.com/330/
- https://stefanzhang.com/332/
- https://stefanzhang.com/341/
- https://stefanzhang.com/352/
- https://stefanzhang.com/354/
- https://stefanzhang.com/356/
- https://stefanzhang.com/359/
- https://stefanzhang.com/52/
- https://stefanzhang.com/54/
warning Images missing alt text
Rule images.missing_alt · Images · 50 occurrence(s)
- https://stefanzhang.com/ — 1 of 1 images missing alt
- https://stefanzhang.com/105/ — 31 of 36 images missing alt
- https://stefanzhang.com/177/ — 31 of 34 images missing alt
- https://stefanzhang.com/187/ — 31 of 31 images missing alt
- https://stefanzhang.com/195/ — 31 of 31 images missing alt
- https://stefanzhang.com/205/ — 31 of 31 images missing alt
- https://stefanzhang.com/21/ — 31 of 35 images missing alt
- https://stefanzhang.com/23/ — 31 of 34 images missing alt
- https://stefanzhang.com/25/ — 31 of 32 images missing alt
- https://stefanzhang.com/253/ — 31 of 32 images missing alt
- https://stefanzhang.com/29/ — 31 of 39 images missing alt
- https://stefanzhang.com/290/ — 31 of 31 images missing alt
- https://stefanzhang.com/295/ — 31 of 31 images missing alt
- https://stefanzhang.com/300/ — 31 of 31 images missing alt
- https://stefanzhang.com/302/ — 31 of 31 images missing alt
- https://stefanzhang.com/311/ — 31 of 32 images missing alt
- https://stefanzhang.com/323/ — 31 of 31 images missing alt
- https://stefanzhang.com/327/ — 31 of 31 images missing alt
- https://stefanzhang.com/330/ — 31 of 31 images missing alt
- https://stefanzhang.com/332/ — 31 of 31 images missing alt
- https://stefanzhang.com/341/ — 31 of 31 images missing alt
- https://stefanzhang.com/352/ — 31 of 31 images missing alt
- https://stefanzhang.com/354/ — 31 of 31 images missing alt
- https://stefanzhang.com/52/ — 31 of 34 images missing alt
- https://stefanzhang.com/54/ — 31 of 31 images missing alt
warning Render-blocking script in <head> (no defer/async)
Rule perf.render_blocking · Performance · 50 occurrence(s)
- https://stefanzhang.com/ — 3 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/105/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/177/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/187/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/195/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/205/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/21/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/23/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/25/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/253/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/29/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/290/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/295/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/300/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/302/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/311/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/323/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/327/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/330/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/332/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/341/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/352/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/354/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/52/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
- https://stefanzhang.com/54/ — 4 render-blocking <script> in <head> (add defer/async or use type=module)
Notices (18 rules)
notice Heading levels skip a level
Rule agent.heading_skip · Agent Readiness · 49 occurrence(s)
- https://stefanzhang.com/105/ — h4 follows h2 — skips h3
- https://stefanzhang.com/177/ — h4 follows h2 — skips h3
- https://stefanzhang.com/187/ — h4 follows h2 — skips h3
- https://stefanzhang.com/195/ — h3 follows h1 — skips h2
- https://stefanzhang.com/205/ — h4 follows h2 — skips h3
- https://stefanzhang.com/21/ — h4 follows h2 — skips h3
- https://stefanzhang.com/23/ — h4 follows h2 — skips h3
- https://stefanzhang.com/25/ — h4 follows h2 — skips h3
- https://stefanzhang.com/253/ — h4 follows h2 — skips h3
- https://stefanzhang.com/29/ — h4 follows h2 — skips h3
- https://stefanzhang.com/290/ — h4 follows h2 — skips h3
- https://stefanzhang.com/295/ — h4 follows h2 — skips h3
- https://stefanzhang.com/300/ — h4 follows h2 — skips h3
- https://stefanzhang.com/302/ — h4 follows h2 — skips h3
- https://stefanzhang.com/311/ — h4 follows h2 — skips h3
- https://stefanzhang.com/323/ — h4 follows h2 — skips h3
- https://stefanzhang.com/327/ — h4 follows h2 — skips h3
- https://stefanzhang.com/330/ — h4 follows h2 — skips h3
- https://stefanzhang.com/332/ — h4 follows h2 — skips h3
- https://stefanzhang.com/341/ — h4 follows h2 — skips h3
- https://stefanzhang.com/352/ — h4 follows h2 — skips h3
- https://stefanzhang.com/354/ — h4 follows h2 — skips h3
- https://stefanzhang.com/356/ — h4 follows h2 — skips h3
- https://stefanzhang.com/52/ — h4 follows h2 — skips h3
- https://stefanzhang.com/54/ — h4 follows h2 — skips h3
notice No llms.txt for AI agents
Rule agent.llms_txt_missing · Agent Readiness · 1 occurrence(s)
- https://stefanzhang.com/ — no llms.txt found at the site root — add one so AI agents get a curated site summary
notice Page served uncached (no-store/private or CDN bypass)
Rule cache.not_cacheable · Cache · 50 occurrence(s)
- https://stefanzhang.com/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/105/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/177/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/187/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/195/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/205/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/21/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/23/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/25/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/253/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/29/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/290/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/295/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/300/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/302/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/311/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/323/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/327/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/330/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/332/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/341/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/352/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/354/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/52/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
- https://stefanzhang.com/54/ — Cache-Control: no-store, no-cache, must-revalidate, no-cache · cloudflare: DYNAMIC
notice Low text-to-HTML ratio
Rule content.low_ratio · Content · 31 occurrence(s)
- https://stefanzhang.com/ — 3.1%
- https://stefanzhang.com/105/ — 3.2%
- https://stefanzhang.com/177/ — 4.8%
- https://stefanzhang.com/21/ — 3.6%
- https://stefanzhang.com/23/ — 2.4%
- https://stefanzhang.com/25/ — 3.2%
- https://stefanzhang.com/253/ — 2.3%
- https://stefanzhang.com/29/ — 3.5%
- https://stefanzhang.com/295/ — 2.6%
- https://stefanzhang.com/300/ — 3.0%
- https://stefanzhang.com/302/ — 2.5%
- https://stefanzhang.com/311/ — 2.3%
- https://stefanzhang.com/323/ — 3.1%
- https://stefanzhang.com/327/ — 2.7%
- https://stefanzhang.com/330/ — 2.5%
- https://stefanzhang.com/332/ — 2.5%
- https://stefanzhang.com/341/ — 3.3%
- https://stefanzhang.com/352/ — 2.4%
- https://stefanzhang.com/354/ — 2.6%
- https://stefanzhang.com/356/ — 2.6%
- https://stefanzhang.com/359/ — 2.6%
- https://stefanzhang.com/361/ — 2.6%
- https://stefanzhang.com/370/ — 2.5%
- https://stefanzhang.com/52/ — 2.0%
- https://stefanzhang.com/54/ — 2.3%
notice Multiple <h1> elements
Rule h1.multiple · Headings · 1 occurrence(s)
- https://stefanzhang.com/195/ — 2 <h1> elements
notice Likely hero image lacks fetchpriority=high
Rule images.hero_no_fetchpriority · Performance · 33 occurrence(s)
- https://stefanzhang.com/187/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/195/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/205/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/21/ — the likely hero/LCP image (svg+xml;base64,pcetlufyz29utg9hzgluzy0tpgo8c3znihdpzhropsixiibozwlnahq9ijeiihhtbg5zpsjodhrwoi8vd3d3lnczlm9yzy8ymdawl3n2zyigc3ryb2tlpsijzmzmzmzmmdaipjxnpjwvzz4kpc9zdmc+) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/23/ — the likely hero/LCP image (svg+xml;base64,pcetlufyz29utg9hzgluzy0tpgo8c3znihdpzhropsixiibozwlnahq9ijeiihhtbg5zpsjodhrwoi8vd3d3lnczlm9yzy8ymdawl3n2zyigc3ryb2tlpsijzmzmzmzmmdaipjxnpjwvzz4kpc9zdmc+) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/290/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/295/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/300/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/302/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/323/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/327/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/330/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/332/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/341/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/352/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/354/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/356/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/359/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/361/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/370/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/372/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/383/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/435/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/52/ — the likely hero/LCP image (svg+xml;base64,pcetlufyz29utg9hzgluzy0tpgo8c3znihdpzhropsixiibozwlnahq9ijeiihhtbg5zpsjodhrwoi8vd3d3lnczlm9yzy8ymdawl3n2zyigc3ryb2tlpsijzmzmzmzmmdaipjxnpjwvzz4kpc9zdmc+) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
- https://stefanzhang.com/54/ — the likely hero/LCP image (svg+xml;base64,phn2zybjbgfzcz0izw1vdglvbi1sb2fkaw5niib4bwxucz0iahr0cdovl3d3dy53my5vcmcvmjawmc9zdmciigzpbgw9im5vbmuiihzpzxdcb3g9ii04ic04idqwidqwiibzdhjva2u9iim4odgiig9wywnpdhk9ii41iib3awr0ad0injaiighlawdodd0injaipgogidxwyxroihn0cm9rzs1saw5ly2fwpsjyb3vuzcigc3ryb2tllwxpbmvqb2lupsjyb3vuzcigc3ryb2tllxdpzhropsixljuiigq9ik0xnc44mjggmtquodi4ytqgncawidaxltuunju2idbnosaxmggumdfnmtugmtboljaxttixideyytkgosawidexlte4idagosa5idagmdexocaweiivpgo8l3n2zz4=) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
notice Images without width/height (layout shift / CLS)
Rule images.missing_dimensions · Images · 50 occurrence(s)
- https://stefanzhang.com/ — 1 of 1 images without width/height
- https://stefanzhang.com/105/ — 31 of 36 images without width/height
- https://stefanzhang.com/177/ — 31 of 34 images without width/height
- https://stefanzhang.com/187/ — 31 of 31 images without width/height
- https://stefanzhang.com/195/ — 31 of 31 images without width/height
- https://stefanzhang.com/205/ — 31 of 31 images without width/height
- https://stefanzhang.com/21/ — 35 of 35 images without width/height
- https://stefanzhang.com/23/ — 34 of 34 images without width/height
- https://stefanzhang.com/25/ — 31 of 32 images without width/height
- https://stefanzhang.com/253/ — 31 of 32 images without width/height
- https://stefanzhang.com/29/ — 31 of 39 images without width/height
- https://stefanzhang.com/290/ — 31 of 31 images without width/height
- https://stefanzhang.com/295/ — 31 of 31 images without width/height
- https://stefanzhang.com/300/ — 31 of 31 images without width/height
- https://stefanzhang.com/302/ — 31 of 31 images without width/height
- https://stefanzhang.com/311/ — 31 of 32 images without width/height
- https://stefanzhang.com/323/ — 31 of 31 images without width/height
- https://stefanzhang.com/327/ — 31 of 31 images without width/height
- https://stefanzhang.com/330/ — 31 of 31 images without width/height
- https://stefanzhang.com/332/ — 31 of 31 images without width/height
- https://stefanzhang.com/341/ — 31 of 31 images without width/height
- https://stefanzhang.com/352/ — 31 of 31 images without width/height
- https://stefanzhang.com/354/ — 31 of 31 images without width/height
- https://stefanzhang.com/52/ — 33 of 34 images without width/height
- https://stefanzhang.com/54/ — 31 of 31 images without width/height
notice Internal link has no anchor text / accessible name
Rule links.no_anchor_text · Links · 50 occurrence(s)
- https://stefanzhang.com/ — 6 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/105/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/177/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/187/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/195/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/205/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/21/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/23/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/25/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/253/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/29/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/290/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/295/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/300/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/302/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/311/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/323/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/327/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/330/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/332/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/341/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/352/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/354/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/52/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
- https://stefanzhang.com/54/ — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
notice Legacy <meta name=keywords> tag present (Google ignores it)
Rule meta.keywords_present · Content · 27 occurrence(s)
- https://stefanzhang.com/105/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/187/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/195/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/205/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/21/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/23/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/25/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/29/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/290/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/383/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/388/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/424/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/435/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/457/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/484/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/512/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/52/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/527/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/547/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/556/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/562/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/573/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/578/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/581/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
- https://stefanzhang.com/609/ — a <meta name="keywords"> tag is present — Google has ignored it since 2009; remove it to cut template debt
notice Meta description too long
Rule meta_desc.too_long · Meta Description · 5 occurrence(s)
- https://stefanzhang.com/253/ — 183 chars
- https://stefanzhang.com/435/ — 175 chars
- https://stefanzhang.com/573/ — 248 chars
- https://stefanzhang.com/619/ — 250 chars
- https://stefanzhang.com/636/ — 203 chars
notice Meta description too short
Rule meta_desc.too_short · Meta Description · 8 occurrence(s)
- https://stefanzhang.com/ — 9 chars
- https://stefanzhang.com/187/ — 38 chars
- https://stefanzhang.com/295/ — 45 chars
- https://stefanzhang.com/372/ — 8 chars
- https://stefanzhang.com/405/ — 42 chars
- https://stefanzhang.com/512/ — 47 chars
- https://stefanzhang.com/578/ — 44 chars
- https://stefanzhang.com/609/ — 44 chars
notice Legacy image format (jpg/png/gif) with no next-gen fallback
Rule perf.images_legacy_format · Performance · 50 occurrence(s)
- https://stefanzhang.com/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/105/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/177/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/187/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/195/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/205/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/21/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/23/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/25/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/253/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/29/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/290/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/295/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/300/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/302/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/311/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/323/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/327/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/330/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/332/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/341/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/352/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/354/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/52/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
- https://stefanzhang.com/54/ — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
notice No ETag header (no conditional GET for unchanged pages)
Rule perf.no_etag · Performance · 50 occurrence(s)
- https://stefanzhang.com/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/105/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/177/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/187/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/195/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/205/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/21/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/23/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/25/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/253/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/29/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/290/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/295/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/300/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/302/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/311/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/323/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/327/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/330/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/332/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/341/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/352/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/354/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/52/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
- https://stefanzhang.com/54/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
notice No Last-Modified header (no conditional GET for unchanged pages)
Rule perf.no_last_modified · Performance · 50 occurrence(s)
- https://stefanzhang.com/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/105/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/177/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/187/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/195/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/205/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/21/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/23/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/25/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/253/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/29/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/290/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/295/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/300/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/302/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/311/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/323/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/327/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/330/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/332/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/341/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/352/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/354/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/52/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
- https://stefanzhang.com/54/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
notice No structured data detected
Rule schema.none · Structured Data · 50 occurrence(s)
- https://stefanzhang.com/
- https://stefanzhang.com/105/
- https://stefanzhang.com/177/
- https://stefanzhang.com/187/
- https://stefanzhang.com/195/
- https://stefanzhang.com/205/
- https://stefanzhang.com/21/
- https://stefanzhang.com/23/
- https://stefanzhang.com/25/
- https://stefanzhang.com/253/
- https://stefanzhang.com/29/
- https://stefanzhang.com/290/
- https://stefanzhang.com/295/
- https://stefanzhang.com/300/
- https://stefanzhang.com/302/
- https://stefanzhang.com/311/
- https://stefanzhang.com/323/
- https://stefanzhang.com/327/
- https://stefanzhang.com/330/
- https://stefanzhang.com/332/
- https://stefanzhang.com/341/
- https://stefanzhang.com/352/
- https://stefanzhang.com/354/
- https://stefanzhang.com/52/
- https://stefanzhang.com/54/
notice Missing recommended security headers
Rule security.missing_headers · Security · 50 occurrence(s)
- https://stefanzhang.com/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/105/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/177/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/187/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/195/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/205/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/21/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/23/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/25/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/253/ — X-Content-Type-Options, CSP
- https://stefanzhang.com/29/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/290/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/295/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/300/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/302/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/311/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/323/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/327/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/330/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/332/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/341/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/352/ — X-Content-Type-Options, CSP
- https://stefanzhang.com/354/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/52/ — CSP, X-Content-Type-Options
- https://stefanzhang.com/54/ — CSP, X-Content-Type-Options
notice target=_blank link without rel=noopener (tab-napping)
Rule security.unsafe_cross_origin_links · Security · 50 occurrence(s)
- https://stefanzhang.com/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/105/ — 3 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/177/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/187/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/195/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/205/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/21/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/23/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/25/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/253/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/29/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/290/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/295/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/300/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/302/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/311/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/323/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/327/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/330/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/332/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/341/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/352/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/354/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/52/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
- https://stefanzhang.com/54/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
notice Missing Twitter Card tag
Rule twitter.missing · Social · 1 occurrence(s)
| URL | Status | Indexable | Words | In-links |
|---|---|---|---|---|
| https://stefanzhang.com/ Stefan的自留地 – 好记性不如烂笔头 |
200 | yes | 410 | 50 |
| https://stefanzhang.com/442/ 【原则】确认偏误 Confirmation Bias – Stefan的自留地 |
200 | yes | 346 | 18 |
| https://stefanzhang.com/438/ 【原则】宜家效应Ikea Effect – Stefan的自留地 |
200 | yes | 339 | 18 |
| https://stefanzhang.com/372/ 【原则】齐拉特十诫 Szilard’s Ten Commandments – Stefan的自留地 |
200 | yes | 333 | 5 |
| https://stefanzhang.com/457/ 【姿势】Cloudflare SaaS回源 提升网站国内加载速度 – Stefan的自留地 |
200 | yes | 460 | 5 |
| https://stefanzhang.com/435/ 【翻译】哈耶克:头脑的两种类型 – Stefan的自留地 |
200 | yes | 366 | 3 |
| https://stefanzhang.com/405/ 【电子书】置身事内:中国政府与经济发展 – Stefan的自留地 |
200 | yes | 313 | 5 |
| https://stefanzhang.com/484/ 【姿势】搭建KMS Windows激活服务器 – Stefan的自留地 |
200 | yes | 389 | 3 |
| https://stefanzhang.com/424/ 【翻译】职场中的魔力循环 – Stefan的自留地 |
200 | yes | 462 | 3 |
| https://stefanzhang.com/383/ 【翻译】德鲁克:做自己人生的CEO – Stefan的自留地 |
200 | yes | 498 | 3 |
| https://stefanzhang.com/573/ 【翻译】热尔韦原则 III:发展的诅咒 – Stefan的自留地 |
200 | yes | 554 | 4 |
| https://stefanzhang.com/25/ 特征选择 – Stefan的自留地 |
200 | yes | 385 | 4 |
| https://stefanzhang.com/512/ 【翻译】财富积累:8条可行的财富自由建议 – Stefan的自留地 |
200 | yes | 664 | 3 |
| https://stefanzhang.com/388/ 【翻译】信息茧房自救指南 – Stefan的自留地 |
200 | yes | 499 | 3 |
| https://stefanzhang.com/562/ 【翻译】热尔韦原则 II:职场中的 4 种语言 – Stefan的自留地 |
200 | yes | 513 | 3 |
| https://stefanzhang.com/527/ 【翻译】请远离“受害者心态” – Stefan的自留地 |
200 | yes | 387 | 3 |
| https://stefanzhang.com/556/ 【翻译】热尔韦原则 – Stefan的自留地 |
200 | yes | 467 | 3 |
| https://stefanzhang.com/547/ 【翻译】罗素:论人类欲望的本质 – Stefan的自留地 |
200 | yes | 447 | 3 |
| https://stefanzhang.com/187/ 【翻译】糟糕的考试思维如何毁掉我们的一生 – Stefan的自留地 |
200 | yes | 434 | 3 |
| https://stefanzhang.com/177/ 【翻译】PARA方法:在几秒钟内组织数字生活的简单系统 – Stefan的自留地 |
200 | yes | 408 | 3 |
| https://stefanzhang.com/619/ 【翻译】协议造不出金字塔 – Stefan的自留地 |
200 | yes | 490 | 3 |
| https://stefanzhang.com/195/ 【翻译】修复并保持:如何做出色的原地踏步工作 – Stefan的自留地 |
200 | yes | 387 | 3 |
| https://stefanzhang.com/105/ 【姿势】网盘挂载Emby媒体服务器直链播放 – Stefan的自留地 |
200 | yes | 441 | 3 |
| https://stefanzhang.com/311/ 【电子书】打造第二大脑 – Stefan的自留地 |
200 | yes | 323 | 4 |
| https://stefanzhang.com/21/ 缺失数据处理 – Stefan的自留地 |
200 | yes | 559 | 3 |
| https://stefanzhang.com/23/ 异常值处理 – Stefan的自留地 |
200 | yes | 376 | 3 |
| https://stefanzhang.com/370/ 【原则】林迪效应 Lindy effect – Stefan的自留地 |
200 | yes | 341 | 3 |
| https://stefanzhang.com/578/ 【翻译】热尔韦原则 IV:奇妙的人类世界 – Stefan的自留地 |
200 | yes | 571 | 3 |
| https://stefanzhang.com/205/ 【翻译】别人为什么要听你的? – Stefan的自留地 |
200 | yes | 524 | 3 |
| https://stefanzhang.com/54/ 【姿势】甲骨文云(OCI) ARM实例 使用手册 – Stefan的自留地 |
200 | yes | 402 | 3 |
| https://stefanzhang.com/609/ 【翻译】热尔韦原则 VI:无神之子 – Stefan的自留地 |
200 | yes | 602 | 3 |
| https://stefanzhang.com/581/ 【翻译】热尔韦原则 V:正面我赢,反面你输 – Stefan的自留地 |
200 | yes | 535 | 3 |
| https://stefanzhang.com/253/ 【电子书】黑客与画家 – Stefan的自留地 |
200 | yes | 325 | 3 |
| https://stefanzhang.com/52/ 使用AWS CloudFront后WordPress编辑文章丢失可视化标签 – Stefan的自留地 |
200 | yes | 349 | 3 |
| https://stefanzhang.com/29/ WordPress博客优化加速概览 – Stefan的自留地 |
200 | yes | 467 | 3 |
| https://stefanzhang.com/361/ 【原则】汉隆剃刀Hanlon’s Razor – Stefan的自留地 |
200 | yes | 350 | 4 |
| https://stefanzhang.com/636/ 【翻译】何为理性思考 – Part 1 – Stefan的自留地 |
200 | yes | 387 | 2 |
| https://stefanzhang.com/290/ 【翻译】如何在有限的生命,做真正重要的事 – Stefan的自留地 |
200 | yes | 617 | 3 |
| https://stefanzhang.com/295/ 【原则】奥卡姆剃刀 Ockham’s Razor – Stefan的自留地 |
200 | yes | 358 | 3 |
| https://stefanzhang.com/302/ 【原则】逆向思维 Reverse Thinking – Stefan的自留地 |
200 | yes | 337 | 3 |
| https://stefanzhang.com/323/ 【原则】巴纳姆效应 Barnum Effect – Stefan的自留地 |
200 | yes | 360 | 3 |
| https://stefanzhang.com/359/ 【原则】罗伯特法则(Robert’s Rules of Order) – Stefan的自留地 |
200 | yes | 359 | 3 |
| https://stefanzhang.com/300/ 【原则】贝叶斯推理 Bayesian inference – Stefan的自留地 |
200 | yes | 364 | 3 |
| https://stefanzhang.com/327/ 【原则】涌现 Emergence – Stefan的自留地 |
200 | yes | 343 | 3 |
| https://stefanzhang.com/356/ 【原则】帕累托法则 Pareto Principle – Stefan的自留地 |
200 | yes | 344 | 3 |
| https://stefanzhang.com/330/ 【原则】类比思维 Concept Explanation – Stefan的自留地 |
200 | yes | 338 | 3 |
| https://stefanzhang.com/354/ 【原则】恩格尔巴特定律 Engelbart’s law – Stefan的自留地 |
200 | yes | 335 | 3 |
| https://stefanzhang.com/332/ 【原则】棘轮效应 Ratchet Effect – Stefan的自留地 |
200 | yes | 330 | 3 |
| https://stefanzhang.com/352/ 【原则】熵增定律 – Stefan的自留地 |
200 | yes | 329 | 3 |
| https://stefanzhang.com/341/ 【原则】第一性原理 – Stefan的自留地 |
200 | yes | 334 | 3 |
Audit your own site — free
157 checks, internal PageRank, render-diff. No signup, results in ~30s.