MCPcopy Index your code
hub / github.com/DblK/shottower

github.com/DblK/shottower @v0.0.4

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.0.4 ↗ · + Follow
404 symbols 863 edges 70 files 214 documented · 53%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

ShotTower

golangci-lint ginkgo GitHub go.mod Go version of a Go module GoDoc reference example GoReportCard GitHub release

An open source, self-hosted implementation of the Shotstack backend server.

Join our Discord server for a chat.

What is ShotStack

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.

Design goal

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.

Support

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.

Features (Basic + Exclusive 😎)

  • "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 https://github.com/DblK/shottower/issues/1 for multiple endpoint handling)
  • 😎 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 default 25 fps.
  • 😎 Add other values for output quality (highest, lowest).
  • [Planned] Allow to use ftp file from url filed (ftp://user:password@dblk.org/mypath/my_asset)
  • [Planned] Add destination to Youtube

Shotstack implementation progress

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 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

Endpoint implementation

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/.

Disclaimer

  1. We have nothing to do with shotstack
  2. The purpose of ShotTower is maintaining a working, self-hosted Shotstack api compatible backend.

Contributing

To contribute to shottower you would need the latest version of Go.

Code style

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.

Commit message

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.

Install development tools

  • Go
  • FFMPEG (v5 or up)
  • (optional) I recommend using gow

Testing and building

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

Running the server

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

Contributors

Rémy Rémy Boulanouar

Extension points exported contracts — how you extend this code

Router (Interface)
Router defines the required methods for retrieving api routes [3 implementers]
go/routers.go
DownloadAPIRouter (Interface)
DownloadApiRouter defines the required methods for binding the api requests to a responses for the DownloadApi The Downl [2 …
go/api.go
EditAPIOption (FuncType)
EditAPIOption for how the controller is set up.
go/api_edit.go
ErrorHandler (FuncType)
ErrorHandler defines the required method for handling error. You may implement it and inject this into a controller if y
go/error.go
ServeAPIOption (FuncType)
ServeAPIOption for how the controller is set up.
go/api_serve.go
DownloadAPIOption (FuncType)
DownloadAPIOption for how the controller is set up.
go/api_download.go
FFMPEGCommand (Interface)
(no doc) [1 implementers]
go/model_ffmpeg.go
ShottowerConfiguration (Interface)
(no doc) [1 implementers]
config/config.go

Core symbols most depended-on inside this repo

ToString
called by 72
go/model_ffmpeg.go
AssertRecurseInterfaceRequired
called by 47
go/helpers.go
IsZeroValue
called by 36
go/helpers.go
trackName
called by 17
go/ffmpeg.go
EncodeJSONResponse
called by 16
go/routers.go
Response
called by 15
go/helpers.go
SetOutputResolution
called by 12
go/model_ffmpeg.go
GetResolution
called by 10
go/model_ffmpeg.go

Shape

Method 175
Function 145
Struct 66
Interface 10
FuncType 4
TypeAlias 4

Languages

Go100%

Modules by API surface

go/ffmpeg.go44 symbols
go/api.go36 symbols
go/model_ffmpeg.go34 symbols
config/config.go15 symbols
go/api_edit.go14 symbols
go/api_edit_service.go13 symbols
go/queue.go11 symbols
go/routers.go10 symbols
go/error.go9 symbols
go/api_serve.go8 symbols
go/model_clip.go7 symbols
go/model_output.go6 symbols

For agents

$ claude mcp add shottower \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact