# Add subtitle, chapters, and thumbnails to video uploads
[View original](https://ittybit.com/guides/subtitles-chapters-thumbnails)
## The Workflow
### Overview
This workflow generates [subtitles](/docs/subtitles), [chapters](/docs/chapters), and [thumbnails](/docs/thumbnails) in a single task.
***
### Build Workflow
A [workflow](/docs/workflows) is an array of task definitions that describe
what should happen and in what order.
Tasks in the array run in parallel. You can also chain tasks together in
sequences using the `next` property.
***
### Automatic Upgrade
Behind-the-scenes, ittybit will upgrade this to extract the data each subtask requires, without you having to do anything.
***
### Create Task
We create a new task with the `kind: "workflow"`.
The `workflow` property contains our workflow steps as defined above.
```ts
const task = await ittybit.tasks.create({
url: "https://example.com/your-video.mp4",
kind: "workflow",
workflow: workflow
})
```
```python
task = ittybit.tasks.create({
url="https://example.com/your-video.mp4",
kind="workflow",
workflow=workflow
})
```
```ruby
task = ittybit.tasks.create({
url: "https://example.com/your-video.mp4",
kind: "workflow",
workflow: workflow
})
```
```php
$task = $ittybit->tasks->create([
'url' => "https://example.com/your-video.mp4",
'kind' => "workflow",
'workflow' => workflow
]);
```
```go
task, err := ittybit.Tasks.Create(
context.TODO(),
&ittybit.TaskCreateParams{
Kind: "workflow",
URL: "https://example.com/your-video.mp4",
Workflow: workflow
},
)
```
```js
const task = await fetch('https://api.ittybit.com/tasks', {
method: 'POST',
headers: { 'Authorization': `Bearer ${ITTYBIT_API_KEY}` },
body: JSON.stringify({
url: "https://example.com/your-video.mp4",
kind: "workflow",
workflow: workflow
})
})
```
***
### Handle Webhook
Your webhook handler should parse the [File Object](/docs/files) payloads and save the data in your database.