
SSRWire
A command-line tool for inspecting the HTML your server sends, including content and metadata that arrive in a stream. It records when important elements appear and compares responses for different browser, search-crawler and social-preview user agents.

Images
About SSRWire
"Server-rendered" doesn’t necessarily mean everything arrives at once. The page content might come through first, with the title, canonical URL or sharing metadata following later. Different user agents can receive different versions, too. So checking the finished page and deciding “yep, looks fine” leaves a few things unanswered.
SSRWire reads the response as it arrives. It records when it finds titles, descriptions, canonicals, indexing directives, headings and other important elements, along with whether they appear in the head or body. Late metadata isn’t automatically a problem—the checks depend on the requirements you’ve selected.
It also checks Open Graph and Twitter Card metadata, which is handy when you’re trying to work out why sharing a perfectly normal page produces a rather unhelpful preview. You can see which values the server supplied, whether anything is missing and whether those values change between user agents.
One successful request doesn’t always tell the whole story, either. You can take repeated samples to catch inconsistent responses, or save audits from production and a preview deployment and compare them before releasing a change.
The reports explain what was found and suggest fixes. There’s a standalone HTML report you can open or share, plus machine-readable output for automated checks.
It’s written in TypeScript and runs on Node.js, without installing a browser. RoutePlay handles the browser and navigation checks; SSRWire concentrates on the server response. Its user-agent profiles test how your server responds to those strings—they don’t reproduce a search engine’s rendering or indexing process.
Release history
Version 0.5.0
Added
check --format htmlfor one self-contained, script-free audit report with a per-target verdict, plain-language findings, fix recipes, probe timings, streaming arrival order, social-preview readiness, and a social preview card that prints the captured values and image URL without fetching anything.- Human-readable findings through
explainFinding(),nextSteps(),targetVerdict(), andauditVerdict(): every built-in finding code now maps onto what was observed, why it matters, and what to change, with a generic fallback for unrecognized codes. - Framework-aware fix recipes for Next.js, Nuxt, Astro, SvelteKit, Remix, Laravel, WordPress, and
plain PHP, selected from
x-powered-byandx-nextjs-cacheresponse headers, the working directory'spackage.jsonorcomposer.json, or an explicit--frameworkoverride. X-Robots-Tagresponse-header checks per crawler profile:robots-header-noindex(error),robots-header-restrictive(warning), androbots-header-ineffective(information) withX-Robots-Tagadded to the allowlisted response-header snapshot.- Built-in AI and answer-engine crawler profiles:
gptbot,oai-searchbot,chatgpt-user,claudebot, andperplexitybot, with aliases such asclaudeandperplexity. - Terminal verdict lines per target and a "What to do" list of distinct fixes ordered by severity.
Changed
- The HTML audit report is exposed through
renderReport()andrenderAuditHtml(), and embeds the run's--fail-onpolicy and exit code when the CLI writes it. - Explanations, verdicts, and fix recipes are derived at render time, so the persisted
schemaVersion: 1audit contract and offline comparison behavior are unchanged.
External download
Version 0.4.2
Fixed
- Decode HTML using a leading byte-order mark, a supported response charset, or an in-document encoding declaration within the first 1024 bytes, with UTF-8 as the fallback. Ignore charset-like text in comments and unrelated attributes, and preserve arrival timestamps and byte evidence while buffering.
- Preserve buffered HTML when callers reuse input buffers, and use the last
arrival time when
end()orfinish()closes an unfinished element. - Emit body fingerprints only for complete responses, excluding truncated, timed-out, and failed response bodies.
- Reject conflicting duplicate URLs in configuration while allowing equivalent contracts, reordered accepted statuses, and command-line duplicates.
- Give SARIF findings stable, distinct identities without incorporating changing observations, counts, or error messages, and add rule help links.
- Handle empty terminal signal sets without displaying negative-infinite timing.
- Correct release instructions, version-reference guidance, and the documented audit comparison compatibility version.
External download
Version 0.4.1
Changed
- Updated the runtime dependencies to Commander 15.0.0, htmlparser2 12.0.0, and Zod 4.5.4. Commander 15's ESM-only and Node.js 22.12 requirements match SSRWire's existing package contract.
- Updated development tooling to Biome 2.5.11, tsx 4.23.13, and Vitest 4.1.11, and updated the Docker base image to Node.js 26.
- Disabled npm audit and funding network requests during Docker dependency installation and pruning to keep image builds within the CI time limit.
External download
Version 0.4.0
Added
- Offline
ssrwire comparefor two redacted JSON audits, with stable target IDs for matching the same route across production and preview origins. - Regression, fixed, and neutral-change classification for policy findings, completion, HTTP delivery, metadata values and locations, agent coverage, and redirect evidence.
- Dual-floor median timing comparisons with configurable absolute and relative thresholds.
- Terminal and deterministic JSON comparison reports plus a self-contained, script-free HTML wire waterfall.
- Public comparison, report-validation, and comparison-reporter APIs.
Changed
- JSON audits now include an explicit
schemaVersion: 1persisted-report contract independent of the SSRWire package version. - Target objects accept an optional unique
id; exact URL matching remains the fallback when an ID is absent.
External download
Version 0.3.0
Added
- Streamed capture for core Open Graph and Twitter Card metadata with arrival time, observed byte position, document location, bounded repeated values, and report redaction.
- Opt-in
require.openGraphandrequire.twitterCardtarget contracts with missing-field, invalid-URL, duplicate/conflict, and head/body delivery findings. - A terminal social-preview readiness table and public social metadata signal types in JSON and the programmatic API.
Changed
- Enabled social contracts now participate in required-signal timing, cross-agent comparison, and repeated-sample stability analysis.
- Twitter Card readiness prefers native Twitter metadata and falls back to the corresponding Open Graph title, description, and image.
- Multiple
og:imagevalues are retained in document order without being treated as conflicting scalar metadata.
External download
Version 0.2.0
Added
- Bounded
repeatconfiguration and--repeatCLI sampling for 1–10 requests per target-agent pair. - Per-agent minimum, median, nearest-rank p95, maximum, and spread summaries for response-header, first-byte, required-signal, and completion timings.
- Response and streamed-HTML stability findings across repeated samples.
- Sample attribution in terminal and JSON reports.
Changed
- Added an npm package badge to the README.
- Samples for one target-agent pair run sequentially while independent pairs retain bounded concurrency.
- Repeated policy findings are coalesced with occurrence and sample evidence.
- Exact body-fingerprint variation alone is informational; timing variation alone remains evidence rather than a policy failure.
External download
Version 0.1.0
- Stream-observation probes for browser and crawler user-agent profiles.
- Timing and byte-position evidence for SEO metadata, H1, main text, and JSON-LD.
- Redirect, status, response-header, truncation, timeout, and network-failure evidence.
- Cross-agent delivery comparisons with configurable expectations.
- Terminal, JSON, and SARIF reports with CI-safe exit codes.
- YAML configuration, one-off URL checks, Docker support, and GitHub Actions examples.
External download

















