# pfpmaker.online SEO/GEO/AEO Final Recheck

- Task: t_c454a7a5
- Tenant: site-pfpmaker-20260603
- Domain: https://pfpmaker.online
- Project dir: /root/projects/pfpmaker
- Commit checked: bf4dbc7f0f62b3dd1c3ef268093ee62dc13971f7
- Production checked: https://pfpmaker.online/
- Raw audit JSON: /root/.hermes/kanban/boards/site-factory/workspaces/t_c454a7a5/pfpmaker_seo_audit.json
- Audit script: /root/.hermes/kanban/boards/site-factory/workspaces/t_c454a7a5/audit_pfpmaker_seo.py

## Verdict

SEO verdict: **SEO_NO_GO**

上线可访问性通过，但 SEO/GEO/AEO final gate 不通过。阻塞点集中在：indexable 子页 title 过长、多个 indexable 页内容偏薄、全站 logo `<img>` 空 alt、Profile/AI/Templates 缺 schema、项目缺正式 `seo:audit` 发布门禁脚本。

## Verification executed

```text
npm run lint      PASS
npm run typecheck PASS
npm run build     PASS
npm run verify    PASS
```

`npm run build` confirmed static routes:

- `/`
- `/discord-pfp-maker`
- `/profile-picture-maker`
- `/ai-pfp-maker`
- `/templates`
- `/contact`
- `/privacy`
- `/terms`
- `/cookie-policy`
- `/robots.txt`
- `/sitemap.xml`

Production fetch + HTML audit checked:

- 9 HTML routes
- `/robots.txt`
- `/sitemap.xml`
- title/meta/canonical/robots meta
- H1/H2/H3 counts
- word count
- keyword density
- image alt
- OG/Twitter meta
- JSON-LD schema
- sitemap inclusion/exclusion
- internal links

Browser runtime smoke checked homepage:

- URL loaded: https://pfpmaker.online/
- Document title: `Free PFP Maker - Create Profile Pictures Online, No Sign Up`
- DOM complete: ~3302ms in tool environment
- Resource count: 10
- Transfer total reported by browser performance API: ~2700 bytes in this environment
- Rendered homepage has upload-first editor, controls, internal navigation, and footer links
- Browser console messages: none; browser tool surfaced 2 empty exception records, needs dev QA to confirm whether tool artifact or real runtime exception

## Pass items

| Gate | Result | Evidence |
|---|---|---|
| Production route availability | PASS | all audited routes returned 200 |
| Static build | PASS | `npm run build` success |
| Local verify | PASS | `npm run verify` ok, 9 app routes / 11 html files |
| Robots | PASS | `User-Agent: *`, `Allow: /`, sitemap points to `https://pfpmaker.online/sitemap.xml` |
| Sitemap index policy | PASS | sitemap includes only 5 indexable URLs: `/`, `/discord-pfp-maker`, `/profile-picture-maker`, `/ai-pfp-maker`, `/templates`; legal noindex pages excluded |
| Canonical | PASS | all audited pages self-canonicalized to `https://pfpmaker.online/...` |
| Noindex legal pages | PASS | `/contact`, `/privacy`, `/terms`, `/cookie-policy` are `noindex,follow` |
| H1 uniqueness | PASS | every audited route has exactly one H1 |
| OG/Twitter social meta | PASS | audited pages expose `og:title`, `og:description`, `og:url`, `twitter:card` |
| Internal links | PASS | indexable pages link to related tools / footer / browse-all pages |
| Homepage content depth | PASS | 1,264 parsed words, H2=8, H3=24 |
| Homepage keyword density | PASS | `pfp maker` density 2.53% |
| Homepage schema | PASS | `SoftwareApplication` JSON-LD present |
| Discord schema | PASS | `FAQPage` JSON-LD present |
| AI overclaim risk | PASS | `/ai-pfp-maker` states AI generation is planned, not live |
| IP / platform disclaimer | PASS | footer says not affiliated, endorsed, or sponsored by mentioned platforms |

## Blocking findings

### P0 / release-blocking for SEO_GO

1. All audited pages contain logo images with empty alt.

Evidence:

- Source: `/root/projects/pfpmaker/src/components/SiteChrome.tsx:15`
- Source: `/root/projects/pfpmaker/src/components/SiteChrome.tsx:37`
- Runtime audit: every audited route reports `0/2 images with alt`

Why it blocks: site SEO gate requires all `<img>` to have non-empty alt. If these are purely decorative logos, the current internal gate still fails because the policy says non-empty alt for all images. Recommended fix: use `alt="PFP Maker Online logo"` on both logo images, or explicitly waive decorative logo alt in the audit standard and document the waiver. For this pipeline, safer fix is non-empty alt.

2. Indexable subpage titles exceed 60 characters after global template suffix.

| Route | Runtime title length | Runtime title |
|---|---:|---|
| `/discord-pfp-maker` | 81 | `Discord PFP Maker - Crop and Download Discord Profile Pictures | PFP Maker Online` |
| `/profile-picture-maker` | 78 | `Profile Picture Maker - Create Profile Pictures Online Free | PFP Maker Online` |
| `/ai-pfp-maker` | 73 | `AI PFP Maker - Create AI-Style Profile Pictures Online | PFP Maker Online` |
| `/templates` | 66 | `PFP Templates - Original Profile Picture Styles | PFP Maker Online` |

Source cause: global title template in `/root/projects/pfpmaker/src/app/layout.tsx:8` appends `| PFP Maker Online`. Page-level titles were written near 50-60 chars before suffix, but runtime titles exceed the 40-60 char final-title gate.

Recommended final titles:

- `/discord-pfp-maker`: `Discord PFP Maker - Crop Profile Pictures Free` (47)
- `/profile-picture-maker`: `Profile Picture Maker - Free Online PFP Editor` (46)
- `/ai-pfp-maker`: `AI PFP Maker - Style Profile Pictures Online` (43)
- `/templates`: `PFP Templates - Original Profile Picture Styles` (47)

If the template suffix remains, shorten page titles further or override absolute title where Next metadata supports it.

3. Content depth is below gate on key indexable pages.

| Route | Parsed words | Gate | Result |
|---|---:|---:|---|
| `/discord-pfp-maker` | 715 | 800 | FAIL |
| `/ai-pfp-maker` | 718 | 800 | FAIL |
| `/templates` | 448 | 500 minimum used for templates | FAIL |

Recommended fix:

- `/discord-pfp-maker`: add 120-180 words covering Discord circle safe area, 512 export rationale, server icon vs user avatar, common crop mistakes, and rights-safe gaming/anime style guidance.
- `/ai-pfp-maker`: add 120-180 words clarifying current non-AI workflow, future AI feature labels, privacy/processing state, and AI vs manual PFP decision table.
- `/templates`: add 100-150 words describing 12 original template categories, when to use each, and how to apply them in the editor.

4. Schema missing on several indexable pages.

| Route | Current schema | Required direction |
|---|---|---|
| `/profile-picture-maker` | none | add `FAQPage` and/or `WebApplication`/`SoftwareApplication` |
| `/ai-pfp-maker` | none | add `FAQPage` with truthful AI feature-state Q&A |
| `/templates` | none | add `ItemList` or `CreativeWork`/`CollectionPage`; optional FAQ if copy expanded |

Homepage has `SoftwareApplication`; `/discord-pfp-maker` has `FAQPage`. The remaining indexable pages need structured data for GEO/AEO consistency.

5. No formal `seo:audit` script or deploy-gate chain exists in `package.json`.

Current scripts:

```json
{
  "build": "next build",
  "lint": "eslint src next.config.ts scripts/verify-site.mjs",
  "typecheck": "tsc --noEmit",
  "verify": "node scripts/verify-site.mjs"
}
```

Required by site-seo-review gate: build/deploy should be blocked by an SEO audit script covering title, description, canonical, H1/H2/H3, word count, keyword density, noindex, sitemap inclusion, robots, image alt, OG/Twitter meta.

Recommended fix:

- Add `scripts/seo-audit.mjs` to the repo.
- Add package script: `"seo:audit": "node scripts/seo-audit.mjs"`.
- Ensure deploy path is effectively: `npm run build && npm run seo:audit && deploy`.

## Page-level audit table

| Route | Index policy | Title len | Meta len | Words | H1/H2/H3 | Keyword density | Schema | Main result |
|---|---|---:|---:|---:|---|---:|---|---|
| `/` | index | 59 | 139 | 1264 | 1/8/24 | 2.53% | SoftwareApplication | PASS except logo alt |
| `/discord-pfp-maker` | index | 81 | 129 | 715 | 1/4/5 | 1.68% | FAQPage | FAIL title, thin content, logo alt |
| `/profile-picture-maker` | index | 78 | 159 | 800 | 1/5/11 | 1.88% | none | FAIL title, schema, logo alt |
| `/ai-pfp-maker` | index | 73 | 159 | 718 | 1/5/6 | 1.67% | none | FAIL title, thin content, schema, logo alt |
| `/templates` | index | 66 | 150 | 448 | 1/2/12 | 1.34% | none | FAIL title, thin content, schema, logo alt |
| `/contact` | noindex | 26 | 67 | 164 | 1/2/0 | n/a | none | PASS index policy; logo alt issue remains |
| `/privacy` | noindex | 33 | 72 | 328 | 1/6/0 | n/a | none | PASS index policy; logo alt issue remains |
| `/terms` | noindex | 35 | 33 | 292 | 1/6/0 | n/a | none | PASS index policy; logo alt issue remains |
| `/cookie-policy` | noindex | 32 | 49 | 193 | 1/3/0 | n/a | none | PASS index policy; logo alt issue remains |

## Sitemap / robots details

Robots:

```text
User-Agent: *
Allow: /
Host: https://pfpmaker.online
Sitemap: https://pfpmaker.online/sitemap.xml
```

Sitemap includes exactly:

- `https://pfpmaker.online`
- `https://pfpmaker.online/discord-pfp-maker`
- `https://pfpmaker.online/profile-picture-maker`
- `https://pfpmaker.online/ai-pfp-maker`
- `https://pfpmaker.online/templates`

This is correct: indexable P0/P1 routes included, legal noindex routes excluded.

## Internal links / crawlability

PASS. Header links to P0 routes and FAQ. Footer links to tools/resources/legal. Each indexable page has `Browse all PFP tools`, avoiding orphan pages.

No internal dead-link crawl was detected by this audit because it validated route contract and fetched all linked core routes. External links were not the focus of this task.

## GEO / AEO assessment

PASS with remediation needed.

Good:

- Homepage has answer-first `What is a PFP maker?` section.
- FAQ sections exist on main indexable pages.
- `/discord-pfp-maker` has JSON-LD `FAQPage`.
- AI page avoids false claims and says AI generation is planned.
- Footer platform/IP disclaimer is visible.

Needs fix before SEO_GO:

- Add JSON-LD to `/profile-picture-maker`, `/ai-pfp-maker`, `/templates`.
- Expand short-answer blocks on Discord and AI pages so they are extractable without relying only on FAQ.
- Add a compact comparison/table block for platform presets if future GEO citation is a priority.

## Core Web Vitals basic risk

No Lighthouse/CrUX field data is available in this recheck. Basic browser smoke suggests low asset weight and no large external media risk on homepage. Remaining risks:

- Client-side editor JS is required for core tool interaction; ensure hydration errors are absent in a clean Chrome QA pass.
- Browser tool returned two empty exception records despite no console messages; dev QA should confirm with Chrome DevTools / Sentry-free console before final GO.
- OG image `/assets/og-image.png` was not deeply inspected for size/dimensions in this run.

## Recommended remediation order

1. Fix logo alt text in `SiteChrome.tsx`.
2. Shorten final runtime titles or remove/override suffix for subpages.
3. Add missing schema to `/profile-picture-maker`, `/ai-pfp-maker`, `/templates`.
4. Expand `/discord-pfp-maker`, `/ai-pfp-maker`, `/templates` copy to meet content gates.
5. Add committed `seo:audit` script and wire it into deploy gate.
6. Re-run: `npm run lint && npm run typecheck && npm run build && npm run verify && npm run seo:audit`.
7. Re-fetch production after redeploy and rerun this final recheck.

## Final decision

SEO_NO_GO.

Do not submit sitemap / IndexNow / GSC as final launch SEO completion yet. Production is crawlable, but the SEO quality gate is not clean enough for final pipeline GO.
