Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
245f4d1
docs: add documentation website
betegon Jan 26, 2026
8be1fce
fix(docs): improve contrast and force dark mode
betegon Jan 27, 2026
2166cab
fix(docs): improve docs styling and add package manager tabs
betegon Jan 27, 2026
bd83d2f
fix(docs): align tab styling and unify code block appearance
betegon Jan 27, 2026
abaebf8
fix(docs): replace terminal dots with Terminal label, position copy i…
betegon Jan 27, 2026
f5d91df
fix(docs): match expressive-code copy button style to PackageManagerCode
betegon Jan 27, 2026
68990c0
fix(docs): align copy button vertically with Terminal label
betegon Jan 27, 2026
0b65ee9
fix(docs): match PackageManagerCode copy animation to expressive-code…
betegon Jan 27, 2026
d6f5bdd
fix(docs): move Copied! text to left of icon
betegon Jan 27, 2026
173fa6e
fix(docs): increase spacing between Copied! text and icon
betegon Jan 27, 2026
6205120
fix(docs): unify sidebar border color and remove right sidebar border
betegon Jan 27, 2026
2e9b8dc
fix(docs): override left sidebar border to match content border color
betegon Jan 27, 2026
238b1d1
fix(docs): remove border below content header
betegon Jan 27, 2026
f46ec05
feat(docs): wider sidebar, better content spacing, section labels abo…
betegon Jan 27, 2026
2c58930
fix(docs): make tables fit content width instead of full width
betegon Jan 27, 2026
3023dc8
fix(docs): tighten table styling - less padding, cleaner borders
betegon Jan 27, 2026
fa44bf9
fix(docs): simplify table styles - clean basic styling
betegon Jan 27, 2026
fd5adea
fix(docs): make tables full width
betegon Jan 27, 2026
3d67ffe
fix(docs): force tables to full width with !important
betegon Jan 27, 2026
a0658bd
fix(docs): remove pagination from landing page, improve pagination st…
betegon Jan 27, 2026
aa56c6e
feat(docs): add 3 feature section variations for comparison
betegon Jan 27, 2026
6582230
feat(docs): keep only horizontal rows variation with command overlays…
betegon Jan 27, 2026
2c69006
feat(docs): update feature section copy - It Knows Your Project, Ask …
betegon Jan 27, 2026
ca0fbc8
feat(docs): redesign feature sections with terminals inside backgroun…
betegon Jan 27, 2026
e9debbd
feat(docs): refine hero section styling - smaller command box, more t…
betegon Jan 27, 2026
754d290
fix(docs): remove border from feature sections, make images fill full…
betegon Jan 27, 2026
52fae67
fix(docs): add padding around feature sections, round image corners
betegon Jan 27, 2026
8e8bfb1
fix(docs): equalize spacing on feature sections
betegon Jan 27, 2026
d045977
fix(docs): fix spacing - add gap, reset h3 margin, adjust padding
betegon Jan 27, 2026
b7a47a9
feat(docs): update feature terminals to match hero style, expand sect…
betegon Jan 27, 2026
6fdfd0b
refactor(docs): remove install and quickstart sections from landing page
betegon Jan 27, 2026
2b254d7
feat(docs): widen feature terminals for better text utilization
betegon Jan 27, 2026
ac53e21
fix(docs): improve table alignment in first feature section with prop…
betegon Jan 27, 2026
e52b4ce
feat(docs): add overscroll easter egg on landing page
betegon Jan 27, 2026
f6b59f1
style(docs): make hero command box fully rounded with smaller copy bu…
betegon Jan 27, 2026
4de5081
style(docs): apply consistent border-radius nesting (16px → 8px)
betegon Jan 27, 2026
7cc8c95
style(docs): remove left sidebar border
betegon Jan 27, 2026
537f2b9
merge: resolve conflict with main in ci.yml
betegon Jan 27, 2026
5d9f3ba
ci: remove test dependency from build-docs job
betegon Jan 27, 2026
63107a4
fix(docs): correct base path for PR preview deployment
betegon Jan 27, 2026
e9d9ae1
fix(docs): use dynamic base path for all images
betegon Jan 27, 2026
5b616bc
fix(docs): add trailing slash to base path for images
betegon Jan 27, 2026
36bd0c1
fix(docs): use dynamic base path for Docs header link
betegon Jan 27, 2026
95f5a53
chore: exclude docs folder from biome linting
betegon Jan 27, 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
1 change: 1 addition & 0 deletions .craft.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,4 @@ requireNames:
targets:
- name: npm
- name: github
- name: gh-pages
25 changes: 24 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -185,9 +185,31 @@ jobs:
name: npm-package
path: '*.tgz'

build-docs:
name: Build Docs
needs: [lint]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
- name: Build Docs
working-directory: docs
run: |
bun install --frozen-lockfile
bun run build
- name: Package Docs
run: |
cp .nojekyll docs/dist/
zip -r gh-pages.zip docs/dist/
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: gh-pages
path: gh-pages.zip

merge-artifacts:
name: Merge Artifacts
needs: [build-binary, build-npm, test-e2e]
needs: [build-binary, build-npm, build-docs, test-e2e]
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
Expand All @@ -197,3 +219,4 @@ jobs:
path: |
sentry-*/
npm-package/*.tgz
gh-pages/gh-pages.zip
67 changes: 67 additions & 0 deletions .github/workflows/docs-preview.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
name: Docs Preview

on:
pull_request:
paths:
- 'docs/**'
- '.github/workflows/docs-preview.yml'

permissions:
contents: write
pull-requests: write

jobs:
preview:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: oven-sh/setup-bun@v2

- name: Build Docs for Preview
working-directory: docs
env:
# Override base path for PR preview (no /cli prefix since preview domain is different)
DOCS_BASE_PATH: /pr-preview/pr-${{ github.event.pull_request.number }}
run: |
bun install --frozen-lockfile
bun run build

- name: Ensure .nojekyll at gh-pages root
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"

# Try to fetch the gh-pages branch
if git fetch origin gh-pages:gh-pages 2>/dev/null; then
# Branch exists remotely, check if .nojekyll is present
if git show gh-pages:.nojekyll &>/dev/null; then
echo ".nojekyll already exists at gh-pages root"
else
echo "Adding .nojekyll to existing gh-pages branch"
git checkout gh-pages
touch .nojekyll
git add .nojekyll
git commit -m "Add .nojekyll to disable Jekyll processing"
git push origin gh-pages
git checkout -
fi
else
# Branch doesn't exist, create it as an orphan branch
echo "Creating gh-pages branch with .nojekyll"
git checkout --orphan gh-pages
git rm -rf .
touch .nojekyll
git add .nojekyll
git commit -m "Initialize gh-pages with .nojekyll"
git push origin gh-pages
git checkout -
fi

- name: Deploy Preview
uses: rossjrw/pr-preview-action@v1
with:
source-dir: docs/dist/
preview-branch: gh-pages
umbrella-dir: pr-preview
action: auto
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
*.tsbuildinfo
.turbo

# docs
docs/dist
docs/node_modules
docs/.astro

# IntelliJ based IDEs
.idea

Expand Down
Empty file added .nojekyll
Empty file.
3 changes: 3 additions & 0 deletions biome.jsonc
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
{
"$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
"extends": ["ultracite/core"],
"files": {
"includes": ["!docs"]
},
"javascript": {
"globals": ["Bun"]
},
Expand Down
178 changes: 178 additions & 0 deletions docs/astro.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
import starlight from "@astrojs/starlight";
import { defineConfig } from "astro/config";

// Allow base path override via environment variable for PR previews
const base = process.env.DOCS_BASE_PATH || "/cli";

export default defineConfig({
site: "https://getsentry.github.io",
base,
integrations: [
starlight({
title: "Sentry CLI",
favicon: "/favicon.png",
logo: {
src: "./src/assets/logo.svg",
replacesTitle: true,
},
social: {
github: "https://github.com/getsentry/cli",
},
expressiveCode: {
themes: ["github-dark"],
styleOverrides: {
frames: {
frameBoxShadowCssValue: "none",
editorActiveTabIndicatorTopColor: "transparent",
editorActiveTabIndicatorBottomColor: "transparent",
editorTabBarBorderBottomColor: "transparent",
editorTabBarBackground: "transparent",
terminalTitlebarBorderBottomColor: "transparent",
terminalTitlebarBackground: "rgba(255, 255, 255, 0.03)",
terminalBackground: "#0a0a0f",
},
borderRadius: "12px",
borderColor: "rgba(255, 255, 255, 0.1)",
codeBackground: "#0a0a0f",
},
},
components: {
Header: "./src/components/Header.astro",
ThemeSelect: "./src/components/ThemeSelect.astro",
PageTitle: "./src/components/PageTitle.astro",
},
head: [
// Force dark mode - runs before page renders
{
tag: "script",
content: `document.documentElement.dataset.theme = 'dark';`,
},
// Overscroll easter egg - bottom of page, only on /cli route
{
tag: "script",
content: `
(function() {
let overscrollEl;
let pullDistance = 0;
let touchStartY = 0;
let isAtBottom = false;

function isLandingPage() {
const path = window.location.pathname;
// Works with both /cli (prod) and /pr-preview/pr-XX (preview)
return path === '/cli' || path === '/cli/' ||
/^\\/pr-preview\\/pr-\\d+\\/?$/.test(path);
}

function checkAtBottom() {
const scrollTop = window.scrollY || document.documentElement.scrollTop;
const scrollHeight = document.documentElement.scrollHeight;
const clientHeight = document.documentElement.clientHeight;
return scrollTop + clientHeight >= scrollHeight - 5;
}

function createOverscrollMessage() {
if (!isLandingPage()) return;
overscrollEl = document.createElement('div');
overscrollEl.className = 'overscroll-message';
overscrollEl.innerHTML = '<span>You made it to the end. Might as well give it a try → <code>npx sentry@latest</code></span>';
document.body.appendChild(overscrollEl);
}

function updateOverscroll(distance) {
if (!overscrollEl) return;
const clampedDistance = Math.min(Math.max(distance, 0), 50);
const opacity = Math.min(clampedDistance / 15, 1);
const translateY = Math.min(clampedDistance * 2.5, 120);
overscrollEl.style.opacity = opacity;
overscrollEl.style.transform = 'translateX(-50%) translateY(-' + translateY + 'px)';
}

function handleTouchStart(e) {
if (!isLandingPage()) return;
touchStartY = e.touches[0].clientY;
isAtBottom = checkAtBottom();
}

function handleTouchMove(e) {
if (!isLandingPage() || !isAtBottom) return;
const touchY = e.touches[0].clientY;
pullDistance = touchStartY - touchY;
if (pullDistance > 0 && checkAtBottom()) {
updateOverscroll(pullDistance);
}
}

function handleTouchEnd() {
pullDistance = 0;
updateOverscroll(0);
}

function handleWheel(e) {
if (!isLandingPage()) return;
if (checkAtBottom() && e.deltaY > 0) {
pullDistance = Math.min(pullDistance + e.deltaY * 0.8, 50);
updateOverscroll(pullDistance);
clearTimeout(window.overscrollTimeout);
window.overscrollTimeout = setTimeout(function() {
pullDistance = 0;
updateOverscroll(0);
}, 300);
}
}

document.addEventListener('DOMContentLoaded', function() {
createOverscrollMessage();
document.addEventListener('touchstart', handleTouchStart, { passive: true });
document.addEventListener('touchmove', handleTouchMove, { passive: true });
document.addEventListener('touchend', handleTouchEnd, { passive: true });
document.addEventListener('wheel', handleWheel, { passive: true });
});
})();
`,
},
// Add fonts
{
tag: "link",
attrs: {
rel: "preconnect",
href: "https://fonts.googleapis.com",
},
},
{
tag: "link",
attrs: {
rel: "preconnect",
href: "https://fonts.gstatic.com",
crossorigin: true,
},
},
{
tag: "link",
attrs: {
rel: "stylesheet",
href: "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap",
},
},
],
sidebar: [
{
label: "Getting Started",
items: [
{ label: "Introduction", slug: "" },
{ label: "Installation", slug: "getting-started" },
],
},
{
label: "Commands",
autogenerate: { directory: "commands" },
},
{
label: "Resources",
items: [{ label: "Contributing", slug: "contributing" }],
},
],
customCss: ["./src/styles/custom.css"],
}),
],
});
Loading
Loading