Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Converts draft customer-story Markdown into Langfuse website MDX (Fumadocs), collects missing metadata and assets, wires meta.json and authors. Use when adding or converting a customer case study, user story, or /users page, or when the user mentions customer story setup, cresta/canva-style posts, or CustomerStoryCTA/BlogHeader for customers.
.claude/skills/langfuse-customer-story-setup/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 45% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 710% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 133% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 41% | 0% |
> Single source of truth: maintain this skill under > .agents/skills/customer-story-setup/ only. Claude and Cursor load > projected copies under .claude/skills/customer-story-setup and > .cursor/skills/customer-story-setup.
Turns a plain Markdown draft into content/customers/<slug>.mdx in the same pattern as content/customers/canva.mdx and cresta.mdx.
Do not guess. If any item below is missing from the user's draft or message, ask explicitly and wait for answers (or confirm defaults).
| Topic | Ask | | --------------------- | ----------------------------------------------------------------------------------------- | | Company name | Legal/marketing name for copy and quotes | | Company website | Public URL for the [Company](https://...) link in About <Company> | | Slug | Filename: <slug>.mdx (lowercase, hyphens), e.g. cresta -> cresta.mdx | | Page title | H1 string for BlogHeader + YAML title (often "How <Company> ... with Langfuse") | | Short description | YAML description + BlogHeader description (SEO/social; 1-2 sentences) | | Publish date | YAML date + BlogHeader date (e.g. March 26, 2026) | | OG image | Optional ogImage: path; if unset, leave empty like other stories |
authors={["..."]})| Topic | Ask | | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Byline author(s) | Who should appear under the title (keys from data/authors.json) | | External / guest speaker | If not in authors.json: collect name, title, optional socials, and headshot path under public/images/people/ or public/images/customers/<slug>/, then add an entry to data/authors.json (see existing entries). Every authors key must resolve in authors.json. |
| Topic | Ask | | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | Logos | Paths for customerLogo and customerLogoDark (light + dark mode), usually under public/images/customers/<slug>/ | | Pull quote | customerQuote (short, for grid card) | | Quote attribution | quoteAuthor, quoteRole, quoteCompany | | Speaker headshot (optional) | quoteAuthorImage for card/SEO if you use the same as Canva | | Show on /users | showInCustomerIndex: true \| false |
Produce a numbered checklist for the user (and keep it in the PR description if useful):
public/images/customers/<slug>/<Frame fullWidth> around markdown images, e.g.  per site conventionssips -g pixelWidth -g pixelHeight <file> to get dimensions):<div className="flex justify-center"><Frame fullWidth className="w-1/2">...</Frame></div><div className="flex justify-center"><Frame fullWidth className="w-2/3">...</Frame></div><Frame fullWidth className="w-full">...</Frame> (no centering wrapper needed)If the draft says "screenshot here" without files, list placeholders in MDX with consistent paths so the user can drop files in later.
Ask whether to add sparse internal links. Default policy: only link major product concepts (match what we used on Cresta):
Do not pepper every noun with links. Use paths from llms-docs.txt / available-internal-links rule so links resolve.
title, date, description, ogImage,tag: customer-story, author (display string if needed), customerLogo, customerLogoDark, optional quote fields, showInCustomerIndex.
BlogHeader, CustomerQuote (if quote), ImpactChart (ifimpact section), CustomerStoryCTA; use Frame for images (global in MDX).
BlogHeader: title, description, customerLogo, authors, date;optional image for hero.
BlogHeader). Body uses## and ###; do not skip levels.
<CustomerQuote quote="..." name="..." role="..." company="..." />role / company with frontmatter so the byline reads "Name, Role at Company"rolew-1/2 centeredw-2/3 centeredw-full<ImpactChart items={[{ area, impact }, ...]} /> (optional)then <CustomerStoryCTA />.
Reference implementations: content/customers/canva.mdx, content/customers/cresta.mdx.
content/customers/meta.json"<slug>" to the pages array (with "index" first).sorted by sortCustomerStoriesByMetaOrder in lib/sortCustomerStoriesByMeta.ts, which reads this list. Place the slug where the card should appear (e.g. last in the list = bottom-right in a 2-column grid).
data/authors.json (key must match BlogHeaderauthors).
public/images/customers/<slug>/.with add-customer-to-user-list so the Reference cell is [User Story](/users/<slug>).
authors keys exist in data/authors.jsonmeta.json includes slug in desired order-) - the linter will do this anyway; better to do it upfrontAGENTS.md / documentation-pages.mdc: one H1 via BlogHeader, American English, accessible alt textyaml--- title: "..." date: ... description: ... ogImage: tag: customer-story author: ... customerLogo: "/images/customers/<slug>/...-light.png" customerLogoDark: "/images/customers/<slug>/...-dark.png" customerQuote: "..." quoteAuthor: "..." quoteRole: "..." quoteCompany: "..." showInCustomerIndex: true ---
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-11 | fail→pass | 11,475 | 2,598 | -77% | 1 | 1 | 0% | 1,826 | 2,639 | +45% | 0 | 0 | — |
case-01 | fail→pass | 2,765 | 8,535 | +209% | 1 | 1 | 0% | 378 | 3,061 | +710% | 0 | 0 | — |
case-02 | fail→fail | 17,429 | 5,762 | -67% | 1 | 1 | 0% | 3,307 | 3,283 | -1% | 0 | 0 | — |
case-03 | fail→fail | 10,436 | 8,826 | -15% | 1 | 1 | 0% | 2,011 | 3,625 | +80% | 0 | 0 | — |
case-04 | fail→fail | 9,355 | 2,006 | -79% | 1 | 1 | 0% | 1,571 | 2,586 | +65% | 0 | 0 | — |
case-05 | pass→pass | 10,415 | 2,866 | -72% | 1 | 1 | 0% | 1,821 | 2,628 | +44% | 0 | 0 | — |
case-12 | fail→pass | 6,273 | 1,837 | -71% | 1 | 1 | 0% | 1,052 | 2,452 | +133% | 0 | 0 | — |
case-06 | fail→fail | 11,929 | 2,747 | -77% | 1 | 1 | 0% | 2,187 | 2,723 | +25% | 0 | 0 | — |
case-07 | fail→pass | 14,552 | 3,100 | -79% | 1 | 1 | 0% | 2,318 | 2,850 | +23% | 0 | 0 | — |
case-08 | fail→pass | 10,237 | 2,427 | -76% | 1 | 1 | 0% | 1,891 | 2,660 | +41% | 0 | 0 | — |
case-09 | fail→pass | 8,497 | 4,503 | -47% | 1 | 1 | 0% | 1,555 | 3,065 | +97% | 0 | 0 | — |
case-10 | fail→pass | 12,387 | 2,025 | -84% | 1 | 1 | 0% | 2,126 | 2,516 | +18% | 0 | 0 | — |
case-13 | fail→pass | 7,664 | 2,509 | -67% | 1 | 1 | 0% | 1,340 | 2,641 | +97% | 0 | 0 | — |
case-14 | fail→pass | 6,760 | 2,840 | -58% | 1 | 1 | 0% | 1,186 | 2,701 | +128% | 0 | 0 | — |
case-15 | fail→pass | 7,997 | 1,022 | -87% | 1 | 1 | 0% | 1,388 | 2,346 | +69% | 0 | 0 | — |
case-16 | pass→pass | 8,150 | 2,299 | -72% | 1 | 1 | 0% | 1,518 | 2,594 | +71% | 0 | 0 | — |
case-22 | pass→pass | 17,514 | 11,409 | -35% | 1 | 1 | 0% | 3,314 | 4,293 | +30% | 0 | 0 | — |
case-17 | pass→pass | 11,245 | 4,675 | -58% | 1 | 1 | 0% | 1,802 | 2,868 | +59% | 0 | 0 | — |
case-18 | fail→pass | 12,381 | 1,721 | -86% | 1 | 1 | 0% | 2,039 | 2,500 | +23% | 0 | 0 | — |
case-19 | fail→pass | 5,333 | 2,374 | -55% | 1 | 1 | 0% | 992 | 2,618 | +164% | 0 | 0 | — |
case-20 | fail→pass | 13,105 | 6,286 | -52% | 1 | 1 | 0% | 2,219 | 3,361 | +51% | 0 | 0 | — |
case-21 | pass→pass | 10,019 | 5,732 | -43% | 1 | 1 | 0% | 1,975 | 3,253 | +65% | 0 | 0 | — |
case-23 | pass→pass | 10,208 | 3,105 | -70% | 1 | 1 | 0% | 1,735 | 2,692 | +55% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +57 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.