ramensoftware/windhawk · warning
The response carries no changelog
Error message
The response carries no changelog
What it means
ChangelogModal fetches a mod's changelog from the backend; the payload arrives as text with a metadata section, a NUL separator ('\0'), and the changelog text after it. If the separator is missing the text is treated as empty, and if the extracted changelog is blank the component throws this error so the UI shows a retryable failure instead of an empty dialog that reopening would never refresh.
Solutions
- Click retry / reopen the modal — transient network or CDN issues often resolve; the component sets fetchStatus to failure precisely so a reopen re-fetches.
- Verify the mod actually has a changelog on windhawk.net; if it has none, the error is expected — treat it as 'no changelog available'.
- Check the network response in DevTools: if it's an error page or non-mod payload, the backend request failed — retry later or report an API issue.
- If persistent for a specific mod, report the mod's missing changelog data to the mod author or Windhawk maintainers.
Example fix
// caller-side guard
try {
await openChangelog(modId);
} catch (e) {
if (e.message === 'The response carries no changelog') {
showInfo('This mod has no changelog available.');
}
} Defensive patterns
Strategy: retry
Validate before calling
const sep = text.indexOf('\0');
const changelog = sep === -1 ? '' : text.slice(sep + 1);
if (!changelog.trim()) console.warn('Response carries no changelog'); Try / catch
try {
await openChangelogModal(modId);
} catch (e) {
if (e.message === 'The response carries no changelog') {
showRetryableError('Changelog unavailable; the mod may have none. Retry?');
}
} Prevention
- Retry once on failure before showing an error — the component already supports reopen/re-fetch.
- Check the mod's website for an actual changelog before assuming a bug.
- Inspect the raw HTTP response for error pages/CDN failures that produce metadata-less payloads.
When it happens
Trigger: Opening the changelog modal for a mod whose backend response has no NUL separator or an empty/whitespace-only changelog section — e.g. a mod with no published changelog entries, an API/CDN response that returned an error page or truncated body, or a backend format change.
Common situations: Viewing the changelog of a brand-new or newly updated mod whose changelog hasn't propagated on the server; offline/proxied networks returning HTML error bodies; older mods that never had changelog data.
Related errors
AI-assisted analysis of ramensoftware/windhawk@61d99ed8e1 (2026-09-12).
Data as JSON: /api/errors/b1591c32d3fbebe1.
Report an issue: GitHub.
Appendix: source
Thrown at src/windhawk-frontend/apps/windhawk-frontend/src/app/panel/about/ChangelogModal.tsx:54
useEffect(() => {
// Fetch when modal opens if we haven't successfully fetched yet
// On error, allow retry when modal is reopened (not immediate retry)
if (props.open && fetchStatusRef.current !== 'success' && fetchStatusRef.current !== 'loading') {
fetchStatusRef.current = 'loading';
setLoading(true);
setHasError(false);
fetchText(CHANGELOG_URL)
.then((textWithNull) => {
// The response is the latest version and the changelog, separated by a
// NUL. Any other 2xx body - a CDN interstitial, a format change - has
// no changelog in it, and is reported as a failure the user can retry
// instead of an empty dialog that no reopen refreshes.
const separatorIndex = textWithNull.indexOf('\0');
const text =
separatorIndex === -1 ? '' : textWithNull.slice(separatorIndex + 1);
if (!text.trim()) {
throw new Error('The response carries no changelog');
}
setChangelog(text);
fetchStatusRef.current = 'success';
setLoading(false);
})
.catch((err) => {
console.error('Failed to fetch changelog:', err);
setHasError(true);
fetchStatusRef.current = 'error';
setLoading(false);
});
}
}, [props.open]);
return (
<Modal
open={props.open}View on GitHub (pinned to 61d99ed8e1)