Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
9c951df
Reapply "feat(homepage): Bifurcated homepage refresh" (#18870)
sergical Jul 29, 2026
9168fc5
feat(homepage): Add AI setup pill, full SDK list, and copy fixes
sergical Jul 29, 2026
a0a4fc0
[getsentry/action-github-commit] Auto commit
getsantry[bot] Jul 29, 2026
8699111
ref(homepage): Use react-feather icons instead of hand-rolled SVGs
sergical Jul 29, 2026
0d666bc
fix(homepage): Show header search on load and trim comments
sergical Jul 29, 2026
ef6a727
ci: Allow the AI-utomatically pun in the typos config
sergical Jul 29, 2026
2652510
fix(search): Keep the results dropdown left-aligned and inside the vi…
sergical Jul 29, 2026
b674f26
ref(homepage): Use the header search instead of a page-level one
sergical Jul 29, 2026
e7738c9
fix(search): Send Algolia click events with working credentials
sergical Jul 29, 2026
7a77d10
docs(search): Point the follow-up comment at search.credentials
sergical Jul 29, 2026
63c564c
fix(search): Report Algolia Insights rejections instead of dropping them
sergical Jul 29, 2026
ea68484
fix(search): Skip Insights init when credentials are absent
sergical Jul 29, 2026
9666326
ci: Drop Algolia env references that resolve to empty strings
sergical Jul 29, 2026
b568fed
fix(search): Avoid a CORS preflight on Insights events
sergical Jul 29, 2026
86743f7
fix(search): Exclude versioned pages from the Algolia index
sergical Jul 29, 2026
56a2917
fix(homepage): Make the AI card clickable and drop the copy cursor
sergical Jul 29, 2026
0cf2d30
ref(homepage): Retitle the AI card to "Ask AI to set it up"
sergical Jul 29, 2026
1a909f4
ref(homepage): Retitle the AI card to "Set up with a coding agent"
sergical Jul 29, 2026
79eb593
fix(search): Stay silent when Insights is unconfigured
sergical Jul 29, 2026
449e47a
fix(platforms): Balance the SDK list columns
sergical Jul 29, 2026
a8b98b8
fix(homepage): Keep the hero tagline off a second line
sergical Jul 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
# warning: variables prefixed with NEXT_PUBLIC_ will be made available to client-side code
# be careful not to expose sensitive data (in this case your Algolia admin key)

NEXT_PUBLIC_ALGOLIA_APP_ID=
NEXT_PUBLIC_ALGOLIA_SEARCH_KEY=
# Algolia Insights (search click tracking). Must be the same application and a
# valid key for the index @sentry-internal/global-search queries, or every click
# event is rejected with a 401.
NEXT_PUBLIC_ALGOLIA_APP_ID=OOK48W9UCL
NEXT_PUBLIC_ALGOLIA_SEARCH_KEY=2d64ec1106519cbc672d863b0d200782
NEXT_PUBLIC_SENTRY_DSN=
4 changes: 0 additions & 4 deletions .github/workflows/algolia-index.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,6 @@ jobs:
ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }}
ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }}
DOCS_INDEX_NAME: ${{ secrets.DOCS_INDEX_NAME }}
NEXT_PUBLIC_ALGOLIA_APP_ID: ${{ secrets.NEXT_PUBLIC_ALGOLIA_APP_ID }}
NEXT_PUBLIC_ALGOLIA_SEARCH_KEY: ${{ secrets.NEXT_PUBLIC_ALGOLIA_SEARCH_KEY }}
ALGOLIA_SENTRY_DSN: ${{ secrets.ALGOLIA_SENTRY_DSN }}
SENTRY_DSN: https://examplePublicKey@o0.ingest.sentry.io/0
NEXT_PUBLIC_SENTRY_DSN: https://examplePublicKey@o0.ingest.sentry.io/0
Expand All @@ -76,8 +74,6 @@ jobs:
ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }}
ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }}
DOCS_INDEX_NAME: ${{ secrets.DEVELOP_DOCS_INDEX_NAME }}
NEXT_PUBLIC_ALGOLIA_APP_ID: ${{ secrets.NEXT_PUBLIC_ALGOLIA_APP_ID }}
NEXT_PUBLIC_ALGOLIA_SEARCH_KEY: ${{ secrets.NEXT_PUBLIC_ALGOLIA_SEARCH_KEY }}
ALGOLIA_SENTRY_DSN: ${{ secrets.ALGOLIA_SENTRY_DSN }}
SENTRY_DSN: https://examplePublicKey@o0.ingest.sentry.io/0
NEXT_PUBLIC_SENTRY_DSN: https://examplePublicKey@o0.ingest.sentry.io/0
Expand Down
9 changes: 8 additions & 1 deletion scripts/algolia.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {isDeveloperDocs} from 'sentry-docs/isDeveloperDocs';

import {getDevDocsFrontMatter, getDocsFrontMatter} from '../src/mdx';
import {FrontMatter} from '../src/types';
import {isVersioned} from '../src/versioning';

const ALGOLIA_SENTRY_DSN = process.env.ALGOLIA_SENTRY_DSN;
if (ALGOLIA_SENTRY_DSN) {
Expand Down Expand Up @@ -87,7 +88,13 @@ async function indexAndUpload() {
: getDocsFrontMatter());

const allPages = pageFrontMatters.filter(
frontMatter => !frontMatter.draft && !frontMatter.noindex && frontMatter.title
frontMatter =>
!frontMatter.draft &&
!frontMatter.noindex &&
frontMatter.title &&
// Versioned pages document superseded SDK majors and outrank the current
// docs for the same query. They stay reachable via the version selector.
!isVersioned(frontMatter.slug)
);
const pages = DRY_RUN ? allPages.slice(0, DRY_RUN_PAGE_LIMIT) : allPages;
const uploadIndex = DRY_RUN ? null : index;
Expand Down
21 changes: 2 additions & 19 deletions src/components/agentSetupCallout/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {ChevronDownIcon, ChevronRightIcon} from '@radix-ui/react-icons';
import * as Sentry from '@sentry/nextjs';
import Link from 'next/link';
import {useCallback, useState} from 'react';
import {Copy} from 'react-feather';
import {usePlausibleEvent} from 'sentry-docs/hooks/usePlausibleEvent';
import {DocMetrics} from 'sentry-docs/metrics';

Expand Down Expand Up @@ -66,7 +67,7 @@ export function AgentSetupCallout({skill, platformName}: Props) {
<code className={styles.promptText}>{prompt}</code>
</div>
<button className={styles.copyButton} onClick={copyPrompt} type="button">
<CopyIcon />
<Copy size={14} />
{copied ? 'Copied!' : 'Copy Prompt'}
</button>
</div>
Expand Down Expand Up @@ -108,21 +109,3 @@ export function AgentSetupCallout({skill, platformName}: Props) {
</div>
);
}

function CopyIcon() {
return (
<svg
width="14"
height="14"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<rect x="9" y="9" width="13" height="13" rx="2" ry="2" />
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" />
</svg>
);
}
21 changes: 2 additions & 19 deletions src/components/copyPromptButton/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {Theme} from '@radix-ui/themes';
import * as Sentry from '@sentry/nextjs';
import {useTheme} from 'next-themes';
import {useCallback, useMemo, useState} from 'react';
import {Copy} from 'react-feather';
import {usePlausibleEvent} from 'sentry-docs/hooks/usePlausibleEvent';
import {DocMetrics} from 'sentry-docs/metrics';

Expand Down Expand Up @@ -98,7 +99,7 @@ export function CopyPromptButton({skill, platformName}: Props) {
type="button"
aria-label="Copy setup prompt for AI agents"
>
<CopyIcon />
<Copy size={14} />
<span className={styles.label}>{copied ? 'Copied!' : 'Copy Prompt'}</span>
</button>
</Tooltip.Trigger>
Expand All @@ -117,21 +118,3 @@ export function CopyPromptButton({skill, platformName}: Props) {
</span>
);
}

function CopyIcon() {
return (
<svg
width="12"
height="12"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<rect x="9" y="9" width="13" height="13" rx="2" ry="2" />
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" />
</svg>
);
}
50 changes: 6 additions & 44 deletions src/components/header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import SentryLogoSVG from 'sentry-docs/logos/sentry-logo-dark.svg';
import {Platform} from 'sentry-docs/types';

import {MagicIcon} from './cutomIcons/magic';
import {useHomeSearchVisibility} from './homeSearchVisibility';
import {mainSections} from './navigationData';
import sidebarStyles from './sidebar/style.module.scss';
import {ThemeToggle} from './theme-toggle';
Expand Down Expand Up @@ -49,18 +48,10 @@ export function Header({
platforms = [],
}: Props) {
const isHomePage = pathname === '/';
const [homeSearchVisible, setHomeSearchVisible] = useState(true);
const [homeMobileNavOpen, setHomeMobileNavOpen] = useState(false);
const [sidebarOpen, setSidebarOpen] = useState(false);
const [mobileSearchOpen, setMobileSearchOpen] = useState(false);

// Listen for home search visibility changes
useHomeSearchVisibility(
useCallback((isVisible: boolean) => {
setHomeSearchVisible(isVisible);
}, [])
);

// Close mobile overlays on navigation
useEffect(() => {
setMobileSearchOpen(false);
Expand Down Expand Up @@ -175,48 +166,21 @@ export function Header({
return () => window.removeEventListener('resize', handleResize);
}, [sidebarOpen]);

// Show header search if: not on home page, OR on home page but home search is scrolled out of view
const showHeaderSearch = !isHomePage || !homeSearchVisible;

return (
<header className="bg-[var(--gray-1)] h-[var(--header-height)] w-full z-50 border-b border-[var(--gray-a3)] fixed top-0 flex items-center min-h-[64px]">
{/* define a header-height variable for consumption by other components */}
<style>{`
:root { --header-height: 64px; }
/* Home page: align header content with max-w-screen-xl (1280px) content */
/* The nav element has px-4 (16px) on mobile, md:pl-3 (12px) on desktop */
/* Home content uses px-4 (16px), sm:px-8 (32px), lg:px-[50px] */
/* So we subtract the nav's padding from the content's padding */
/* Home page: full-width nav that spans the viewport (matches the old
* homepage). No max-width cap — the nav's own edge padding
* (px-4 / md:pl-3 and the right block's lg:pr-6) handles spacing. */
.header-content-home {
max-width: 1280px;
margin-left: auto;
margin-right: auto;
max-width: none;
margin-left: 0;
margin-right: 0;
padding-left: 0;
padding-right: 0;
}
@media (min-width: 640px) {
.header-content-home {
/* 32px (content) - 16px (nav px-4) = 16px */
padding-left: 16px;
padding-right: 16px;
}
}
@media (min-width: 768px) {
.header-content-home {
/* 32px (content) - 12px (nav md:pl-3) = 20px on left */
/* 32px (content) - 16px (nav md:pr-4) = 16px on right */
padding-left: 20px;
padding-right: 16px;
}
}
@media (min-width: 1024px) {
.header-content-home {
/* 50px (content) - 12px (nav md:pl-3) = 38px on left */
/* 50px (content) - 24px (right div lg:pr-6) = 26px on right */
padding-left: 38px;
padding-right: 26px;
}
}
/* Doc pages: fluid centering to match sidebar offset at wide viewports */
.header-content:not(.header-content-home) {
padding-left: var(--layout-offset, 0px);
Expand Down Expand Up @@ -328,8 +292,6 @@ export function Header({
<div
className="flex flex-shrink-0 items-center gap-2"
style={{
visibility: showHeaderSearch ? 'visible' : 'hidden',
pointerEvents: showHeaderSearch ? 'auto' : 'none',
width: '340px',
minWidth: '340px',
}}
Expand Down
Loading
Loading