General Guide: See Global LCP Guide for universal concepts and fixes.
What is LCP?
Largest Contentful Paint measures when the largest content element becomes visible. Google recommends LCP under 2.5 seconds. Oracle WebCenter Sites (formerly FatWire) uses JSP-based templates, Satellite Server for page assembly, and BlobServer for asset delivery. LCP depends heavily on Satellite Server cache configuration, BlobServer image serving, and the complexity of asset template rendering chains.
Oracle WebCenter Sites-Specific LCP Causes
- Satellite Server cache misses -- uncached pages execute full asset rendering chains through Content Server, which can take seconds per request
- BlobServer image delivery -- images served via BlobServer URLs (
/cs/BlobServer?blobkey=...) are dynamically resolved and lack CDN-level caching by default - Deep asset template nesting -- WCS renders pages by assembling nested asset templates (Layout, Slot, Detail), each requiring a Content Server call
- Uncached CSElement and SiteEntry assets -- every uncached template fragment triggers a database query and JSP compilation
- No image processing pipeline -- uploaded images serve at original resolution without server-side resizing or format conversion
Fixes
1. Configure Satellite Server Caching
Ensure all page and fragment assets have proper cache headers:
<!-- In your Template asset's CSElement -->
<ics:setvar name="cachecontrol" value="max-age=3600"/>
<ics:setvar name="pagecriteria" value="c,cid,p"/>
<!-- For SiteEntry assets, set cache rules in the WCS admin -->
<!-- Admin > Sites > Cache Rules > Add Rule -->
<!-- Pattern: /cs/Satellite/site/* -->
<!-- Cache Time: 3600 seconds -->
<!-- Vary: c,cid,rendermode -->
Verify caching is active:
# Check Satellite Server cache status
curl -I "https://yoursite.com/cs/Satellite/site/page" | grep -i "x-cache"
# Should return: X-Cache: HIT from Satellite
2. Optimize BlobServer Image Delivery
Move hero images from BlobServer to a CDN, or add caching headers:
<%-- In your Detail template JSP --%>
<%-- Instead of raw BlobServer URL: --%>
<img
src="/cs/BlobServer?blobkey=id&blobnocache=true&blobwhere=<%= imageId %>&blobcol=urldata"
width="1200" height="630"
alt="<%= assetName %>"
loading="eager"
fetchpriority="high"
style="aspect-ratio: 1200/630; width: 100%; height: auto; object-fit: cover;"
>
<%-- Better: Use a static URL via Satellite Server with caching --%>
<satellite:link pagename="ImageRender" c="Image" cid="<%= imageId %>"
assembler="query" fragment="true"/>
Pre-optimize images before uploading to the DAM:
# Resize and compress before uploading to WCS
mogrify -strip -quality 80 -resize "1920>" *.jpg
cwebp -q 80 hero.jpg -o hero.webp
3. Reduce Template Nesting Depth
Flatten your asset template chain where possible:
<%-- SLOW: 4 levels deep --%>
<%-- Layout -> Wrapper -> Slot -> Detail -> Fragment --%>
<%-- FASTER: Inline fragments into Detail templates --%>
<%-- Layout -> Slot -> Detail (with inlined fragments) --%>
<%-- Use ics:callelement with caching instead of deep nesting --%>
<ics:callelement element="ContentRender/HeroImage"
cscachecontrol="max-age=1800"
cscriteria="c,cid">
<ics:argument name="c" value="Page"/>
<ics:argument name="cid" value='<%= ics.GetVar("cid") %>'/>
</ics:callelement>
4. Preload Critical Assets in Layout Templates
<%-- In your Layout template's <head> section --%>
<head>
<%-- Inline critical CSS --%>
<style>
body { font-family: system-ui, sans-serif; margin: 0; }
.header { display: flex; height: 64px; align-items: center; }
.hero { width: 100%; aspect-ratio: 16/9; }
.content { max-width: 1200px; margin: 0 auto; padding: 1rem; }
</style>
<%-- Preload hero image if available --%>
<% if (heroImageUrl != null) { %>
<link rel="preload" as="image" href="<%= heroImageUrl %>">
<% } %>
<%-- Defer non-critical CSS --%>
<link rel="preload" href="/cs/Satellite/theme/main.css" as="style"
</head>
5. Enable Composition Caching
# In wcs_properties.json or Satellite Server config
# Enable page composition caching
satellite.cachemanager.enabled=true
satellite.cachemanager.maxentries=10000
satellite.cachemanager.defaultexpiry=3600
# Enable blob caching
cs.blobcachefolder=/opt/wcs/blobcache
cs.blobcacheexpiry=86400
Measuring LCP on Oracle WCS
- WCS Activity Logging -- enable
futuretense.inidebug logging to see asset render times:cs.debug=true,cs.debug.logfile=/opt/wcs/debug.log - Satellite Server cache stats -- check hit/miss ratios in the Satellite Server admin console
- PageSpeed Insights -- test public-facing pages to identify the LCP element
- TTFB baseline --
curl -w "TTFB: %{time_starttransfer}\n" -o /dev/null -s https://yoursite.com-- if over 800ms, focus on Satellite Server caching - Template profiling -- use WCS's built-in render time logging to identify the slowest asset templates in the chain
Analytics Script Impact
- Place analytics scripts at the bottom of the Layout template before
</body> - Use
asyncordeferon all tracking scripts - Oracle WCS Visitor Tracking (if enabled) adds minimal overhead since it runs server-side
- Avoid synchronous calls to Oracle Maxymiser (personalization) in the critical rendering path