Skip to content

docs(compose): split compose into a group of learn and reference pages - #100

Merged
a-essawy merged 16 commits into
mainfrom
docs/compose-release-rewrite
Sep 24, 2026
Merged

a-essawy merged 16 commits into
mainfrom
docs/compose-release-rewrite

Conversation

@a-essawy

@a-essawy a-essawy commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Do not merge until the compose release ships. These pages document the timeline shape on feat/compose-revamp in the monorepo, which is not on main and not deployed. Merging early would publish docs for an API that is not live.

What changed

jobs/compose.mdx was one page of 970 lines and 44 sections, the largest on the site by a factor of three, and the page a migrating Shotstack customer lands on. It is now a group: an overview, 11 learn pages, and 13 reference pages generated from the schema the API validates with. The docs went from 35 pages to 59.

The learn pages teach the shape the next release ships, which the old page did not: one ordered effects list on a clip, a track or the timeline; keyframes as their own section with all 33 easings; one transform that places every clip including text and shapes; timers, subtitles, Lottie, masks, LUTs, output.range, a transparent background and the free validate endpoint; all six transitions.

Every feature is shown, not described

93 video clips across the group, 77 of them before-and-after pairs, one for each compose feature. They are rendered locally through the same melt image the render lane runs, uploaded to cdn.rendobar.com/compose/showcase/, and pinned by a drift test in the monorepo that fails if a demo is edited without a re-render or if a demo request contains anything the render would ignore.

The eleven sound demos cannot be judged by eye, so they were verdicted by measurement (ebur128 and astats, before and after) against what each one claims. That caught a compressor that was not compressing at its documented defaults.

Verification

  • Every JSON example run through the API's own validateComposeDocument: no refusals, no warnings, nothing in the old shape. It caught a documented transition field on an ordinary clip that does not exist.
  • All five repo validators pass: frontmatter (59 files), nav and redirects (59 pages, 59 nav entries, 24 redirects), plan limits, the webhooks contract (36/36), template links.
  • All 186 showcase media URLs referenced by these pages return 200.

Nav

The Compose group uses root: "jobs/compose", so clicking the parent opens the overview the way the Captions group does, and each generated reference entry is labelled by what it lists rather than repeating the learn page's label above it. scripts/validate-nav-and-redirects.mjs now counts a group's root as a nav entry; it previously reported that page as an orphan.

Still owed, separately

Nothing on this page set. The MCP page already carries validate_compose and the effect argument on list_job_types (mcp-server.mdx, in this PR). Notes for bringing the other 34 pages up to this standard are in the monorepo at docs/plans/docs-revamp-all.md.

Merges only once the compose API is live, after rendobar/rendobar#792.

The page taught the pre-release timeline: per-clip `color`, `blur`,
`chromaKey` and `filter` fields, `animateTo` for movement, shapes that
placed themselves with their own `position`, `size` and `anchor`, and
`output.frameTime` for a still. Ten of the twelve complete examples on
it used at least one field that has moved.

It now teaches one `effects` list on a clip, a track or the timeline,
keyframes with 33 easings on anything that moves, and one `transform`
that places every clip including text and shapes. New sections cover
timers, subtitles from cues or an .srt file, Lottie animations, masks
and LUTs, the `engine` entry, `output.range`, a transparent background,
and the free `validate` endpoint. The transition table carries all six
kinds, with wipes by shape or by your own greyscale map.

Every JSON example was run through the API's own validator: 30 of them,
no refusals, no warnings, nothing left in the old shape. That caught
three examples I had written wrong, including an engine parameter that
takes a number and a transparent background on mp4, which has no alpha.
Both ship with the compose release: a free dry run of a compose submit,
and reading one effect's parameters instead of the whole reference.
…reference

One page of 970 lines becomes eleven learn pages and thirteen generated
reference pages, matching how Creatomate and JSON2Video both organise this:
one reference page per asset kind. jobs/compose stays the overview so every
existing link to it still works.

The reference pages are generated from the schema the API validates with, so a
field table cannot drift from what a render accepts. Effect and transition
demos play the before and after clips already on the CDN.

Both groups are marked expanded, so opening a reference page no longer folds
the rest of the section away.
The before and after pair on that page was the engine escape-hatch demo, which
renders frei0r.cartoon, captioned as a keyframed scale. That is why the result
looked flat and low quality: it was a cartoon filter, not a Ken Burns push.

No keyframe demo exists in the showcase set, so the page teaches from the JSON
until one is rendered. A wrong clip is worse than no clip. Also removes a lead
that repeated the section's own opening line.
These pages are for a quick explanation and a look at the result, not a second
reference. Three of them carried no picture at all.

Motion gets a real Ken Burns demo, rendered through the compiler a job uses:
a still photograph scaled 1 to 1.15 with easeInOutSine, beside the untouched
still. Text gets the timer, subtitles and Lottie clips, which were already
rendered and sitting unused. Timeline gets a diagram of the music-bed example,
because length "end" is the hardest thing on that page to picture from prose.
fonts proves the claim it makes: a display family on the headline, Arabic and
Devanagari shaping through the bundled fallbacks with no font file uploaded.

output gains the fit comparison, a wide photograph in a phone-shaped box, which
is the framing question readers actually get wrong.
A vertical render with the title clipped at the top and the caption jammed at
the bottom, beside the same two lines inside the safe area. The last learn page
without a picture now has one.
Position, anchor, scale, size, rotate, flip, crop, rounded corners, corner pin,
opacity and speed, each one before and after on the same shot. Twelve fields
were documented in a table and shown nowhere.
The page was mixing six clips from an older prefix that nothing validates with
two from the drift-tested demo set. Every clip on it now comes from the demo
set, and all seven kinds join the same two shots so they can be compared.
Stroke, shadow and a box, ordered by how much each changes the look, plus
alignment and an entrance. Five fields that were described and never shown.
Kinds, gradient, outline with a real hole, radius, softness, shadow and paths.
Thirteen clips from the drift-tested demo set, beside the six composed pattern
examples the page already had.
…transition shape

The page described a transition field on a clip and showed JSON for it. No such
field exists: a transition is a clip placed between the two it joins, and the
property is transition rather than kind. Corrected on the page, in the example
and in the generated reference.
Every media block on every compose page now comes from the drift-tested demo
set. The four transition clips on the overview, four colour clips on effects,
one on output and one on text all duplicated demos that now exist, and the
shapes lead's row of six became a lower third and a progress bar of their own.
Twenty-five always-visible entries was too many. The twelve learn pages stay
open and the thirteen generated reference pages sit behind one line. Mintlify
opens a collapsed group when the active page is inside it, so landing on a
reference page still shows its siblings.
…nce entry

Two halves of the same nav bug. Clicking the Compose parent did nothing and
selecting a child never held its highlight.

`jobs/compose` is now the group's `root`, so the parent row opens the overview
the way the Captions group does. The structural validator counted only `pages`
entries, so a group with a `root` reported its own landing page as an orphan;
it now counts `root` as a nav entry.

The generated reference entries had labels identical to the learn pages above
them ("Timeline" twice, "audio" twice). Mintlify highlights by label, so one
group with two identical entries reads as a single selection. Each one now says
what it lists. The regen also picks up the reworded `textStyle.animate`
description from the schema.
The rulebook bans "not just X" as an AI rhetorical tell. The sentence reads
stronger without it.
@a-essawy a-essawy changed the title docs(compose): rewrite the page for the shape the next release ships docs(compose): split compose into a group of learn and reference pages Sep 24, 2026
@a-essawy
a-essawy merged commit 3146fe2 into main Sep 24, 2026
1 check passed
@a-essawy
a-essawy deleted the docs/compose-release-rewrite branch September 24, 2026 13:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant