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

# July 2025

export const MintTable = ({columns = [], rows = [], columnWidths = []}) => {
  const pushTextWithLineBreaks = (parts, text, keyBase) => {
    const segments = String(text).split(/\\n|\n/);
    segments.forEach((segment, idx) => {
      if (segment) {
        parts.push(<span key={`${keyBase}-text-${idx}`}>{segment}</span>);
      }
      if (idx < segments.length - 1) {
        parts.push(<br key={`${keyBase}-br-${idx}`} />);
      }
    });
  };
  const parseMarkdown = text => {
    if (text === null || text === undefined) return "";
    const str = String(text);
    const parts = [];
    let lastIndex = 0;
    const pattern = /(`[^`]+`|\*\*[^*]+\*\*|\*[^*]+\*|\[([^\]]+)\]\(([^)]+)\))/g;
    let match;
    while (true) {
      match = pattern.exec(str);
      if (match === null) {
        break;
      }
      if (match.index > lastIndex) {
        pushTextWithLineBreaks(parts, str.substring(lastIndex, match.index), `before-${lastIndex}`);
      }
      const fullMatch = match[0];
      if (fullMatch.startsWith("`") && fullMatch.endsWith("`")) {
        parts.push(<code key={match.index}>{fullMatch.slice(1, -1)}</code>);
      } else if (fullMatch.startsWith("**") && fullMatch.endsWith("**")) {
        parts.push(<strong key={match.index}>{fullMatch.slice(2, -2)}</strong>);
      } else if (fullMatch.startsWith("*") && fullMatch.endsWith("*")) {
        parts.push(<em key={match.index}>{fullMatch.slice(1, -1)}</em>);
      } else if (fullMatch.startsWith("[")) {
        const linkText = match[2];
        const linkUrl = match[3];
        parts.push(<a key={match.index} href={linkUrl} className="text-black-600 dark:text-black-400">
            {linkText}
          </a>);
      }
      lastIndex = pattern.lastIndex;
    }
    if (lastIndex < str.length) {
      pushTextWithLineBreaks(parts, str.substring(lastIndex), `tail-${lastIndex}`);
    }
    if (parts.length > 0) {
      return parts;
    }
    const plainParts = [];
    pushTextWithLineBreaks(plainParts, str, "plain");
    return plainParts.length ? plainParts : str;
  };
  const safeColumns = Array.isArray(columns) ? columns : [];
  const safeRows = Array.isArray(rows) ? rows : [];
  const safeColumnWidths = Array.isArray(columnWidths) ? columnWidths : [];
  const hasColumnWidths = safeColumnWidths.some(w => w !== null && w !== undefined && w !== "");
  const toCssWidth = width => typeof width === "number" ? `${width}px` : String(width);
  const getColumnStyle = idx => {
    const rawWidth = safeColumnWidths[idx];
    if (rawWidth === null || rawWidth === undefined || rawWidth === "") {
      return undefined;
    }
    const width = toCssWidth(rawWidth);
    return {
      width,
      minWidth: width
    };
  };
  const containerStyle = hasColumnWidths ? undefined : {
    overflowX: "auto"
  };
  const tableStyle = hasColumnWidths ? {
    tableLayout: "fixed",
    width: "100%"
  } : {
    width: "max-content",
    minWidth: "100%"
  };
  if (!Array.isArray(columns) || !Array.isArray(rows) || !Array.isArray(columnWidths)) {
    console.warn("MintTable received invalid props:", {
      columns,
      rows,
      columnWidths
    });
  }
  if (!safeColumns.length && !safeRows.length) {
    return null;
  }
  return <div className="mint-table-container" style={containerStyle}>
      <table style={tableStyle}>
        {hasColumnWidths && <colgroup>
            {safeColumns.map((_, idx) => {
    const style = getColumnStyle(idx);
    return <col key={idx} style={style} />;
  })}
          </colgroup>}
        <thead>
          <tr>
            {safeColumns.map((col, idx) => <th key={idx} className="text-left" style={getColumnStyle(idx)}>
                <b>{parseMarkdown(col)}</b>
              </th>)}
          </tr>
        </thead>
        <tbody>
          {safeRows.map((row, rIdx) => {
    const safeRow = Array.isArray(row) ? row : [];
    return <tr key={rIdx}>
                {safeRow.map((cell, cIdx) => <td key={cIdx} style={getColumnStyle(cIdx)}>
                    {parseMarkdown(cell)}
                  </td>)}
              </tr>;
  })}
        </tbody>
      </table>
    </div>;
};

export const SiftIcon = ({className}) => <span className={`inline-flex items-center align-middle text-black dark:text-white ${className || ''}`}>
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Artwork" x="0px" y="0px" viewBox="0 0 1005.58 733.96" style={{
  enableBackground: "new 0 0 1005.58 733.96",
  width: "2em",
  height: "2em"
}} xmlSpace="preserve">
      <path fill="currentColor" d="M552.16,150.89c-165.6,0-180.29,160.61-300.62,192.32v2.67h601.24v-2.67C747.74,324.18,717.72,150.89,552.16,150.89z   M453.46,583.08c165.6,0,180.29-160.61,300.62-192.32v-2.67H152.84v2.67C257.88,409.78,287.91,583.08,453.46,583.08z" />
    </svg>
  </span>;

## <Icon icon="o" /> Overview

This month's release notes introduce foundational upgrades across the Sift workspace. Explore 2 (Beta) is now live, delivering a rebuilt exploration experience with sharper visuals, faster performance, and more flexible workflows. We've also rolled out protective rate limiting for high-volume data access and brought back flexible Channel search for faster navigation. Together, these updates give teams deeper visibility, more reliable performance, and a smoother path from raw data to answers.

## <Icon icon="sparkles" /> <span className="new">New</span>: Explore v2 (Beta)

* <Icon icon="o" /> **Overview**: Explore v2 (Beta) is a full rebuild of Sift's Explore workspace for telemetry analysis, designed for speed, precision, and control. Now available in Beta, this update enhances several aspects of the exploration workflow to help teams move faster, compare signals more effectively, and uncover root causes with less friction. It introduces capabilities such as multi-chart layouts, cross-source plotting, smarter Channel selection, advanced styling, and X+Y zoom, along with performance improvements including nanosecond resolution and significantly faster rendering, especially on Linux. The redesign is grounded in direct input from teams working with high-frequency, mission-critical data.
  * To learn more, see Explore v2 (Beta)'s [Tutorial](../tutorials/analyze/explore/tutorial-1).
* <Icon icon="unlock" /> **Unlocked**: Explore v2 (Beta) gives teams greater control and clarity when working with high-frequency telemetry. Whether you're troubleshooting a system fault, comparing behavior across Assets, or surfacing trends across large datasets, the new workspace is built to accelerate that process. The result: faster root cause analysis, clearer comparisons, and less time spent wrangling data.

<Frame>
  <img src="https://mintcdn.com/sift/AVPAwC92-E5RJWuy/images/content/release-notes/july-25/explore-2-beta.gif?s=99e818978175140460706767bdca4497" alt="Explore 2 (Beta)" width="2188" height="1080" data-path="images/content/release-notes/july-25/explore-2-beta.gif" />
</Frame>

## <Icon icon="sparkles" /> <span className="new">New</span>: GetData rate limiting

* <Icon icon="o" /> **Overview**: Sift now includes rate limiting for GetData requests across many of our interfaces, including the API, Grafana plugin, and Explore v1.
  This change is designed to protect system stability without disrupting normal usage, especially for users running automated or large-scale queries.
* <Icon icon="unlock" /> **Unlocked**: This feature introduces a protective layer that limits excessively parallel queries or long-running scripts that could affect performance for others.
  The rate limiter is configured with generous thresholds based on real usage data and has been running in dry-run mode for validation.
  Importantly, this does not apply to Explore v2 (Beta), which uses a separate data path.
  Teams relying on GetData via these interfaces should expect no impact under normal usage but will benefit from improved overall reliability.

## <Icon icon="clock-rotate-left" /> <span className="restored">Restored</span>: Keyword search in the Channel selector

* <Icon icon="o" /> **Overview**: Explore's Channel selector now supports keyword search using multiple partial terms. This restores a popular search behavior previously referred to as "fuzzy Channel search" by users. You can now locate Channels more efficiently, even when you don't remember the exact name or formatting.
* <Icon icon="unlock" /> **Unlocked**: You can search using multiple space-separated keywords, and each will be matched independently within the Channel name, regardless of order. For example, typing `max_ground temp` will successfully match `max_ground_temp(C)`. This improves discoverability for long or inconsistently named Channels and streamlines navigation across large datasets.

<Frame>
  <img src="https://mintcdn.com/sift/AVPAwC92-E5RJWuy/images/content/release-notes/july-25/search.gif?s=31b4333be97605bbc637268e3fbac7fa" alt="Search" width="2568" height="1080" data-path="images/content/release-notes/july-25/search.gif" />
</Frame>

## <Icon icon="megaphone" /> Announcements

* **Manifesto**: Ever wonder why Sift was created? It wasn't to build more software; it was to fix the fragile infrastructure that slows down the teams building our most complex machines. We've published a manifesto that lays out what we're building and why it matters. [Download manifesto](https://www.siftstack.com/manifesto).
* **Webinar recording**: Traceability isn't just a compliance checkbox anymore; it's now mission-critical infrastructure. In our latest webinar, we break down how leading aerospace and defense teams are unifying hardware genealogy across build, test, and operations to move faster and reduce risk. Whether you missed the live session or want to revisit key insights, the full recording is now available [here](https://www.siftstack.com/mission-critical/payload-webinar).

## <Icon icon="blog" /> Recent blogs

<Card
  className="shadow-none md:col-span-2"
  title={
    <a href="https://www.siftstack.com/mission-critical/telemetry-single-source-of-truth" className="inline-flex items-center justify-center font-light text-brand-500 no-underline hover:underline hover:underline-offset-2 hover:decoration-brand-500">
    How Sift transforms hardware telemetry chaos into a trusted foundation for analysis
    </a>
}
>
  “Sift gives engineering teams a single foundation to work with hardware telemetry by delivering a \[Single Source of Truth (SSOT)] and a \[Single Pane of Glass (SPOG)].”
</Card>
