Files
Oleg Isonen d78e770d82 perf: Keep article indexing out of publish API requests (#6427)
Ref #6416

The publish workflow was doing too much work in one short-lived API
request. This moves content indexing into the build runner and keeps
article bodies out of hosted/SSR sync.

## What changed

- The build-bundle API can return the lightweight project bundle without
preparing a full content index.
- The CLI downloads required assets directly from storage and builds the
index locally for SSG. Asset downloads remain bounded to 10 concurrent
requests.
- Hosted/SSR sync skips Markdown and MDX article downloads and does not
compile an article index. It still downloads regular assets needed by
the build.
- Markdown body queries use stored frontmatter and fetch only the
requested article at runtime. MDX still needs source downloads and
compilation for SSG.
- Public MCP and content-engine docs explain the Markdown/MDX tradeoff.

This removes article parsing and article-body transfer from the tRPC
request. SSG still downloads article sources from storage and compiles
MDX in the build runner. Hosted runtime article reads remain on demand.

## Checklist

- [x] Keep the tRPC bundle request limited to project metadata and
necessary records.
- [x] Prepare SSG content indexes in the build runner; keep hosted
article bodies out of sync.
- [x] Cover no-body query preparation, direct asset reads, and
SSG-versus-hosted sync behavior with regression tests.
- [x] Update public CLI, MCP, and content-engine guidance.
- [x] Regenerate and verify fixtures.
- [x] Run workspace tests, typechecks, lint, formatting,
package-boundary, generated API/docs, and fixture-size checks.
- [ ] Verify the deployed publish flow has comfortable margin below the
hosted API timeout.

## Verification

- `pnpm -r --workspace-concurrency=1 test`: passed, including all 3,082
Builder tests and 1,150 CLI tests.
- `pnpm -r typecheck`, `pnpm lint`, `pnpm check:package-boundaries`,
`pnpm check:generated-api`, `pnpm check:generated-docs`, `pnpm
check:fixture-sizes`, and `pnpm exec oxfmt --check`: passed.
- The new hosted article-download regression test was confirmed to fail
with the old behavior and pass after the fix.
- A deployed end-to-end publish timing check is still needed, so this PR
remains draft.
2026-09-26 11:56:37 +02:00
..

🧩 Core Components

Layout

{% content-ref url="element.md" %} element.md {% endcontent-ref %}

{% content-ref url="slot.md" %} slot.md {% endcontent-ref %}

{% content-ref url="separator.md" %} separator.md {% endcontent-ref %}

Typography

{% content-ref url="text.md" %} text.md {% endcontent-ref %}

{% content-ref url="heading.md" %} heading.md {% endcontent-ref %}

{% content-ref url="paragraph.md" %} paragraph.md {% endcontent-ref %}

{% content-ref url="inline-text.md" %} inline-text.md {% endcontent-ref %}

{% content-ref url="blockquote.md" %} blockquote.md {% endcontent-ref %}

{% content-ref url="code-text.md" %} code-text.md {% endcontent-ref %}

Navigation

{% content-ref url="link.md" %} link.md {% endcontent-ref %}

{% content-ref url="button.md" %} button.md {% endcontent-ref %}

Media

{% content-ref url="image.md" %} image.md {% endcontent-ref %}

{% content-ref url="video.md" %} video.md {% endcontent-ref %}

{% content-ref url="vimeo.md" %} vimeo.md {% endcontent-ref %}

{% content-ref url="vimeo-background-video.md" %} vimeo-background-video.md {% endcontent-ref %}

{% content-ref url="youtube.md" %} youtube.md {% endcontent-ref %}

Forms

{% content-ref url="form.md" %} form.md {% endcontent-ref %}

{% content-ref url="webhook-form.md" %} webhook-form.md {% endcontent-ref %}

{% content-ref url="input.md" %} input.md {% endcontent-ref %}

{% content-ref url="textarea.md" %} textarea.md {% endcontent-ref %}

{% content-ref url="label.md" %} label.md {% endcontent-ref %}

{% content-ref url="checkbox.md" %} checkbox.md {% endcontent-ref %}

{% content-ref url="radio-button.md" %} radio-button.md {% endcontent-ref %}

{% content-ref url="select.md" %} select.md {% endcontent-ref %}

Data

{% content-ref url="list.md" %} list.md {% endcontent-ref %}

{% content-ref url="collection.md" %} collection.md {% endcontent-ref %}

{% content-ref url="content-embed.md" %} content-embed.md {% endcontent-ref %}

{% content-ref url="content-block.md" %} content-block.md {% endcontent-ref %}

Embeds

{% content-ref url="html-embed.md" %} html-embed.md {% endcontent-ref %}

{% content-ref url="markdown-embed.md" %} markdown-embed.md {% endcontent-ref %}

Animation

{% content-ref url="animation-group.md" %} animation-group.md {% endcontent-ref %}

{% content-ref url="text-animation.md" %} text-animation.md {% endcontent-ref %}

{% content-ref url="video-animation.md" %} video-animation.md {% endcontent-ref %}

{% content-ref url="stagger-animation.md" %} stagger-animation.md {% endcontent-ref %}

Head / SEO

{% content-ref url="head-slot.md" %} head-slot.md {% endcontent-ref %}

{% content-ref url="json-ld.md" %} 🏷️ JSON-LD {% endcontent-ref %}

XML / Localization

{% content-ref url="xml-node.md" %} xml-node.md {% endcontent-ref %}

{% content-ref url="time.md" %} time.md {% endcontent-ref %}