A continuation of Janady13/crawler-signal-reference / framework-html-meta-copyright.md. The complete source identity, every recorded occurrence, and linked equations are on its first page.
Source transcript · continued
Download complete source text ↓1,762 lines · 56.0 KB
Fix: use unquoted integer. (In practice, both work for major consumers.)
**Pitfall 11: Inconsistent copyright holder across pages on same site.**
Symptom: about page says "© Joseph Anady", services page says "© ThatDeveloperGuy", blog says "© Joseph W. Anady".
Why it breaks: fragmented brand identity.
Fix: standardize on canonical copyright holder name; use consistently.
**Pitfall 12: Copyright statement reveals personal information beyond what's needed.**
Symptom: "© 2026 Joseph W. Anady, 463 State Highway 76, Cassville MO 65625".
Why it breaks: unnecessary personal information disclosure.
Fix: "© 2026 Joseph Anady" or "© 2026 ThatDeveloperGuy.com" without full address.
---
## 18. DIAGNOSTIC COMMANDS
Reference of commands useful for copyright investigation.
### Inspect a single URL
```bash
# Check for meta copyright (should be absent)
curl -s https://example.com/ | grep -c 'meta name="copyright"'
# Expected: 0
# Get visible footer copyright
curl -s https://example.com/ | grep -oE '©[^<]+\|copyright[^<]+' | head -5
# Get Schema.org copyrightHolder
curl -s https://example.com/ | python3 -c "
import sys, json, re
text = sys.stdin.read()
for m in re.findall(r'<script type=\"application/ld\+json\">(.*?)</script>', text, re.DOTALL):
try:
data = json.loads(m)
if 'copyrightHolder' in data:
print(json.dumps(data['copyrightHolder'], indent=2))
if 'copyrightYear' in data:
print(f'copyrightYear: {data[\"copyrightYear\"]}')
except:
pass
"
# Get rel="license"
curl -s https://example.com/ | grep -oE 'link[^>]*rel="license"[^>]+' | head -1
```
### Find sites with stale years
```bash
# All sites with copyright years
CURRENT_YEAR=$(date +%Y)
for site_dir in /var/www/sites/*/; do
SITE=$(basename "$site_dir")
INDEX="$site_dir/index.html"
if [ -f "$INDEX" ]; then
YEARS=$(grep -oE '©[[:space:]]+20[0-9]{2}' "$INDEX" | grep -oE '20[0-9]{2}' | sort -u)
for y in $YEARS; do
if [ "$y" -lt "$((CURRENT_YEAR - 1))" ]; then
echo "STALE: $SITE -> $y (current: $CURRENT_YEAR)"
fi
done
fi
done
```
### Find sites with legacy meta copyright
```bash
for site_dir in /var/www/sites/*/; do
SITE=$(basename "$site_dir")
if grep -rq 'meta name="copyright"' "$site_dir" 2>/dev/null; then
echo "LEGACY META: $SITE"
fi
done
```
### Verify Bubbles footer attribution
```bash
# Check that "Crafted by ThatDeveloperGuy.com" is present
for site_dir in /var/www/sites/*/; do
SITE=$(basename "$site_dir")
INDEX="$site_dir/index.html"
if [ -f "$INDEX" ]; then
HAS_FOOTER=$(grep -c "Crafted by ThatDeveloperGuy.com" "$INDEX")
if [ "$HAS_FOOTER" = "0" ]; then
echo "MISSING FOOTER: $SITE"
fi
fi
done
```
### Cross check copyright holder consistency
```bash
# Check that copyrightHolder in Schema matches visible footer
URL=$1
SCHEMA_HOLDER=$(curl -s "$URL" | python3 -c "
import sys, json, re
text = sys.stdin.read()
for m in re.findall(r'<script type=\"application/ld\+json\">(.*?)</script>', text, re.DOTALL):
try:
data = json.loads(m)
h = data.get('copyrightHolder')
if isinstance(h, dict):
print(h.get('name', ''))
break
elif isinstance(h, str):
print(h)
break
except:
pass
")
FOOTER_HOLDER=$(curl -s "$URL" | grep -oE '©[[:space:]]*([0-9]{4}[-0-9]*[[:space:]]+)?[^.<]+' | head -1)
echo "Schema copyrightHolder: $SCHEMA_HOLDER"
echo "Footer text: $FOOTER_HOLDER"
```
### Apply annual year update
```bash
# Update years from previous to current
PREV_YEAR=$((`date +%Y` - 1))
CURRENT_YEAR=$(date +%Y)
for site_dir in /var/www/sites/*/; do
find "$site_dir" -name "*.html" -type f -exec \
sed -i "s/© $PREV_YEAR/© $CURRENT_YEAR/g" {} \;
done
nginx -t && systemctl reload nginx
```
### Audit all client sites
```bash
copyright-audit.sh
```
---
## 19. CROSS-REFERENCES
* [framework-html-meta-author.md](framework-html-meta-author.md): the copyright holder may differ from the author; both are signaled separately via Schema.org.
* [framework-html-meta-generator.md](framework-html-meta-generator.md): the Bubbles "Crafted by ThatDeveloperGuy.com" footer is developer attribution; the copyright notice is separate.
* [framework-html-meta-description.md](framework-html-meta-description.md): the description does not typically contain copyright (use schema or footer instead).
* [framework-html-meta-charset.md](framework-html-meta-charset.md): the © symbol requires UTF-8 (otherwise mojibake).
* [UNIVERSAL-RANKING-FRAMEWORK.md](UNIVERSAL-RANKING-FRAMEWORK.md): copyright not directly ranking but E-E-A-T uses authorship signals.
* [SEO-BUILD-REFERENCE.md](SEO-BUILD-REFERENCE.md) v2.4: the build playbook including footer convention.
* US Copyright Office: https://www.copyright.gov
* Berne Convention: https://www.wipo.int/treaties/en/ip/berne/
* 17 U.S.C. § 105 (Federal Government works): https://www.law.cornell.edu/uscode/text/17/105
* Schema.org Article (copyrightHolder, copyrightYear, license): https://schema.org/Article
* Schema.org CreativeWork: https://schema.org/CreativeWork
* Creative Commons license chooser: https://creativecommons.org/choose/
* MDN meta name: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name
* MDN link rel=license: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel/license
---
## APPENDIX A: ONE PAGE QUICK REFERENCE
For the person who just wants the answer.
### The Bubbles rule
**Omit `<meta name="copyright">`. Use visible footer plus Schema.org instead.**
### The canonical pattern
```html
<head>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"copyrightHolder": {"@type": "Organization", "name": "Client Business"},
"copyrightYear": "2026"
}
</script>
</head>
<body>
<footer>
<p>© 2026 Client Business. Crafted by ThatDeveloperGuy.com.</p>
</footer>
</body>
```
### The forbidden patterns
```html
<!-- Stale year hard coded -->
<footer><p>© 2019 Business. All rights reserved.</p></footer>
<!-- Developer claiming copyright on client content -->
<footer><p>© 2026 ThatDeveloperGuy.com. All rights reserved.</p></footer>
<!-- Useless meta copyright on top of working footer -->
<meta name="copyright" content="© 2026 Business">
```
### Five rules to memorize
1. **Copyright is automatic. The tag declares; it doesn't establish.**
2. **Visible footer is primary. Schema.org is supplementary. Meta tag is obsolete.**
3. **Client owns copyright on client content. Joseph is credited as developer.**
4. **Update the year dynamically (server side or JavaScript fallback).**
5. **Federal public domain: distinguish content from site framework.**
### Five commands every operator should know
```bash
# 1. Check for legacy meta copyright (should be 0)
curl -s URL | grep -c 'meta name="copyright"'
# 2. Get footer copyright
curl -s URL | grep -oE '©[^<]+\|copyright[^<]+' | head -3
# 3. Get Schema.org copyrightHolder
curl -s URL | grep -oE '"copyrightHolder":[^,]+' | head -1
# 4. Find stale years across all sites
year-audit.sh
# 5. Apply annual year update
sed -i "s/© $((`date +%Y`-1))/© `date +%Y`/g" /var/www/sites/*/index.html
nginx -t && systemctl reload nginx
```
### Three end to end tests
```bash
# 1. No legacy meta copyright
URL=https://example.com/
HAS_META=$(curl -s "$URL" | grep -c 'meta name="copyright"')
[ "$HAS_META" = "0" ] && echo "OK: no legacy meta" || echo "FAIL"
# 2. Visible footer present
HAS_FOOTER=$(curl -s "$URL" | grep -c "Crafted by ThatDeveloperGuy.com")
[ "$HAS_FOOTER" -ge "1" ] && echo "OK: footer present" || echo "FAIL"
# 3. Year is current
CURRENT_YEAR=$(date +%Y)
YEARS_FOUND=$(curl -s "$URL" | grep -oE '©[[:space:]]+20[0-9]{2}' | grep -oE '20[0-9]{2}' | sort -u)
HAS_CURRENT=0
for y in $YEARS_FOUND; do
if [ "$y" = "$CURRENT_YEAR" ] || [ "$y" = "$((CURRENT_YEAR - 1))" ]; then
HAS_CURRENT=1
fi
done
[ "$HAS_CURRENT" = "1" ] && echo "OK: year is current" || echo "FAIL: stale year"
```
If all three pass AND Schema.org copyrightHolder matches the visible footer holder, the copyright layer is correctly wired.
---
End of framework-html-meta-copyright.md.