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.
Track, Clip, VideoAsset, ...) support of Shotstack's features (See bellow for progress)stage endpoint value until all features are implemented (See https://github.com/DblK/shottower/issues/1 for multiple endpoint handling)url filed (file:///Users/dblk/clips/my_asset)/dl/{version}/renders/:id to download renders (instead of cdn/s3)360, 480, 540, 720) all with default 25 fps.highest, lowest).Planned] Allow to use ftp file from url filed (ftp://user:password@dblk.org/mypath/my_asset)Planned] Add destination to YoutubeIn 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 are started |
| 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 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 | Not yet | |
| Output | range | Not yet | |
| Output | poster | Not yet | |
| Output | thumbnail | Not yet | |
| Output | destinations | Not yet |
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 | |
| ## Running shottower |
Please have a look at the documentation under docs/.
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 features
- fix: For any fix
- doc, 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.
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
|
|
$ claude mcp add shottower \
-- python -m otcore.mcp_server <graph>