thedotmack/claude-mem · info

claude-mem: banner frame decoding failed, skipping banner:

Error message

claude-mem: banner frame decoding failed, skipping banner:

What it means

A console.warn from the npx CLI's banner player: inflateRawSync over the base64-embedded BANNER payload threw. The banner is purely decorative, so the code deliberately fails open — frames becomes [] and playBanner() skips the animation instead of breaking the CLI. Seeing this warning means the published bundle's embedded frames are corrupted or the zlib/base64 layer mismatched.

Source

Thrown at src/npx-cli/banner.ts:38

  if (!truecolor) return '\x1b[38;5;215m';
  const r = Math.min(255, Math.round(255 * brightness));
  const g = Math.min(255, Math.round(180 * brightness));
  const b = Math.min(255, Math.round(122 * brightness));
  return `\x1b[38;2;${r};${g};${b}m`;
}

let frames: string[] | null = null;
function getFrames(): string[] {
  if (frames) return frames;
  // Banner is decorative — if frame payload decoding fails for any reason
  // (corrupted bundle, mismatched zlib, etc.) we must not break the CLI.
  // Fail open by returning an empty frame list; playBanner() bails on empty.
  try {
    const raw = inflateRawSync(Buffer.from(BANNER.compressed, 'base64')).toString('utf8');
    frames = raw.split(FRAME_SEP).filter(Boolean);
  } catch (error) {
    const err = error instanceof Error ? error : new Error(String(error));
    console.warn('claude-mem: banner frame decoding failed, skipping banner:', err);
    frames = [];
  }
  return frames;
}

/** One character of a parsed frame plus whether it sits inside an accent span. */
export interface FrameCell {
  ch: string;
  accent: boolean;
}

/**
 * Parse a raw span-marked frame (`<x>…</x>` accent markers, `\n` row
 * separators) into per-character cells carrying an accent flag. Span state
 * carries across newlines, matching the original single-pass styling.
 */
export function parseFrameCells(frame: string): FrameCell[][] {
  const rows: FrameCell[][] = [[]];

View on GitHub (pinned to 8bc631a71a)

Solutions

  1. Ignore it — cosmetic only, all CLI commands still run
  2. Clear the npm cache and reinstall (npm cache clean --force; npx claude-mem@latest …) to get a clean bundle
  3. If it persists on every machine, report a packaging bug — the embedded BANNER payload is malformed in that release
Defensive patterns

Strategy: fallback

Prevention

When it happens

Trigger: A corrupted or partially-downloaded package in the npm cache (truncated base64 payload); a bundling change that altered BANNER.compressed between encode and decode; manual tampering with the bundle.

Common situations: Flaky network producing a truncated package tarball; using a forked/rebundled claude-mem where the banner asset pipeline changed; disk corruption in ~/.npm/_cacche. Functionality is unaffected apart from the animation.


AI-assisted analysis of thedotmack/claude-mem@8bc631a71a (2026-08-20). Data as JSON: /api/errors/d3232d9d9eda385f. Report an issue: GitHub.