Releases: HarperFast/prerender-plugin
Release list
v1.10.0 — @harperfast/prerender-browser
@harperfast/prerender-browser v1.10.0
Adds a configurable scroll.stepFraction — the scroll increment per settle-loop step, as a fraction of the viewport height.
Why
Live v1.9.0 telemetry showed the render ceiling is CPU-bound in the scroll-settle phase (settle ~9.6s of a 12.2s render; containers at 100% CPU), not the network. The settle scroll pass was hardcoded to half-viewport steps; on tall pages that's dozens of steps per pass and most of the per-render layout/paint CPU. Widening the step cuts both wall-time and CPU → more throughput at the same core count.
Added
scroll.stepFraction(default 0.5 — unchanged behavior).1.0(full viewport) roughly halves pass time.validate()rejects a non-number / non-positivestepFractionat config load;scrollPassfloors pathologically small positive values in-page (defense-in-depth).
Correctness
Default stays 0.5; a wider step skips more per hop, so consumers opt into a larger value and validate that IntersectionObserver-lazy content (e.g. BazaarVoice reviews) still renders. Post-pass networkIdle + DOM-stability gating is unchanged.
Consumers install:
https://github.com/HarperFast/prerender-plugin/releases/download/v1.10.0/harperfast-prerender-browser-1.10.0.tgz
v1.9.0 — @harperfast/prerender-browser
@harperfast/prerender-browser v1.9.0
Per-render phase timing and per-worker CPU telemetry in the worker stats log, to diagnose render-throughput ceilings (network-wait vs in-browser CPU) and right-size CONCURRENCY.
Added to each per-window worker stats log line
phaseMs— mean/p50/p95/max for each render phase:navTtfb— main-document TTFB (origin/edge response time; isolates a slow/pinned upstream IP)navTotal— fullpage.gotoincl.waitUntilsettle— post-nav scroll / network-idle / DOM-stable looppostProcess— final in-page serialize/flatten
cpu— respects the N-workers-per-container topology:workerCores/nodeCores/browserCores— this worker only (Node process + its own Chrome process tree via/proc, incl. reaped-child CPU)container— whole-pod cgroup usage +utilization, reported separately (shared by all workers, not per-worker)avgConcurrent(Little's law) +coresPerRender— for concurrency tuning (CPU-bound concurrency ≈limitCores / coresPerRender)
Notes
- Sampled once per stats window — no per-render overhead.
- Degrades to
nullon hosts without procfs/cgroup. - No config or API surface changes; drop-in.
Consumers install the tarball asset attached to this release:
https://github.com/HarperFast/prerender-plugin/releases/download/v1.9.0/harperfast-prerender-browser-1.9.0.tgz
v1.8.0 — @harperfast/prerender-browser
Per-interval worker stats: throughput/latency(p50/p95)/error-buckets/saturation, workerId + rssMb, sendResult delivery accounting. Stats interval 45s→60s. Observability-only; no render/claim/callback behavior change.
v1.7.0 — @harperfast/prerender-browser
Claim per capacity: jobClaimLimit defaults to concurrency (was concurrency×2) so a worker no longer over-claims and hoards a burst / holds jobs leased-idle.
prerender-v0.5.0 — @harperfast/prerender
@harperfast/prerender v0.5.0
Sitemap refresh reliability + identifiable outbound traffic.
- Fail loudly on a blocked sitemap fetch.
fetchLatestSitemapnow guardsres.okand validates the parsed shape; a non-sitemap response (e.g. an Akamai 403 "Access Denied" HTML page) throws with the status + a body snippet instead of silently reporting a no-opcreated: 0success.parseSitemapextracted toutil/sitemap.js. - Route all Harper→origin sitemap traffic through the configured staging edge. Whenever
staging.ipis set, the sitemap fetch (including the daily scheduled refresh) is pinned to it (Host/SNI preserved), so the security token authenticates. Emptystaging.ip→ direct fetch. - Identifiable User-Agents. Sitemap fetch uses a configurable
sitemapUserAgent(defaultHarperSitemapCrawler/1.0); proxy device UAs now carryHarperProxy/1.0(wasHarperPrerender/1.0).
Consumers install the tarball asset from this release; bump @harperfast/prerender in kohls-pr to pick it up.
prerender-v0.4.0 — @harperfast/prerender
Spread the render schedule: reschedule relative to completion + deterministic first-render jitter (no more fixed-07:00 daily herd); renderInterval now drives cadence. Server-side claim ceiling (queue.maxClaimLimit). Reschedule keys on target existence.
prerender-v0.3.6 — @harperfast/prerender
@harperfast/prerender v0.3.6
Generalizes the 0.3.5 on-demand render into two orthogonal levers for authorized requests, and adds tester-facing debug headers (PR #19).
Request levers (authorized requests only; real crawler traffic is unaffected)
- Cache freshness —
Cache-Control: no-cache/no-storeskips the served cache (forces a miss). Honored only when authorized. - Miss behavior — the configured
missHeadervalue picks what happens on a miss/skip:prerender(render now + wait) ororigin(proxy origin). Absent →defaultMissMode(defaultprerender).
So default (no Cache-Control) = "serve cache, else render now" (warm-on-demand); adding Cache-Control: no-cache = "always render fresh now".
Behavior change vs 0.3.5: the auth header alone no longer forces a full render — it's now warm-on-demand. Add Cache-Control: no-cache for the old always-render behavior.
Debug response headers (emitted only when the debug header is present)
x-harper-cache (hit|miss|stale|skip), x-harper-cache-key, x-harper-url, x-harper-source (cache|rendered|origin), x-harper-route (forwarded mode), x-harper-indexable — alongside the existing x-harper-device-type / -cache-timestamp / -origin / -render-now.
Schema
PrerenderedPage gains an optional isIndexable field (additive; older rows omit it), stored by processJobResult so the serving path can surface x-harper-indexable.
Config
renderNow adds missHeader and defaultMissMode.
prerender-v0.3.5 — @harperfast/prerender
@harperfast/prerender v0.3.5
Adds an opt-in on-demand "render now" capability (PR #18).
renderNowrequest header — when enabled and authenticated (header value must match a shared-secrettoken, sourceable fromrenderNow.valueEnv), a GET bot request bypasses both the served cache and the origin proxy, forces an immediate one-off render, and long-polls the page cache for the fresh result before responding. Emitsx-harper-render-now: hit|timeout.- Off by default. Config:
renderNow.{enabled, header, token, valueEnv, timeoutMs, pollIntervalMs, fallback}(fallback=origin|stale|erroron timeout). A config warning fires if enabled without a token. - GET only; respects
excludePathPatterns; an unauthorized-but-present header falls through to normal serving.
- Off by default. Config:
- One-off / orphan schedule cleanup —
RenderQueue.processJobResultnow drops aRenderSchedulerow that has no owningRenderTarget(on both success and unknown-error paths), so a render-now job renders once instead of being re-claimed after its lease expires.
v1.6.0 — @harperfast/prerender-browser
Adds scroll.topSettleMs (default 300ms): after the scroll/settle phase returns to the top, wait before serializing so scroll-reactive UI (sticky/compact headers that hide the main header on scroll-down and re-reveal it at the top via a throttled handler) settles into its top state. Fixes prerendered pages shipping with a blank header band. 0 disables.
See #16.
v1.5.3 — @harperfast/prerender-browser
@harperfast/prerender-browser v1.5.3
Hardening from the v1.5.2 (PR #12) review:
- URIError-safe URL normalization —
decodeURIno longer throws out ofnormalizeUrlForCompare/normalizeCanonicalUrlon a malformed%-sequence (falls back to the raw string), so such a URL can't fail its render. - Case-insensitive
noindex— robots meta directives are matched case-insensitively (NOINDEX/NoIndex) per spec.