Skip to content

fix(app): open the full nav over the page on compact viewports - #3574

Merged
kodiakhq[bot] merged 4 commits into
mainfrom
elizabet/mobile-nav-overlay
Nov 5, 2026
Merged

kodiakhq[bot] merged 4 commits into
mainfrom
elizabet/mobile-nav-overlay

Conversation

@elizabetdev

@elizabetdev elizabetdev commented Nov 5, 2026 •

Copy link
Copy Markdown
Member

Summary

Below 900px the sidebar is forced into its 50px icon rail (useCompactViewport() || isPreferCollapsed). The header toggle only flipped the saved isNavCollapsed preference, which the compact layout ignores. On a phone the button did nothing, and the rail has no labels, so there was no way to reach the full nav.

This PR makes the toggle open the full nav (250px) as an overlay over the page:

  • The page keeps reserving the rail width, so opening the nav does not shift content. The overlay reserves exactly the rail width, with no extra pixel.
  • A dimmed scrim covers the rest of the page. Tapping it closes the nav.
  • Body scroll is locked while the overlay is open, so the page does not drift under the scrim on touch.
  • The nav closes on route change and on Escape. Escape pressed inside a text field, menu, or dialog opened from the nav does not close it.
  • Focus is trapped inside the open nav and returns to the toggle when it closes.
  • The button reports aria-expanded.
  • The saved desktop collapse preference is unchanged. Toggling on a phone does not affect the desktop layout, and a toggle made while the viewport is wide cannot latch the overlay open.

The overlay sits at the top-level drawer z-index (10), with the scrim one layer below.

The collapsed rail and the wordmark also use the ClickStack hexagon-and-bolt symbol from Figma (node 93:6056), and the favicon set is regenerated from the same symbol. This is a separate commit, so it can move to its own PR if reviewers prefer.

Commits

  1. 29cd716 the nav overlay
  2. aa670cd address compact nav overlay review feedback: focus trap and focus return, scroll lock, Escape scoping, no-latch toggle, named width constants, a 1px ghost fix, a corrected z-index comment, and three hook tests
  3. 33c980e use the ClickStack hexagon and bolt mark in the logo, collapsed rail, and favicon

Screenshots or video

Not captured. The change was verified with unit tests, tsc, ESLint, and stylelint only. Please fill in the table from a compact-width viewport (under 900px) with the sidebar collapsed and then open. For the mark, add one before/after pair on main and this branch in both light and dark mode.

Before After

How to reproduce

Starting point: yarn app:dev:local connected to the demo server (onboarding → "Connect to Demo Server"), or play.hyperdx.io at a narrow window width.

On main:

  1. Resize the browser to under 900px wide.
  2. Click the button titled "Collapse/expand navigation" in the sidebar header.
  3. Nothing changes. The sidebar stays a 50px icon rail.

On this branch:

  1. Resize the browser to under 900px wide.
  2. Click "Collapse/expand navigation".
  3. The full sidebar opens over the page with labels and favorites. The page content does not move.
  4. Scroll the page behind the scrim. It does not move.
  5. Press Tab. Focus stays inside the sidebar.
  6. Tap the dimmed area to the right. The sidebar closes, and focus returns to the toggle.
  7. Open it again and click "Chart explorer". The sidebar closes and the chart page loads.
  8. Open it again and press Escape. The sidebar closes.

How to test on Vercel preview

Preview routes: /search

Steps:

  1. Set the viewport width to 390 pixels.
  2. Click the button labeled "Collapse/expand navigation".
  3. Verify the sidebar shows the link labeled "Chart explorer" and the text "Saved searches".
  4. Verify the page behind the scrim does not scroll.
  5. Click the button labeled "Close navigation".
  6. Verify the sidebar is a narrow icon rail and the "Chart explorer" text is not visible.
  7. Verify the collapsed rail shows the hexagon mark, and that the expanded header shows the wordmark with the same mark, in light and dark mode.

Tests

  • useMobileNavOverlay: 8 tests covering toggle, compact gating, Escape, Escape from a text field, route change, scroll lock, no reopen after the window shrinks, and a toggle made while wide.
  • Existing AppNav, CompactViewport, brand, and AppNavUserMenu tests pass (63). tsc, ESLint, and stylelint are clean.
  • Not covered: a component-level test of the AppNav toggle wiring (the branch to toggleMobileNav on compact viewports, and the scrim close). The review flagged this. It is not in this PR yet.

Changesets

  • compact-nav-overlay: patch for @hyperdx/app
  • clickstack-hexagon-mark: patch for @hyperdx/app

References

  • Linear Issue:

Below 900px the sidebar is forced into the 50px icon rail, so the toggle
button changed a saved preference that the compact layout ignores. It now
opens the full nav as an overlay. The rail width stays reserved so the page
does not shift, and the saved desktop collapse preference is left alone.

Co-authored-by: Cursor <cursoragent@cursor.com>
@elizabetdev
elizabetdev requested a review from a team as a code owner November 5, 2026 18:38
@changeset-bot

changeset-bot Bot commented Nov 5, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 33c980e

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 3 packages
Name Type
@hyperdx/app Patch
@hyperdx/api Patch
@hyperdx/otel-collector Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions github-actions Bot added the review/tier-2 Low risk — AI review + quick human skim label Nov 5, 2026
@github-actions

github-actions Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

🟡 Tier 3 — Standard

Introduces new logic, modifies core functionality, or touches areas with non-trivial risk.

Why this tier:

  • Diff size: 280 production lines changed (Tier 2 max: < 250)

Review process: Full human review — logic, architecture, edge cases.
SLA: First-pass feedback within 1 business day.

Stats
  • Production files changed: 5
  • Production lines changed: 280 (+ 93 in test files, excluded from tier calculation)
  • Branch: elizabet/mobile-nav-overlay
  • Author: elizabetdev

To override this classification, remove the review/tier-3 label and apply a different review/tier-* label. Manual overrides are preserved on subsequent pushes.

@vercel

vercel Bot commented Nov 5, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
hyperdx-oss Ready Ready Preview Nov 5, 2026 7:37pm UTC
hyperdx-storybook Ready Ready Preview Nov 5, 2026 7:37pm UTC

Request Review

@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

Duplicate code analysis

No new duplicate code introduced by this PR.


jscpd compared this branch against origin/main
across app, api and common-utils. Only new clones are listed; the codebase
currently holds 110 in total (1.22%).
Run yarn dupes locally to reproduce, or yarn dupes:all for the full picture.

style={{
width: navWidth + 1,
minWidth: navWidth + 1,
width: reservedWidth + 1,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 minor — Opening the overlay moves page content 1px to the right, though the PR says the content stays put

The in-flow rail takes exactly 50px, because globals.css:12 sets * { box-sizing: border-box } and the 1px border is drawn inside that width. The ghost that replaces it is reservedWidth + 1 = 51px, so the content shifts by 1px every time the nav opens or closes. When the ghost is only there for the overlay (isMobileNavOpen && !fixed), size it to reservedWidth with no +1.

Advisory. Fix if it is a small defect in code this PR changes; otherwise reply in the thread. Do not widen the PR or touch files it did not already change. How to respond

}}
></div>
)}
{isMobileNavOpen && (

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 minor — The overlay acts like a modal drawer but does not manage focus

Opening the nav leaves focus on the toggle, and Tab moves past the nav into page controls hidden behind the scrim. Closing it with Escape or the scrim does not return focus anywhere. Trap focus inside the nav while it is open, for example with Mantine FocusTrap / useFocusTrap on the nav container, and return focus to the toggle on close. Mantine Drawer already provides the overlay, Escape handling and focus return.

Advisory. Fix if it is a small defect in code this PR changes; otherwise reply in the thread. Do not widen the PR or touch files it did not already change. How to respond

position: fixed;
}

// Top-level drawers use z-index 10 (see PageHeader.module.scss).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 minor — The new comment points to PageHeader.module.scss for drawers at z-index 10, but that file sets z-index 2

PageHeader.module.scss:22 sets z-index 2 and only describes drawers as contextZIndex + 10 from ZIndexContext, e.g. DBRowSidePanel. Point the comment at ZIndexContext/DBRowSidePanel instead, or reference a shared constant rather than hardcoding 10 and 9 here.

Advisory. Fix if it is a small defect in code this PR changes; otherwise reply in the thread. Do not widen the PR or touch files it did not already change. How to respond

@github-actions

github-actions Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

PR Review

If you are a coding agent acting for the author, read this first.
Nothing below blocks merge automatically; a maintainer decides. What they will expect:

  • 🔴 critical or 🟠 major in code this PR adds or changes: fix before asking for review.
  • 🔵 minor in code this PR changes: your call. Fix if small, otherwise reply.
  • Anything about surrounding code, or asking you to widen the change (hoist a helper,
    dedupe with another file, fix other call sites): never fix here, whatever the
    severity. Reply with one sentence; if it is critical, say so plainly so a human sees it.

One commit per review round. After two rounds, stop and ask a maintainer to review
scope rather than addressing more automated findings. Full rule: AGENTS.md.

3 finding(s): 🔴 0 critical · 🟠 1 major · 🔵 2 minor

1 posted as inline comment(s) on the changed lines. 2 listed below.

Findings outside the changed lines

2 minor
  • 🔵 packages/app/src/brand/Logomark.tsx:132 — The bolt is painted with --color-bg-body instead of being cut out, so it shows as a wrong-colored patch on any other background → The bolt is a filled shape in var(--color-bg-body), so the mark only looks right on the body background. Logomark is also used as the leftSection of the Cloud action in the Spotlight (Spotlights.tsx:27,199). There the modal surface and the hovered or selected row are not --color-bg-body, so the bolt shows up as a body-colored blob. Fix: merge the hexagon and bolt into one <path fill="currentColor" fillRule="evenodd">, or use a <mask>, so the bolt is transparent on every surface. Make the same change in Wordmark.tsx.
  • 🔵 packages/app/src/brand/Wordmark.tsx:190 — The hexagon and bolt path data is copied by hand into Logomark and Wordmark → The two long d strings in Wordmark.tsx are identical copies of the ones in Logomark.tsx (and favicon.svg). Any later change to the mark has to be made in every copy. Export the paths, or a <LogomarkPaths /> fragment, from Logomark.tsx, and render it inside Wordmark's nested <svg>.

Severity is the reviewer's own estimate and is used for ordering, not filtering. No finding blocks merge automatically; a maintainer decides.

@github-actions

github-actions Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

Deep Review

✅ No critical issues found. No P0/P1: the change introduces no data loss, auth, injection, or guaranteed happy-path crash. The prior human concern (body shift on close, @brandon-pereira) was verified addressed in code. The items below are recommended hardening and nits.

🟡 P2 — recommended

  • packages/app/src/components/AppNav/useMobileNavOverlay.ts:36 — the overlay's raw document.body.style.overflow save/restore does not compose with Mantine's modal scroll-lock, so closing the overlay (via resize or route change) while a nav-opened modal is still mounted restores the stale value and can leave the body overflow: hidden until reload.
    • Fix: Use a ref-counted or shared scroll-lock such as Mantine's RemoveScroll instead of snapshotting and writing document.body.style.overflow directly.
    • correctness, julik-frontend-races, adversarial
  • packages/app/src/components/AppNav/AppNav.tsx:443 — the new compact-overlay wiring (the isCompact ? toggleMobileNav() : setIsPreferCollapsed() branch, scrim close, focus return, and the ghostWidth no-shift math) has no component-level test, so the behavior this PR fixes can silently regress.
    • Fix: Add an AppNav render test that mocks useCompactViewport and asserts the overlay opens on toggle when compact, the scrim closes it, and the ghost width equals the reserved rail width while open.
    • testing, correctness, kieran-typescript
🔵 P3 nitpicks (5)
  • packages/app/src/components/AppNav/AppNav.tsx:202 — focus is returned to the collapse toggle on every overlay close, including non-keyboard closes (scrim tap, route change, and compact→desktop resize), which can steal focus from the destination page or force a focus ring after a pointer tap.
    • Fix: Restore focus to the toggle only when the close was keyboard-initiated (Escape), not on scrim, route-change, or resize closes.
    • correctness, kieran-typescript, julik-frontend-races, adversarial
  • packages/app/src/components/AppNav/AppNav.module.scss:56 — .navScrim hardcodes rgb(0 0 0 / 40%) where the repo defines a semantic --color-backdrop token with the same value for overlay backdrops.
    • Fix: Set background: var(--color-backdrop); on .navScrim.
    • project-standards
  • packages/app/src/brand/Wordmark.tsx:20 — the hexagon-and-bolt mark is duplicated verbatim as inline <path> strings in both Wordmark.tsx and Logomark.tsx, so a future mark change must be edited in every copy.
    • Fix: Render the shared Logomark (or a shared path constant) inside Wordmark so the symbol lives in one place.
    • maintainability
  • packages/app/src/components/AppNav/AppNav.tsx:198 — opening a Mantine modal from inside the open overlay leaves the nav useFocusTrap active alongside the modal's own focus trap, so keyboard focus can be contested between the two disjoint subtrees.
    • Fix: Disable the nav focus trap while a child modal is open, or render those modals outside the overlay's trap scope.
    • adversarial
  • packages/app/src/components/AppNav/AppNav.module.scss:70 — the overlay's hardcoded z-index: 10 can sit below a top-level drawer that uses contextZIndex + 10, so opening the nav on a compact viewport while such a drawer is open renders the nav behind it under the scrim.
    • Fix: Coordinate the overlay z-index with ZIndexContext so it stacks above concurrently-open drawers.
    • adversarial

Pre-existing (not introduced by this PR, excluded from verdict): AppNav.tsx is ~620 lines, over the documented 300-line component limit; the overlay logic was correctly extracted into useMobileNavOverlay.ts, but a future component split is still warranted.

Brand-mark note (latent, renders correctly today): the bolt uses fill: var(--color-bg-body) as a see-through cutout while the sidenav is var(--color-bg-sidenav); both resolve to the same token today, so it is correct, but it will break if the mark is placed on a non-body-colored surface or those tokens diverge.


Reviewers (10): correctness, testing, maintainability, project-standards, agent-native, learnings, kieran-typescript, julik-frontend-races, adversarial, previous-comments.

Testing gaps:

  • The useMobileNavOverlay hook is well-covered; all gaps are in AppNav.tsx, which has no component test (toggle branch, scrim close, focus return, aria-expanded, data-autofocus, ghostWidth no-shift math).
  • No test stacks a Mantine modal on the open overlay and then resizes/navigates to assert document.body.style.overflow is restored (the scroll-lock composition leak).
  • shouldCloseOnEscape is tested only for the text-field branch; the [role=dialog|menu|listbox], contentEditable, and defaultPrevented branches are unexercised.
  • The no-shift-on-close fix was verified only in headless Chromium against compiled CSS, with no automated regression guard.

No finding blocks merge automatically. A maintainer will expect P0/P1 findings in code this PR changes to be fixed; P2/P3 are your call -- fix or reply. Never fix findings about surrounding code here; reply instead. Do not widen the PR. How to respond

@github-actions

github-actions Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

E2E Test Results

✅ All tests passed • 463 passed • 1 skipped • 1652s

Status Count
✅ Passed 463
❌ Failed 0
⚠️ Flaky 1
⏭️ Skipped 1

Tests ran across 4 shards in parallel.

View full report →

@brandon-pereira

Copy link
Copy Markdown
Member

@elizabetdev LGTM except one weird thing I see is when you close the flyout the whole body moves a bit like its animating the nav expansion state

elizabetdev and others added 2 commits November 5, 2026 19:23
Keep the rail width reserved without the extra pixel when the overlay
opens, so the page does not shift. Lock body scroll while the overlay is
open. Ignore Escape from text fields and menus opened from the nav.
Trap focus in the open overlay and return it to the toggle on close.
Ignore a toggle while the viewport is wide so it cannot latch open.
Name the rail and full-nav widths and correct the z-index comment.

Co-authored-by: Cursor <cursoragent@cursor.com>
Replace the bar mark in the logomark and wordmark with the hexagon and
bolt symbol from the ClickStack Figma icon. The bolt uses the page
background so it reads on both color modes. Regenerate the favicon set
from the same symbol.

Co-authored-by: Cursor <cursoragent@cursor.com>
@elizabetdev

Copy link
Copy Markdown
Member Author

Addressed in aa670cd (review fixes) and 33c980e (mark):

  • Ghost 1px shift: overlay ghost is now exactly the rail width.
  • Focus trap and focus return: `useFocusTrap` on the nav, focus goes back to the toggle on close.
  • Scroll lock: body overflow is hidden while the overlay is open and restored on close.
  • Escape scoping: ignored when the event comes from a text field, menu, listbox, or dialog, or was already handled.
  • Toggle latch: toggle is a no-op unless compact.
  • Constants and z-index comment: `RAIL_WIDTH` and `FULL_NAV_WIDTH`, and the comment now points at `ZIndexContext` and `DBRowSidePanel`.
  • Tests: three hook tests added (scroll lock, Escape from a text field, wide-viewport toggle).
  • Changeset: added (`compact-nav-overlay`, plus `clickstack-hexagon-mark`).

Not done: a component-level AppNav test for the toggle wiring. It needs a lot of mocks for the nav's data hooks. The PR description lists it as a gap.

if (!isOpen) return;
const previousOverflow = document.body.style.overflow;
// The scrim covers the page but does not catch wheel or touch scrolling.
document.body.style.overflow = 'hidden';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 minor — The scroll lock sets overflow: hidden on document.body, but the page doesn't scroll on the body

Pages inside the nav scroll in #app-content-scroll-container (packages/app/src/layout.tsx:86-97, APP_CONTENT_SCROLL_CONTAINER_ID), and its parent is already overflow: hidden. Setting document.body.style.overflow therefore has no effect. The comment on line 37 and the test 'locks body scroll while open' only check a style on an element that never scrolls. Either remove the lock and the test, or lock the real scroll container (or set overscroll-behavior: contain on the scrim) and test that element.

Advisory. Fix if it is a small defect in code this PR changes; otherwise reply in the thread. Do not widen the PR or touch files it did not already change. How to respond

Closing the overlay drops the nav back into the flow. Its width transition
started from the overlay width, so the content jumped to 250px and slid
back to 50px. Skip the width transition while the compact rail is closed.
Opening keeps its slide-in.

Co-authored-by: Cursor <cursoragent@cursor.com>
@elizabetdev

Copy link
Copy Markdown
Member Author

@brandon-pereira thanks for catching this. The body moved on close because the nav drops back into the flow at the rail width, and its width transition started from the overlay width. The content jumped to 250px and slid back to 50px.

Fixed in b0b11bb. The width transition is now skipped while the compact rail is closed, so closing snaps. Opening still animates.

I checked this in headless Chromium against the compiled nav CSS: the content stays at 50px through open and close, and the nav still animates from 50px to 250px on open. I have not checked it in a running app.

&Overlay {
top: 0;
left: 0;
z-index: 10;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 major — The nav overlay shares z-index 10 with the row side panel, so the open side panel covers most of the nav

DBRowSidePanel (packages/app/src/components/DBRowSidePanel.tsx:1405, 1461, 1476) renders a portaled Drawer at contextZIndex + 10 = 10, with withOverlay={false} and a width of 80% (DrawerUtils.tsx:16). The portal comes later in the DOM, so at the same z-index it paints over the in-tree nav. On a 390px viewport with a row open, the toggle at x<50 is still visible and clickable. Clicking it opens a 250px nav whose area from x≈78 to x=250 is hidden under the drawer. The z-9 scrim also sits under the drawer, so the drawer stays undimmed and interactive. Fix: put the overlay above top-level drawers, for example by portaling the nav and scrim with a z-index above drawerZIndex, or close open side panels when the nav opens.

Nothing blocks merge automatically, but a maintainer will expect this fixed if it is a real defect in code this PR changes. If it is about surrounding code, reply and say so instead of patching. Do not widen the PR. How to respond

@brandon-pereira brandon-pereira left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@kodiakhq
kodiakhq Bot merged commit f56d4ad into main Nov 5, 2026
29 checks passed
@kodiakhq
kodiakhq Bot deleted the elizabet/mobile-nav-overlay branch November 5, 2026 21:23
kodiakhq Bot pushed a commit that referenced this pull request Nov 6, 2026
)

## Summary

The brand name was the outlined SVG inside `brand/Wordmark.tsx`. This PR rewrites that component as live text next to the hexagon, so the name is selectable and matches the ClickStack lockup. `useWordmark()` is the only caller path, so every header that uses it changes together:

- The sidebar, and the header on the login and register pages (`LandingHeader`).
- The name is Inter 18px, weight 500, at normal letter spacing. `useWordmark()` passes the name in, so a downstream build still changes it in one place.
- The symbol is 23px tall and hugs the hexagon. The gap is 8px from the symbol.
- The collapsed rail is unchanged. `Logomark` stays a square box everywhere except inside the wordmark, so Spotlights and the Brand stories keep their old width.

The branch also replaces the favicon set with the new artwork (black rounded square, yellow hexagon, dark bolt):

- `favicon.ico`, `favicon-16x16.png`, `favicon-32x32.png`, and `apple-touch-icon.png` are replaced.
- `favicon.svg` is the same artwork, linked as `image/svg+xml` so browsers that prefer SVG use it. The PNG and ICO files stay as fallbacks.

The favicon change is a separate commit from the wordmark. Each has its own changeset. Either can be split into its own PR if reviewers prefer.

## Screenshots or video

Not captured. The Before/After table is blank because I did not run the app. Please add pairs, on `main` and this branch, for the expanded sidebar, the collapsed rail, the login or register header, and the browser tab icon.

| Before | After |
| :----- | :---- |
|        |       |

## How to reproduce

**Starting point:** `yarn app:dev:local` connected to the demo server (onboarding → "Connect to Demo Server"), or play.hyperdx.io.

**On `main`:**

1. Open the sidebar at a desktop width.
2. The brand name in the sidebar is the outlined logo text, not selectable text.
3. Open `/login`. The header shows the same outlined logo.
4. The browser tab shows the old favicon.

**On this branch:**

1. Open the sidebar at a desktop width.
2. The sidebar shows the hexagon symbol followed by "ClickStack" as text, in medium weight.
3. Click "Collapse/expand navigation". The rail shows only the hexagon symbol, at the same size as before.
4. Open `/login`. The header shows the same text lockup as the sidebar.
5. The browser tab shows the new favicon.

## How to test on Vercel preview

**Preview routes:** /search

**Steps:**

1. Set the viewport width to 1280 pixels.
2. Verify the sidebar header shows the text "ClickStack" next to the hexagon symbol.
3. Click the button labeled "Collapse/expand navigation".
4. Verify the collapsed sidebar shows only the hexagon symbol and no "ClickStack" text.

## Tests

- `npx tsc --noEmit`, ESLint, and stylelint pass on the changed files.
- `Wordmark.test.tsx` renders the lockup and checks that the name is "ClickStack" and that the mark is narrower than it is tall. A second case checks that `useLogomark` still returns a square box.
- Not covered by tests: the favicon in a browser tab, and the login header in a running app. The lockup was checked by rendering the Figma artwork next to the new text in a headless browser. That is not the running app.

## References

- Linear Issue:
- Related PRs: [#3574](#3574) (compact nav overlay and the hexagon mark, already merged)

This branch was successfully deployed

2 active deployments
Preview – hyperdx-oss — b0b11bb8 Deployed Nov 5, 2026 by vercel[bot]
Preview – hyperdx-storybook — b0b11bb8 Deployed Nov 5, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

automerge review/tier-3 Standard — full human review required

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants