Improve SEO, GEO, and AEO for ditectrev.com - #19
Conversation
Add route-specific titles, descriptions, canonicals, and Open Graph/Twitter tags, plus JSON-LD for Organization, FAQ, and services. Improve heading markup, crawlable service links, sitemap freshness, and 404 noindex status without changing page copy or inventing claims. Co-authored-by: ✅ Daniel Danielecki <danieldanielecki@users.noreply.github.com>
Loop tag removal until the string is stable and drop leftover angle brackets so nested or unclosed tags cannot survive a single regex pass. Co-authored-by: ✅ Daniel Danielecki <danieldanielecki@users.noreply.github.com>
Publish llms.txt and llms-full.txt, allow major AI crawlers, and extend JSON-LD with FAQ, HowTo, glossary terms, service catalogs, and snippet-friendly robots so answer engines can cite existing site facts. Co-authored-by: ✅ Daniel Danielecki <danieldanielecki@users.noreply.github.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 2 potential issues.
Bugbot Autofix is ON, but it could not run because the branch was deleted or merged before autofix could start.
Reviewed by Cursor Bugbot for commit 40353e8. Configure here.
| if (!isIndexablePath(req.path || req.url)) { | ||
| res.status(404); | ||
| res.set('X-Robots-Tag', 'noindex, follow'); | ||
| } |
There was a problem hiding this comment.
Trailing slashes skip true 404s
Medium Severity
isIndexablePath and getPageSeo strip trailing slashes before lookup, so /about-us/ is treated as the real About page. The router has no empty-child route for those paths, so the wildcard 404 view can still render. Crawlers then get HTTP 200, index,follow, and the real page’s title and canonical on a not-found body.
Additional Locations (2)
Reviewed by Cursor Bugbot for commit 40353e8. Configure here.
| items.push(...this.flattenFaq(node.questions, nextPrefix)); | ||
| } | ||
| } | ||
| return items; |
There was a problem hiding this comment.
FAQ schema prefixes visible questions
Medium Severity
flattenFaq builds JSON-LD question names as category: question, so /faq markup says Company: What is Ditectrev? while the page shows What is Ditectrev?. FAQ rich results and answer engines expect the marked-up question to match the visible text, so this FAQPage block is likely ignored or treated as mismatched content.
Reviewed by Cursor Bugbot for commit 40353e8. Configure here.


Summary
High-impact SEO plus GEO (Generative Engine Optimization), AEO (Answer Engine Optimization), and AIO (AI Overviews / AI optimization) for the Angular SSR/prerender site. Copy is taken from existing page content only—no invented claims, reviews, ratings, or keyword stuffing.
SEO (earlier on this PR)
SeoService(wired from router navigation so it is present in SSR/prerender HTML). Defaults inindex.htmlwere cleaned up: emojis removed, relative OG image replaced with an absolute PNG, Twitter tags usename, and fabricatedog:locale:alternatevalues were removed (the site is English-only).rel=canonicalmatching the sitemap URL shape (https://ditectrev.com/for home, no trailing slash elsewhere).Allow: /,Disallow: /health, and stale 2021lastmoddates removed so we do not send inaccurate modification signals.<h1>page titles (keeping existingtitleattributes for e2e). Service cards use<h2>. HTML sitemap section labels are headings. 404 page has an<h1>and a homepage link.<a routerLink>instead of<button>, with descriptive link text from existing tooltips. Gallery “Learn more” links userouterLink(still emithref). Unknown SSR routes now return HTTP 404 plusX-Robots-Tag: noindex, follow.loading="lazy"on below-fold images,decoding="async", and intrinsicwidth/heighton 100×100 testimonial portraits to reduce CLS.stripHtmlloops to a fixpoint and then removes leftover<>so nested/unclosed tags cannot remain.GEO / AEO / AIO (this follow-up)
/llms.txtand/llms-full.txt. Spec-style markdown overview plus a citation fact sheet and Q&A, all paraphrased or quoted from existing About, FAQ, services, methodology, and legal copy. Built as Angular assets so Express static, Firebase Hosting, and Vercel serve them before the SSR fallback.User-agent: *), not Google-Extended.index,follow,max-snippet:-1,max-image-preview:large,max-video-preview:-1so Google can use full passages in overviews and snippets.rel=describedbyandrel=alternate type=text/markdownpoint tollms.txt. XML sitemap lists both LLM files.knowsAbout, offer catalog of the three service lines.WebPage.mainEntityQ&A from existing FAQ (What is Ditectrev, what we do, location, Scrum)./faqfrom the live FAQ tree./methodologyfrom the five existing delivery stages./glossaryfrom existing glossary terms./servicesfor the three service lines.Remaining opportunities (skipped)
<h2>. Changing it to a<p>would require rewriting a large letter-animation stylesheet; left as-is to avoid a visual redesign.twitter:card=summaryrather than inventing marketing art./faq, not on the service templates; adding FAQPage there would not match visible content..mdmirrors /.well-known/llms.txt/ WebMCP. Duplicative or experimental relative to rootllms.txt.llms.txt.routerLinkwould 404 inside the SPA; crawlers already get robots.txt, sitemap.xml, anddescribedby.h3→h2. Would enlarge section titles visually; skipped to stay out of redesign territory.Test plan
SeoService(13 passed, including HowTo, DefinedTermSet, ItemList, describedby/alternate, sanitizer)e2e/seo.spec.ts(home/about titles, llms.txt, llms-full.txt, sitemap discovery, 404 noindex)e2e/pages.spec.ts,e2e/smoke.spec.ts) still passes (from earlier SEO work)/,/about-us,/services,/faq,/contact(covered by Playwright page specs)stripHtmlnow loops to a fixpoint and removes leftover<>; SeoService specs cover nested/unclosed tags