Reelsaw
OCI · GHCR.IO/OSBYTES/REELSAW
Drive a self-hosted Reelsaw: turn long videos into vertical clips, edit, re-render and export them.
Available components
Last scanned (11 hours ago)
Scores higher than 85% of OCI servers
Category Design and Media
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security0
- No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.Unverified
- Known CVEs could not be checked: this image's dependency list comes from an SBOM its publisher attached, which nothing verifies, so we will not report it as a clean result.Unverified
- Install-script risk not yet assessed.Unverified
- Dependency health could not be checked: this image's dependency list comes from an SBOM its publisher attached. It names packages and versions but not whether each is deprecated, still maintained or linked to its source, so there is nothing we can fairly grade.Unverified
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to osbytes/reelsaw). View diagnostics → Pass
- Clear OSI-approved license (AGPL-3.0).Pass
- Actively maintained (last published 0 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability66
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 15138 tokens (~180/item across 84 items; 84 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management17
- Stability observed for 5 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety95
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 11 of 14 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "test_webhook" implies "send" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Partial
- An AI judge read all 85 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Unverified: 1 category
A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.
Checks we ran (12)
- Source repository
- Provenance
- License
- Maintenance
- Security disclosure
- Schema quality
- Stability
- Tool coverage
- Injection markers
- Destructive annotations
- Judged manipulation
- MCP protocol
Checks we could not complete (4)
These are gaps on our side, not findings about this package. We only credit what we can confirm, so a category made up entirely of them scores 0.
- Malware scan in Supply Chain Security (scores 0 for this)No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
- Known CVEs in Supply Chain Security (scores 0 for this)Known CVEs could not be checked: this image's dependency list comes from an SBOM its publisher attached, which nothing verifies, so we will not report it as a clean result.
- Install scripts in Supply Chain Security (scores 0 for this)Install-script risk not yet assessed.
- Dependency health in Supply Chain Security (scores 0 for this)Dependency health could not be checked: this image's dependency list comes from an SBOM its publisher attached. It names packages and versions but not whether each is deprecated, still maintained or linked to its source, so there is nothing we can fairly grade.
Does not apply to this package (2)
- Endpoint SecurityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
- Transport & ReachabilityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
The score does not measure everything. What the score does not measure →
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 +1
- Package version: 0.31.0 → 0.32.0 functional
- 2 Nov 26 +1
- Stability: 0.03 → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- First check of Schema quality: unverified functional
- Package version: 0.30.3 → 0.31.0 functional
- Package version: 0.30.3 → 0.30.4 functional
- 1 Nov 26 0
- Stability: 0.00 → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- First check of Schema quality: unverified functional
- Package version: 0.30.1 → 0.30.3 functional
- Package version: 0.30.1 → 0.30.2 functional
- 31 Oct 26 50
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed oci/ghcr.io/osbytes/reelsaw@0.32.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | oci |
| Reason | Verified |
| Discovered via | OCI referrers API |
| Source repo | osbytes/reelsaw |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/osbytes/reelsaw/.github/workflows/release.yml@refs/tags/v0.32.0 |
| Rekor log index | 3692516147 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha256:8a5ba67d1f86b6ec86615ed771e8f7034facb010661648acfd2788c03b8f72d2 |
Background: How many MCP packages publish verified provenance →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
reanalyze_project Re-analyze project ~186
Pick clips again from the existing transcript (needs one), optionally with new settings. Clips you created or edited are kept; untouched AI picks are replaced and restorable with restore_clip for a while. Returns { kept, replaced } at once; the picking runs in the background, so follow with wait_for_project. To only save settings use update_project; to resume a failure use retry_project.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Project id (from list_projects, search_clips or create_project) |
| settings | object | – | Project settings; omit for the defaults (automatic clip count, 20–60 s clips, natural pauses, name fixes and the on-screen text scan on, filler removal off). Set refineDisfluency / disfluencyLlm true… |
No output schema declared.
No examples provided.
refine_project Refine project ~147
Re-run refine steps on the existing transcript: entities (name spelling), disfluency (filler and repeat cuts), scenes (shot cuts); all three when steps is omitted. Optionally set the vocabulary (names and terms, comma separated; empty string clears it) first. Fixes you accepted or rejected may be replaced. Clips re-render afterwards. Returns { ok, steps }; then wait_for_project.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Project id (from list_projects, search_clips or create_project) |
| steps | array | – | Which refine steps to re-run; default all |
| vocabulary | string | – | Names and terms the transcript should spell this way; empty string clears it |
No output schema declared.
No examples provided.
report_issue Report an issue ~278
A download link for an issue-report zip (the same file Report an issue in the app saves; admins may include instance-wide diagnostics). Returns { url, filename }; GET the url with the same Authorization header as this server. Admins may set instance true to include unfinished work, failed jobs, usage and error logs across every account, for queue, disk or machine problems that are not just one project. On hosted instances with telemetry, non-admins cannot download a zip.
| Name | Type | Req | Description |
|---|---|---|---|
| allClips | boolean | – | Include every rendered clip (default false) |
| clipIds | array | – | Clips the problem shows up in (from get_project) |
| description | string | yes | What went wrong (a sentence is enough) |
| instance | boolean | – | Admins only: include unfinished work, failed jobs, usage and error logs across every account |
| logs | boolean | – | Include this project's log lines (default true) |
| previews | boolean | – | Include thumbnails and the selected clips' videos (default true) |
| projectId | string | – | Project the report is about (from list_projects); omit for an account- or instance-level report |
| source | boolean | – | Include the source video file (default false) |
| system | boolean | – | Include versions, machine resources, queue counts and recent errors (default true; ignored when not allowed) |
No output schema declared.
No examples provided.
rerender_clip Re-render clip ~117
Queue one clip for rendering again (after rerender: false edits, a failure, or an intro/outro change). Async: the new video replaces the old when done (usually under a minute); poll get_clip. Returns { step: render | prepare, renderQueued, hint } (prepare = it never got its AI title, which runs first and renders afterwards). For several clips of a project use rerender_clips.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Clip id, not a project id (from get_project or search_clips) |
No output schema declared.
No examples provided.
rerender_clips Re-render clips ~125
Queue several clips of one project for rendering again in one step (after edits or failures). Finished and failed clips are queued, clips still rendering are skipped; each new video replaces the old when done. Returns { requested, rerendered, skipped, renderQueued, hint }; poll get_project or wait_for_project. For a single clip rerender_clip is enough.
| Name | Type | Req | Description |
|---|---|---|---|
| clipIds | array | yes | Clip ids of that project (get_project), 1-200 |
| projectId | string | yes | Project id (from list_projects, search_clips or create_project) |
No output schema declared.
No examples provided.
resend_webhook_delivery Resend webhook delivery ~65
Send a delivery again (a new series of attempts, same webhook-id and body, signed afresh). The webhook must be on. Returns { ok, deliveryId, message }.
| Name | Type | Req | Description |
|---|---|---|---|
| deliveryId | integer | yes | Delivery id (from list_webhook_deliveries) |
No output schema declared.
No examples provided.
restore_asset Restore library asset ~64
Bring one of your deleted library items back (the id from delete_asset or list_deleted); restoring an item that is not deleted changes nothing. It does not become a default again. Returns { ok }.
| Name | Type | Req | Description |
|---|---|---|---|
| assetId | string | yes | Library asset id (from delete_asset) |
No output schema declared.
No examples provided.
restore_clip Restore clip ~87
Bring back a deleted clip or one a re-analyze replaced (list_deleted or get_project → replacedClips); it goes to the end of the project's clips. Returns { changed, status, needsRerender }; needsRerender means it never finished, so call rerender_clip.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Clip id (from list_deleted or get_project → replacedClips) |
No output schema declared.
No examples provided.
restore_layer_template Restore layer template ~54
Bring back a deleted layer template (the id from list_layer_templates deleted or list_deleted). It does not become a default again. Returns the template.
| Name | Type | Req | Description |
|---|---|---|---|
| templateId | string | yes | Layer template id (list_layer_templates) |
No output schema declared.
No examples provided.
restore_project Restore project ~92
Bring back a deleted project with its clips and files (find it with list_deleted or list_projects deleted: true); restoring a project that is not deleted changes nothing. Refused if the account is already at its live project cap. A project that was processing comes back failed: retry_project resumes it. Returns { changed, status }.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Project id (from list_projects with deleted: true) |
No output schema declared.
No examples provided.
retry_failures Retry failed work ~167
Admins only: retry matching failed projects and clips through the same lifecycle as retry_project / rerender_clip (never a raw queue poke). Each item is its own transaction so live-job caps still apply. Cap 50 per call. Returns { retried, skipped, nextCursor }. Writes an admin event failures.retried. Hosted non-admins are refused.
| Name | Type | Req | Description |
|---|---|---|---|
| ids | array | – | Retry these rows instead of the current filter; omitted = every match of q/stage/since |
| limit | integer | – | Max items to retry this call, default 50 |
| q | string | – | Same error substring as list_failures |
| since | string | – | Same since filter as list_failures |
| stage | string | – | Same stage filter as list_failures |
No output schema declared.
No examples provided.
retry_project Retry project ~96
Resume a failed or stuck project from its furthest completed stage: re-render unfinished clips if there are clips, else pick clips, refine or transcribe again. Finished clips, the transcript and the source are kept. Returns { queue } (the stage restarted); then wait_for_project. To pick different clips use reanalyze_project instead.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Project id (from list_projects, search_clips or create_project) |
No output schema declared.
No examples provided.
review_transcript_flags Review transcript fixes ~150
Accept or reject suggested transcript fixes (ids from list_transcript_flags), optionally with your own replacement text for an accepted name fix. The transcript is rebuilt; with rerender true (default) clips whose captions overlap a change are re-rendered. Returns { changed, rerendered, needsRerender, flags: [{ id, status, replacement }], hint }.
| Name | Type | Req | Description |
|---|---|---|---|
| decisions | array | yes | One decision per fix |
| id | string | yes | Project id (from list_projects, search_clips or create_project) |
| rerender | boolean | – | Re-render the finished clips whose captions overlap a change (default true); false only saves, re-render later with rerender_clips |
No output schema declared.
No examples provided.
revoke_media_link Revoke share links ~125
Turn share links off now: one (linkId), a clip's (clipId), a project's (projectId) or all of yours (all: true). Give exactly one. Returns { revoked, message }. Anyone holding a revoked link gets a 404 from then on.
| Name | Type | Req | Description |
|---|---|---|---|
| all | boolean | – | Every share link you have |
| clipId | string | – | Every link to this clip |
| linkId | string | – | Link id (from get_media_links or list_media_links) |
| projectId | string | – | Every link to this project's clips and zip |
No output schema declared.
No examples provided.
rotate_webhook_secret Rotate webhook secret ~75
A new signing secret for a webhook. Deliveries are signed with both the new and the old one for 24 h, so the receiver can switch; refused while a rotation is still open. Returns { secret, previousStopsAt, message }.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Webhook id (from list_webhooks) |
No output schema declared.
No examples provided.
save_layer_template Save layer template ~300
Create a template from exactly one of clipId (that clip's layers: spanning = fill, touching the start = head, touching the end = tail, else anchored to the nearer edge; plus the intro and outro the clip renders with) or layers (each with a timing, see list_layer_templates; [] with bumpers = an intro / outro only template). Returns the template { id, name, layerCount, layers, bumpers }. Use apply_layer_template to put it on clips
| Name | Type | Req | Description |
|---|---|---|---|
| bumpers | object | – | With layers: the intro / outro the template puts on clips ({ intro, introSec, outro, outroSec }; a slot left out = clips keep their own, null = none, an id = that video or image). With clipId the cli… |
| clipId | string | – | Build the template from this clip's layers (get_project or search_clips). Pass clipId or layers, not both |
| layers | array | – | Or the layers themselves, each with a timing: { kind: asset|text|audio, id, timing: { mode: head|tail|fill|relative, start, end, minSec, maxSec }, ...the layer's own fields (assetId, x, y, w / text,… |
| name | string | yes | Template name (1-120 chars) |
No output schema declared.
No examples provided.
search_assets Search library, catalog and providers ~264
Find assets. source "library" = your own uploads (name and tags; empty q lists all); omitted or "catalog" = the Reelsaw catalog (CC0, works offline); or a provider an admin enabled. Returns { provider, items: [{ provider, externalId, name, kind, license, durationSec }], nextCursor }. Adds nothing: a catalog / provider hit's provider + externalId go to add_asset.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | nextCursor from the previous page; omit for the first page |
| deleted | boolean | – | library only: list your deleted items instead (their ids go to restore_asset) |
| kind | string | – | Only this kind of result |
| license | string | – | freesound only: cc0 (default) or by (CC0 and CC-BY, attribution is stored) |
| limit | integer | – | Results per page (1-60, default 24) |
| q | string | – | What to look for, e.g. "whoosh", "arrow", "city at night"; empty lists everything in the source |
| source | string | – | library, catalog (default), pexels, pixabay, freesound, iconify, openverse, giphy or klipy |
No output schema declared.
No examples provided.
search_clips Search clips ~107
Find your clips and projects by words in their title, hook or caption (every word must match; case-insensitive, typo-tolerant; best first). Returns { projects (max 8), clips (max limit) with ids, bounds and links, truncated? }. Use list_projects to browse instead.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Most clips to return (1-50, default 15) |
| q | string | yes | Words to find, e.g. "budget tips" |
No output schema declared.
No examples provided.
set_clip_bumpers Set clips' intro/outro ~240
Override the intro and/or outro of up to 200 clips of one project: "inherit" (follow the project), "none", or a library asset id; a slot left out is untouched. rerender: true re-renders only these clips. Returns { updated, rerendered }.
| Name | Type | Req | Description |
|---|---|---|---|
| clipIds | array | yes | Clip ids of that project (get_project), 1-200 per call |
| intro | – | – | "inherit" (alias "default") = follow the project, "none" = no bumper on this clip, or a library asset id |
| introSec | number | – | Seconds an intro image shows on these clips (1-10) |
| outro | – | – | "inherit" (alias "default") = follow the project, "none" = no bumper on this clip, or a library asset id |
| outroSec | number | – | Seconds an outro image shows on these clips (1-10) |
| projectId | string | yes | Project the clips belong to (list_projects) |
| rerender | boolean | yes | true = re-render only these clips now; false = apply on their next render |
No output schema declared.
No examples provided.
set_default_bumper Set default intro/outro ~85
Make a library item your default intro or outro for projects you create from now on (assetId null clears it). Existing projects keep theirs; to change one use set_project_bumpers. Returns { ok }.
| Name | Type | Req | Description |
|---|---|---|---|
| assetId | – | yes | Library asset id (search_assets with source library), or null for no default |
| slot | string | yes | Which default to set |
No output schema declared.
No examples provided.
set_email_preferences Set email preferences ~97
Turn topics of optional email on or off; omitted topics stay as they are. ready = the note sent when projects finish while you are away (Settings → Account, or the link in the email). Mail you need (password reset, verification) is not affected. Returns { ok, emailPreferences }.
| Name | Type | Req | Description |
|---|---|---|---|
| ready | boolean | – | the note sent when projects finish while you are away: true to get it, false to stop it |
No output schema declared.
No examples provided.
set_instance_settings Change instance settings ~2,114
Admins only: change instance settings without a restart; every process applies them within seconds and the change is audited. Pass only the keys to change; null returns a key to the environment's value; an empty string clears an optional one (URLs, captcha). Validated as a whole (a captcha provider needs both keys; email verification needs an email driver). Returns the same state as get_instance_settings.
| Name | Type | Req | Description |
|---|---|---|---|
| ADMIN_EVENT_RETENTION_DAYS | – | – | Prune the admin event log after this many days. 0 = keep forever. |
| ALLOW_PRIVATE_SOURCE_URLS | boolean|null | – | Let link sources point at LAN or loopback hosts (a NAS). Off, they are blocked (SSRF guard). |
| ALLOW_PRIVATE_WEBHOOK_URLS | boolean|null | – | Let webhook URLs point at LAN or loopback hosts (a self-hosted n8n next to Reelsaw), over http too. Off, they must be public https (SSRF guard). |
| BLOCK_DISPOSABLE_EMAILS | boolean|null | – | Refuse sign-ups from known temporary-address domains (a vendored list of about 120k domains). |
| CAPTCHA_PROVIDER | – | – | Bot protection on sign-up, sign-in and password reset: cloudflare-turnstile, google-recaptcha or hcaptcha; empty = off. Needs both keys. |
| CAPTCHA_SECRET_KEY | – | – | Secret captcha key the server verifies with; stored encrypted, never shown again; empty = unset. |
| CAPTCHA_SITE_KEY | – | – | Public captcha key the browser widget uses; empty = unset. |
| CATALOG_URL | – | – | Where the Reelsaw catalog manifest (sounds, icons, stickers) is fetched from, hourly; the starter pack bundled with Reelsaw is used until a newer one arrives. |
| CLIP_RETENTION_DAYS | – | – | Delete rendered clip files this many days after rendering; the clip stays and can be re-rendered. 0 = keep forever. |
| DECISION_RETENTION_DAYS | – | – | Prune users' recorded decisions (accepts, rejects, edits Reelsaw learns from) older than this. They outlive deleted projects until then. 0 = keep forever. |
| DELETED_RETENTION_DAYS | – | – | Deleted projects and replaced clips stay restorable this long, then rows and files go. 0 = keep forever. |
| DISFLUENCY_LLM | boolean|null | – | Model pass on top of rule-based disfluency detection. Off by default. Ignored when disfluency removal is off. Turn on so projects may opt in via disfluencyLlm. |
| DISFLUENCY_REMOVAL | boolean|null | – | Detect fillers, repetitions and false starts after transcription. Off by default; turn on so projects may opt in via refineDisfluency. |
| EVENT_PROJECT_DONE_READY_EMAIL_DELAY_MINUTES | – | – | Minutes to wait after the first project in a batch finishes before emailing that the clips are ready, so several projects land in one note. Sent only when an email driver is set and the account has n… |
| EVENT_RETENTION_DAYS | – | – | Prune project events older than this; each project keeps its run skeleton. 0 = keep forever. |
| FREESOUND_API_KEY | – | – | Freesound API key (free): enables sound effects in Browse. Stored encrypted; empty = provider hidden. |
| GIPHY_API_KEY | – | – | Giphy API key: enables GIFs and stickers in Browse. Stored encrypted; empty = provider hidden. |
| HEALTH_DETAILS | boolean|null | – | Include machine numbers in GET /api/health for anonymous callers (private networks only). Admins always get them. |
| ICONIFY_API_URL | – | – | Iconify API used for icon search; the public one by default, or your own self-hosted instance (https). |
| KLIPY_API_KEY | – | – | Klipy API key: enables GIF search in Browse (experimental). Stored encrypted; empty = provider hidden. |
| LLM_CALL_TIMEOUT_SECONDS | – | – | Longest one model call may take (all its HTTP attempts together) before its step is stopped and retried. 0 = auto: 120 s for a hosted model, 600 s for a self-hosted one, and for a self-hosted transcr… |
| LLM_USAGE_RETENTION_DAYS | – | – | Prune model and transcription usage rows older than this. 0 = keep forever. |
| MAX_LIVE_JOBS_PER_USER | – | – | Queued plus running jobs an account's own requests may add to. 0 = unlimited. |
| MAX_NEW_PROJECTS_PER_HOUR | – | – | Projects an account may create per hour. 0 = unlimited. |
| MAX_PROJECTS_PER_USER | – | – | Projects an account may keep. 0 = unlimited. Admins can override per user on the Users page. |
| MAX_REQUESTS_PER_HOUR | – | – | Changes an account may make per hour. 0 = unlimited. |
| MAX_REQUESTS_PER_MINUTE | – | – | Changes (API mutations, MCP tool calls) an account may make per minute. 0 = unlimited. Admins can override per user on the Users page. |
| MAX_RERENDERS_PER_HOUR | – | – | Re-renders, hand-made clips and re-runs (re-analyze, refine) an account may ask for per hour. 0 = unlimited. |
| MAX_SIGNUPS_PER_IP_PER_DAY | – | – | Accounts one network address may create per day. 0 = unlimited. Needs TRUST_PROXY behind a reverse proxy. |
| MAX_SOURCE_FILE_MB | – | – | Largest file a link source may download (yt-dlp --max-filesize), in MB. |
| MAX_SOURCE_MINUTES_PER_DAY | – | – | Minutes of source video an account may add per day (UTC). 0 = unlimited. |
| MAX_SOURCE_MINUTES_PER_MONTH | – | – | Minutes of source video an account may add per period: its billing period when it has a plan, else the calendar month (UTC). 0 = unlimited. |
| MAX_STORAGE_MB | – | – | MB of sources, uploads, renders and intros/outros an account may keep (deleted items count until they are deleted forever). 0 = unlimited. |
| MAX_UPLOAD_MB | – | – | Largest accepted file upload, in MB. |
| MAX_WEBHOOKS_PER_USER | – | – | Webhook endpoints an account may add. 0 = unlimited. Admins can override per user on the Users page. |
| MEDIA_LINK_ALLOW_NEVER | boolean|null | – | Owners may make a share link that never expires (they can still revoke it). |
| MEDIA_LINK_RETENTION_DAYS | – | – | Delete revoked and expired share links this many days after they stopped working. 0 = keep forever. |
| MEDIA_LINK_TTL_DAYS | – | – | Share links last this many days unless the owner picks less. |
| OPENVERSE_ENABLED | boolean|null | – | Show Openverse (Creative Commons images and audio, no key) in Browse. Off by default until you have checked its limits for your use. |
| PEXELS_API_KEY | – | – | Pexels API key (free): enables stock photos and portrait videos in Browse. Stored encrypted; empty = provider hidden. |
| PIXABAY_API_KEY | – | – | Pixabay API key (free): enables photos, illustrations, vectors and videos in Browse. Stored encrypted; empty = provider hidden. |
| PRIVACY_URL | – | – | Privacy policy link shown on the sign-up form; empty = none. |
| REFINE_SCENES | boolean|null | – | Scan the video for on-screen text (burned-in captions, watermarks, slides) during refine. On by default; off closes the ceiling (projects opt out via refineScenes). Shot cuts are always detected. |
| REQUIRE_EMAIL_VERIFICATION | boolean|null | – | New users must click the verification link before they can sign in. The link works for 24 hours and is single-use; an expired one offers a new send. Needs an email driver in .env. |
| SCRATCH_CACHE_HOURS | – | – | With an S3 store, drop a worker's local copies of the sources and rendered clips of finished projects after this many idle hours; a job pulls them back from the bucket when it needs them, and a worke… |
| SIGNUP_MODE | – | – | Who may sign up: open (anyone, right for a public instance with email confirmation), approval (new accounts wait for an admin; a private box) or closed (nobody). The first account is always the admin. |
| SOURCE_RETENTION_DAYS | – | – | Delete stored source videos this many days after upload; the project stays and Retry re-fetches. 0 = keep forever. |
| STAGE_IDLE_TIMEOUT_MINUTES | – | – | A stage made of checkpointed steps (finding moments) is stopped when no step has finished for this long; Retry continues where it stopped. 0 = auto: 1.5 times the model call timeout. |
| STALL_MINUTES | – | – | A running job with no progress for this long is reported as stalled (log and UI). |
| STEP_RETENTION_DAYS | – | – | Drop the saved checkpoints (finding-moments windows) of a finished project this many days after it last changed; a Retry sooner than that reuses them. 0 = keep forever. |
| TERMS_URL | – | – | Terms of service link shown on the sign-up form; empty = none. |
| TRANSCRIPT_CORRECTION | boolean|null | – | After transcription, fix misheard names with the language model. On by default; off closes the ceiling so no project runs it (projects opt out via refineEntities). |
| UPDATE_CHECK | boolean|null | – | Ask GitHub for the latest release and tell admins when a newer Reelsaw exists. Only the request leaves the machine. |
| WATERMARK_NON_ADMINS | boolean|null | – | Burn a small watermark into the clips of accounts that are not admins. A paid plan removes it, and an admin can switch it per user on the Users page. |
| WATERMARK_TEXT | – | – | The watermark text, e.g. your site name. |
| WEBHOOK_DELIVERY_RETENTION_DAYS | – | – | Delete webhook delivery log rows older than this. 0 = keep forever. |
No output schema declared.
No examples provided.
set_learning Turn learning on or off ~70
Whether Reelsaw records your decisions (accepts, rejects, cuts, clip edits) to learn from (Settings → Learning, on by default). Off stops recording; what is already kept stays until forget_decisions. Returns { enabled }.
| Name | Type | Req | Description |
|---|---|---|---|
| enabled | boolean | yes | true records decisions, false stops |
No output schema declared.
No examples provided.
set_project_bumpers Set a project's intro/outro ~269
Set one project's intro and/or outro: "default" (your current default), "none", or a library asset id; a slot left out is untouched, and introSec/outroSec are saved with the project. Clips with their own choice (set_clip_bumpers) keep it. Applies on each clip's next render; rerender: true re-renders finished clips now. Returns { rerendered }. set_default_bumper changes future projects instead.
| Name | Type | Req | Description |
|---|---|---|---|
| intro | – | – | "default" = your current default intro/outro, "none" = no bumper, or a library asset id (see list_bumpers) |
| introSec | number | – | Seconds an intro image shows in this project (1-10); videos keep their own length. Saved with the project |
| outro | – | – | "default" = your current default intro/outro, "none" = no bumper, or a library asset id (see list_bumpers) |
| outroSec | number | – | Seconds an outro image shows in this project (1-10). Saved with the project |
| projectId | string | yes | Project id (list_projects or create_project) |
| rerender | boolean | yes | true = re-render the project's finished clips now; false = apply on their next render |
No output schema declared.
No examples provided.
set_project_defaults Set project defaults ~100
Replace the settings every new project starts with; existing projects keep theirs. Send the whole set you want: keys left out are cleared, {} clears all (read get_project_defaults first). Intro and outro change through set_default_bumper. Returns { ok, projectDefaults, hint }.
| Name | Type | Req | Description |
|---|---|---|---|
| defaults | object | yes | The complete set of defaults, e.g. { language: "en", maxClips: 5, pauses: "tight" } |
No output schema declared.
No examples provided.
set_project_source_text Set source text handling ~158
Hide or keep text burned into the source video (captions, logos) for the whole project: hide covers it, keep leaves it, always shows it. Re-renders every finished clip so the set agrees. Returns { changed, needsRerender, rerendered, skipped, hint }; rerendered is how many clips were queued, so follow with wait_for_project; skipped clips were still preparing or rendering and need rerender_clips once done (needsRerender is true).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Project id (from list_projects, search_clips or create_project) |
| sourceText | string | yes | hide = cover on-screen text in the source, keep = leave it, always = always show it |
No output schema declared.
No examples provided.
test_webhook Test webhook ~58
Send a webhook.test delivery now and wait for the answer. Returns { ok, code, message, response (first 2 KB of what the receiver said) }.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Webhook id (from list_webhooks) |
No output schema declared.
No examples provided.
update_asset Update library asset ~156
Rename one of your own library items, replace its tags, or change how long a still image shows (deleted items too; shared catalog and provider items cannot be changed). Only labels change; nothing re-renders, except that a new image length applies on each project's next render. Returns { id, name, tags, durationSec, previousName }.
| Name | Type | Req | Description |
|---|---|---|---|
| assetId | string | yes | Library asset id (from search_assets) |
| imageSeconds | number | – | Seconds a still image shows as an intro/outro (1-10); images only |
| name | string | – | New name (1-120 chars) |
| tags | array | – | Replaces the tags (lowercase words; max 20); [] clears them |
No output schema declared.
No examples provided.
update_clip Update clip ~459
Edit one clip (3 s-10 min): only the fields you pass change; style, layoutSections and layers replace the whole value (null = project's / none). Title, caption and hashtags apply at once; bounds, hook, framing, style, emphasis, layers and intro/outro are burned in and re-render (~1 min) unless rerender is false. Returns the clip summary plus { changed, needsRerender, rerendered, hint }; poll get_clip until done.
| Name | Type | Req | Description |
|---|---|---|---|
| caption | string | – | Post caption, not burned in (max 300 chars) |
| emphasis | array | – | Words the captions colour (max 30); replaces the list |
| endSec | number | – | New end, seconds from the start of the source; clip must stay ≥3 s |
| hashtags | array | – | Hashtags without # (max 20); replaces the list |
| hook | string | – | On-screen opening line (max 80 chars) |
| id | string | yes | Clip id (from get_project or search_clips) |
| layers | – | – | Everything laid over or played under the clip, one list (max 30): kind asset = a library image/GIF/video (search_assets with source library; logos, stickers, b-roll), kind text = a line of text, kind… |
| layoutOverride | – | – | Framing for the whole clip; null = automatic |
| layoutSections | – | – | Framing per time range (max 50), source seconds; replaces all sections; null or [] = automatic |
| rerender | boolean | – | Re-render when a burned-in field changed (default true, same as the app); false = keep the old video until rerender_clip |
| startSec | number | – | New start, seconds from the start of the source video |
| style | – | – | Caption/hook style for this clip on top of the project's; replaces the clip's override; null = follow the project |
| title | string | – | Clip title (1-120 chars) |
No output schema declared.
No examples provided.
update_layer_template Update layer template ~130
Rename a layer template, replace its layers (the whole list, each with a timing) and/or replace its intro / outro (bumpers; null = it sets neither); a field left out is untouched. Clips that already got the template keep what they have; apply_layer_template again to refresh them. Returns the template.
| Name | Type | Req | Description |
|---|---|---|---|
| bumpers | – | – | – |
| layers | array | – | The template's layers, each with a timing (max 30) |
| name | string | – | Template name (1-120 chars) |
| templateId | string | yes | Layer template id (list_layer_templates) |
No output schema declared.
No examples provided.
update_project Update project ~223
Rename a project and/or change its saved settings (focus, instructions, clip length, maxClips, caption style, framing, pauses, refineEntities, refineDisfluency, disfluencyLlm, refineScenes); only the fields you pass change. Does not re-pick clips or re-render: reanalyze_project picks again with the new selection settings, refine_project re-runs refine steps, rerender_clips applies style changes. Returns { changed, needsReanalyze, needsRefine, needsRerender, hint }.
| Name | Type | Req | Description |
|---|---|---|---|
| clear | array | – | Optional settings to reset to their default, e.g. maxClips (back to automatic) or focus |
| id | string | yes | Project id (from list_projects, search_clips or create_project) |
| metadata | object | – | Replace the project's metadata (the whole map; {} clears it) |
| settings | object | – | Settings to change; keys left out keep their value. Intro/outro go through set_project_bumpers |
| title | string | – | New title |
No output schema declared.
No examples provided.
update_project_style Update project style ~197
Change the caption/hook look for the whole project (font, colors, size, position, words per line). Clears per-clip style overrides unless keepOverrides, and re-renders every finished clip unless rerender is false. Returns { changed, needsRerender, rerendered, skipped, hint }; rerendered is how many clips were queued, skipped how many were still preparing or rendering (they need rerender_clips once done). For one clip use update_clip { style }.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Project id (from list_projects, search_clips or create_project) |
| keepOverrides | boolean | – | Keep clips' own style overrides instead of clearing them (default false) |
| rerender | boolean | – | Re-render finished clips now (default true); false saves the style and the next render shows it |
| style | object | yes | The style fields to change; fields left out keep their value |
No output schema declared.
No examples provided.
update_webhook Update webhook ~134
Change a webhook's url, events or description, or turn it on or off (enabled). Turning it on clears a failure streak; turning it off cancels deliveries waiting to be sent (resend_webhook_delivery brings them back). Returns { endpoint, changed, message }.
| Name | Type | Req | Description |
|---|---|---|---|
| description | – | – | New label; null clears it |
| enabled | boolean | – | Turn it on (true) or off (false) |
| events | array | – | Replace the events it gets |
| id | string | yes | Webhook id (from list_webhooks) |
| url | string | – | New URL to POST to (https) |
No output schema declared.
No examples provided.
wait_for_project Wait for project ~133
Block until the project is done or failed, or timeoutSeconds pass. Returns { id, status, stage, stageProgress, stageDetail ({ done, total, etaSec } while a stage works in parts, else null), error, clips: [{ id, title, status }] }; on timeout the same with hint "Still running": call it again. Use get_project instead for a non-blocking look with full clip details.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Project id (from create_project or list_projects) |
| timeoutSeconds | integer | – | Longest to wait, seconds (1-120, default 60) |
No output schema declared.
No examples provided.
How do I install the Reelsaw MCP server?
Reelsaw runs locally as a container image, launched with docker run --rm -i ghcr.io/osbytes/reelsaw:0.32.0 reelsaw mcp, plus the required -e, which you supply. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.
oci · ghcr.io/osbytes/reelsaw
claude mcp add osbytes-reelsaw -- docker run --rm -i ghcr.io/osbytes/reelsaw:0.32.0 reelsaw mcp
Incomplete: the registry marks -e as required and gives no value we can show, so it is not in this command. Add it before you run it.
What is the Reelsaw MCP server?
Reelsaw is an MCP server listed in the public MCP registry as io.github.osbytes/reelsaw. Drive a self-hosted Reelsaw: turn long videos into vertical clips, edit, re-render and export them. This page covers its container image (ghcr.io/osbytes/reelsaw).
Is the Reelsaw MCP server safe to use?
Reelsaw scores 52 out of 100 on VerifyMCP. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Reelsaw MCP server expose?
Reelsaw exposes 84 tools: list_projects, get_project, create_project, update_project, wait_for_project, and 79 more. Their descriptions and schemas cost roughly 14,095 tokens of context every time the server is loaded.
Is the Reelsaw MCP server still maintained?
Reelsaw is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Reelsaw MCP server under?
Reelsaw declares the AGPL-3.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.
What did VerifyMCP test on the Reelsaw MCP server?
VerifyMCP ran 12 checks on Reelsaw, covering Source repository, Provenance, License, Maintenance and 8 more. 4 items could not be completed, a gap on our side rather than a finding about Reelsaw: Malware scan, Known CVEs, Install scripts and Dependency health. One category scores 0 for that reason, because we only credit what we can confirm. Endpoint Security and Transport & Reachability do not apply to a container image, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.