Catalog / stefanzhang.com
65

SEO audit for stefanzhang.com

Stefan的自留地 – 好记性不如烂笔头

otherWordPress

Health 65/100 (fair) · 50 pages crawled · generated 2026-08-26

Download Markdown report (feed to ChatGPT / Claude / Cursor)

好记性不如个烂笔头

Screenshot of stefanzhang.com
50
pages crawled
50
indexable pages
0
errors
201
warnings
606
notices
0
orphan pages
0
broken links
Category breakdown
CategoryScoreErrorsWarningsNotices
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
Findings

Warnings (6 rules)

warning Control has no accessible name

Rule agent.control_no_name · Agent Readiness · 50 occurrence(s)

warning Missing canonical tag

Rule canonical.missing · Canonical · 1 occurrence(s)

warning Near-duplicate page content

Rule duplicate.near · Duplicate · 3 occurrence(s)

warning Images missing alt text

Rule images.missing_alt · Images · 50 occurrence(s)

warning Render-blocking script in <head> (no defer/async)

Rule perf.render_blocking · Performance · 50 occurrence(s)

Notices (18 rules)

notice Heading levels skip a level

Rule agent.heading_skip · Agent Readiness · 49 occurrence(s)

notice No llms.txt for AI agents

Rule agent.llms_txt_missing · Agent Readiness · 1 occurrence(s)

notice Page served uncached (no-store/private or CDN bypass)

Rule cache.not_cacheable · Cache · 50 occurrence(s)

notice Multiple <h1> elements

Rule h1.multiple · Headings · 1 occurrence(s)

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)

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)

notice Meta description too short

Rule meta_desc.too_short · Meta Description · 8 occurrence(s)

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 Missing recommended security headers

Rule security.missing_headers · Security · 50 occurrence(s)

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)

Pages (showing 50 of 50)
URLStatusIndexableWordsIn-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.

Scan your site →