From 592ea548ab9e493e1e54477720594b7ec7507b8e Mon Sep 17 00:00:00 2001 From: Abdelrahman Essawy Date: Fri, 18 Sep 2026 08:16:11 +0300 Subject: [PATCH] docs: serve a docs home page at /docs /docs answered with two chained 308s to /docs/quickstart, so every link from the marketing site landed on a redirect chain and Google had no 200 page to hang a "Docs" sitelink on. Mintlify serves a folder's index.mdx at the folder itself (storage/index.mdx is /docs/storage), so a root index.mdx serves /docs directly. - index.mdx: hub page linking every section, answer-first intro - validate-frontmatter: the root index canonical is /docs, not /docs/index - add-canonical: strip /index the same way. It never did, so a re-run would have written /docs/storage/index over the two existing folder indexes --- docs.json | 1 + index.mdx | 70 ++++++++++++++++++++++++++++++++ scripts/add-canonical.mjs | 5 ++- scripts/validate-frontmatter.mjs | 7 ++-- 4 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 index.mdx diff --git a/docs.json b/docs.json index 957a618..e15ba56 100644 --- a/docs.json +++ b/docs.json @@ -27,6 +27,7 @@ { "group": "Getting Started", "pages": [ + "index", "quickstart", "build-with-ai" ] diff --git a/index.mdx b/index.mdx new file mode 100644 index 0000000..9792a34 --- /dev/null +++ b/index.mdx @@ -0,0 +1,70 @@ +--- +title: "Docs for the media processing API" +sidebarTitle: "Overview" +description: "Start with the quickstart, then browse job types, storage connections, automation platforms, and the SDK, CLI and MCP server." +icon: "book-open" +keywords: ["rendobar docs", "rendobar documentation", "media processing api docs", "video api documentation", "ffmpeg api docs"] +canonical: "https://rendobar.com/docs" +--- + +Rendobar runs media jobs on our infrastructure and hands back a finished file. You POST a job with your inputs, we execute it on isolated cloud workers, and you collect the output by webhook or by polling. One endpoint covers raw FFmpeg, media inspection, timeline composition, compression, captions, and image generation. + + + + Submit your first job, poll it to completion, and download the result. + + + Hand your coding agent one prompt and let it write the integration. + + + +## How a job works + +Every job shares the same shape, whatever its type. Read [how a job works](/concepts/job) for the lifecycle and the output contract, [scopes and access](/concepts/scopes) for what an API key is allowed to do, and [credits](/concepts/credits) for how work is billed. + +Results arrive two ways: [webhooks](/guides/webhooks) for signed delivery to your endpoint, or [callbacks](/guides/callbacks) when you want the job to call your own service. + +## Job types + + + + Run any FFmpeg command in a sandbox, with guardrails. + + + Probe media metadata from a URL, normalized plus raw. + + + Render video from a declarative JSON timeline. + + + Shrink a file to a target size or quality budget. + + + Burn static subtitles or animate word-level captions. + + + Generate, edit and upscale images on hosted models. + + + +## Bring your own storage + +Connect a bucket you own and jobs read inputs from it and write outputs back, so your files never need to be public. Start at [storage connections](/storage), then pick your provider: [Cloudflare R2](/storage/cloudflare-r2), [Amazon S3](/storage/amazon-s3), [Supabase](/storage/supabase), or any [S3-compatible](/storage/s3-compatible) bucket. + +## Automation and tooling + + + + Run jobs from n8n or Activepieces, no code required. + + + TypeScript SDK, plus the rb command line tool. + + + Let Claude, Cursor and other agents run jobs directly. + + + +## When something goes wrong + +Check the [FAQ](/support/faq) first, then [error codes](/support/errors) to handle failures by machine code rather than message text. [Limits](/support/limits) covers plan caps, and [versioning](/support/versioning) covers how the API changes. diff --git a/scripts/add-canonical.mjs b/scripts/add-canonical.mjs index a8a25f6..6f87f96 100644 --- a/scripts/add-canonical.mjs +++ b/scripts/add-canonical.mjs @@ -31,8 +31,9 @@ for (const file of walkMdx(ROOT)) { if (lines[0] !== '---') { console.error(`SKIP no frontmatter: ${file}`); continue; } const close = lines.indexOf('---', 1); if (close === -1) { console.error(`SKIP unterminated frontmatter: ${file}`); continue; } - const slug = relative(ROOT, file).replace(/\\/g, '/').replace(/\.mdx$/, ''); - const canonical = `canonical: "${BASE}${slug}"`; + // An index.mdx is served at its folder, and the root index.mdx at /docs itself. + const slug = relative(ROOT, file).replace(/\\/g, '/').replace(/\.mdx$/, '').replace(/(^|\/)index$/, ''); + const canonical = `canonical: "${slug ? BASE + slug : BASE.replace(/\/$/, '')}"`; const existing = lines.findIndex((l, i) => i > 0 && i < close && l.startsWith('canonical:')); if (existing !== -1) { if (lines[existing] === canonical) continue; diff --git a/scripts/validate-frontmatter.mjs b/scripts/validate-frontmatter.mjs index 31cf382..5c16a12 100644 --- a/scripts/validate-frontmatter.mjs +++ b/scripts/validate-frontmatter.mjs @@ -153,9 +153,10 @@ function validate(filePath, fm, violations) { } // --- Canonical checks --- - // A folder's index.mdx is served at the folder itself: storage/index.mdx is /docs/storage. - const expectedCanonical = - 'https://rendobar.com/docs/' + rel.replace(/\\/g, '/').replace(/\.mdx$/, '').replace(/\/index$/, ''); + // A folder's index.mdx is served at the folder itself: storage/index.mdx is /docs/storage, + // and the ROOT index.mdx is /docs with no trailing segment at all. + const slug = rel.replace(/\\/g, '/').replace(/\.mdx$/, '').replace(/(^|\/)index$/, ''); + const expectedCanonical = 'https://rendobar.com/docs' + (slug ? '/' + slug : ''); if (!fm.canonical) { violations.push({ file: rel, field: 'canonical',