fix(seo): SEO/GEO/AEO audit fixes for -new draft pages, part 2#507
Merged
Conversation
Addresses the Critical/High findings from the -new pages SEO/GEO/AEO audit that are safe to ship while pages stay noindexed: - Remove deprecated HowTo/HowToStep schema (retired by Google Sept 2023) from incubator-new, mentorship-new, volunteer-new - Add a shared #organization @id to HomeLayout's NonprofitOrganization node and reference it from donate-new, donate-2-new, media-new, and contact-new so their page-level schema fragments merge into one entity instead of creating duplicate/orphan Organization nodes - Add a canonicalUrl override prop to HomeLayout and point donate-2-new at /donate to codify the primary/fallback relationship before either page goes live - Fix 5 titles missing the site's "| Tech for Palestine" brand suffix (endorsements, london-gathering, legal, privacy-policy, terms) - Trim 2 meta descriptions over the 160-char SERP truncation limit (e4p, london-gathering) - Fix home-new title capitalization/length and drop the redundant "T4P" prefix on tools-new's title
…pages Addresses the content/E-E-A-T and GEO findings from the -new pages SEO/GEO/AEO audit: - Fix MembershipDues to compute its A/B variant assignment (URL param, localStorage) inside an effect instead of a useState initializer, so the component no longer crashes under SSR; switch membership-new from client:only to client:load so the dues formula, fee-waiver list, and tax-deductibility copy are now in the crawlable HTML - Add fetchE4PSignatories to notionClient.ts (mirrors the existing fetchNotionEvents/fetchNotionFAQ pattern) and use it to server-fetch signatories for e4p/pledge-new, switching SignatoriesNew from client:only to client:load with the fetched data as initial props - Flesh out contact-new (response-time SLA, registered address, FAQ link, social links) from ~85 to 250+ words; align the endorsements card's review-time language with the endorsements-new page - Add a definitional "what is Tech for Palestine" passage to about-new's visible body copy, not just its meta description - Add static fallback copy to events-new (independent of the Notion fetch) and expand faq-new's fallback FAQ list from 3 to 6 items - Rework 6 declarative H2s into question form across donate-new, membership-new, incubator-new (x2), mentorship-new, and volunteer-new for better AI Overview/answer-engine extraction - Add missing recommended `image` to the Event schema on events-new and london-gathering-new; add datePublished + <time datetime> to media-new's press coverage; add <time datetime> to event dates in EventsNew.tsx - Add page-specific schema to the four pages that had none: ItemList for home-new's open roles and ideas-new's project ideas, WebPage for get-involved-new, and BreadcrumbList for the two nested routes (e4p/pledge-new, help/hire-new) - Link Person.worksFor nodes (about-new, team-new) to the shared #organization @id; add the founder's real image URL to about-new's Person schema Skipped by design: team-new's per-director bios and quantified "impact" stats on tools-new's Thaura/Newscord/Boycat/Find-a-Protest cards both need real facts (bios, LinkedIn URLs, usage numbers) that don't exist in this codebase — fabricating them would put false claims about named staff and real products on a public nonprofit page. UpScrolled's existing Al Jazeera coverage (already cited on media-new) was added since it's a verified fact.
…nical normalization Addresses the remaining GEO/technical findings from the -new pages SEO/GEO/AEO audit that don't depend on a live preview deploy: - Add public/llms.txt: org summary, mission, EIN, and 16 key live pages with one-line descriptions. Points only at the live canonical URLs (e.g. /about, /donate) — deliberately excludes the noindexed -new draft variants per the audit's own guidance - Add explicit Allow rules in robots.txt for GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, Claude-User, PerplexityBot, and Google-Extended. Functionally redundant with the existing wildcard allow, but makes AI-crawler access an explicit, intentional signal rather than an implicit side effect - Normalize the trailing slash in HomeLayout's canonical URL construction so /page and /page/ always emit the same self-referential canonical, matching the trailing-slash-free convention already used by all internal links sitewide. Scoped to canonical-tag construction rather than astro.config.mjs's trailingSlash setting, to avoid changing routing/redirect behavior for the ~60 existing live pages Not done in this pass: firming up the Performance/Images audit scores requires a live preview deploy to crawl (Core Web Vitals field data and image analysis can't be produced from source alone) — flagging for a follow-up once a preview URL exists.
…me-new Measured the live production page directly (curl timing + response inspection) to replace guesswork with real data for the Performance/ Images audit score: - open-roles fetch in home-new.astro has averaged ~0.7-0.8s round-trip in production and was unbounded — a hanging upstream would stall SSR indefinitely. Add a 3s AbortSignal.timeout so it degrades to the existing empty-array fallback instead of hanging the whole page. - Two below-the-fold footer images (brand logo, UpScrolled social icon) were missing loading="lazy" in FooterSection.astro, which is shared by every -new page. Also confirmed via live crawl but NOT fixed here (out of scope / too risky for this pass): every HomeLayout-based page — not just home-new — loads two "conversions.*.css" chunks (~81KB combined, render-blocking) that belong to the unrelated admin conversions dashboard. This is a sitewide Vite CSS-chunk-splitting artifact, not a home-new-specific bug, and needs its own investigation into the build's chunking behavior rather than a blind fix that could affect styling across all ~60 live pages.
Deploying website with
|
| Latest commit: |
d28bb5a
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://6e362bc0.website-aun.pages.dev |
| Branch Preview URL: | https://seo-new-pages-audit-fixes.website-aun.pages.dev |
This was referenced Jul 14, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Follow-up to #505/#506 — a second, more thorough SEO/GEO/AEO audit of all 24
-newdraft pages (via theclaude-seoskill's parallel technical/content/schema/GEO specialist passes), plus fixes. All 24 pages remainnoindex'd and excluded from the sitemap — this PR only improves the drafts themselves, it does not launch them.HowTo/HowToStepmarkup (retired by Google Sept 2023) from incubator/mentorship/volunteer-new; gave the site'sNonprofitOrganizationnode a shared@idand linked page-level schema fragments to it instead of creating duplicate/orphan Organization entities; added page-specific schema (ItemList,WebPage,BreadcrumbList) to the 4 pages that had noneMembershipDuesandSignatoriesNewwereclient:only, so their real content (dues formula, fee-waiver list, pledge signatories) rendered as an empty shell to crawlers/AI search. Fixed the SSR-unsafewindow/localStorageaccess and switched both toclient:loadwith server-fetched initial datacontact-new(was ~85 words, no response time or address), added a real definitional passage toabout-newinstead of burying it in the meta description, added static fallback copy toevents-new/faq-newso a Notion outage doesn't leave a near-blank page, reworked 6 headings into question form for AI Overview/answer-engine extractionpublic/llms.txt(org summary + 16 live key pages), explicitrobots.txtallow rules for major AI crawlers/home-newpage directly and found theopen-rolesfetch was unbounded and averaging ~0.7-0.8s per request — added a timeout so a hanging upstream can't stall SSR; fixed two footer images missingloading="lazy"Explicitly not done (documented in commit messages, not silently skipped):
team-new's per-director bios and quantified stats on 3 of 4 featured tools need real facts (bios, LinkedIn URLs, usage numbers) that don't exist in this codebase — fabricating them would put false claims about named staff and real products on a public nonprofit pageconversions.*.csschunk issue (81KB render-blocking CSS unrelated to page content, loaded on everyHomeLayoutpage, not just-newones) needs its own investigation into Vite's chunk-splitting — too broad a blast radius to fix blindly hereTest plan
pnpm check— 0 errors, 0 warnings across all 4 commitspnpm build— succeeds; spot-checked compiled output for HowTo removal,@idmerging, breadcrumb/ItemList schema,datePublished, eventimage, and the timeout fix