> ## Documentation Index
> Fetch the complete documentation index at: https://docs.livepeer.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Frameworks Changelog

> Release history for Frameworks – sovereign video infrastructure on Livepeer.

export const CustomCardTitle = ({icon, title, variant = "card", iconSize, style = {}, className = "", ...rest}) => {
  const variants = {
    card: {
      display: 'flex',
      alignItems: 'center',
      gap: "var(--lp-spacing-2)",
      marginBottom: "var(--lp-spacing-3)",
      color: 'var(--lp-color-text-primary)',
      fontSize: '1rem',
      fontWeight: 600
    },
    accordion: {
      display: 'inline-flex',
      alignItems: 'center',
      gap: "var(--lp-spacing-2)"
    },
    tab: {
      display: 'inline-flex',
      alignItems: 'center',
      gap: '0.4rem',
      fontSize: '0.875rem'
    }
  };
  const sizes = {
    card: 20,
    accordion: 18,
    tab: 14
  };
  const size = iconSize || sizes[variant] || 20;
  const baseStyle = variants[variant] || variants.card;
  return variant === 'card' ? <div className={className} style={{
    ...baseStyle,
    ...style
  }} {...rest}>
      {typeof icon === 'string' ? <Icon icon={icon} size={size} color="var(--lp-color-accent)" /> : icon}
      {title}
    </div> : <span className={className} style={{
    ...baseStyle,
    ...style
  }} {...rest}>
      {typeof icon === 'string' ? <Icon icon={icon} size={size} color="var(--lp-color-accent)" /> : icon}
      {title}
    </span>;
};

export const Subtitle = ({style = {}, text, children, variant = 'default', fontSize = '', fontWeight = '', fontStyle = '', marginTop = '', marginBottom = '', color = '', className = '', ...rest}) => {
  const renderInlineCode = (value, keyPrefix) => {
    return value.split(/(`[^`]+`)/g).map((segment, index) => {
      if (segment.startsWith('`') && segment.endsWith('`')) {
        return <code key={`${keyPrefix}-code-${index}`}>{segment.slice(1, -1)}</code>;
      }
      return segment;
    });
  };
  const renderInlineMarkup = (value, keyPrefix = 'subtitle') => {
    if (typeof value !== 'string') {
      return value;
    }
    return value.split(/(\*\*[\s\S]+?\*\*)/g).map((segment, index) => {
      if (segment.startsWith('**') && segment.endsWith('**')) {
        const inner = segment.slice(2, -2);
        return <strong key={`${keyPrefix}-strong-${index}`}>
            {renderInlineCode(inner, `${keyPrefix}-strong-${index}`)}
          </strong>;
      }
      return renderInlineCode(segment, `${keyPrefix}-${index}`);
    });
  };
  const renderContent = (value, keyPrefix) => {
    if (Array.isArray(value)) {
      return value.map((item, index) => renderContent(item, `${keyPrefix}-${index}`));
    }
    return renderInlineMarkup(value, keyPrefix);
  };
  const variants = {
    default: {
      fontSize: '1rem',
      fontStyle: 'italic',
      color: 'var(--lp-color-accent)',
      marginBottom: 0
    },
    changelog: {
      fontSize: '0.8rem',
      fontStyle: 'normal',
      fontWeight: 700,
      color: 'var(--lp-color-text-primary)',
      marginBottom: 0
    }
  };
  const base = variants[variant] || variants.default;
  return <span className={className} style={{
    ...base,
    ...fontSize ? {
      fontSize
    } : {},
    ...fontWeight ? {
      fontWeight
    } : {},
    ...fontStyle ? {
      fontStyle
    } : {},
    ...marginTop ? {
      marginTop
    } : {},
    ...marginBottom ? {
      marginBottom
    } : {},
    ...color ? {
      color
    } : {},
    ...style
  }} {...rest}>
      {renderContent(text, 'text')}
      {renderContent(children, 'children')}
    </span>;
};

export const BorderedBox = ({children, variant = "default", padding = "var(--lp-spacing-4)", borderRadius = "var(--lp-spacing-px-8)", margin = "", accentBar = "", style = {}, className = "", ...rest}) => {
  const variants = {
    default: {
      border: "1px solid var(--lp-color-border-default)",
      backgroundColor: "var(--lp-color-bg-card)"
    },
    accent: {
      border: "1px solid var(--lp-color-accent)",
      backgroundColor: "var(--lp-color-bg-card)"
    },
    muted: {
      border: "1px solid var(--lp-color-border-default)",
      backgroundColor: "transparent"
    }
  };
  const accentBarColors = {
    accent: "var(--lp-color-accent)",
    positive: "var(--green-9)"
  };
  return <div data-docs-bordered-box="" data-accent-bar={accentBarColors[accentBar] ? "" : undefined} className={className} style={{
    ...variants[variant],
    padding: padding,
    borderRadius: borderRadius,
    ...margin ? {
      margin
    } : {},
    ...accentBarColors[accentBar] ? {
      position: "relative",
      '--accent-bar-color': accentBarColors[accentBar]
    } : {},
    ...style
  }} {...rest}>
      {children}
    </div>;
};

export const LazyLoad = ({children, height = "200px", offset = "200px", fadeDuration = 400, className = "", style = {}, ...rest}) => {
  const ref = useRef(null);
  const [visible, setVisible] = useState(false);
  const [ready, setReady] = useState(false);
  useEffect(() => {
    const el = ref.current;
    if (!el) return;
    const observer = new IntersectionObserver(([entry]) => {
      if (entry.isIntersecting) {
        setVisible(true);
        observer.disconnect();
      }
    }, {
      rootMargin: offset
    });
    observer.observe(el);
    return () => observer.disconnect();
  }, []);
  useEffect(() => {
    if (!visible) return;
    const frameId = requestAnimationFrame(() => {
      setReady(true);
    });
    return () => cancelAnimationFrame(frameId);
  }, [visible]);
  const placeholder = <div ref={ref} className={className} style={{
    minHeight: height,
    ...style
  }} {...rest} />;
  if (!visible) return placeholder;
  return <div ref={ref} className={className} style={{
    opacity: ready ? 1 : 0,
    transition: `opacity ${fadeDuration}ms ease-in`,
    ...style
  }} {...rest}>
      {children}
    </div>;
};

export const ScrollBox = ({children, maxHeight = 300, showHint = true, ariaLabel = "Scrollable content", style = {}, className = "", ...rest}) => {
  const contentRef = useRef(null);
  const [isOverflowing, setIsOverflowing] = useState(false);
  useEffect(() => {
    const checkOverflow = () => {
      if (contentRef.current) {
        const maxHeightPx = typeof maxHeight === "number" ? maxHeight : parseInt(maxHeight, 10) || 300;
        setIsOverflowing(contentRef.current.scrollHeight > maxHeightPx);
      }
    };
    checkOverflow();
    window.addEventListener("resize", checkOverflow);
    return () => window.removeEventListener("resize", checkOverflow);
  }, [maxHeight, children]);
  return <div className={className} style={{
    position: "relative",
    ...style
  }} {...rest}>
      <div ref={contentRef} role="region" tabIndex={0} aria-label={ariaLabel} style={{
    maxHeight: typeof maxHeight === "number" ? `${maxHeight}px` : maxHeight,
    overflowY: "auto",
    paddingRight: 4
  }} onScroll={e => {
    const el = e.target;
    const atBottom = el.scrollHeight - el.scrollTop <= el.clientHeight + 10;
    const hint = el.parentNode.querySelector("[data-scroll-hint]");
    if (hint) hint.style.opacity = atBottom ? "0" : "1";
  }}>
        {children}
      </div>
      {showHint && isOverflowing && <div data-scroll-hint style={{
    fontSize: 11,
    color: "var(--lp-color-text-muted)",
    textAlign: "center",
    marginTop: 8,
    transition: "opacity 0.2s"
  }}>
          Scroll for more ↓
        </div>}
    </div>;
};

export const DoubleIconLink = ({label = '', labelColor, href = '#', text = '', iconLeft = 'github', iconLeftColor, iconRight = 'arrow-up-right', iconRightColor = 'var(--lp-color-accent)', className = '', style = {}, ...rest}) => {
  return <span className={className} style={{
    whiteSpace: 'nowrap',
    display: 'inline-flex',
    alignItems: 'center',
    gap: "var(--lp-spacing-1)",
    marginLeft: '0.3rem',
    ...style
  }} {...rest}>
      {text && <span style={{
    marginRight: 8
  }}>{text}</span>}
      <Icon icon={iconLeft} color={iconLeftColor} />
      <a href={href} style={{
    color: {
      labelColor
    }
  }}>
        {label}
      </a>
      <div style={{
    marginRight: '0.3rem'
  }}>
        <Icon icon={iconRight} size={12} color={iconRightColor} />
      </div>
    </span>;
};

export const LinkArrow = ({href, label, description, newline = true, borderColor, className = '', style = {}, ...rest}) => {
  const linkArrowStyle = {
    display: 'inline-flex',
    alignItems: 'center',
    justifyContent: 'center',
    gap: "var(--lp-spacing-1)",
    width: 'fit-content',
    ...borderColor && ({
      borderColor
    })
  };
  return <span className={className} style={style} {...rest}>
      {newline && <br />}
      <span style={linkArrowStyle}>
        <a href={href} target="_blank" rel="noopener noreferrer">
          {label}
        </a>
        <Icon icon="arrow-up-right" size={14} color="var(--lp-color-accent)" />
      </span>
      {description && description}
      {description && <div style={{
    height: "var(--lp-spacing-3)"
  }} />}
    </span>;
};

export const InlineDivider = ({margin = "0.75rem 0", padding = "0", color = "var(--lp-color-border-default)", opacity = 0.4, height = "1px", className = "", style = {}, ...rest}) => <hr role="separator" className={className} style={{
  border: "none",
  margin,
  padding,
  height,
  backgroundColor: color,
  opacity,
  ...style
}} {...rest} />;

export const CustomDivider = ({color = "var(--lp-color-border-default)", middleText = "", spacing = "default", style = {}, className = "", ...rest}) => {
  const spacingPresets = {
    default: {
      margin: "24px 0"
    },
    overlap: {
      margin: "-1rem 0 -1rem 0"
    },
    tight: {
      margin: "0 0 -1rem 0"
    },
    section: {
      margin: "0 0 -2rem 0"
    },
    sectionOverlap: {
      margin: "-1rem 0 -2rem 0"
    },
    deepOverlap: {
      margin: "-1rem 0 -1.5rem 0"
    }
  };
  const spacingStyle = spacingPresets[spacing] || spacingPresets.default;
  return <div role="separator" aria-orientation="horizontal" className={className} style={{
    display: "flex",
    alignItems: "center",
    ...spacingStyle,
    fontSize: style?.fontSize || "16px",
    height: "fit-content",
    ...style
  }} {...rest}>
      <span style={{
    marginRight: "var(--lp-spacing-px-8)",
    opacity: 0.2
  }}>
        <Icon icon="/snippets/assets/logos/Livepeer-Logo-Symbol-Theme.svg" />
      </span>
      <div style={{
    flex: 1,
    height: "1px",
    background: "var(--lp-color-border-default)",
    opacity: 0.4
  }}></div>
      {middleText && <>
          <Icon icon="circle" size={2} />
          <span style={{
    margin: "0 8px",
    fontWeight: "bold",
    color: color,
    opacity: 0.7
  }}>
            {middleText}
          </span>
          <Icon icon="circle" size={2} />
        </>}
      <div style={{
    flex: 1,
    height: "1px",
    background: "var(--lp-color-border-default)",
    opacity: 0.4
  }}></div>
      <span style={{
    marginLeft: "var(--lp-spacing-px-8)",
    opacity: 0.2
  }}>
        <span style={{
    display: "inline-block",
    transform: "scaleX(-1)"
  }}>
          <Icon icon="/snippets/assets/logos/Livepeer-Logo-Symbol-Theme.svg" />
        </span>
      </span>
    </div>;
};

<Tip>
  This page is an automated workflow.
  <Subtitle variant="changelog" style={{fontSize: "0.95rem", marginTop: "0.25rem"}}>Subscribe to this changelog's <LinkArrow label="RSS Feed" href="/v2/solutions/frameworks/changelog/rss.xml" newline={false} /></Subtitle>
</Tip>

<CustomDivider style={{margin: "-0.5rem 0 -1.5rem 0"}} />

Track releases for <LinkArrow label="Frameworks" href="https://github.com/livepeer-frameworks/monorepo/releases" newline={false} /> on GitHub.

<LazyLoad height="600px">
  <Update label="v0.2.71" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.71", description: "This release fixes telemetry DNS assignment handling, managed stream HA ownership during Foghorn failover, React play..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.71

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.71

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.71" iconLeft="github" />
  </Update>

  <Update label="v0.2.70" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.70", description: "This release hardens upgrade behavior, Postgres/Yugabyte transaction retry paths, mist-native playback routing, telem..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.70

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.70

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.70" iconLeft="github" />
  </Update>

  <Update label="v0.2.69" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.69", description: "This release tightens the public infrastructure topology model, adds a `cluster finalize` recovery command for post-p..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.69

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.69

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.69" iconLeft="github" />
  </Update>

  <Update label="v0.2.68" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.68", description: "This release adds the first Mist-native managed stream pipeline: operator-owned always-on streams can now be declared..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.68

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.68

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.68" iconLeft="github" />
  </Update>

  <Update label="v0.2.67" tags={["Fixes"]} rss={{ title: "Frameworks v0.2.67", description: "This is a focused patch release for the v0.2.66 provisioning and infrastructure-scope changes. It fixes platform rele..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.67

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.67

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.67" iconLeft="github" />
  </Update>

  <Update label="v0.2.66" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.66", description: "This is a focused patch release for provisioning determinism, analytics access scoping, login verification redirects,..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.66

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.66

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.66" iconLeft="github" />
  </Update>

  <Update label="v0.2.65" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.65", description: "This release tightens the v0.2.64 durability and analytics work: edge DNS membership is now event-driven, current vie..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.65

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.65

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.65" iconLeft="github" />
  </Update>

  <Update label="v0.2.64" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.64", description: "This release hardens the accounting and event pipeline: canonical metering fact ledgers, finalized Periscope rollups,..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.64

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.64

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.64" iconLeft="github" />
  </Update>
</LazyLoad>

<LazyLoad height="600px">
  <Update label="v0.2.63" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.63", description: "This release hardens the Foghorn trust boundary, fixes edge enrollment routing, stabilizes Privateer mesh PKI repair,..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.63

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.63

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.63" iconLeft="github" />
  </Update>

  <Update label="v0.2.62" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.62", description: "This release replaces native password entry in CLI/tray clients with browser-mediated auth handoff. It adds PKCE auth..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.62

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.62

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.62" iconLeft="github" />
  </Update>

  <Update label="v0.2.61" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.61", description: "This release focuses on operator UX and observability assets: the macOS tray can discover and run CLI commands from t..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.61

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.61

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.61" iconLeft="github" />
  </Update>

  <Update label="v0.2.60" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.60", description: "This release is an observability and edge-routing hardening pass. It adds shared Prometheus primitives, Kafka consume..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.60

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.60

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.60" iconLeft="github" />
  </Update>
</LazyLoad>

<LazyLoad height="600px">
  <Update label="v0.2.59" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.59", description: "This release makes core Foghorn routing prefer the internal gRPC/TLS listener while keeping public Foghorn health che..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.59

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.59

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.59" iconLeft="github" />
  </Update>

  <Update label="v0.2.58" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.58", description: "This release fixes two routing/provisioning issues: public proxy sites now resolve aliased service deployments correc..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.58

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.58

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.58" iconLeft="github" />
  </Update>

  <Update label="v0.2.57" tags={["Features", "Fixes", "Breaking"]} rss={{ title: "Frameworks v0.2.57", description: "This release hardens edge release convergence, finishes the move from edge `/health` probes to TLS readiness checks, ..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.57

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.57

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.57" iconLeft="github" />
  </Update>

  <Update label="v0.2.56" tags={["Features", "Fixes", "Breaking"]} rss={{ title: "Frameworks v0.2.56", description: "This release tightens edge readiness checks, makes Helmsman’s MistServer config reconciliation more complete, and kee..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.56

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.56

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.56" iconLeft="github" />
  </Update>

  <Update label="v0.2.55" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.55", description: "This release fixes the provisioning/runtime fallout from the infrastructure refresh: support service images are pinne..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.55

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.55

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.55" iconLeft="github" />
  </Update>

  <Update label="v0.2.54" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.54", description: "This release adds typed cluster drift detection and apply orchestration, service desired-state fingerprints, SIGHUP-b..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.54

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.54

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.54" iconLeft="github" />
  </Update>

  <Update label="v0.2.53" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.53", description: "This release fixes Metabase/Postgres provisioning, honors per-database Postgres passwords, persists edge Caddy Config..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.53

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.53

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.53" iconLeft="github" />
  </Update>

  <Update label="v0.2.52" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.52", description: "This release adds operator-only MistServer admin sessions for edge nodes, fixes edge Caddy ConfigSeed activation, har..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.52

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.52

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.52" iconLeft="github" />
  </Update>

  <Update label="v0.2.51" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.51", description: "This release fixes edge playback provisioning around MistServer’s API vs HTTP surfaces, stops generating fake TLS sch..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.51

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.51

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.51" iconLeft="github" />
  </Update>

  <Update label="v0.2.50" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.50", description: "This release tightens gRPC TLS authority across the platform, splits Foghorn’s internal and external gRPC listeners, ..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.50

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.50

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.50" iconLeft="github" />
  </Update>
</LazyLoad>

<LazyLoad height="600px">
  <Update label="v0.2.41" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.41", description: "v0.2.41 fixes media-cluster provisioning edge cases, adds read-only media diagnostics, hardens Skipper/LLM streaming ..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.41

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.41

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.41" iconLeft="github" />
  </Update>

  <Update label="v0.2.40" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.40", description: "v0.2.40 hardens provisioning, mesh bootstrap, Skipper Bridge routing, and the release pipeline’s artifact identity mo..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.40

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.40

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.40" iconLeft="github" />
  </Update>

  <Update label="v0.2.39" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.39", description: "v0.2.39 hardens mesh bootstrap and service topology handling for multi-region clusters." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.39

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.39

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.39" iconLeft="github" />
  </Update>

  <Update label="v0.2.38" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.38", description: "v0.2.38 fixes two bootstrap issues in multi-region clusters: root TLS bundle derivation and GitOps-owned node topolog..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.38

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.38

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.38" iconLeft="github" />
  </Update>

  <Update label="v0.2.37" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.37", description: "v0.2.37 fixes service registration topology handling for regional media clusters." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.37

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.37

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.37" iconLeft="github" />
  </Update>

  <Update label="v0.2.35" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.35", description: "v0.2.35 is a provisioning hardening release for the v0.2.33/v0.2.34 rollout. If you have not upgraded yet, skip v0.2...." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.35

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.35

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.35" iconLeft="github" />
  </Update>

  <Update label="v0.2.34" tags={["Fixes"]} rss={{ title: "Frameworks v0.2.34", description: "v0.2.34 is a hotfix for v0.2.33 cluster provisioning. If you have not upgraded yet, skip v0.2.33 and roll v0.2.34 ins..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.34

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.34

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.34" iconLeft="github" />
  </Update>

  <Update label="v0.2.33" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.2.33", description: "The big one: multi-region media control plane, tenant DNS aliases with customer custom domains, signed playback polic..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.33

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.33

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.33" iconLeft="github" />
  </Update>

  <Update label="v0.2.32" tags={["Features", "Fixes", "Performance"]} rss={{ title: "Frameworks v0.2.32", description: "Welcome to the first properly formatted release note! Subsequent releases will also actually describe the changes mad..." }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.32

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    # Release v0.2.32

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.32" iconLeft="github" />
  </Update>

  <Update label="v0.2.31" tags={["Release"]} rss={{ title: "Frameworks v0.2.31", description: "Full Changelog: https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.2.30...v0.2.31" }} description={<Subtitle variant="changelog">May 2026</Subtitle>}>
    ## v0.2.31

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    **Full Changelog**: [https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.2.30...v0.2.31](https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.2.30...v0.2.31)

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.31" iconLeft="github" />
  </Update>
</LazyLoad>

<LazyLoad height="600px">
  <Update label="v0.2.0-rc3" tags={["Release"]} rss={{ title: "Frameworks v0.2.0-rc3", description: "Full Changelog: https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.2.0-rc2...v0.2.0-rc3" }} description={<Subtitle variant="changelog">March 2026</Subtitle>}>
    ## v0.2.0-rc3

    <CustomCardTitle variant="tab" icon="user-robot" title="_AI Summary_" />

    **Full Changelog**: [https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.2.0-rc2...v0.2.0-rc3](https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.2.0-rc2...v0.2.0-rc3)

    <InlineDivider margin="1rem 0" />

    <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.0-rc3" iconLeft="github" />
  </Update>
</LazyLoad>

<Update label="v0.2.0-rc2" tags={["Release"]} rss={{ title: "Frameworks v0.2.0-rc2", description: "Full Changelog: https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.2.0-rc1...v0.2.0-rc2" }} description={<Subtitle variant="changelog">March 2026</Subtitle>}>
  ## v0.2.0-rc2

  <ScrollBox maxHeight="250px" showHint={true}>
    **Full Changelog**: [https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.2.0-rc1...v0.2.0-rc2](https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.2.0-rc1...v0.2.0-rc2)
  </ScrollBox>

  <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.0-rc2" iconLeft="github" />
</Update>

<Update label="v0.2.0-rc1" tags={["Release"]} rss={{ title: "Frameworks v0.2.0-rc1", description: "Full Changelog: https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.1.0-rc5...v0.2.0-rc1" }} description={<Subtitle variant="changelog">March 2026</Subtitle>}>
  ## v0.2.0-rc1

  <ScrollBox maxHeight="250px" showHint={true}>
    **Full Changelog**: [https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.1.0-rc5...v0.2.0-rc1](https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.1.0-rc5...v0.2.0-rc1)
  </ScrollBox>

  <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.2.0-rc1" iconLeft="github" />
</Update>

<Update label="v0.1.0-rc5" tags={["Release"]} rss={{ title: "Frameworks v0.1.0-rc5", description: "Full Changelog: https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.1.0-rc4...v0.1.0-rc5" }} description={<Subtitle variant="changelog">March 2026</Subtitle>}>
  ## v0.1.0-rc5

  <ScrollBox maxHeight="250px" showHint={true}>
    **Full Changelog**: [https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.1.0-rc4...v0.1.0-rc5](https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.1.0-rc4...v0.1.0-rc5)
  </ScrollBox>

  <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.1.0-rc5" iconLeft="github" />
</Update>

<Update label="v0.1.0-rc4" tags={["Release"]} rss={{ title: "Frameworks v0.1.0-rc4", description: "Full Changelog: https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.1.0-rc3...v0.1.0-rc4" }} description={<Subtitle variant="changelog">February 2026</Subtitle>}>
  ## v0.1.0-rc4

  <ScrollBox maxHeight="250px" showHint={true}>
    **Full Changelog**: [https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.1.0-rc3...v0.1.0-rc4](https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.1.0-rc3...v0.1.0-rc4)
  </ScrollBox>

  <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.1.0-rc4" iconLeft="github" />
</Update>

<Update label="v0.1.0-rc3" tags={["Release"]} rss={{ title: "Frameworks v0.1.0-rc3", description: "Full Changelog: https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.1.0-rc2...v0.1.0-rc3" }} description={<Subtitle variant="changelog">February 2026</Subtitle>}>
  ## v0.1.0-rc3

  <ScrollBox maxHeight="250px" showHint={true}>
    **Full Changelog**: [https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.1.0-rc2...v0.1.0-rc3](https://github.com/Livepeer-FrameWorks/monorepo/compare/v0.1.0-rc2...v0.1.0-rc3)
  </ScrollBox>

  <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.1.0-rc3" iconLeft="github" />
</Update>

<Update label="v0.1.0-rc2" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.1.0-rc2", description: "* redis foghorn-ha by @stronk-dev in https://github.com/Livepeer-FrameWorks/monorepo/pull/286" }} description={<Subtitle variant="changelog">February 2026</Subtitle>}>
  ## v0.1.0-rc2

  <ScrollBox maxHeight="250px" showHint={true}>
    ## What's Changed

    * redis foghorn-ha
    * Cluster-aware DNS + per-edge A records and cluster wildcard TLS distribution (ConfigSeed TLS bundle)
    * Fix cluster DNS pool collisions and bootstrap sync type
    * Harden TLS certificate refresh convergence in control plane
    * Privateer mesh and infra convergence audit
    * Cluster context propagation invariants audit
    * Fix cross-cluster attribution across triggers, ingest, and billing rollups
    * Harden shared Foghorn cluster assignment semantics
    * Cluster bootstrap and provisioning orchestration audit
    * Harden enrollment token lifecycle against replay races
    * Harden cluster/node reconciliation and stale routing recovery
    * Harden DLQ and service-event observability (preserve event\_id/event\_type, surface tenant drops)
    * Harden mixed-version analytics compatibility for proto decoding and billing queries
    * Harden federation degraded-mode handling and normalise HTTP retry policy
    * Harden DNS reconciliation cleanup and Cloudflare idempotent retry behaviour
    * Fix hostname source-of-truth drift in edge preregistration/bootstrap
    * Privateer mesh and local resolver convergence
    * Peer discovery and lifecycle correctness
    * Harden federation PeerChannel identity checks and stale peer cache cleanup
    * Fix federation reconciliation cleanup and destination-node validation
    * Harden enrollment token tenant and cluster binding
    * Fail-open/fail-closed behaviour for control-plane dependency outages audit
    * Harden origin-pull coordination and loop prevention
    * Artifact federation correctness and metadata consistency audit
    * Multi-cluster ingest coverage and fallback semantics audit
    * Harden Send\* relay forwarding and add relay oneof wiring tests
    * Harden relay conn\_owner lifecycle and relay failure behaviour
    * Fix PushOperationalMode propagation for canonical node ownership in HA Foghorn
    * Harden BootstrapService advertise host derivation and node-cluster safety
    * Service registration lifecycle consistency
    * Service discovery consumers after address derivation changes
    * Tenant operation fan-out correctness
    * Harden federation forwarded artifact command safety checks
    * Harden cluster-aware Commodore routing and ingest cache behaviour
    * Docker-compose HA relay test completeness
    * Graceful shutdown and conn\_owner cleanup correctness
    * Relay observability and diagnosability
    * Harden mixed-version cluster routing and relay compatibility paths
    * Harden active ingest cluster freshness and clip routing fallback
    * Add frontend GraphQL codegen drift check and normalise explorer history types
    * Route type safety and ID semantics correctness
    * Align EmptyState shared prop contract and add regression coverage
    * origin\_cluster\_id correctness across artifact lifecycle
    * Fix federation geo attribution and null‑island filtering
    * Fix federation ingest completeness and optional numeric semantics
    * Fix cross-cluster attribution drift in audience analytics
    * Fix navigation route hygiene for hidden/dynamic routes and add safety tests
    * Infrastructure cluster detail data correctness
    * Harden node detail lifecycle and instance churn rendering
  </ScrollBox>

  <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.1.0-rc2" iconLeft="github" />
</Update>

<Update label="v0.1.0-rc1" tags={["Features", "Fixes"]} rss={{ title: "Frameworks v0.1.0-rc1", description: "* Bump actions/upload-artifact from 4 to 6 by @dependabot[bot] in https://github.com/Livepeer-FrameWorks/monorepo/pul..." }} description={<Subtitle variant="changelog">February 2026</Subtitle>}>
  ## v0.1.0-rc1

  <ScrollBox maxHeight="250px" showHint={true}>
    ## What's Changed

    * Bump actions/upload-artifact from 4 to 6 by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/49](https://github.com/Livepeer-FrameWorks/monorepo/pull/49)
    * Bump actions/setup-node from 4 to 6 by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/50](https://github.com/Livepeer-FrameWorks/monorepo/pull/50)
    * Bump docker/build-push-action from 5 to 6 by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/51](https://github.com/Livepeer-FrameWorks/monorepo/pull/51)
    * Bump actions/checkout from 4 to 6 by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/52](https://github.com/Livepeer-FrameWorks/monorepo/pull/52)
    * Bump the go-deps group in /pkg with 12 updates by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/53](https://github.com/Livepeer-FrameWorks/monorepo/pull/53)
    * Test harness + code coverage artifacts (vitest)
    * fix(webapp): import formatNumber in OverviewTabPanel
    * ci: add CI passed gate for branch protection
    * Bump actions/upload-artifact from 4 to 6 by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/62](https://github.com/Livepeer-FrameWorks/monorepo/pull/62)
    * Bump actions/download-artifact from 4 to 7 by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/63](https://github.com/Livepeer-FrameWorks/monorepo/pull/63)
    * Bump actions/setup-go from 5 to 6 by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/64](https://github.com/Livepeer-FrameWorks/monorepo/pull/64)
    * Bump pnpm/action-setup from 2 to 4 by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/65](https://github.com/Livepeer-FrameWorks/monorepo/pull/65)
    * Harden tenant scoping for analytics
    * Use percent-based disk headroom for DVR
    * docs: align edge CLI examples, add Makefile `build-bin-forms`, and clarify Listmonk ports
    * Harden billing usage ingestion and Periscope DLQ/duplicate-event metrics
    * billing jobs: close rows per-tenant, thread ctx/timeouts, harden rollup SQL
    * Bump the npm-deps group across 1 directory with 59 updates by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/71](https://github.com/Livepeer-FrameWorks/monorepo/pull/71)
    * Bump the go-deps group in /pkg with 6 updates by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/66](https://github.com/Livepeer-FrameWorks/monorepo/pull/66)
    * Improve ingest error propagation and session ordering
    * Fix VOD upload flow guards and error handling
    * Bump the go-tooling-deps group across 1 directory with 2 updates by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/90](https://github.com/Livepeer-FrameWorks/monorepo/pull/90)
    * Fix defrost race handling and add stale-defrost cleanup job
    * Harden x402 settlement safety
    * Handle out-of-order viewer disconnects and remove ingest disconnect cache
    * Bump the npm-deps group with 4 updates by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/91](https://github.com/Livepeer-FrameWorks/monorepo/pull/91)
    * Fix QoE stream health mappings
    * Improve routing analytics attribution (bootstrap, caching, retry)
    * Fix periscope ingest lifecycle handling
    * Normalise internal\_name handling; use vod\_hash for VOD and add filename column
    * Add node maintenance/drain modes to Foghorn
    * Fix geo edge handling in routing
    * storage/analytics: validate tenant/stream IDs, attribute snapshots, harmonize lifecycle naming, remove audit doc
    * Use fwcid/mist session IDs for exact virtual viewer correlation; remove ClickHouse migration
    * Wire TRUSTED\_PROXY\_CIDRS & GRPC\_METADATA\_POLICY; add trusted-proxy client IP handling and gRPC metadata audit; demo-mode post-auth change
    * Propagate Foghorn trailers, add multi-node artifact fallbacks, and session-aware virtual viewers
    * Fix WHIP reconnection, cleanup, and fallback rotation in StreamCrafter
    * Reject analytics without tenant\_id and guard Decklog trigger sends
    * Return typed ingest errors in Mist trigger flow, regenerate protobufs, remove vendored google protos
    * Reduce GeoIP stampedes: singleflight + cache wiring
    * fix(playback): unify /play errors and reuse resolved live data
    * Harden billing enforcement cache handling
    * Improve playback diagnostics for blacklisted protocols
    * Harden ingest normalisation and service event guards
    * Use player+protocol+URL combos for fallback and caching
    * Preserve stream source NodeID and add deferred DVR stop registry with decklog emissions
    * Fix artifact lifecycle transitions and events
    * Improve Helmsman control stream resilience
    * Align Clip/DVR lifecycle resolvers with Periscope; add isExpired and make isFrozen nullable
    * Improve cold storage state reporting and eviction failure handling
    * Make content\_type optional, document VOD, improve Commodore logging, remove plan file
    * Add explicit artifact types and sync defrost paths
    * Improve disk space guards for clips and DVR
    * Support `d` day suffix in admin duration flags and clarify retention/S3 docs
    * Fix heartbeat-based node staleness tracking
    * Use snapshot timestamps, preserve hot footprint, ignore in‑flight files, and report actual sizes
    * Fix disk metrics path handling, proto RAM units, and infra historical fallbacks
    * Clarify prepaid deduction paths, handle missing cluster IDs, and ensure idempotent usage deductions
    * Propagate Helmsman operational mode through NodeLifecycleUpdate and regenerate protos
    * Fix periscope pagination keysets
    * Gate demo mode service events across gRPC services
    * Add ClickHouse migration guidance for rolling deploys
    * Improve API usage aggregation hashing and timestamps
    * DLQ: preserve tenant/event headers and surface missing-tenant events
    * Fix prepaid balance deduction idempotency and atomic updates
    * Add service event coverage for clip/DVR/VOD and structured cluster rejection codes
    * Redact message content from realtime support events
    * Fix usage tracker retry handling for Decklog batches
    * Enforce gateway auth and API token scope checks
    * Add gRPC stream auth interceptor for Signalman
    * Harden GraphQL complexity/depth: cap page size, multiply connection cost, fragment-aware depth, and add analytics costs
    * Improve cursor stability with dedupe and collision logging
    * Scope stream context & Commodore caches by tenant
    * Fix x402 settlement behaviour, enforce cent-alignment, and add gas wallet low-balance metric
    * Harden Signalman subscription auth and tenant isolation
    * Add gRPC error sanitizer and GraphQL error presenter; sanitize auth flows
    * Enforce tenant checks for VOD relay resolution
    * Harden x402 reconciliation during RPC outages
    * Add shared prepaid threshold enforcement
    * Enforce preflight billing checks for MCP stream and VOD handlers; remove plan file
    * Fix x402 reconciliation balance handling
    * Improve MCP audit coverage
    * Serialize HD wallet index allocation and add per-tenant x402 uniqueness safeguard
    * Tighten crypto deposit validation, record on‑chain metadata, dedupe txs; remove migration
    * Improve navigator DNS/ACME resiliency
    * Handle Foghorn control-plane outages without crash loops
    * Harden bootstrap enrollment enforcement and token validation
    * Validate artifact playback content types and hashes
    * Report explicit storage lifecycle failures for sync/evict/cache and emit failed defrost events
    * Harden webhook routing and verification
    * Skip VOD symlink clip entries in artifact scan
    * Simplify Helmsman blocking trigger config
    * Prevent N+1 on lifecycle failures; use proto/demo fallbacks in clip/DVR resolvers; add PrimeNil
    * Fix DVR/VOD lifecycle failure handling
    * Harden Privateer mesh bootstrap flows (transactional tokens, expected\_ip, stable node IDs)
    * Improve DNS sync resilience and Cloudflare integration for Navigator
    * Add unit tests for analytics handler helper functions
    * Add table-driven tests for error sanitization
    * Add IP validation tests for tenant gRPC helper
    * Add webhook router allowlist tests
    * Add hash middleware test coverage
    * Format helpers: accept bps input and add tests
    * Add unit tests for webhook rate limiter
    * Use errors.Is / errors.As for robust error handling across services and CLI
    * Add ctxkeys for GraphQL metadata and x402 paid flag; replace string Gin keys
    * feat: tune node lifecycle batch defaults
    * Add unit tests for analytics ingest helpers, countries, and gateway middleware
    * Add unit tests for auth, wallet, cache, and x402; add sqlmock dependency
    * Add unit tests for playback, S3, HD wallet, validation, and billing helpers
    * Fix auth & x402 logic and add comprehensive tests (API tokens, wallet sigs, x402 mocks)
    * Add request contexts to Stripe and Mollie payment HTTP calls
    * Resolve govet shadowing in batch 1 modules
    * Fix lint violations, modernize gRPC usage, and refresh golangci baseline
    * Bump github.com/quic-go/quic-go from 0.54.0 to 0.57.0 in /api\_tenants by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/183](https://github.com/Livepeer-FrameWorks/monorepo/pull/183)
    * Bump github.com/quic-go/quic-go from 0.54.0 to 0.57.0 in /api\_mesh by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/184](https://github.com/Livepeer-FrameWorks/monorepo/pull/184)
    * Serve single-source skill files from gateway and include them in Docker builds
    * Bump github.com/quic-go/quic-go from 0.54.0 to 0.57.0 in /api\_gateway by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/185](https://github.com/Livepeer-FrameWorks/monorepo/pull/185)
    * Bump github.com/quic-go/quic-go from 0.54.0 to 0.57.0 in /api\_forms by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/186](https://github.com/Livepeer-FrameWorks/monorepo/pull/186)
    * Add context-aware DB queries and execs in balancing, handlers and health checks
    * test: add high-value unit coverage for auth, x402, middleware, analytics, and balancing
    * Bump github.com/quic-go/quic-go from 0.54.0 to 0.57.0 in /api\_firehose by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/189](https://github.com/Livepeer-FrameWorks/monorepo/pull/189)
    * Bump github.com/quic-go/quic-go from 0.54.0 to 0.57.0 in /api\_control by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/190](https://github.com/Livepeer-FrameWorks/monorepo/pull/190)
    * Bump github.com/quic-go/quic-go from 0.54.0 to 0.57.0 in /api\_balancing by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/191](https://github.com/Livepeer-FrameWorks/monorepo/pull/191)
    * Bump github.com/quic-go/quic-go from 0.54.0 to 0.57.0 in /api\_analytics\_ingest by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/192](https://github.com/Livepeer-FrameWorks/monorepo/pull/192)
    * Bump github.com/quic-go/quic-go from 0.54.0 to 0.57.0 in /api\_dns by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/193](https://github.com/Livepeer-FrameWorks/monorepo/pull/193)
    * Bump github.com/quic-go/quic-go from 0.54.0 to 0.57.0 in /api\_billing by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/194](https://github.com/Livepeer-FrameWorks/monorepo/pull/194)
    * Bump github.com/quic-go/quic-go from 0.54.0 to 0.57.0 in /api\_analytics\_query by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/195](https://github.com/Livepeer-FrameWorks/monorepo/pull/195)
    * Bump github.com/quic-go/quic-go from 0.54.0 to 0.57.0 in /pkg by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/201](https://github.com/Livepeer-FrameWorks/monorepo/pull/201)
    * docs: align mcp-consultant RFC phase framing
    * AI video consultant phase 2 & 3 (MCP, docs, webapp, RAG, LLM, web-search)
    * Implement referral attribution capture and network-usage reporting
    * Harden Skipper auth cookies and payload sanitization
    * Harden crawler renderer, add SSRF-safe URL validation and HEAD metadata
    * Harden Skipper chat auth and prompt handling
    * Hide unavailable Skipper tools, add docs-mode tool filtering, and make metering persistence retryable
    * Codex-generated pull request
    * Sanitize attribution URLs and forward registration attribution to Quartermaster
    * Improve upgrade rollback safety and provisioner idempotency
    * Improve SSH pool health checks and TOFU locking
    * Codex-generated pull request
    * Improve GitOps manifest cache robustness
    * test(balancing): expand virtual viewer & stream-state tests for USER\_NEW/USER\_END ordering
    * Edge preflight: disk-space guardrails, Postgres DB readiness & Caddy public checks
    * Improve orchestrator dependency diagnostics and Kafka/Zookeeper validation
    * Codex-generated pull request
    * Improve periscope-query aggregation and failure handling
    * test(api\_gateway): expand resolver tests for payload redaction, malformed JSON and error propagation
    * Codex-generated pull request
    * periscope-ingest: log handler errors to ingest\_errors, validate viewer connect/disconnect payloads, and add tests
    * Improve DLQ payload tenant metadata and add unit tests
    * Codex-generated pull request
    * Harden periscope-ingest Kafka commit semantics and ClickHouse batch handling
    * Prevent draft updates after finalised invoice and add Purser invoice tests
    * Add Foghorn playback fallback tests and guard HOST template resolution
    * test(gateway): expand tests for rate limits, request lifecycle, IP trust, introspection and cursors
    * Codex-generated pull request
    * Add balancer routing edge-case tests and saturating bandwidth penalty
    * Add decklog routing tests for api\_firehose
    * api\_firehose: add Decklog ingest tests and nil-trigger guard
    * Add api\_dns DNS lifecycle/store tests and disable retries for non-idempotent CloudFlare requests
    * api\_dns: add ACME issuance/renewal tests and make ACME/DNS/worker deps injectable
    * Improve navigator DNS sync test coverage and Cloudflare retry safety
    * Codex-generated pull request
    * api\_sidecar: add failure-handling tests, injectable disk-space check, and health evaluator
    * Add control stream lifecycle tests for api\_sidecar
    * Expand RAG/crawl safety tests and make knowledge search resilient to per-tenant failures
    * tests(api\_consultant): add MCP reconnect, docs-mode tool guard, and usage/billing tests
    * test(api\_consultant): expand chat lifecycle coverage
    * api\_mesh: add enrollment lifecycle tests and make agent dependencies injectable
    * api\_mesh: validate WireGuard config & DNS updates, add sync/rollback tests
    * Add mesh agent sync robustness tests and small testable interfaces
    * signalman: add gRPC lifecycle tests and harden Client sendLoop
    * api\_realtime: add Signalman routing tests and dedupe subscriptions
    * api\_forms: add validation tests, idempotent-safe subscribe flow, and Listmonk API error handling
    * Improve Listmonk subscribe resilience and add integration tests
    * Codex-generated pull request
    * api\_realtime: add Signalman failure-mode tests and tenant safeguards
    * Add unit tests for core player modules (BasePlayer, EventEmitter, MetaTrackManager, TelemetryReporter, PlayerRegistry, FrameWorksPlayer, utils)
    * Thread contexts and use context-aware DB APIs in billing + crypto; fix govet shadowing in ticketing gRPC
    * Add x402 settlement edge-case tests and update testing plan
    * tests: expand api\_gateway middleware coverage (auth, x402, ratelimit, public-or-jwt)
    * test(api\_billing): expand billing handler test coverage (checkout, webhooks, crypto, x402)
    * Add tests for stream state parsing, bandwidth logic, and tenant cache invalidation
    * Codex-generated pull request
    * test: expand balancing trigger and x402 helper coverage
    * Bump github.com/failsafe-go/failsafe-go from 0.9.5 to 0.9.6 in /pkg in the go-deps group by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/277](https://github.com/Livepeer-FrameWorks/monorepo/pull/277)
    * Bump the player-deps group in /npm\_player with 3 updates by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/278](https://github.com/Livepeer-FrameWorks/monorepo/pull/278)
    * Bump the go-service-deps group across 5 directories with 11 updates by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/279](https://github.com/Livepeer-FrameWorks/monorepo/pull/279)
    * Add Cloudflare DNS error-path tests
    * Add unit tests for sidecar handler helpers and storage utilities
    * Honour splitRatio in layouts and tighten renderer filter tests
    * Bump axios from 1.13.4 to 1.13.5 by @dependabot\[bot] in [https://github.com/Livepeer-FrameWorks/monorepo/pull/284](https://github.com/Livepeer-FrameWorks/monorepo/pull/284)

    ## New Contributors

    * @stronk-dev-bot made their first contribution in [https://github.com/Livepeer-FrameWorks/monorepo/pull/60](https://github.com/Livepeer-FrameWorks/monorepo/pull/60)
  </ScrollBox>

  <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.1.0-rc1" iconLeft="github" />
</Update>

<Update label="v0.0.0-rc1" tags={["Release"]} rss={{ title: "Frameworks v0.0.0-rc1", description: "Full Changelog: https://github.com/Livepeer-FrameWorks/monorepo/commits/v0.0.0-rc1" }} description={<Subtitle variant="changelog">November 2025</Subtitle>}>
  ## v0.0.0-rc1

  <ScrollBox maxHeight="250px" showHint={true}>
    **Full Changelog**: [https://github.com/Livepeer-FrameWorks/monorepo/commits/v0.0.0-rc1](https://github.com/Livepeer-FrameWorks/monorepo/commits/v0.0.0-rc1)
  </ScrollBox>

  <DoubleIconLink label="View release on GitHub" href="https://github.com/Livepeer-FrameWorks/monorepo/releases/tag/v0.0.0-rc1" iconLeft="github" />
</Update>
