Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
d8a38d9
docs: add web callback docs
nimarb May 19, 2026
822ef7d
bump
nimarb May 22, 2026
e8ea427
Merge branch 'main' into feature/lfe-9876-web-callbacks-docs-page
nimarb May 22, 2026
18402da
feat(launch-week-5): add teaser landing page (#2980)
jannikmaierhoefer May 22, 2026
6251be4
docs: update website banner for launch week
clemra May 22, 2026
049e044
ci(deps): bump the github-actions group with 2 updates (#2983)
dependabot[bot] May 22, 2026
796cba7
docs(claude-code): add YouTube video embed to integration page (#2999)
CodeCLS May 24, 2026
7eb5881
docs: correct annotation queues typo (#3001)
maxdeichmann May 25, 2026
d96d227
feat(launch-week-5): day 1 — experiments in CI/CD (#3000)
jannikmaierhoefer May 25, 2026
a56ba5f
docs(guides): add guide on calibrating LLM-as-a-judge with the Langfu…
Lotte-Verheyden May 26, 2026
83d65a9
[codex] Add workshop section (#3003)
marcklingen May 26, 2026
13a8b2e
docs(claude-code): add NEW callout for plugin marketplace install (#3…
CodeCLS May 26, 2026
9805fa5
feat(launch-week-5): day 2 — Langfuse agent skill (#2974)
marliessophie May 26, 2026
6e5c134
Add Hermes Agent integration page (#2887)
jannikmaierhoefer May 26, 2026
c183da9
docs(security): credit alcls01111 for SSRF blob storage disclosure (#…
Steffen911 May 27, 2026
dac5ded
feat(launch-week-5): day 3 — Faster search in Fast Mode (#3010)
sumerman May 27, 2026
6865b16
docs: update launch page
jannikmaierhoefer May 27, 2026
4222af9
docs: update launch message
jannikmaierhoefer May 27, 2026
393cff0
docs: update FTS message
jannikmaierhoefer May 27, 2026
573ba12
chore: bump langfuse sdk
hassiebp May 27, 2026
fbca7f2
[codex] Fix formatting on main (#3014)
wochinge May 28, 2026
3fb3c5f
docs(evaluation): restructure evaluation workflow (#2939)
wochinge May 28, 2026
50a99b0
Enable CI on main and manual trigger + add Slack notification (#3015)
bezbac May 28, 2026
5b642ab
fix: Do not initialize PostHog if the key is missing (#3016)
bezbac May 28, 2026
a5cbe50
fix: Disable inkeep if no API key is provided (#3017)
bezbac May 28, 2026
b869255
docs(self-hosting): document AWS SES email transport (#3019)
Steffen911 May 28, 2026
13dd821
feat(launch-week-5): day 4 — Code evaluators (#3006)
wochinge May 28, 2026
4b7ed7e
Added growth hiring process (#3013)
leonardwolters May 28, 2026
546b40a
docs: update code evaluator changelog
jannikmaierhoefer May 28, 2026
9ba473e
fix(notebook-banner): label JS cookbook notebooks as TypeScript (#3021)
Lotte-Verheyden May 28, 2026
7debb0f
docs(agents): add CI format check guidance to AGENTS and cursor rules…
Lotte-Verheyden May 28, 2026
37b1399
chore: move code evaluator creation gif to CDN (#3023)
wochinge May 29, 2026
9d4b72f
docs: update code evals video thumbnail
jannikmaierhoefer May 29, 2026
49b2ae3
feat(launch-week-5): day 5 — Langfuse MCP, expanded (#2988)
bezbac May 29, 2026
5d73841
ci(deps): bump zizmorcore/zizmor-action from 0.5.5 to 0.5.6 in the gi…
dependabot[bot] May 29, 2026
a5318ca
Update Exa integration examples to use search() (#2963)
10ishq Jun 1, 2026
aee1b14
feat(analytics): add Google Ads conversion tracking (#3028)
jannikmaierhoefer Jun 1, 2026
dd45764
docs: update README banner
jannikmaierhoefer Jun 1, 2026
96e7cf9
docs(handbook/support): expand how-to-answer guide as decision tree (…
CodeCLS Jun 1, 2026
e48994f
fix
nimarb Jun 2, 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
27 changes: 27 additions & 0 deletions .agents/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,33 @@ This repository powers the Langfuse website hosted on `langfuse.com`, including
2. Regenerate docs with `bash scripts/update_cookbook_docs.sh`.
3. Do **not** hand-edit generated files in `content/guides/cookbook/`.
4. Avoid `pnpm build` for routine edits or small UI/content changes. Prefer targeted checks or `pnpm dev`, and only run the full production build when it is necessary or explicitly requested.
5. **Always run `pnpm run format` before committing or opening a PR if you edited any file Prettier formats** (see "Passing CI checks on the first try" below). The `format` CI job runs `pnpm run format:check` and fails the build on a single unformatted file.

## Passing CI checks on the first try

CI runs three required checks on every PR. Run these locally before pushing to avoid a re-run cycle:

### 1. Prettier format (`format` job) — this is the check that most often fails

CI runs `pnpm run format:check`. To fix locally, run `pnpm run format` and commit the result.

- Prettier formats: `.js`, `.jsx`, `.mjs`, `.cjs`, `.ts`, `.tsx`, `.json`, `.css`, `.scss`, `.md`, `.mdx`, `.yaml`/`.yml`, `.html`. Any change to one of these — including tiny edits like a one-line tweak to an MDX page, a TSX component, or `next.config.mjs` — can trigger the check.
- Prettier does **not** format files matched by `.prettierignore` (generated cookbook docs in `content/guides/cookbook/**`, `content/workshop/**`, lockfiles, generated assets in `public/`, etc.). Source notebooks (`.ipynb` in `cookbook/`) are also skipped because Prettier has no built-in parser for them.
- Config (`.prettierrc.json`): `proseWrap: "preserve"` (don't reflow Markdown prose), `embeddedLanguageFormatting: "off"` (fenced code blocks are left alone), `trailingComma: "all"`.
- If you touched only files Prettier skips (e.g., a notebook, or a generated file listed in `.prettierignore`), the check will still pass — no need to run format.
- When in doubt, just run `pnpm run format` — it's fast and idempotent.

### 2. H1 heading check (`check_h1` job)

CI runs `node scripts/check-h1-headings.js`. It fails if any `.md`/`.mdx` file contains more than one top-level `# ` heading (code-fenced examples are ignored). Use exactly one H1 per markdown file; deeper sections use `##`, `###`, etc.

### 3. Build + link/sitemap checks (`build-and-check-links`, `check-sitemap-links` jobs)

These run `pnpm build` followed by `pnpm link-check` / `pnpm sitemap-check`. The full build is ~10 minutes — don't run it locally for routine edits. Instead, before pushing:

- Check internal links you added/changed point to real pages or anchors.
- For anchor links (`...#some-id`), make sure the target page defines the anchor explicitly with `[#some-id]` at the end of the heading line.
- If you renamed or moved a page, also update any references and add a redirect in `next.config.mjs` if needed.

## Styling and implementation guidelines

Expand Down
6 changes: 6 additions & 0 deletions .agents/cursor/rules/_general-rules.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,9 @@ alwaysApply: true
## Frontend

- When using tailwindcss, never use explicit colors, always use the default semantic color tokens.

## Before committing or opening a PR

- Run `pnpm run format` if you edited any file Prettier formats (`.js`, `.jsx`, `.mjs`, `.cjs`, `.ts`, `.tsx`, `.json`, `.css`, `.scss`, `.md`, `.mdx`, `.yaml`/`.yml`, `.html`). CI runs `pnpm run format:check` and fails on a single unformatted file — this is the format check that most often fails on the first try.
- Files in `.prettierignore` (`content/guides/cookbook/**`, `content/workshop/**`, generated assets in `public/`, lockfiles) are skipped, as are source notebooks (`.ipynb` in `cookbook/`) since Prettier has no parser for them. If you only touched those, no format step is needed.
- Each `.md`/`.mdx` file must have exactly one H1 (`# `) heading; CI's `check_h1` job rejects multiples.
61 changes: 57 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ name: "CI"
on:
pull_request:
merge_group:
push:
branches:
- main
workflow_dispatch:

jobs:
# Add pre-job to skip duplicate actions in merge queues
Expand All @@ -17,7 +21,8 @@ jobs:
- id: skip_check
uses: fkirc/skip-duplicate-actions@f75f66ce1886f00957d99748a42c724f4330bdcf # v5.3.1
with:
do_not_skip: '["workflow_dispatch"]'
skip_after_successful_duplicate: "true"
do_not_skip: '["workflow_dispatch", "schedule", "merge_group"]'

check_h1:
needs:
Expand Down Expand Up @@ -50,7 +55,7 @@ jobs:
with:
persist-credentials: false

- uses: pnpm/action-setup@8912a9102ac27614460f54aedde9e1e7f9aec20d # v6.0.5
- uses: pnpm/action-setup@0e279bb959325dab635dd2c09392533439d90093 # v6.0.8
with:
version: 9.5.0
run_install: false
Expand Down Expand Up @@ -115,7 +120,7 @@ jobs:
fetch-depth: 0
persist-credentials: false

- uses: pnpm/action-setup@8912a9102ac27614460f54aedde9e1e7f9aec20d # v6.0.5
- uses: pnpm/action-setup@0e279bb959325dab635dd2c09392533439d90093 # v6.0.8
id: pnpm-install
with:
version: 9.5.0
Expand Down Expand Up @@ -164,7 +169,7 @@ jobs:
fetch-depth: 0
persist-credentials: false

- uses: pnpm/action-setup@8912a9102ac27614460f54aedde9e1e7f9aec20d # v6.0.5
- uses: pnpm/action-setup@0e279bb959325dab635dd2c09392533439d90093 # v6.0.8
id: pnpm-install
with:
version: 9.5.0
Expand Down Expand Up @@ -221,3 +226,51 @@ jobs:
if: ${{ contains(needs.*.result, 'failure') }}
run: exit 1
working-directory: .
- name: Notify Slack
if: failure() && github.event_name == 'push' && (github.ref == 'refs/heads/main')
uses: slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3
with:
webhook: ${{ secrets.SLACK_WEBHOOK_URL }}
webhook-type: incoming-webhook
payload: |
{
"text": "❌ CI failed on ${{ github.ref_name }}",
"blocks": [
{
"type": "header",
"text": {
"type": "plain_text",
"text": "❌ CI Failed",
"emoji": true
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Branch:*\n`${{ github.ref_name }}`"
},
{
"type": "mrkdwn",
"text": "*Triggered by:*\n${{ github.actor }}"
}
]
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"text": "View Workflow Logs",
"emoji": true
},
"url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}",
"style": "danger"
}
]
}
]
}
2 changes: 1 addition & 1 deletion .github/workflows/nextjs_bundle_analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
with:
persist-credentials: false

- uses: pnpm/action-setup@8912a9102ac27614460f54aedde9e1e7f9aec20d # v6.0.5
- uses: pnpm/action-setup@0e279bb959325dab635dd2c09392533439d90093 # v6.0.8
id: pnpm-install
with:
version: 9.5.0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
node-version: 22

- name: Setup pnpm
uses: pnpm/action-setup@8912a9102ac27614460f54aedde9e1e7f9aec20d # v6.0.5
uses: pnpm/action-setup@0e279bb959325dab635dd2c09392533439d90093 # v6.0.8
with:
version: "9.5.0"

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/zizmor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
with:
persist-credentials: false
- name: Run zizmor
uses: zizmorcore/zizmor-action@b1d7e1fb5de872772f31590499237e7cce841e8e # v0.5.3
uses: zizmorcore/zizmor-action@5f14fd08f7cf1cb1609c1e344975f152c7ee938d # v0.5.6
with:
advanced-security: ${{ github.event_name == 'push' && 'true' || 'false' }}
min-severity: low
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public/sitemap*.xml
.sitemap-all-pages.json
public/llms*.txt
public/md-src
content/workshop/

# we use pnpm
package-lock.json
Expand Down Expand Up @@ -112,6 +113,7 @@ fabric.properties
.playwright-mcp/
.mcp.json
.claude/settings.json
.claude/settings.local.json
.claude/launch.json
.claude/skills/
.cursor/mcp.json
Expand Down
1 change: 1 addition & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ out
content/guides/cookbook/**
content/guides/cookbook/index.mdx
content/guides/cookbook/meta.json
content/workshop/**
data/generated/contributors.json
pnpm-lock.yaml
public/md-src
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
![GitHub Banner](https://github.com/langfuse/langfuse-docs/assets/2834609/e403ad73-73fa-43f0-9925-292b05ce58de)
<img width="2400" height="600" alt="hero-b" src="https://github.com/user-attachments/assets/382a0209-262d-42b0-8107-e0997c568d13" />

# Langfuse Docs

Expand Down
1 change: 1 addition & 0 deletions app/cloud/[[...path]]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ export default function CloudRegionSelectorPage() {
<a
key={regionKey}
href={href}
data-launch-app-cta=""
onClick={(event) => handleRegionSelect(regionKey, event)}
className="group flex items-center gap-4 px-4 py-4 transition-colors hover:bg-surface-1 sm:px-5"
>
Expand Down
17 changes: 17 additions & 0 deletions app/launch-week-5/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import type { ReactNode } from "react";
import { HomeLayout } from "@/components/layout";

export default function LaunchWeek5Layout({
children,
}: {
children: ReactNode;
}) {
return (
<HomeLayout
showAside={false}
footerClassName="md:max-w-none xl:max-w-none px-4 sm:px-6 md:px-8"
>
{children}
</HomeLayout>
);
}
27 changes: 27 additions & 0 deletions app/launch-week-5/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import type { Metadata } from "next";
import { LaunchWeek5Landing } from "@/components/launch-week-5/LaunchWeek5Landing";
import { buildDefaultSiteOgImageUrl } from "@/lib/og-url";

const ogImageUrl = buildDefaultSiteOgImageUrl();

export const metadata: Metadata = {
title: "Langfuse Launch Week #5",
description:
"Five days, five feature drops, May 25–29, 2026. New building blocks for taking AI from prototype to production — unveiled live at ClickHouse OpenHouse.",
alternates: {
canonical: "https://langfuse.com/launch-week-5",
},
// Next.js replaces (not deep-merges) openGraph across segments, so the root
// layout's default `images` is dropped unless re-supplied here.
openGraph: {
title: "Langfuse Launch Week #5",
description:
"Five days, five feature drops, May 25–29, 2026. Live demos at ClickHouse OpenHouse.",
url: "https://langfuse.com/launch-week-5",
images: [{ url: ogImageUrl }],
},
};

export default function LaunchWeek5Page() {
return <LaunchWeek5Landing />;
}
2 changes: 2 additions & 0 deletions app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ const f37Analog = localFont({
weight: "500",
});
import { Hubspot } from "@/components/analytics/hubspot";
import { GoogleAds } from "@/components/analytics/google-ads";
import "../style.css";
import "@vidstack/react/player/styles/base.css";
import "../src/overrides.css";
Expand Down Expand Up @@ -90,6 +91,7 @@ export default function RootLayout({
{process.env.NODE_ENV === "production" && (
<>
<GoogleTagManager gtmId="GTM-NGLK4TZX" />
<GoogleAds />
<Hubspot />
<Script
id="cookieyes"
Expand Down
77 changes: 77 additions & 0 deletions app/workshop/[[...slug]]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import type { Metadata } from "next";
import { DocsBody, DocsPage } from "fumadocs-ui/page";
import { notFound, redirect } from "next/navigation";
import { workshopSource } from "@/lib/source";
import { DocsChromePage } from "@/components/DocsChromePage";
import { buildSectionMetadata } from "@/lib/mdx-page";
import { WORKSHOP_DEFAULT_CHAPTER } from "@/lib/workshop-config.js";

type PageProps = {
params: Promise<{ slug?: string[] }>;
};

function redirectFolderIndexes(slug: string[]) {
if (slug.length !== 1) return;
if (slug[0] === "learner")
redirect(`/workshop/learner/${WORKSHOP_DEFAULT_CHAPTER}`);
if (slug[0] === "instructor")
redirect(`/workshop/instructor/${WORKSHOP_DEFAULT_CHAPTER}`);
}

function hasWorkshopContent() {
return workshopSource.getPages().length > 0;
}

function WorkshopContentUnavailablePage() {
return (
<DocsPage
toc={[]}
tableOfContent={{ enabled: false }}
footer={{ enabled: false }}
>
<DocsBody className="flex-1">
<h1>Workshop content is not available</h1>
<p>
Workshop pages are generated locally from the public{" "}
<code>langfuse/langfuse-workshop</code> repository and are not checked
into this repository.
</p>
<p>Run this command, then refresh the page:</p>
<pre>
<code>pnpm workshop:sync</code>
</pre>
</DocsBody>
</DocsPage>
);
}

export default async function WorkshopPage({ params }: PageProps) {
const { slug = [] } = await params;
if (!hasWorkshopContent()) return <WorkshopContentUnavailablePage />;

redirectFolderIndexes(slug);

const page = workshopSource.getPage(slug);
if (!page) notFound();
return <DocsChromePage page={page} />;
}

export async function generateMetadata({
params,
}: PageProps): Promise<Metadata> {
const { slug = [] } = await params;
if (!hasWorkshopContent()) {
return {
title: "Workshop content is not available",
description: "Run pnpm workshop:sync to generate workshop pages locally.",
};
}

const page = workshopSource.getPage(slug);
if (!page) return { title: "Not Found" };
return buildSectionMetadata(page, "workshop", "Workshop", slug);
}

export function generateStaticParams() {
return workshopSource.generateParams();
}
17 changes: 17 additions & 0 deletions app/workshop/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { workshopSource } from "@/lib/source";
import { SharedDocsLayout } from "@/components/layout";

export default function WorkshopLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<SharedDocsLayout
tree={workshopSource.getPageTree()}
sectionLabel="Workshop"
>
{children}
</SharedDocsLayout>
);
}
7 changes: 7 additions & 0 deletions components-mdx/self-host-features.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
Mail,
ServerCog,
Activity,
Code,
Eye,
Zap,
ShieldCheck,
Expand All @@ -34,6 +35,12 @@ import {
href="/self-hosting/configuration/caching"
arrow
/>
<Cards.Card
icon={<Code size="24" />}
title="Code evaluators"
href="/self-hosting/configuration/code-evaluators"
arrow
/>
<Cards.Card
icon={<Route size="24" />}
title="Custom Base Path"
Expand Down
Loading
Loading