An open source, self-hosted implementation of the Shotstack backend server.
Join our Discord server for a chat.
ShotStack is a video editing API that allow to build dynamic Video Applications at Scale.
Everything in ShotStack is Open Source, except the Dashboard and the backend server.
The backend server translate JSON to FFMPEG commands and serve the result.
shottower aims to implement a self-hosted, open source alternative to the Shotstack backend server. shottower has a narrower scope and are not built for heavy transcode (but pull request are welcome!).
shottower uses terms that maps to Shotstack's API, consult the glossary for explanations.
If you like shottower and find it useful, there is a sponsorship and donation buttons available in the repo.
If you would like to sponsor features, bugs or prioritization, reach out to one of the maintainers.
- "Basic" (
Track,Clip,VideoAsset, ...) support of Shotstack's features (See bellow for progress)- Use only the
stageendpoint value until all features are implemented (See #1 for multiple endpoint handling)
- Use only the
- π Possible to burn subtitle into video clip
- π Allow to use local file from
urlfiled (file:///Users/dblk/clips/my_asset) - π Add an endpoint
/dl/{version}/renders/:idto download renders (instead of cdn/s3) - π Add other values for resolution (
360,480,540,720) all with default25 fps. - π Add other values for output quality (
highest,lowest). - [
Planned] Allow to use ftp file fromurlfiled (ftp://user:[email protected]/mypath/my_asset) - [
Planned] Add destination to Youtube
In the following matrix, there is only components than their implementation have been started.
At the end of the road this section should either disappear or be full of Yes π.
| Component | Property | Implemented | Comment |
|---|---|---|---|
| Timeline | soundtrack | Not yet | |
| Timeline | background | Yes β | |
| Timeline | fonts | Not yet | |
| Timeline | tracks | Yes β | |
| Timeline | cache | Yes β | |
| Track β | all β | Yes β | |
| Clip | asset | Partial π | Only VideoAsset & ImageAsset are handled |
| Clip | start | Yes β | |
| Clip | length | Yes β | |
| Clip | fit | Not yet | |
| Clip | scale | Yes β | |
| Clip | position | Yes β | |
| Clip | offset | Not yet | |
| Clip | transition | Not yet | |
| Clip | effect | Not yet | |
| Clip | filter | Not yet | |
| Clip | opacity | Not yet | |
| Clip | transform | Not yet | |
Clip [VideoAsset] |
all β | Yes β | |
Clip [ImageAsset] |
all β | Yes β | |
Clip [TitleAsset] |
all | Not yet | |
Clip [HTMLAsset] |
all | Not yet | |
Clip [AudioAsset] |
src | Partial π | Download asset only |
Clip [AudioAsset] |
trim | Not yet | |
Clip [AudioAsset] |
volume | Not yet | |
Clip [AudioAsset] |
effect | Not yet | |
Clip [LumaAsset] |
src | Partial π | Download asset only |
Clip [LumaAsset] |
trim | Not yet | |
| Output | format | Partial π | Only mp4 & gif at the moment |
| Output | resolution | Yes β | |
| Output | aspectRatio | Not yet | |
| Output | size | Yes β | |
| Output | fps | Yes β | |
| Output | scaleTo | Not yet | |
| Output | quality | Yes β | |
| Output | repeat | Yes β | |
| Output | range | Not yet | |
| Output | poster | Not yet | |
| Output | thumbnail | Not yet | |
| Output | destinations | Not yet | |
| Callback | Yes β |
There are several endpoints that are available but not all of them are implemented.
| Category | Endpoint Description | Status | Comment |
|---|---|---|---|
| Edit | Render asset | Yes β | |
| Edit | Get Render Status | Partial π | Missing real owner |
| Edit | Create Template | Not yet | |
| Edit | List Template | Not yet | |
| Edit | Retrieve Template | Not yet | |
| Edit | Update Template | Not yet | |
| Edit | Delete Template | Not yet | |
| Edit | Render Template | Not yet | |
| Edit | Inspect Media | Not yet | |
| Serve | Get Asset | Partial π | |
| Serve | Delete Asset | Not yet | |
| Serve | Get Asset by Render ID | Not yet |
Please have a look at the documentation under docs/.
- We have nothing to do with shotstack
- The purpose of ShotTower is maintaining a working, self-hosted Shotstack api compatible backend.
To contribute to shottower you would need the latest version of Go.
To ensure we have some consistency with contributions, this project has adopted linting and style/formatting rules:
The Go code is linted with golangci-lint.
Check out the .golangci.yml to see the specific configuration.
To ensure, the changelog are well generated, please use prefix in your commit message as follow:
feat,features,feature: For new featuresfix: For any fixdoc,docs: For any update in documentation (README, etc...)
And if you really need to commit something that is not working wip ou test are your friends.
- Go 1.18
- FFMPEG (v5 or up)
- gifski (For high quality GIF)
- ginkgo
- golangci-lint
- (optional) I recommend using gow
To run the tests (solo execution):
ginkgo -r --randomize-all --randomize-suites --race --trace -coverTo run the tests during development:
ginkgo watch -r --randomize-all --race --traceTo build the program:
go buildTo run the server, follow these simple steps:
go run main.go
To run the server in a docker container
docker build --network=host -t shottower .
Once image is built use
docker run --rm -it shottower
|
RΓ©my Boulanouar |