Documentation
SlateConfiguration
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
ffmpegbinary. The build stepphp artisan slate:provision-ffmpeginstalls one pinned, checksum-verified LGPLffmpegandffprobebuild intoruntime/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. |