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
stage
endpoint 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
url
filed (file:///Users/dblk/clips/my_asset
) - 😎 Add an endpoint
/dl/{version}/renders/:id
to 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 fromurl
filed (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 -cover
To run the tests during development:
ginkgo watch -r --randomize-all --race --trace
To build the program:
go build
To 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 |