($job['status'] ?? '') === 'completed'));
$failedCount = count(array_filter($jobs, static fn(array $job): bool => ($job['status'] ?? '') === 'failed'));
$latestJob = $jobs[0] ?? null;
$toolConfig = [];
foreach ($tools as $key => $tool) {
$toolConfig[$key] = [
'label' => $tool['label'],
'description' => $tool['description'],
'accept' => tool_accept_attribute($key),
'acceptSummary' => $tool['accept_summary'],
'submitLabel' => $tool['submit_label'],
'requiresFfmpeg' => !empty($tool['requires_ffmpeg']),
'presets' => array_map(
static fn(array $preset): array => [
'label' => $preset['label'],
'description' => $preset['description'],
],
$tool['presets'] ?? []
),
];
}
?>
= h($meta['title']) ?>
= h($notice) ?>
Sell more than a single codec swap
One dashboard for video exports and subtitle conversions.
FormatShift now combines the original WEBM โ MP4 flow with social-ready MP4 presets and a lightweight SRT โ VTT subtitle utility, so the product feels closer to a creator toolkit than a commodity converter.
Tool bundle
3 converters
Video compatibility, social presets, and subtitle reformatting.
Upload limit
Up to = h((string)$maxUpload) ?> MB
Applies to video uploads and subtitle assets.
Retention
= h((string)$retentionHours) ?> hours
Temporary files auto-clean so the VM stays lean.
Runtime snapshot
= $ffmpegReady ? 'Video tools online' : 'Video tools paused' ?>
= $ffmpegReady ? 'FFmpeg is available, so the MP4-based tools are ready to run.' : 'FFmpeg is unavailable, so only subtitle conversions will succeed right now.' ?>
Completed jobs
= h((string)$completedCount) ?>
Failed jobs
= h((string)$failedCount) ?>
Latest activity
= $latestJob ? h(job_tool_label($latestJob)) : 'โ' ?>
What this bundle sells better
Core utility
WEBM โ MP4 stays as the universal compatibility tool.
Upsell angle
Social presets turn a generic conversion app into a publishing workflow for agencies and growth teams.
Add-on utility
Subtitle format conversion supports accessibility and multi-channel publishing without external tools.
Storage policy
Jobs and files are retained for = h((string)$retentionHours) ?> hours before cleanup.
Helpful defaults
Use WEBM โ MP4 for simple playback compatibility.
Use Social export presets for landscape, square, or vertical delivery.
Use Subtitle converter when captions need SRT or VTT output.
Your first WEBM, social export, or subtitle conversion will show up here with a dedicated detail page and download action.
= h(job_tool_label($job)) ?>
= h((string)$job['original_name']) ?>
= h(ucfirst((string)$job['status'])) ?>
Created
= h(format_datetime((string)$job['created_at'])) ?>
Input
= h(format_bytes(isset($job['input_size']) ? (int)$job['input_size'] : null)) ?>
Output
= h(format_bytes(isset($job['output_size']) ? (int)$job['output_size'] : null)) ?>
Download
= job_output_exists($job) ? h(job_download_label($job)) : 'Pending' ?>
Processing your job
Large uploads and FFmpeg-based exports can take a little while on this VM.