Content operations skills for AEM Edge Delivery Services: page auditing, SEO optimization, AI search (GEO), WCAG accessibility, bulk metadata, structured data, sitemap validation, and content diffing. Complements the EDS development skills with operational tooling for content teams.
90%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Source for every rule here: Keeping it 100 and the AEM boilerplate, read in November 2026. Check them again before you rely on a detail.
/ to /en to /en/home) as a separate finding.| Phase | What loads | Counts against the budget |
|---|---|---|
| Eager | The HTML, styles.css, aem.js, scripts.js, then the whole first section: its blocks' CSS and JS, and its first image, which is the LCP candidate. | Yes |
| Lazy | Starts when the first section is shown: fonts.css, the other sections and their blocks, header and footer, lazy-styles.css, images as they scroll into view. Code the project controls, from the same origin. | No |
| Delayed | Third-party code: tag managers, analytics, consent, chat. The guideline is to start it at least three seconds after the LCP. | No |
The boilerplate takes the first <img> of the first section as the LCP candidate. When the real LCP element is not in the delivered HTML (it comes from a fragment, a JSON lookup or a service), the first block has to finish its changes to the DOM before the candidate is chosen. That lookup is then part of the budget.
Measured with Lighthouse 13.6.0 on https://main--aem-boilerplate--adobe.aem.live/ in November 2026, transfer bytes:
| Request | Bytes |
|---|---|
LCP image (width=750, WebP) | 11,091 |
scripts/aem.js | 6,751 |
favicon.ico | 3,568 |
| HTML | 2,725 |
scripts/scripts.js | 2,307 |
styles/styles.css | 1,917 |
| CSS and JS of the two blocks in the first section | 2,335 |
| Total | 30,694 |
A project starts with about 70 KB of headroom. What a page has on top of these numbers is what the project added.
Use this only when Lighthouse can't run. It gives sizes, not the LCP element and not the order of requests.
BASE="https://<branch>--<repo>--<owner>.aem.live"
for p in "<path>" /styles/styles.css /scripts/aem.js /scripts/scripts.js \
/blocks/<block>/<block>.css /blocks/<block>/<block>.js "<lcp-image-path-and-query>"; do
printf '%s\t%s\n' "$(curl -s --compressed -o /dev/null -w '%{size_download}' "$BASE$p")" "$p"
doneThe LCP image comes from the user (DevTools or RUM). Take its URL with the query string from the <source> that matches a mobile viewport: the media pipeline sizes the image by width.
.tessl-plugin
skills
accessibility-fix
bulk-metadata
content-audit
content-diff
cwv-optimizer
geo-rewrite
heading-optimizer
image-seo
internal-linking
link-rot-scanner
optel-interpreter
performance-budget
product-page-seo
query-index-optimizer
sitemap-audit
structured-data