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

  1. Click retry / reopen the modal — transient network or CDN issues often resolve; the component sets fetchStatus to failure precisely so a reopen re-fetches.
  2. Verify the mod actually has a changelog on windhawk.net; if it has none, the error is expected — treat it as 'no changelog available'.
  3. 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.
  4. 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

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)