Skip to content
Scalpels home

Scalpels is officially launching on October 31, 2026. Special early adopter pricing is available now.

← All documentation

Documentation

Slate

Configuration

Updated

Slate has very little to configure. It has no settings screen for rendering, and almost every limit is fixed in code because it was measured against Laravel Cloud's runtime.

The value you may override

Variable Default What it does
SLATE_INSTALLATION_SUBJECT_REF the host in APP_URL The installation reference that installation credentials must match exactly. The default works, so leave it unset unless you want the reference decoupled from the host.

Nothing has to be set for installation credentials to work. Set this variable only to pin the reference to a name of your own — for instance so credentials survive a planned domain change. To set or change it after installing, edit the environment's variables in Laravel Cloud and redeploy. Changing it, or changing the host it defaults to, invalidates every credential issued against the old value. See API credentials.

What is managed for you

You do not set any of these yourself:

  • Database, queue and bucket settings. Laravel Cloud injects the connection details and selectors (DB_*, QUEUE_CONNECTION, FILESYSTEM_DISK, AWS_*) for the resources Scalpels attached. A value you set by hand overrides Cloud's and breaks that resource.
  • Scalpels' own keys. Scalpels writes the values that link the deployment to your team for managed sign-in, the Console and delegated MCP access.
  • The ffmpeg binary. The build step php artisan slate:provision-ffmpeg installs one pinned, checksum-verified LGPL ffmpeg and ffprobe build into runtime/ inside the deploy.

The app reads a few more variables (SLATE_FFMPEG_RELEASE_TAG, SLATE_FFMPEG_ASSET, SLATE_FFMPEG_RUNTIME_PATH, SLATE_FFMPEG_FONT_PATH, SLATE_ALLOW_HOST_LOCAL_FANOUT), but Scalpels does not declare them and you should leave them unset. Their defaults are the tested ffmpeg build, the location the build step installs it to, and the bundled Noto Sans font. SLATE_ALLOW_HOST_LOCAL_FANOUT turns off the check that requires S3-backed storage, and is meant only for single-machine development.

Fixed limits

These limits are fixed in Slate's config/slate.php and cannot be changed through the environment:

Setting Value
Largest source 8 GiB
Longest source 4 hours
Largest source picture 4096 × 4096 pixels
Most streams in a source 8
Highest source frame rate 60 fps
Output canvas (delivery) 1536 × 1024 or 1024 × 1536
Upload slot lifetime 15 minutes
Result URL lifetime 15 minutes
Parallel workers per run 10
Queue jobs per run 100
Webhook connect / response timeout 3 s / 10 s

Renders run on the default queue and source ingest runs on the ingest queue. Both run on the managed queue Scalpels created.

Scheduled work

The scheduler runs one job: slate:prune-ingests, every hour, never overlapping. It fails abandoned uploads and stuck ingests and deletes the storage they left behind. See Sources. Nothing deletes ready sources or finished results, so remove old objects from the slate-sources/ and slate-runs/ prefixes in your bucket when you no longer need them.

Maintenance commands

You can run these inside the environment, for example with Laravel Cloud's command runner:

Command What it does
php artisan slate:doctor Checks that the ffmpeg binary is present and runs, that caption drawing works with the configured font, and that the expected encoders are available. Exits non-zero if any check fails.
php artisan slate:verify-object-storage Writes a test object (128 MiB by default, set with --bytes) to the default disk, reads it back, deletes it, and prints the result and memory use as JSON.
php artisan slate:prune-ingests Runs the hourly cleanup immediately.