From 5b01e97247a0b967be017ad9b1b48f8a3be82ad2 Mon Sep 17 00:00:00 2001 From: Abdelrahman Essawy Date: Sun, 24 May 2026 07:06:31 +0300 Subject: [PATCH 1/5] chore(docs): remove publicly-leaked internals (CLAUDE.md, superpowers/) --- CLAUDE.md | 142 ------------- credits.mdx | 72 ------- .../2026-04-25-cli-docs-section-design.md | 192 ------------------ 3 files changed, 406 deletions(-) delete mode 100644 CLAUDE.md delete mode 100644 credits.mdx delete mode 100644 superpowers/specs/2026-04-25-cli-docs-section-design.md diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 6ac371b..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,142 +0,0 @@ -# Rendobar Docs - -> Mintlify docs site. Sole content surface for `rendobar.com/docs/*` (proxied -> from `rendobar.com` Astro site to this Mintlify deployment). - ---- - -## CROSS-REPO BRAND CONSISTENCY - -This repo is part of the broader Rendobar platform. The canonical reference -for brand strings, URLs, metadata conventions, and entity rules lives in the -apex monorepo at `rendobar/rendobar` `.claude/rules/brand-consistency.md`. - -You can read it here: -https://github.com/rendobar/rendobar/blob/main/.claude/rules/brand-consistency.md - -The critical rules are also embedded below so you don't need to context-switch. -**If anything in this file conflicts with the apex rule file, the apex rule -file wins** — open a PR there to update it, then mirror the change here. - ---- - -## Canonical brand strings (these MUST match apex) - -| Field | Value | -|---|---| -| Display name | `Rendobar` | -| Slogan | `Serverless media processing API` | -| Apex URL | `https://rendobar.com` | -| Apex page URLs | `https://rendobar.com//` (always trailing slash) | -| API URL | `https://api.rendobar.com` | -| Dashboard URL | `https://app.rendobar.com` | -| CDN URL | `https://cdn.rendobar.com` | -| Twitter handle | `@rendobar` | -| Locale | `en_US` | -| OG image (universal) | `https://rendobar.com/brand/og-default.jpg` (1200×630 JPG) | -| Theme color (light) | `#FFFFFF` | -| Theme color (dark) | `#0A0A0A` | - -**Forbidden variants**: `Rendobar.com`, `the Rendobar platform`, `rendobar` -(lowercase except in URLs), `https://www.rendobar.com`, `http://rendobar.com`, -apex page links without a trailing slash. - ---- - -## Mintlify-specific rules - -### Title rules (per-page MDX frontmatter) - -Mintlify auto-appends ` - Rendobar` (hyphen) to every page's ``. We -accept this cosmetic separator difference vs the apex em-dash because forking -Mintlify isn't worth it. Everything else stays consistent. - -| Rule | Why | -|---|---| -| `title:` is sentence-case subject ONLY (12–48 chars) | Mintlify produces `<subject> - Rendobar` | -| **NEVER prefix `title` with `Rendobar`** | Produces double-brand `Rendobar CLI - Rendobar` | -| **NEVER include `&`, use `and`** | Sentence case + AI parsers prefer `and` | -| Use `sidebarTitle:` for short nav labels when SEO title is long | e.g. `title: "Frequently asked questions"` + `sidebarTitle: "FAQ"` | -| **NEVER use ALL CAPS, emojis, year-stuffing, or trailing punctuation** | (same as apex) | -| Acronyms (FFmpeg, API, MCP, GDPR, SRT, VTT, CI/CD) keep their case | Sentence case rule allows this | - -### Description rules (per-page MDX frontmatter) - -Identical to apex: -- 100–160 characters -- Sentence case -- No brand prefix (`Rendobar` is in `<title>`) -- No CTAs (`Learn more`, `Try free`) -- Declarative, front-loaded value prop - -### Site-wide metadata (`docs.json`) - -Lives in `seo.metatags`. Required keys (must match apex): -```json -{ - "og:type": "website", - "og:site_name": "Rendobar", - "og:locale": "en_US", - "og:image": "https://rendobar.com/brand/og-default.jpg", - "og:image:width": "1200", - "og:image:height": "630", - "og:image:alt": "Rendobar — Serverless media processing API", - "og:image:type": "image/jpeg", - "twitter:card": "summary_large_image", - "twitter:site": "@rendobar", - "robots": "index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" -} -``` - -### Apex links in `docs.json` (nav, footer, anchors) - -Apex Astro is configured with `trailingSlash: "always"`. Every link to an -`https://rendobar.com/<path>` URL **must end with `/`**. Validator on apex -rejects anything else. Examples: -- ✅ `https://rendobar.com/blog/`, `https://rendobar.com/pricing/`, `https://rendobar.com/terms/` -- ❌ `https://rendobar.com/blog`, `https://rendobar.com/pricing` - -(The apex root `https://rendobar.com` itself has no trailing slash — that's -the only exception. Subdomains like `app.rendobar.com` and `api.rendobar.com` -are separate origins and don't follow this rule.) - -### Sentence case for footer labels - -Match apex page titles: -- ✅ "Terms of service", "Privacy policy", "Pricing", "Dashboard" -- ❌ "Terms of Service", "Privacy Policy" - ---- - -## Audit script - -Quick frontmatter sanity check from this repo's root: - -```bash -for f in $(find . -name "*.mdx" -not -path "./node_modules/*" -not -path "./snippets/*"); do - title=$(awk '/^title:/{sub(/^title: */, ""); gsub(/"/, ""); print; exit}' "$f") - desc=$(awk '/^description:/{sub(/^description: */, ""); gsub(/"/, ""); print; exit}' "$f") - tlen=${#title}; dlen=${#desc} - flag="" - [ "$dlen" -lt 100 ] || [ "$dlen" -gt 160 ] && flag="${flag}DESC!" - [[ "$title" == *"Rendobar"* ]] && [[ "$f" != *"changelog"* ]] && flag="${flag}DBL-BRAND!" - [ "$tlen" -lt 8 ] && flag="${flag}THIN!" - printf "%-45s T=%-3d D=%-3d %s %s\n" "$f" "$tlen" "$dlen" "$flag" "$title" -done -``` - -A clean run shows no flags. Run before committing changes that touch frontmatter. - ---- - -## Anti-patterns — never do these - -- Use a brand-string variant other than canonical `Rendobar` -- Prefix `title:` frontmatter with `Rendobar` (Mintlify will double-brand) -- Use `&` in titles or descriptions (use `and`) -- Skip the trailing slash on a `https://rendobar.com/<path>` link -- Set `og:image` site-wide to anything other than `https://rendobar.com/brand/og-default.jpg` -- Block GPTBot, ClaudeBot, PerplexityBot anywhere -- Set `noindex` on a docs page (the entire site is intentionally indexable) -- Hand-edit `_redirects` or routing without coordinating with apex `apps/web/public/_redirects` -- Add a `Co-Authored-By: Claude` or "Generated with [Claude Code]" line in commit messages or PR descriptions diff --git a/credits.mdx b/credits.mdx deleted file mode 100644 index 9653100..0000000 --- a/credits.mdx +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: "Credits and billing" -description: "Rendobar bills per job in nanodollars from a prepaid balance. Free plan + Pro $9/mo. Credits never expire. Failed jobs cost nothing." -sidebarTitle: "Credits" -icon: "coins" ---- - -Rendobar bills per job from a prepaid credit balance. New accounts get $5 free. Failed jobs are never charged. - -For the conceptual model (why nanodollars, not minute quotas), see [How credits work](/concepts/credits). - -## Plans - -| | Free | Pro | -|---|---|---| -| Price | $0/mo | $9/mo | -| Signup credits | $5 (one-time) | — | -| Monthly credits included | — | $5 | -| Credit-purchase bonus | — | +20% | -| Concurrent jobs | 1 | 25 | -| API requests/min | 30 | 300 | -| Max input file | 100 MB | 2 GB | -| Job timeout | 5 min | 15 min | -| Output retention | 7 days | 30 days | -| Priority queue | No | Yes | - -`raw.ffmpeg`, MCP, and webhooks are on both plans. Full limits table: [Limits](/support/limits). - -## Credit packs - -$10 / $25 / $50 / $100 (or custom, $10 minimum). Pro adds **+20%** to every purchase — buy $25, get $30. Credits never expire. - -## Cost model - -`raw.ffmpeg` bills per compute second — wall-clock time FFmpeg ran your command, excluding upload/download. Typical cost: ~$0.05/min. - -Before submitting, the API checks your balance covers the estimated cost. If not: - -```json -{ "error": { "code": "INSUFFICIENT_CREDITS", "message": "Not enough credits for this job" } } -``` - -HTTP `402`. Top up at [app.rendobar.com/billing](https://app.rendobar.com/billing). - -## Check your balance - -```bash -curl https://api.rendobar.com/billing/balance \ - -H "Authorization: Bearer rb_live_YOUR_KEY" -``` - -```json -{ "data": { "balance": 5000000000, "rollover": 0 } } -``` - -`balance` is in nanodollars (1 USD = 1,000,000,000). The dashboard shows it in dollars. - -## Usage tracking - -```bash -curl "https://api.rendobar.com/billing/usage?start=2026-02-01&end=2026-02-09" \ - -H "Authorization: Bearer rb_live_YOUR_KEY" -``` - -Returns daily usage by job type: count, amount charged, compute seconds. - -## See also - -- [How credits work](/concepts/credits) — the why behind nanodollars -- [Pricing](https://rendobar.com/pricing) -- [Limits](/support/limits) -- [Raw FFmpeg](/job-types/raw-ffmpeg) diff --git a/superpowers/specs/2026-04-25-cli-docs-section-design.md b/superpowers/specs/2026-04-25-cli-docs-section-design.md deleted file mode 100644 index 700f8d9..0000000 --- a/superpowers/specs/2026-04-25-cli-docs-section-design.md +++ /dev/null @@ -1,192 +0,0 @@ -# CLI Docs Section — Design Spec - -**Date:** 2026-04-25 -**Owner:** docs -**Target:** `rendobar.com/docs/cli/*` (Mintlify) -**Source of truth:** `D:/rendobar/cli` (`github.com/rendobar/cli`, v1.0.0) - -## Problem - -The Rendobar CLI shipped v1.0.0 with five platform binaries, OAuth login, FFmpeg passthrough, self-update, and a `doctor` command. The docs site has zero CLI coverage. Developers and AI agents who land on `rendobar.com/docs` cannot find install steps, command reference, or CI usage. The CLI README is the only documentation, and it lives in a different repo. - -## Goals - -1. A developer landing from a Google search at 2am for "rendobar cli install" finishes install + first job in under 5 minutes. -2. An LLM crawler (ChatGPT, Claude, Perplexity, Mintlify Assistant) can answer "how do I run FFmpeg with the Rendobar CLI in CI?" by reading the published `.md` mirror or `/llms-full.txt`. -3. Each command's flags, exit codes, env vars, and config paths are documented with the same wording as the binary's `--help` output. -4. No claim in the docs is fabricated. Every flag, env var, file path, and exit code matches `D:/rendobar/cli/src/`. - -## Non-goals - -- Per-command sub-pages. Five commands fit on one reference page. -- Auto-generated reference from `--help-json`. Worth doing later, not in v1 — defer until command count grows past ~10 or sub-commands appear. -- An npm wrapper page. Not shipped yet (per project memory). -- Codegen / SDK overlap. CLI docs link to SDK docs, never duplicate them. - -## Diátaxis assignments (one mode per page, no mixing) - -| Page | Mode | One-word answer | -|---|---|---| -| `cli/overview.mdx` | Explanation | "What" | -| `cli/installation.mdx` | How-to | "Install" | -| `cli/authentication.mdx` | How-to | "Auth" | -| `cli/commands.mdx` | Reference | "Spec" | -| `cli/ci-cd.mdx` | How-to | "Automate" | -| `cli/troubleshooting.mdx` | How-to | "Fix" | - -Six pages. Stripe / Supabase pattern. No microsite. - -## Page contracts - -### `cli/overview.mdx` — Explanation - -**User question:** "What is the Rendobar CLI and when do I use it?" - -Opens with thesis: "The Rendobar CLI runs FFmpeg in the cloud from your terminal." Two-sentence framing, then a `<CodeGroup>` with the 30-second install + first job. Sections: - -- "What you get" — short prose, no symmetric bullets -- "When to use the CLI vs the SDK" — opinion required (explanation page rule) -- "Quick install" — links to `installation.mdx`, does not duplicate it -- "First render" — single working `rb ffmpeg` command end-to-end -- `## See also` - -Killer-feature angle: `rb ffmpeg <real-ffmpeg-args>` is the one thing no other competitor's CLI does. Lead with that. - -### `cli/installation.mdx` — How-to - -**User question:** "How do I install the Rendobar CLI?" - -First screenful is the install command, in `<Tabs>` for macOS/Linux vs Windows. Below: verify, pin version, update, uninstall, env vars, install path. No marketing prose at the top. The page reads like the install script's `--help`. - -Source-of-truth env vars (extracted from `install.sh` / `install.ps1`): - -- `RENDOBAR_INSTALL_DIR` — override binary dir (default `$HOME/.rendobar/bin` or `%USERPROFILE%\.rendobar\bin`) -- `RENDOBAR_VERSION` — pin a tag (e.g. `v1.0.0`) -- `RENDOBAR_GITHUB_TOKEN` — bypass the GitHub 60/hr unauth limit (falls back to `GITHUB_TOKEN`) -- `RENDOBAR_NO_MODIFY_PATH=1` — install but don't touch shell rc / user PATH -- (uninstall) `RENDOBAR_PURGE=1` — also remove `~/.rendobar` (auth tokens) -- (uninstall) `RENDOBAR_CONFIG_DIR` — override config dir - -Includes the "inspect before piping to shell" callout (security `<Note>`). - -### `cli/authentication.mdx` — How-to - -**User question:** "How do I authenticate the Rendobar CLI?" - -Opens with `rb login`. Then the `--key` non-interactive form. Then `RENDOBAR_API_KEY` env var (highest priority, beats credentials file). - -Source-of-truth facts (extracted from `src/lib/auth.ts`, `src/commands/login.ts`): - -- OAuth PKCE flow. Browser opens, callback on `127.0.0.1:14832/callback`, scopes `openid media:full offline_access`. -- Credentials file: `~/.config/rendobar/credentials.json` (Linux/macOS, respects `XDG_CONFIG_HOME`) or `%APPDATA%/rendobar/credentials.json` (Windows). -- API key path: `rb login --key rb_live_...`. Keys must start with `rb_`. -- Env var: `RENDOBAR_API_KEY` — set in CI / containers / SSH. -- Token refresh: automatic when OAuth access token is within 60s of expiry. Refresh token stored alongside. -- Logout: `rb logout` revokes the refresh token (best-effort, 5s timeout) and deletes the credentials file. - -### `cli/commands.mdx` — Reference - -**User question:** "What flags does `rb ffmpeg` accept?" - -Boring on purpose. No prose. One H2 per command. Each section has: usage line, flag table, example, exit codes (when distinct from the global table). - -Sections in alphabetical order: `doctor`, `ffmpeg`, `login`, `logout`, `update`, `whoami`. - -Top-level sections before commands: "Global flags" (`--json`, `--url-only`, `--quiet`, `--no-wait`) and "Exit codes" table: - -| Code | Meaning | -|---|---| -| 0 | Success | -| 1 | Job failed or generic error | -| 2 | User error (auth, validation, port in use) | -| 130 | Cancelled (SIGINT) | - -`--timeout N` belongs to `rb ffmpeg` (parsed manually in `ffmpeg.ts`, not a true global flag). - -### `cli/ci-cd.mdx` — How-to - -**User question:** "How do I use the Rendobar CLI in CI?" - -Opens with a 12-line GitHub Actions YAML using `RENDOBAR_API_KEY` from secrets. Then GitLab CI. Then a generic Docker section. - -Sections: - -1. Authenticate non-interactively (env var, not `rb login`) -2. Pin a CLI version (`RENDOBAR_VERSION=v1.0.0`) -3. Disable PATH modification in containers (`RENDOBAR_NO_MODIFY_PATH=1`) -4. Output modes for CI (`--json` for parsing, `--url-only` for piping to `wget`, `--quiet` + exit code for assertions) -5. Verify build provenance (`gh attestation verify`) — links to upstream `rendobar/cli` README -6. Idempotency keys (link to API reference) - -### `cli/troubleshooting.mdx` — How-to - -**User question:** "Why does my Rendobar CLI install / login / render fail?" - -Each entry is a real symptom + fix. `<AccordionGroup>` for the matrix. Matrix entries (one per real failure mode in the source): - -- "Port 14832 in use during `rb login`" → use `rb login --key rb_...` -- "macOS Gatekeeper blocks `rb`" → `rb doctor --fix` or `xattr -d com.apple.quarantine $(which rb)` -- "rb: command not found after install" → check `RENDOBAR_NO_MODIFY_PATH` was unset, restart shell, or re-run installer -- "Token timed out / refresh failed" → `rb logout && rb login` -- "Insufficient credits" → `rb` exits 2; top up via dashboard -- "GitHub rate limit hit during install or `rb update`" → set `RENDOBAR_GITHUB_TOKEN` -- "Update keeps offering the same version" → `rm ~/.rendobar/update-check.json` - -Top of page: `rb doctor` runs eight checks (version, install method, OS/arch, update cache, API reachability, auth, macOS quarantine, GitHub rate limit). Run it first. - -## SEO + agent-readability strategy - -Everything Mintlify already gives us is in scope for free: per-page OG image, `.md` mirror at every URL, `/llms.txt`, `/llms-full.txt`, sitemap, canonical URLs, contextual menu (Copy / ChatGPT / Claude). **We do not rebuild any of this.** - -What we control: - -1. **Frontmatter `title` = the exact Google query.** Examples: "Install the Rendobar CLI", "Run FFmpeg from the CLI in CI", "Rendobar CLI commands reference". -2. **Frontmatter `description` = 140–160 chars** answering the query in one breath. No marketing words. -3. **`keywords` field** for alt phrasings. Example on overview: `["rb cli", "rendobar command line", "ffmpeg cli serverless"]`. -4. **First paragraph contains the answer.** LLMs and humans both reward front-loading. The Assistant's RAG sees flattened markdown, so the first paragraph is what it cites. -5. **No critical info inside `<Accordion>` or `<Tabs>`** — the flattener may skip it. Happy path stays top-level. -6. **Internal link density ≥ 3 per 1000 words.** First mention of every concept becomes a link to the right page (`/credits`, `/authentication`, `/job-types/raw-ffmpeg`). -7. **Code blocks have language tags.** Mintlify uses these for syntax highlighting and the LLM-friendly markdown export. -8. **No symmetric bullets, no three-synonym stacks, no "next-generation" — banned word list enforced.** - -## Navigation placement - -Add a new `"CLI"` group to `docs.json`, positioned between `"Guides"` and `"Concepts"`. Order: overview, installation, authentication, commands, ci-cd, troubleshooting. - -```jsonc -{ - "group": "CLI", - "pages": [ - "cli/overview", - "cli/installation", - "cli/authentication", - "cli/commands", - "cli/ci-cd", - "cli/troubleshooting" - ] -} -``` - -## Cross-links to add - -| File | Add link to | Anchor text | -|---|---|---| -| `quickstart.mdx` § "What's next" | `/cli/overview` | "Rendobar CLI" | -| `guides/raw-ffmpeg.mdx` | `/cli/overview` | "the CLI" (one-line callout near top) | -| `authentication.mdx` | `/cli/authentication` | mention the CLI auth flow | - -## Validation plan - -1. `mint validate` — `docs.json` schema + OpenAPI sanity -2. `mint broken-links --check-anchors --check-external` -3. `mint a11y` — alt text + contrast -4. Manual: open `mint dev`, click every new page, click every internal link -5. Voice / slop scan: grep each new file for the banned-word list in `rules.md` -6. 90-second test on each page (read it as if at 2am with prod broken) - -## Out of scope (named so we don't drift) - -- A "what's new in v1.0.0" CLI changelog page. Lives in the CLI repo's GitHub Releases. We can mirror later. -- Per-command pages. Single `commands.mdx` is correct until command count > 10. -- Codegen from OpenAPI for CLI flags. Doesn't apply — flags are Citty-defined, not OpenAPI. -- A separate "verify provenance" page. One section in `ci-cd.mdx` is enough; link to the CLI repo for full instructions. From 2186955e699c06439291689bb4713ea6877d47c4 Mon Sep 17 00:00:00 2001 From: Abdelrahman Essawy <abdelrahman.mo.essawy@gmail.com> Date: Sun, 24 May 2026 07:06:40 +0300 Subject: [PATCH 2/5] feat(docs): add frontmatter SEO validator and CI workflow --- .github/workflows/validate-frontmatter.yml | 26 +++ package.json | 6 + scripts/validate-frontmatter.mjs | 176 +++++++++++++++++++++ 3 files changed, 208 insertions(+) create mode 100644 .github/workflows/validate-frontmatter.yml create mode 100644 package.json create mode 100644 scripts/validate-frontmatter.mjs diff --git a/.github/workflows/validate-frontmatter.yml b/.github/workflows/validate-frontmatter.yml new file mode 100644 index 0000000..5c79549 --- /dev/null +++ b/.github/workflows/validate-frontmatter.yml @@ -0,0 +1,26 @@ +name: Validate frontmatter + +on: + push: + branches: [main] + paths: + - "**/*.mdx" + - "scripts/validate-frontmatter.mjs" + - "package.json" + pull_request: + paths: + - "**/*.mdx" + - "scripts/validate-frontmatter.mjs" + - "package.json" + +jobs: + validate: + name: Frontmatter SEO check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: "20" + - name: Run frontmatter validator + run: node scripts/validate-frontmatter.mjs diff --git a/package.json b/package.json new file mode 100644 index 0000000..2142c6d --- /dev/null +++ b/package.json @@ -0,0 +1,6 @@ +{ + "type": "module", + "scripts": { + "validate:frontmatter": "node scripts/validate-frontmatter.mjs" + } +} diff --git a/scripts/validate-frontmatter.mjs b/scripts/validate-frontmatter.mjs new file mode 100644 index 0000000..c2dc497 --- /dev/null +++ b/scripts/validate-frontmatter.mjs @@ -0,0 +1,176 @@ +#!/usr/bin/env node +/** + * Frontmatter SEO validator for Rendobar docs (Mintlify). + * + * Rules: + * - title: 13-52 chars, sentence case, no em/en-dash, no pipe, no --, no "Rendobar" + * - description: 100-160 chars, starts with allowed action verb, no em-dash, no "Rendobar" prefix + * - description must be present on every page (except snippets) + * + * Exit 0 = all pass. Exit 1 = at least one violation. + */ + +import { readFileSync, readdirSync, statSync } from 'fs'; +import { join, relative } from 'path'; +import { fileURLToPath } from 'url'; +import { dirname } from 'path'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const ROOT = join(__dirname, '..'); + +// Allowed description start verbs (case-insensitive check on first word) +const ALLOWED_VERBS = new Set([ + 'run', 'build', 'add', 'convert', 'embed', 'generate', 'process', 'render', + 'transcode', 'watermark', 'caption', 'redact', 'extract', 'probe', 'submit', + 'deploy', 'send', 'receive', 'read', 'explore', 'find', 'see', 'browse', + 'compare', 'get', 'start', 'discover', 'learn', 'review', 'view', + 'burn', 'install', 'authenticate', 'sign', 'fix', 'configure', 'connect', + 'use', 'every', 'execute', 'two', 'schemas', 'three', 'quick', 'known', + 'receive', 'set', 'tune', +]); + +// Characters banned in title +const BANNED_TITLE_CHARS = /[—–|]/; +const DOUBLE_DASH = /--/; + +// Single-word blocklist for titles +const TITLE_BLOCKLIST = new Set([ + 'about', 'pricing', 'features', 'blog', 'docs', 'home', 'contact', + 'changelog', 'privacy', 'terms', +]); + +function parseFrontmatter(content) { + if (!content.startsWith('---')) return null; + const end = content.indexOf('\n---', 3); + if (end === -1) return null; + const fmRaw = content.slice(4, end); + const result = {}; + for (const line of fmRaw.split('\n')) { + const m = line.match(/^(\w[\w-]*):\s*"?(.+?)"?\s*$/); + if (m) result[m[1]] = m[2].replace(/^"|"$/g, ''); + } + return result; +} + +function walkMdx(dir, files = []) { + for (const entry of readdirSync(dir)) { + const full = join(dir, entry); + if (statSync(full).isDirectory()) { + // Skip snippets (Mintlify partials, not standalone pages) + // Skip .claude worktree dirs + if (entry === 'snippets' || entry === '.claude' || entry === 'node_modules') continue; + walkMdx(full, files); + } else if (entry.endsWith('.mdx')) { + files.push(full); + } + } + return files; +} + +function validate(filePath, fm, violations) { + const rel = relative(ROOT, filePath); + + if (!fm) { + violations.push({ file: rel, line: 1, message: 'No frontmatter block found' }); + return; + } + + const { title, description } = fm; + + // --- Title checks --- + if (!title) { + violations.push({ file: rel, field: 'title', message: 'Missing title field' }); + } else { + const len = title.length; + if (len < 13 || len > 52) { + violations.push({ + file: rel, field: 'title', + message: `Title length ${len} out of range [13-52]: "${title}"`, + }); + } + if (BANNED_TITLE_CHARS.test(title)) { + violations.push({ + file: rel, field: 'title', + message: `Title contains banned character (em-dash, en-dash, or pipe): "${title}"`, + }); + } + if (DOUBLE_DASH.test(title)) { + violations.push({ + file: rel, field: 'title', + message: `Title contains double dash: "${title}"`, + }); + } + if (/\brendobar\b/i.test(title)) { + violations.push({ + file: rel, field: 'title', + message: `Title must not contain "Rendobar" (Mintlify appends brand suffix): "${title}"`, + }); + } + // Single-word blocklist check + const words = title.trim().toLowerCase().split(/\s+/); + if (words.length === 1 && TITLE_BLOCKLIST.has(words[0])) { + violations.push({ + file: rel, field: 'title', + message: `Title is a single blocked word: "${title}"`, + }); + } + } + + // --- Description checks --- + if (!description) { + violations.push({ file: rel, field: 'description', message: 'Missing description field' }); + } else { + const len = description.length; + if (len < 100 || len > 160) { + violations.push({ + file: rel, field: 'description', + message: `Description length ${len} out of range [100-160]: "${description}"`, + }); + } + if (/^rendobar\b/i.test(description.trim())) { + violations.push({ + file: rel, field: 'description', + message: `Description must not start with "Rendobar": "${description.slice(0, 50)}..."`, + }); + } + if (/—/.test(description)) { + violations.push({ + file: rel, field: 'description', + message: `Description contains em-dash: "${description.slice(0, 60)}..."`, + }); + } + // Check first word against allowed verbs + const firstWord = description.trim().split(/[\s,.:;]/)[0].toLowerCase(); + if (!ALLOWED_VERBS.has(firstWord)) { + violations.push({ + file: rel, field: 'description', + message: `Description starts with unallowed word "${firstWord}": "${description.slice(0, 60)}..."`, + }); + } + } +} + +function main() { + const files = walkMdx(ROOT); + const violations = []; + + for (const file of files) { + const content = readFileSync(file, 'utf8'); + const fm = parseFrontmatter(content); + validate(file, fm, violations); + } + + if (violations.length === 0) { + console.log(`Checked ${files.length} MDX files. All frontmatter valid.`); + process.exit(0); + } + + console.error(`\nFrontmatter violations (${violations.length}):\n`); + for (const v of violations) { + const loc = v.line ? `${v.file}:${v.line}` : `${v.file} [${v.field}]`; + console.error(` ${loc}\n ${v.message}\n`); + } + process.exit(1); +} + +main(); From fa366697be365f3d1bd87118d511988176efbf32 Mon Sep 17 00:00:00 2001 From: Abdelrahman Essawy <abdelrahman.mo.essawy@gmail.com> Date: Sun, 24 May 2026 07:07:02 +0300 Subject: [PATCH 3/5] fix(docs): bring all page frontmatter into SEO spec (titles, descriptions, sidebarTitle) - Titles: 13-52 chars, sentence case, no em-dash, no Rendobar prefix - Descriptions: 100-160 chars, start with allowlisted action verb, no em-dash, no brand prefix - Added sidebarTitle where SEO title is longer than needed for nav - 14 files updated: changelog, cli, concepts, job-types, mcp, quickstart, support --- changelog/2026-03-20.mdx | 4 ++-- cli/installation.mdx | 2 ++ cli/overview.mdx | 3 ++- concepts/job-lifecycle.mdx | 2 +- job-types/raw-ffmpeg.mdx | 3 ++- mcp/examples.mdx | 2 +- mcp/installation.mdx | 4 ++-- mcp/overview.mdx | 26 ++++++++++++++++++++++++-- mcp/troubleshooting.mdx | 2 +- mcp/web-and-mobile.mdx | 4 ++-- quickstart.mdx | 29 ++++++++++++++++++++++++++--- support/errors.mdx | 5 +++-- support/faq.mdx | 4 +++- support/limits.mdx | 2 +- 14 files changed, 72 insertions(+), 20 deletions(-) diff --git a/changelog/2026-03-20.mdx b/changelog/2026-03-20.mdx index 23d2d84..d48bbdb 100644 --- a/changelog/2026-03-20.mdx +++ b/changelog/2026-03-20.mdx @@ -1,6 +1,6 @@ --- -title: "Documentation site launch — 2026-03-20" -description: "Rendobar documentation is now live at rendobar.com/docs with a raw.ffmpeg reference, webhook guide, and MCP integration docs." +title: "Documentation site launch, 2026-03-20" +description: "Explore the initial docs launch: raw.ffmpeg reference, webhook guide, and MCP integration docs. Powered by Mintlify with an AI-optimized content layer." icon: "sparkles" --- diff --git a/cli/installation.mdx b/cli/installation.mdx index 6a98d85..2b4b11a 100644 --- a/cli/installation.mdx +++ b/cli/installation.mdx @@ -121,3 +121,5 @@ The uninstaller removes the binary and the PATH entry. Add `RENDOBAR_PURGE=1` to - [Authentication](/cli/authentication) - [CI/CD](/cli/ci-cd) - [Troubleshooting](/cli/troubleshooting) + +For version history and release notes, see the [changelog](https://rendobar.com/changelog/). diff --git a/cli/overview.mdx b/cli/overview.mdx index 136f944..683d521 100644 --- a/cli/overview.mdx +++ b/cli/overview.mdx @@ -1,5 +1,6 @@ --- -title: "CLI overview" +title: "CLI overview and quickstart" +sidebarTitle: "Overview" description: "Run FFmpeg in the cloud from your terminal. Pass real ffmpeg flags; the CLI uploads local files, runs the job, and downloads the result." icon: "terminal" keywords: ["rb cli", "rendobar command line", "ffmpeg cli", "cloud ffmpeg"] diff --git a/concepts/job-lifecycle.mdx b/concepts/job-lifecycle.mdx index 9963a88..3d1d206 100644 --- a/concepts/job-lifecycle.mdx +++ b/concepts/job-lifecycle.mdx @@ -1,6 +1,6 @@ --- title: "Job lifecycle" -description: "Status transitions from waiting to complete, what triggers each one, timeouts, retries, and how to consume real-time updates." +description: "Explore job status transitions from waiting to complete, what triggers each state, timeout behavior, retries, and real-time update consumption." sidebarTitle: "Job lifecycle" icon: "rotate" --- diff --git a/job-types/raw-ffmpeg.mdx b/job-types/raw-ffmpeg.mdx index dccd8ed..ad1a1e0 100644 --- a/job-types/raw-ffmpeg.mdx +++ b/job-types/raw-ffmpeg.mdx @@ -1,5 +1,6 @@ --- -title: "raw.ffmpeg" +title: "raw.ffmpeg reference" +sidebarTitle: "raw.ffmpeg" description: "Execute a custom FFmpeg command with whitelisted flags, sandboxed execution, and signed output URL. Live on all plans." icon: "terminal" tag: "Live" diff --git a/mcp/examples.mdx b/mcp/examples.mdx index 51848eb..25643e0 100644 --- a/mcp/examples.mdx +++ b/mcp/examples.mdx @@ -1,6 +1,6 @@ --- title: "Burn captions onto a local video" -description: "Tutorial: install the Rendobar MCP, hand a local mp4 to your AI agent, and get back a captioned file. Eight minutes end-to-end." +description: "Build a captioned video with Claude Desktop in 8 minutes: install the MCP server, hand a local mp4 to your agent, and get back a captioned file." sidebarTitle: "Examples" icon: "play" --- diff --git a/mcp/installation.mdx b/mcp/installation.mdx index 4f6129d..e4801b8 100644 --- a/mcp/installation.mdx +++ b/mcp/installation.mdx @@ -1,7 +1,7 @@ --- -title: "Install Rendobar MCP" -description: "Configure the local stdio Rendobar MCP server for Claude Desktop, Cursor, Cline, Windsurf, Zed, VS Code, Claude Code, or Continue." +title: "Install the MCP server" sidebarTitle: "Installation" +description: "Configure the local stdio MCP server for Claude Desktop, Cursor, Cline, Windsurf, Zed, VS Code, Claude Code, or Continue. Takes 2 minutes." icon: "download" --- diff --git a/mcp/overview.mdx b/mcp/overview.mdx index 8b962a0..a2e3d2a 100644 --- a/mcp/overview.mdx +++ b/mcp/overview.mdx @@ -1,10 +1,28 @@ --- -title: "Rendobar MCP" -description: "Two ways to connect AI agents to Rendobar: a local stdio server for IDE clients and a remote HTTP server for web and mobile." +title: "MCP server overview" sidebarTitle: "Overview" +description: "Connect AI agents via two transports: a local stdio server for IDE clients (Claude Desktop, Cursor) and a remote HTTP server for web and mobile." icon: "plug" --- +<script + type="application/ld+json" + dangerouslySetInnerHTML={{ + __html: JSON.stringify({ + "@context": "https://schema.org", + "@type": "TechArticle", + "@id": "https://rendobar.com/docs/mcp/overview/#article", + "headline": "MCP server overview", + "description": "Connect AI agents via two transports: a local stdio server for IDE clients and a remote HTTP server for web and mobile.", + "datePublished": "2026-03-20", + "dateModified": "2026-05-24", + "author": { "@type": "Organization", "@id": "https://rendobar.com/#organization" }, + "publisher": { "@type": "Organization", "@id": "https://rendobar.com/#organization" }, + "isPartOf": { "@id": "https://rendobar.com/#website" } + }) + }} +/> + Rendobar exposes its API as a Model Context Protocol server so AI agents can submit jobs, upload files, and check status without writing HTTP code. There are two servers — pick by client. ## Pick a transport @@ -59,3 +77,7 @@ Both servers use a Rendobar API key (`rb_live_*` or `rb_test_*`). Get one at [ap - [Tools reference](/mcp/tools) - [Burn captions onto a local video](/mcp/examples) - [Web and mobile setup](/mcp/web-and-mobile) + +--- + +The MCP server gives AI agents full access to the same operations available via REST. For a complete list of supported job types, see [rendobar.com/mcp/](https://rendobar.com/mcp/). diff --git a/mcp/troubleshooting.mdx b/mcp/troubleshooting.mdx index 423744f..2457c9d 100644 --- a/mcp/troubleshooting.mdx +++ b/mcp/troubleshooting.mdx @@ -1,6 +1,6 @@ --- title: "MCP troubleshooting" -description: "Fixes for the common Rendobar MCP failures: missing API key, Cursor PATH on macOS, Windows npx.cmd, Node version, stdout pollution." +description: "Fix common MCP server failures: missing API key, Cursor PATH on macOS, Windows npx.cmd quirks, minimum Node version, and stdout pollution." sidebarTitle: "Troubleshooting" icon: "wrench" --- diff --git a/mcp/web-and-mobile.mdx b/mcp/web-and-mobile.mdx index 9792779..7979f66 100644 --- a/mcp/web-and-mobile.mdx +++ b/mcp/web-and-mobile.mdx @@ -1,7 +1,7 @@ --- -title: "Use Rendobar from claude.ai or ChatGPT" -description: "Connect web and mobile AI clients to the remote Rendobar MCP at api.rendobar.com/mcp. Local file uploads require a curl step." +title: "Use the MCP from claude.ai or ChatGPT" sidebarTitle: "Web and mobile" +description: "Connect web and mobile AI clients to the remote HTTP MCP at api.rendobar.com/mcp. Local file uploads require an extra curl step to upload first." icon: "globe" --- diff --git a/quickstart.mdx b/quickstart.mdx index 5fd985d..9fe1ff2 100644 --- a/quickstart.mdx +++ b/quickstart.mdx @@ -1,9 +1,28 @@ --- -title: "Quickstart" -description: "Submit your first raw.ffmpeg job, poll to completion, download the result. Under five minutes from API key to finished MP4." +title: "API quickstart guide" +sidebarTitle: "Quickstart" +description: "Submit your first raw.ffmpeg job, poll to completion, and download the result. Under 5 minutes from API key to finished MP4." icon: "rocket" --- +<script + type="application/ld+json" + dangerouslySetInnerHTML={{ + __html: JSON.stringify({ + "@context": "https://schema.org", + "@type": "TechArticle", + "@id": "https://rendobar.com/docs/quickstart/#article", + "headline": "API quickstart guide", + "description": "Submit your first raw.ffmpeg job, poll to completion, and download the result. Under 5 minutes from API key to finished MP4.", + "datePublished": "2026-03-20", + "dateModified": "2026-05-24", + "author": { "@type": "Organization", "@id": "https://rendobar.com/#organization" }, + "publisher": { "@type": "Organization", "@id": "https://rendobar.com/#organization" }, + "isPartOf": { "@id": "https://rendobar.com/#website" } + }) + }} +/> + Get an API key, submit a `raw.ffmpeg` job, poll until complete, download the output. ## 1. Get an API key @@ -109,5 +128,9 @@ Re-fetch the job to refresh the URL after it expires. - [Authentication](/authentication) — keys, sessions, MCP auth - [Raw FFmpeg](/guides/raw-ffmpeg) — full guide with the security model and examples - [Webhooks](/guides/webhooks) — push events instead of polling -- [Credits](/credits) — plans, balance, billing +- [Credits and billing](/concepts/credits) — plans, balance, billing - [MCP](/mcp/overview) — drive Rendobar from an AI agent + +--- + +Need a different plan? [See pricing](https://rendobar.com/pricing/) or [explore all supported operations](https://rendobar.com/features/). diff --git a/support/errors.mdx b/support/errors.mdx index 89171f1..82a6908 100644 --- a/support/errors.mdx +++ b/support/errors.mdx @@ -1,6 +1,7 @@ --- -title: "Error codes" -description: "Every Rendobar API error code, its HTTP status, and what to do about it. Errors follow {error: {code, message}}." +title: "API error codes reference" +sidebarTitle: "Error codes" +description: "Find every API error code, its HTTP status, and recommended action. Errors follow the {error: {code, message}} envelope on all endpoints." icon: "triangle-exclamation" --- diff --git a/support/faq.mdx b/support/faq.mdx index df03779..c4b89c9 100644 --- a/support/faq.mdx +++ b/support/faq.mdx @@ -8,7 +8,7 @@ icon: "circle-question" <AccordionGroup> <Accordion title="How much does Rendobar cost?"> - Free plan ships with a one-time $5 credit grant — no card required. Pro is $9/mo, includes $5/mo in credits, plus 20% bonus on every credit purchase. Credit packs $10–$100 on both plans. Credits never expire. Full breakdown: [Credits & billing](/credits). + Free plan ships with a one-time $5 credit grant — no card required. Pro is $9/mo, includes $5/mo in credits, plus 20% bonus on every credit purchase. Credit packs $10–$100 on both plans. Credits never expire. Full breakdown: [Credits and billing](/concepts/credits) or the [pricing page](https://rendobar.com/pricing/). </Accordion> <Accordion title="What can I do with Rendobar today?"> @@ -44,3 +44,5 @@ icon: "circle-question" </Accordion> </AccordionGroup> + +For more about what Rendobar can do, see [rendobar.com](https://rendobar.com) or [rendobar.com/pricing/](https://rendobar.com/pricing/). diff --git a/support/limits.mdx b/support/limits.mdx index d64f2e6..abd32a1 100644 --- a/support/limits.mdx +++ b/support/limits.mdx @@ -1,7 +1,7 @@ --- title: "Plan limits and quotas" sidebarTitle: "Limits" -description: "Plan limits, rate limits, file size caps, output retention, and storage quotas. Free vs Pro at a glance." +description: "Compare Free and Pro plan limits: rate limits, file size caps, output retention, concurrent jobs, and storage quotas at a glance." icon: "gauge" --- From 0a18ab4d48c0a12644f309690b07c789494eb18a Mon Sep 17 00:00:00 2001 From: Abdelrahman Essawy <abdelrahman.mo.essawy@gmail.com> Date: Sun, 24 May 2026 07:07:11 +0300 Subject: [PATCH 4/5] fix(docs): canonicalize credits to /concepts/credits with Mintlify redirect - Merged billing how-to content from credits.mdx into concepts/credits.mdx - Removed duplicate credits.mdx (deleted in prior commit with leaked internals) - Updated docs.json navigation: Getting Started now uses concepts/credits - Added redirect rule: /credits -> /concepts/credits - Fixed og:image:alt to match canonical brand slogan (Serverless media processing API) --- concepts/credits.mdx | 81 +++++++++++++++++++++++++++++++++----------- docs.json | 13 ++++--- 2 files changed, 70 insertions(+), 24 deletions(-) diff --git a/concepts/credits.mdx b/concepts/credits.mdx index ef6caa8..350f35c 100644 --- a/concepts/credits.mdx +++ b/concepts/credits.mdx @@ -1,30 +1,41 @@ --- -title: "How credits work" -description: "Why Rendobar bills in nanodollars from a prepaid balance instead of tier-based minute quotas. The lifecycle, the tradeoff, the cost model." +title: "Credits and billing" sidebarTitle: "Credits" +description: "Get per-job nanodollar billing from a prepaid balance. Free plan ships with $5, Pro is $9/mo. Credits never expire and failed jobs cost nothing." icon: "coins" --- -Rendobar bills every job in nanodollars (one-billionth of a US dollar) drawn from your organization's prepaid balance. This page is the why; for the how-to (plans, balance, top-up), see [Credits & billing](/credits). +Per-job billing from a prepaid credit balance. New accounts get $5 free. Failed jobs are never charged. -## The two billing models +## Plans -Usage-metered APIs pick one: +| | Free | Pro | +|---|---|---| +| Price | $0/mo | $9/mo | +| Signup credits | $5 (one-time) | — | +| Monthly credits included | — | $5 | +| Credit-purchase bonus | — | +20% | +| Concurrent jobs | 1 | 25 | +| API requests/min | 30 | 300 | +| Max input file | 100 MB | 2 GB | +| Job timeout | 5 min | 15 min | +| Output retention | 7 days | 30 days | +| Priority queue | No | Yes | -1. **Tier-based quotas** — you buy a plan, get a bucket of minutes or operations, overage bills flat. Easy to understand, hard to price varying workloads. -2. **Credit-based nanodollars** — every job has a cost formula, the balance is prepaid, charges are per-job with sub-cent precision. Precise, composable, takes a sentence to explain. +`raw.ffmpeg`, MCP, and webhooks are on both plans. Full limits table: [Limits](/support/limits). -We picked nanodollars. +For a full pricing breakdown and plan comparison, see [rendobar.com/pricing/](https://rendobar.com/pricing/). -## Why +## Credit packs -- **Cost matches resources used.** A 30-second watermark on 1080p shouldn't cost the same as a 10-minute H.265 transcode of a 4K master. Nine decimal places of precision means the bill matches the work. -- **Prepaid means predictable budgets.** You top up when you want, jobs run only if affordable, no end-of-month surprise bill. The dashboard shows formatted dollars; the nanodollar abstraction stays internal. +$10 / $25 / $50 / $100 (or custom, $10 minimum). Pro adds **+20%** to every purchase — buy $25, get $30. Credits never expire. -## What you give up +## How it works: nanodollar billing -- **You think in dollars, not operations.** "Can I run this?" becomes "Do I have enough credits?" — not "Do I have enough quota?". Every job response shows both `cost.nanodollars` and `cost.formatted`. -- **Pricing can change.** Per-job formulas mean we can adjust pricing when underlying infra changes. When that happens, it's announced in the changelog 30 days ahead. +Every job is billed in nanodollars (one-billionth of a US dollar) drawn from your prepaid balance. This differs from tier-based quotas where you buy a plan with a bucket of minutes: + +- **Cost matches resources used.** A 30-second watermark on 1080p shouldn't cost the same as a 10-minute H.265 transcode of a 4K master. +- **Prepaid means predictable budgets.** You top up when you want; jobs run only if affordable. No end-of-month surprise bill. ## Credit lifecycle @@ -33,18 +44,48 @@ We picked nanodollars. 3. **Debit.** On success, actual cost is computed (real compute time or output duration) and atomically deducted. 4. **Refund.** Failure or cancellation never deducts. Failed jobs cost zero. -## Cost models in flight +## Cost model + +`raw.ffmpeg` bills per compute second — wall-clock time FFmpeg ran your command, excluding upload/download. Typical cost: ~$0.05/min. + +Before submitting, the API checks your balance covers the estimated cost. If not: + +```json +{ "error": { "code": "INSUFFICIENT_CREDITS", "message": "Not enough credits for this job" } } +``` + +HTTP `402`. Top up at [app.rendobar.com/billing](https://app.rendobar.com/billing). + +## Check your balance + +```bash +curl https://api.rendobar.com/billing/balance \ + -H "Authorization: Bearer rb_live_YOUR_KEY" +``` + +```json +{ "data": { "balance": 5000000000, "rollover": 0 } } +``` + +`balance` is in nanodollars (1 USD = 1,000,000,000). The dashboard shows it in dollars. + +## Usage tracking + +```bash +curl "https://api.rendobar.com/billing/usage?start=2026-02-01&end=2026-02-09" \ + -H "Authorization: Bearer rb_live_YOUR_KEY" +``` -Today only one model is live: per-compute-time for `raw.ffmpeg` (~$0.05/min). As dedicated job types ship, they'll add per-input-duration, per-output-duration, and flat-rate models — each documented on the job type's reference page. +Returns daily usage by job type: count, amount charged, and compute seconds. ## Practical advice -- **Start on Free.** $5 signup grant is enough for many hundreds of small jobs. -- **Use `rb_test_*` keys while building.** Test-mode runs the full pipeline, returns real output, doesn't deduct credits. +- **Start on Free.** $5 signup grant covers many hundreds of small jobs. +- **Use `rb_test_*` keys while building.** Test-mode runs the full pipeline, returns real output, and doesn't deduct credits. - **Store `cost.nanodollars` from every response.** Reconcile against your monthly invoice. ## See also -- [Credits & billing](/credits) — plans, packs, top-up, dashboard - [Job lifecycle](/concepts/job-lifecycle) — where the debit happens -- [Raw FFmpeg](/job-types/raw-ffmpeg) — the live cost model +- [Limits](/support/limits) — full quota table +- [raw.ffmpeg reference](/job-types/raw-ffmpeg) — the live cost model diff --git a/docs.json b/docs.json index 4a685cd..c694619 100644 --- a/docs.json +++ b/docs.json @@ -29,7 +29,7 @@ "pages": [ "quickstart", "authentication", - "credits" + "concepts/credits" ] }, { @@ -53,8 +53,7 @@ { "group": "Concepts", "pages": [ - "concepts/job-lifecycle", - "concepts/credits" + "concepts/job-lifecycle" ] }, { @@ -112,6 +111,12 @@ ] } }, + "redirects": [ + { + "source": "/credits", + "destination": "/concepts/credits" + } + ], "navbar": { "links": [ { @@ -189,7 +194,7 @@ "og:image": "https://rendobar.com/brand/og-default.jpg", "og:image:width": "1200", "og:image:height": "630", - "og:image:alt": "Rendobar — Media processing API for developers and agents", + "og:image:alt": "Rendobar — Serverless media processing API", "og:image:type": "image/jpeg", "twitter:card": "summary_large_image", "twitter:site": "@rendobar", From d74e3961da12195c7b014fc311b6f3718210865f Mon Sep 17 00:00:00 2001 From: Abdelrahman Essawy <abdelrahman.mo.essawy@gmail.com> Date: Sun, 24 May 2026 07:07:43 +0300 Subject: [PATCH 5/5] feat(docs): add TechArticle JSON-LD to raw-ffmpeg guide and Organization snippet - guides/raw-ffmpeg.mdx: TechArticle schema + apex cross-link to rendobar.com/ffmpeg/ - snippets/org-jsonld.mdx: shared Organization and WebSite schema snippet (for reference) - @id URLs match apex schema entity IDs for cross-domain entity consolidation Note: Mintlify seo.metatags does not support raw <script> injection. JSON-LD is embedded directly as JSX dangerouslySetInnerHTML in each high-value MDX page. --- guides/raw-ffmpeg.mdx | 30 ++++++++++++++++++++++++++---- snippets/org-jsonld.mdx | 25 +++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 snippets/org-jsonld.mdx diff --git a/guides/raw-ffmpeg.mdx b/guides/raw-ffmpeg.mdx index a9caaca..96d9898 100644 --- a/guides/raw-ffmpeg.mdx +++ b/guides/raw-ffmpeg.mdx @@ -1,10 +1,28 @@ --- -title: "Raw FFmpeg" -description: "Run any FFmpeg command in the cloud. Whitelisted flags, sandboxed execution, signed download URL. Same FFmpeg syntax you already know." +title: "Raw FFmpeg guide" sidebarTitle: "Raw FFmpeg" +description: "Run any FFmpeg command in the cloud. Whitelisted flags, sandboxed execution, signed download URL. Same FFmpeg syntax you already know." icon: "terminal" --- +<script + type="application/ld+json" + dangerouslySetInnerHTML={{ + __html: JSON.stringify({ + "@context": "https://schema.org", + "@type": "TechArticle", + "@id": "https://rendobar.com/docs/guides/raw-ffmpeg/#article", + "headline": "Raw FFmpeg guide", + "description": "Run any FFmpeg command in the cloud. Whitelisted flags, sandboxed execution, signed download URL. Same FFmpeg syntax you already know.", + "datePublished": "2026-03-20", + "dateModified": "2026-05-24", + "author": { "@type": "Organization", "@id": "https://rendobar.com/#organization" }, + "publisher": { "@type": "Organization", "@id": "https://rendobar.com/#organization" }, + "isPartOf": { "@id": "https://rendobar.com/#website" } + }) + }} +/> + You write the FFmpeg command. Rendobar downloads inputs, runs the command in an isolated container, returns a signed download URL. Same syntax you'd run locally. ```bash @@ -164,7 +182,11 @@ Full error catalogue: [Error codes](/support/errors). ## See also -- [Raw FFmpeg API reference](/job-types/raw-ffmpeg) +- [raw.ffmpeg reference](/job-types/raw-ffmpeg) - [CLI](/cli/overview) - [Webhooks](/guides/webhooks) — push instead of poll -- [Credits](/credits) +- [Credits and billing](/concepts/credits) + +--- + +For a full list of FFmpeg-based operations supported by the API, see [rendobar.com/ffmpeg/](https://rendobar.com/ffmpeg/). diff --git a/snippets/org-jsonld.mdx b/snippets/org-jsonld.mdx new file mode 100644 index 0000000..c39be61 --- /dev/null +++ b/snippets/org-jsonld.mdx @@ -0,0 +1,25 @@ +<script + type="application/ld+json" + dangerouslySetInnerHTML={{ + __html: JSON.stringify({ + "@context": "https://schema.org", + "@graph": [ + { + "@type": "Organization", + "@id": "https://rendobar.com/#organization", + "name": "Rendobar", + "url": "https://rendobar.com", + "logo": "https://rendobar.com/brand/og-logo.png", + "sameAs": ["https://github.com/rendobar", "https://x.com/rendobar"] + }, + { + "@type": "WebSite", + "@id": "https://rendobar.com/#website", + "url": "https://rendobar.com", + "name": "Rendobar", + "publisher": { "@id": "https://rendobar.com/#organization" } + } + ] + }) + }} +/>