{"id":37225512,"url":"https://github.com/dblk/shottower","last_synced_at":"2026-01-15T01:47:37.868Z","repository":{"id":49813151,"uuid":"518196716","full_name":"DblK/shottower","owner":"DblK","description":"An open source, self-hosted implementation of the Shotstack API backend","archived":false,"fork":false,"pushed_at":"2024-04-19T12:33:48.000Z","size":197,"stargazers_count":28,"open_issues_count":7,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-06-21T09:13:13.932Z","etag":null,"topics":["docker","editing","ffmpeg","go","golang","open-source","self-hosted","shotstack","shotstack-api","video"],"latest_commit_sha":null,"homepage":"https://dblk.github.io/shottower","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DblK.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null},"funding":{"github":["dblk"]}},"created_at":"2022-07-26T19:45:43.000Z","updated_at":"2024-03-11T19:28:41.000Z","dependencies_parsed_at":"2024-01-02T14:35:57.430Z","dependency_job_id":"1695063d-0e63-45aa-96f5-2c0a65a2e91f","html_url":"https://github.com/DblK/shottower","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/DblK/shottower","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DblK%2Fshottower","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DblK%2Fshottower/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DblK%2Fshottower/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DblK%2Fshottower/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DblK","download_url":"https://codeload.github.com/DblK/shottower/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DblK%2Fshottower/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28441031,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-15T00:55:22.719Z","status":"ssl_error","status_checked_at":"2026-01-15T00:55:20.945Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","editing","ffmpeg","go","golang","open-source","self-hosted","shotstack","shotstack-api","video"],"created_at":"2026-01-15T01:47:37.187Z","updated_at":"2026-01-15T01:47:37.854Z","avatar_url":"https://github.com/DblK.png","language":"Go","funding_links":["https://github.com/sponsors/dblk"],"categories":[],"sub_categories":[],"readme":"# ShotTower\n\u003cdiv align=\"center\"\u003e\n\n[![golangci-lint](https://github.com/DblK/shottower/actions/workflows/golangci-lint.yml/badge.svg?branch=master)](https://github.com/DblK/shottower/actions/workflows/golangci-lint.yml)\n[![ginkgo](https://github.com/DblK/shottower/actions/workflows/ginkgo.yml/badge.svg?branch=master)](https://github.com/DblK/shottower/actions/workflows/ginkgo.yml)\n[![GitHub go.mod Go version of a Go module](https://img.shields.io/github/go-mod/go-version/DblK/shottower.svg)](https://github.com/DblK/shottower)\n[![GoDoc reference example](https://img.shields.io/badge/godoc-reference-blue.svg)](https://godoc.org/github.com/DblK/shottower)\n[![GoReportCard](https://goreportcard.com/badge/github.com/DblK/shottower)](https://goreportcard.com/report/github.com/DblK/shottower)\n[![GitHub release](https://img.shields.io/github/release/DblK/shottower.svg)](https://GitHub.com/DblK/shottower/releases/)\n\u003c/div\u003e\n\nAn open source, self-hosted implementation of the Shotstack backend server.\n\nJoin our [Discord](https://discord.gg/GCXCNHRC) server for a chat.\n\n## What is ShotStack\n\nShotStack is a video editing API that allow to build dynamic Video Applications at Scale.\n\nEverything in ShotStack is Open Source, except the Dashboard and the backend server.\n\nThe backend server translate JSON to FFMPEG commands and serve the result.\n\n## Design goal\n\n`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!).\n\n`shottower` uses terms that maps to Shotstack's API, consult the glossary for explanations.\n## Support\n\nIf you like `shottower` and find it useful, there is a sponsorship and donation buttons available in the repo.\n\nIf you would like to sponsor features, bugs or prioritization, reach out to one of the maintainers.\n\n## Features (Basic + Exclusive 😎)\n\n* \"Basic\" (`Track`, `Clip`, `VideoAsset`, ...) support of Shotstack's features (See bellow for progress)\n    * Use only the `stage` endpoint value until all features are implemented (See https://github.com/DblK/shottower/issues/1 for multiple endpoint handling)\n* 😎 Possible to burn subtitle into video clip\n* 😎 Allow to use local file from `url` filed (`file:///Users/dblk/clips/my_asset`)\n* 😎 Add an endpoint `/dl/{version}/renders/:id` to download renders (instead of cdn/s3)\n* 😎 Add other values for resolution (`360`, `480`, `540`, `720`) all with default `25 fps`.\n* 😎 Add other values for output quality (`highest`, `lowest`).\n* [`Planned`] Allow to use ftp file from `url` filed (`ftp://user:password@dblk.org/mypath/my_asset`)\n* [`Planned`] Add destination to Youtube\n\n### Shotstack implementation progress\n\nIn the following matrix, there is only components than their implementation have been started.  \nAt the end of the road this section should either disappear or be full of `Yes` 😇.\n\n| Component | Property | Implemented | Comment |\n| ------------------- | -------- | ----------- | --------- |\n| Timeline | soundtrack | Not yet |  |\n| Timeline | background | Yes ✅ |  |\n| Timeline | fonts | Not yet |  |\n| Timeline | tracks | Yes ✅ |  |\n| Timeline | cache | Yes ✅ |  |\n| Track ✅ | all ✅ | Yes ✅ |  |\n| Clip | asset | Partial 🛠 | Only `VideoAsset` \u0026 `ImageAsset` are handled |\n| Clip | start | Yes ✅ |  |\n| Clip | length | Yes ✅|  |\n| Clip | fit | Not yet |  |\n| Clip | scale | Yes ✅|  |\n| Clip | position | Yes ✅ |  |\n| Clip | offset | Not yet |  |\n| Clip | transition | Not yet |  |\n| Clip | effect | Not yet |  |\n| Clip | filter | Not yet |  |\n| Clip | opacity | Not yet |  |\n| Clip | transform | Not yet |  |\n| Clip [`VideoAsset`] | all ✅ | Yes ✅ |  |\n| Clip [`ImageAsset`] | all ✅ | Yes ✅ |  |\n| Clip [`TitleAsset`] | all | Not yet |  |\n| Clip [`HTMLAsset`] | all | Not yet |  |\n| Clip [`AudioAsset`] | src | Partial 🛠 | Download asset only |\n| Clip [`AudioAsset`] | trim | Not yet |  |\n| Clip [`AudioAsset`] | volume | Not yet |  |\n| Clip [`AudioAsset`] | effect | Not yet |  |\n| Clip [`LumaAsset`] | src | Partial 🛠 | Download asset only |\n| Clip [`LumaAsset`] | trim | Not yet |  |\n| Output | format | Partial 🛠 | Only `mp4` \u0026 `gif` at the moment  |\n| Output | resolution | Yes ✅ |  |\n| Output | aspectRatio | Not yet |  |\n| Output | size | Yes ✅ |  |\n| Output | fps | Yes ✅ |  |\n| Output | scaleTo | Not yet |  |\n| Output | quality | Yes ✅ |  |\n| Output | repeat | Yes ✅ |  |\n| Output | range | Not yet |  |\n| Output | poster | Not yet |  |\n| Output | thumbnail | Not yet |  |\n| Output | destinations | Not yet |  |\n| Callback | | Yes ✅ |  |\n\n#### Endpoint implementation\n\nThere are several endpoints that are available but not all of them are implemented.\n\n| Category | Endpoint Description | Status | Comment |\n| -------- | -------------------- | ------ | ------- |\n| Edit     | Render asset | Yes ✅ | |\n| Edit     | Get Render Status | Partial 🛠 | Missing real `owner` |\n| Edit     | Create Template | Not yet | |\n| Edit     | List Template | Not yet | |\n| Edit     | Retrieve Template | Not yet | |\n| Edit     | Update Template | Not yet | |\n| Edit     | Delete Template | Not yet | |\n| Edit     | Render Template | Not yet | |\n| Edit     | Inspect Media | Not yet | |\n| Serve    | Get Asset | Partial 🛠 | |\n| Serve    | Delete Asset | Not yet | |\n| Serve    | Get Asset by Render ID | Not yet | |\n## Running shottower\n\nPlease have a look at the documentation under `docs/`.\n\n## Disclaimer\n\n1. We have nothing to do with shotstack\n2. The purpose of ShotTower is maintaining a working, self-hosted Shotstack api compatible backend.\n\n## Contributing\n\nTo contribute to shottower you would need the latest version of Go.\n\n### Code style\n\nTo ensure we have some consistency with contributions, this project has adopted linting and style/formatting rules:\n\nThe **Go** code is linted with [`golangci-lint`](https://golangci-lint.run).\n\nCheck out the `.golangci.yml` to see the specific configuration.\n\n### Commit message\n\nTo ensure, the changelog are well generated, please use prefix in your commit message as follow:\n- `feat`, `features`, `feature`: For new features\n- `fix`: For any fix\n- `doc`, `docs`: For any update in documentation (README, etc...)\n\nAnd if you `really` need to commit something that is not working `wip` ou `test` are your friends.\n\n### Install development tools\n* [Go 1.18](https://go.dev/doc/install)\n* [FFMPEG (v5 or up)](https://ffmpeg.org/download.html)\n* [gifski](https://github.com/ImageOptim/gifski) (For high quality GIF)\n* [ginkgo](https://onsi.github.io/ginkgo/#installing-ginkgo)\n* [golangci-lint](https://golangci-lint.run/usage/install/)\n* (optional) I recommend using [gow](https://github.com/mitranim/gow)\n\n### Testing and building\n\nTo run the tests (solo execution):\n```golang\nginkgo -r --randomize-all --randomize-suites --race --trace -cover\n```\n\nTo run the tests during development:\n```golang\nginkgo watch -r --randomize-all --race --trace\n```\n\nTo build the program:\n```golang\ngo build\n```\n\n### Running the server\n\nTo run the server, follow these simple steps:\n\n```\ngo run main.go\n```\n\nTo run the server in a docker container\n```\ndocker build --network=host -t shottower .\n```\n\nOnce image is built use\n```\ndocker run --rm -it shottower\n```\n\n## Contributors\n\n\u003ctable\u003e\n\u003ctr\u003e\n    \u003ctd align=\"center\" style=\"word-wrap: break-word; width: 150.0; height: 150.0\"\u003e\n        \u003ca href=https://github.com/DblK\u003e\n            \u003cimg src=https://avatars.githubusercontent.com/u/832617?v=4 width=\"100;\"  alt=Rémy Boulanouar/\u003e\n            \u003cbr /\u003e\n            \u003csub style=\"font-size:14px\"\u003e\u003cb\u003eRémy Boulanouar\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdblk%2Fshottower","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdblk%2Fshottower","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdblk%2Fshottower/lists"}