multilingual-seo
When the user wants to publish pages in more than one language, decide which languages to add, or fix how translated pages are indexed. Also use when the user says "translate this page", "multilingual SEO", "international SEO", "localize the blog", "hreflang", "x-default", "Chinese version", "/zh...
Install this skill
or
79/100
Security score
The multilingual-seo skill was audited on Nov 11, 2026 and we found 7 security issues across 2 threat categories, including 1 high-severity. Review the findings below before installing.
Categories Tested
Security Issues
low line 85
Command substitution pattern
SourceSKILL.md
| 83 | BASE=http://localhost:3000; P=/blog/claude-code-kanban; LOCALES=(zh zh-tw ja ko es pt-br fr de) |
| 84 | for l in "${LOCALES[@]}"; do # status, lang, hreflang count, canonical, title width |
| 85 | u="$BASE/$l$P"; h=$(curl -s "$u") |
| 86 | printf '%s %-6s lang=%s hreflang=%s canonical=%s\n' "$(curl -s -o /dev/null -w '%{http_code}' "$u")" "$l" \ |
| 87 | "$(grep -oE '<html[^>]* lang="[^"]*"' <<<"$h" | sed -E 's/.*lang="([^"]*)".*/\1/')" \ |
low line 86
Command substitution pattern
SourceSKILL.md
| 84 | for l in "${LOCALES[@]}"; do # status, lang, hreflang count, canonical, title width |
| 85 | u="$BASE/$l$P"; h=$(curl -s "$u") |
| 86 | printf '%s %-6s lang=%s hreflang=%s canonical=%s\n' "$(curl -s -o /dev/null -w '%{http_code}' "$u")" "$l" \ |
| 87 | "$(grep -oE '<html[^>]* lang="[^"]*"' <<<"$h" | sed -E 's/.*lang="([^"]*)".*/\1/')" \ |
| 88 | "$(grep -ioE '<link[^>]*hreflang="[^"]*"' <<<"$h" | wc -l | tr -d ' ')" \ |
low line 87
Command substitution pattern
SourceSKILL.md
| 85 | u="$BASE/$l$P"; h=$(curl -s "$u") |
| 86 | printf '%s %-6s lang=%s hreflang=%s canonical=%s\n' "$(curl -s -o /dev/null -w '%{http_code}' "$u")" "$l" \ |
| 87 | "$(grep -oE '<html[^>]* lang="[^"]*"' <<<"$h" | sed -E 's/.*lang="([^"]*)".*/\1/')" \ |
| 88 | "$(grep -ioE '<link[^>]*hreflang="[^"]*"' <<<"$h" | wc -l | tr -d ' ')" \ |
| 89 | "$(grep -oE '<link rel="canonical" href="[^"]*"' <<<"$h" | cut -d'"' -f4)" |
low line 88
Command substitution pattern
SourceSKILL.md
| 86 | printf '%s %-6s lang=%s hreflang=%s canonical=%s\n' "$(curl -s -o /dev/null -w '%{http_code}' "$u")" "$l" \ |
| 87 | "$(grep -oE '<html[^>]* lang="[^"]*"' <<<"$h" | sed -E 's/.*lang="([^"]*)".*/\1/')" \ |
| 88 | "$(grep -ioE '<link[^>]*hreflang="[^"]*"' <<<"$h" | wc -l | tr -d ' ')" \ |
| 89 | "$(grep -oE '<link rel="canonical" href="[^"]*"' <<<"$h" | cut -d'"' -f4)" |
| 90 | sed -n 's:.*<title>\(.*\)</title>.*:\1:p' <<<"$h" | python3 -c 'import sys,html,unicodedata as u |
low line 89
Command substitution pattern
SourceSKILL.md
| 87 | "$(grep -oE '<html[^>]* lang="[^"]*"' <<<"$h" | sed -E 's/.*lang="([^"]*)".*/\1/')" \ |
| 88 | "$(grep -ioE '<link[^>]*hreflang="[^"]*"' <<<"$h" | wc -l | tr -d ' ')" \ |
| 89 | "$(grep -oE '<link rel="canonical" href="[^"]*"' <<<"$h" | cut -d'"' -f4)" |
| 90 | sed -n 's:.*<title>\(.*\)</title>.*:\1:p' <<<"$h" | python3 -c 'import sys,html,unicodedata as u |
| 91 | t=html.unescape(sys.stdin.read().strip()); print(" title", sum(2 if u.east_asian_width(c) in "WF" else 1 for c in t), t)' |
low line 100
Command substitution pattern
SourceSKILL.md
| 98 | nums() { text "$1" | grep -oE '[0-9]+([.,][0-9]+)*' | sort | uniq -c; } |
| 99 | for l in "${LOCALES[@]}"; do |
| 100 | echo "== $l: $(text "$BASE/$l$P" | grep -oiwE 'the|and|with|your|you|this|that|from|which' | wc -l | tr -d ' ') English words" |
| 101 | diff <(nums "$BASE$P") <(nums "$BASE/$l$P") |
| 102 | done |
high line 97
Curl pipe to interpreter
SourceSKILL.md
| 95 | Leftover English and changed numbers, using the visible text without code: |
| 96 | ```bash |
| 97 | text() { curl -s "$1" | python3 -c 'import sys,re,html; s=sys.stdin.read(); m=re.search(r"(?s)<main\b.*?</main>",s); s=m.group(0) if m else s; s=re.sub(r"(?s)<(script|style|pre|code)\b.*?</\1>"," ",s); print(" ".join(html.unescape(re.sub(r"<[^>]+>"," ",s)).split()))'; } |
| 98 | nums() { text "$1" | grep -oE '[0-9]+([.,][0-9]+)*' | sort | uniq -c; } |
| 99 | for l in "${LOCALES[@]}"; do |
Scanned on Nov 11, 2026
View Security Dashboard