Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
3bd9976
feat(docs): rebuild documentation with the Paper design system
emir-karabeg Oct 29, 2026
4cf2622
fix(docs): verify nested tabs and fresh-checkout CI setup
emir-karabeg Oct 29, 2026
ac35482
chore(docs): refresh preservation evidence against latest staging
emir-karabeg Oct 29, 2026
67613aa
fix(docs): align shared navigation and controls with Paper
emir-karabeg Oct 30, 2026
2af0fdd
fix(docs): share active heading across responsive outlines
emir-karabeg Oct 30, 2026
416663b
fix(docs): track the final section at the end of the page
emir-karabeg Oct 30, 2026
d794f9a
fix(docs): preserve sidebar scroll in a persistent layout
emir-karabeg Oct 30, 2026
703e2c1
fix(docs): restore live screenshot backgrounds and framing
emir-karabeg Oct 30, 2026
7dcbd2e
fix(docs): finish layout polish and clean implementation references
emir-karabeg Oct 30, 2026
268aad8
fix(docs): align shared dark theme and overlay states
emir-karabeg Oct 30, 2026
f06b2d6
fix(docs): remove dark borders from platform screenshots
emir-karabeg Oct 30, 2026
16b3fdc
Merge remote-tracking branch 'origin/staging' into feat/docs
emir-karabeg Oct 30, 2026
74b58e8
test(docs): benchmark production navigation and image delivery in CI
emir-karabeg Oct 30, 2026
1aab14f
fix(docs): preserve machine content and production reading contracts
emir-karabeg Oct 30, 2026
179c340
Merge remote-tracking branch 'origin/staging' into feat/docs
emir-karabeg Oct 30, 2026
fb45fae
fix(docs): retain readable tabs without JavaScript and verify current…
emir-karabeg Oct 30, 2026
a5b626b
fix(docs): expose root response schemas and generate clean-checkout t…
emir-karabeg Oct 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,6 @@ Dockerfile* text eol=lf
*.ttf binary
*.eot binary
*.pdf binary

apps/docs/migration/*.json linguist-generated=true
apps/docs/migration/verification/** linguist-generated=true
3 changes: 3 additions & 0 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -683,6 +683,9 @@ jobs:
tar -xzf "$archive" -C "$RUNNER_TEMP" actionlint
"$RUNNER_TEMP/actionlint" -color -shellcheck= -pyflakes=

- name: Generate documentation modules for import audits
run: bun run --cwd apps/docs content:generate

# Every zero-argument `check:*` script, run concurrently. The list is derived in
# scripts/run-audits.ts, which also writes the per-audit timing table to the job
# summary and annotates failures. Audits needing a base ref stay separate below.
Expand Down
15 changes: 12 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1149,9 +1149,18 @@ jobs:
with:
filters: |
docs:
- 'apps/docs/content/docs/**'
- 'apps/sim/scripts/process-docs.ts'
- 'apps/sim/lib/chunkers/**'
- 'apps/docs/content/**'
- 'apps/docs/scripts/compile-content.ts'
- 'apps/docs/scripts/index-search.ts'
- 'apps/docs/lib/content/**'
- 'apps/docs/lib/search/**'
- 'apps/docs/lib/openapi-specs.ts'
- 'apps/docs/lib/urls.ts'
- 'apps/docs/public/openapi*.json'
- 'apps/docs/package.json'
- 'bun.lock'
- '.github/workflows/docs.yml'
- '.github/workflows/ci.yml'

# Process docs embeddings (only when docs change, after images are promoted)
docs:
Expand Down
201 changes: 190 additions & 11 deletions .github/workflows/docs-negotiation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,51 +17,230 @@ on:
- 'bun.lock'
- '.github/workflows/docs-negotiation.yml'
workflow_dispatch:
inputs:
benchmark:
description: Run bounded production navigation, image and Lighthouse measurements
type: boolean
default: false
build_ref:
description: Commit to build for the benchmark (empty uses this workflow revision)
type: string
default: ''
preview_artifact:
description: Save the verified production build for local visual inspection
type: boolean
default: false
benchmark_scope:
description: Full measurements, navigation without Lighthouse, or only interactive controls
type: choice
options: [full, navigation, interactions]
default: full
benchmark_production:
description: Also measure the public production origin (only when it permits automated access)
type: boolean
default: false

permissions:
contents: read

concurrency:
group: docs-negotiation-${{ github.ref }}
group: docs-negotiation-${{ github.ref }}-${{ inputs.benchmark && 'benchmark' || 'verification' }}
cancel-in-progress: true

jobs:
benchmark:
if: github.event_name == 'workflow_dispatch' && inputs.benchmark
name: docs benchmark (${{ matrix.target }})
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-8vcpu-ubuntu-2404' || 'linux-x64-8-core' }}
timeout-minutes: 150
strategy:
fail-fast: false
max-parallel: 2
matrix:
target: ${{ fromJSON(inputs.benchmark_production && '["build","production"]' || '["build"]') }}
env:
DATABASE_URL: ''
OPENAI_API_KEY: ''
DOCS_BENCHMARK_BASE_URL: ${{ matrix.target == 'production' && 'https://docs.sim.ai' || 'http://127.0.0.1:3001' }}
steps:
- name: Checkout measured revision
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6
with:
ref: ${{ inputs.build_ref || github.sha }}
fetch-depth: 0
filter: blob:none
- name: Setup workspace
uses: ./.github/actions/setup
with:
provider: ${{ vars.CI_PROVIDER }}
- name: Checkout benchmark harness
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6
with:
ref: ${{ github.sha }}
path: .readiness-harness
sparse-checkout: apps/docs/scripts/benchmark-readiness.ts
sparse-checkout-cone-mode: false
- name: Prepare measurements
env:
GH_TOKEN: ${{ github.token }}
MEASURED_TARGET: ${{ matrix.target }}
run: |
mkdir -p test-results/benchmark
cp .readiness-harness/apps/docs/scripts/benchmark-readiness.ts apps/docs/scripts/benchmark-readiness.ts
if [ "$MEASURED_TARGET" = production ]; then
gh api "repos/$GITHUB_REPOSITORY/deployments?environment=Production&per_page=1" >test-results/benchmark/deployment.json
REVISION=$(jq -r '.[0].sha' test-results/benchmark/deployment.json)
else
REVISION=$(git rev-parse HEAD)
fi
echo "DOCS_BENCHMARK_REVISION=$REVISION" >> "$GITHUB_ENV"
bunx --no-install playwright install --with-deps chromium
- name: Build measured production docs
if: matrix.target == 'build'
run: bun run --cwd apps/docs build
- name: Measure navigation and Lighthouse sequentially
env:
BENCHMARK_SCOPE: ${{ inputs.benchmark_scope || 'full' }}
run: |
if [ "$DOCS_BENCHMARK_BASE_URL" = http://127.0.0.1:3001 ]; then
bun run --cwd apps/docs start --port 3001 >test-results/benchmark/server.log 2>&1 &
DOCS_SERVER_PID=$!
trap 'kill "$DOCS_SERVER_PID" 2>/dev/null || true' EXIT
for attempt in $(seq 1 30); do
curl -fsS "$DOCS_BENCHMARK_BASE_URL/introduction" -o /dev/null && break
sleep 1
done
fi
NAVIGATION_STATUS=0
LIGHTHOUSE_STATUS=0
if [ "$BENCHMARK_SCOPE" = interactions ]; then
export DOCS_BENCHMARK_SCENARIOS=interactions
fi
DOCS_BENCHMARK_MODE=navigation DOCS_BENCHMARK_REPORT_PATH="$GITHUB_WORKSPACE/test-results/benchmark/navigation.json" bun run --cwd apps/docs scripts/benchmark-readiness.ts || NAVIGATION_STATUS=$?
if [ "$BENCHMARK_SCOPE" = full ]; then
DOCS_BENCHMARK_MODE=lighthouse DOCS_BENCHMARK_REPORT_PATH="$GITHUB_WORKSPACE/test-results/benchmark/lighthouse.json" bun run --cwd apps/docs scripts/benchmark-readiness.ts || LIGHTHOUSE_STATUS=$?
fi
test "$NAVIGATION_STATUS" -eq 0 && test "$LIGHTHOUSE_STATUS" -eq 0
- name: Upload measurements
if: always()
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: docs-benchmark-${{ matrix.target }}
path: test-results/benchmark/
retention-days: 14

http:
if: github.event_name != 'workflow_dispatch' || !inputs.benchmark
name: docs HTTP
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-8vcpu-ubuntu-2404' || 'linux-x64-8-core' }}
timeout-minutes: 15
timeout-minutes: 45
services:
search-postgres:
image: pgvector/pgvector:pg17
env:
POSTGRES_USER: docs_test
POSTGRES_PASSWORD: docs_test
POSTGRES_DB: docs_search_test
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U docs_test -d docs_search_test"
--health-interval 5s
--health-timeout 5s
--health-retries 10
env:
DATABASE_URL: postgresql://docs_test:docs_test@127.0.0.1:1/docs_test
DOCS_E2E_BASE_URL: http://127.0.0.1:3001
DOCS_NEGOTIATION_REPORT_PATH: ${{ github.workspace }}/test-results/docs-negotiation.json
DOCS_HEADER_REPORT_PATH: ${{ github.workspace }}/test-results/docs-headers.json
DOCS_NAVIGATION_REPORT_PATH: ${{ github.workspace }}/test-results/navigation/docs.json
DOCS_NEGOTIATION_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/docs-negotiation.json
DOCS_SEARCH_E2E_DATABASE_URL: postgresql://docs_test:docs_test@127.0.0.1:5432/docs_search_test
DOCS_SEARCH_E2E_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/search-postgres/report.json
DOCS_INTERFACES_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/docs-interfaces.json
DOCS_CORPUS_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/docs-corpus.json
DOCS_HEADER_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/docs-headers.json
DOCS_NAVIGATION_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/navigation/docs.json
DOCS_GENERATORS_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/generators/report.json
DOCS_MIGRATION_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/migration.json
DOCS_SAMPLES_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/samples/report.json
DOCS_SAMPLES_SYNTAX_LANGUAGES: javascript,python,bash,go,java,csharp
DOCS_SAMPLES_HTTP_BASE_URL: http://127.0.0.1:3001
DOCS_PROVIDER_E2E_DATABASE_URL: postgresql://docs_test:docs_test@127.0.0.1:5432/docs_search_test
DOCS_PROVIDER_E2E_BASE_URL: http://127.0.0.1:3001
DOCS_PROVIDER_E2E_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/platform-consumer/report.json
steps:
- name: Checkout code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6
with:
fetch-depth: 0
filter: blob:none
- name: Setup workspace
uses: ./.github/actions/setup
with:
provider: ${{ vars.CI_PROVIDER }}
- name: Build production docs
id: build
run: bun run --cwd apps/docs build
- name: Verify generator idempotence and authored regions
run: bun run --cwd apps/docs scripts/test-generators-e2e.ts
- name: Verify preserved routes, anchors and examples
if: always() && steps.build.outcome == 'success'
run: bun run --cwd apps/docs content:verify-migration
- name: Verify native header edge cases
if: always() && steps.build.outcome == 'success'
run: bun run --cwd apps/docs test:headers:e2e
- name: Verify isolated PostgreSQL search and index lifecycle
if: always() && steps.build.outcome == 'success'
run: bun run --cwd apps/docs test:search:postgres:e2e
- name: Set up Java for copied request examples
if: always() && steps.build.outcome == 'success'
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
with:
distribution: temurin
java-version: '17'
- name: Set up .NET for copied request examples
if: always() && steps.build.outcome == 'success'
uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5
with:
dotnet-version: '8.0.x'
- name: Set up Go for copied request examples
if: always() && steps.build.outcome == 'success'
uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
with:
go-version: '1.25.x'
cache: false
- name: Install browser for navigation checks
run: bunx --no-install playwright install --with-deps chromium
if: always() && steps.build.outcome == 'success'
run: bunx --no-install playwright install --with-deps chromium webkit
- name: Verify HTTP content negotiation
if: always() && steps.build.outcome == 'success'
run: |
mkdir -p test-results
bun run --cwd apps/docs start --port 3001 >test-results/docs-server.log 2>&1 &
mkdir -p apps/docs/test-results
bun run --cwd apps/docs start --port 3001 >apps/docs/test-results/docs-server.log 2>&1 &
DOCS_SERVER_PID=$!
trap 'kill "$DOCS_SERVER_PID" 2>/dev/null || true' EXIT
bun run --cwd apps/docs test:negotiation:e2e
bun run --cwd apps/docs test:navigation:e2e
STATUS=0
bun run --cwd apps/docs test:negotiation:e2e || STATUS=1
bun run --cwd apps/docs scripts/test-docs-interfaces-e2e.ts || STATUS=1
bun run --cwd apps/docs test:corpus:e2e || STATUS=1
bun run --cwd apps/docs scripts/verify-api-samples.ts || STATUS=1
bun --cwd apps/sim --no-env-file scripts/test-docs-search-provider-e2e.ts || STATUS=1
bun run --cwd apps/docs test:navigation:e2e || STATUS=1
DOCS_NAVIGATION_BROWSER=webkit DOCS_NAVIGATION_REPORT_PATH="$GITHUB_WORKSPACE/apps/docs/test-results/navigation-webkit/docs.json" bun run --cwd apps/docs test:navigation:e2e || STATUS=1
exit "$STATUS"
- name: Package production preview for visual inspection
if: always() && inputs.preview_artifact && steps.build.outcome == 'success'
run: tar -czf docs-preview-build.tar.gz --exclude='.next/cache' -C apps/docs .next .content
- name: Upload production preview
if: always() && inputs.preview_artifact && steps.build.outcome == 'success'
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: docs-preview-build
path: docs-preview-build.tar.gz
retention-days: 3
- name: Upload HTTP regression report
if: always()
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: docs-negotiation-report
path: test-results/
path: apps/docs/test-results/
if-no-files-found: warn
retention-days: 14
20 changes: 17 additions & 3 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,36 @@ jobs:
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-2vcpu-ubuntu-2404' || 'ubuntu-latest' }}
timeout-minutes: 30
if: github.ref == 'refs/heads/main'
concurrency:
group: docs-search-index-production
cancel-in-progress: false

steps:
- name: Checkout code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6
with:
ref: main
persist-credentials: false

- name: Setup workspace
uses: ./.github/actions/setup
with:
provider: ${{ vars.CI_PROVIDER }}
node-version: '22'
node-version: '24'

- name: Process docs embeddings
working-directory: ./apps/sim
working-directory: ./apps/docs
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: bun run scripts/process-docs.ts --clear
run: |
bun run content:generate
DOCS_SEARCH_REPORT_PATH=test-results/docs-search-publish.json bun run scripts/index-search.ts
DOCS_SEARCH_REPORT_PATH=test-results/docs-search-check.json bun run scripts/index-search.ts --check

- name: Upload search index report
if: always()
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: docs-search-index
path: apps/docs/test-results/docs-search-*.json
7 changes: 2 additions & 5 deletions apps/docs/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,10 @@ bun-debug.log*
*.tsbuildinfo
next-env.d.ts

# Fumadocs
/.source/
# Build-generated content
/.content/
.plans/

# fumadocs generates .source dirs anywhere a source.config sits
**/.source/

# Build-generated documentation asset
/public/llms-full.txt
/public/.llms-full-*/
Loading
Loading