shaka-packager ships a Debug build in its Docker image and marks three key systems as limited
A media packaging and development framework for VOD and Live DASH and HLS applications, supporting Common Encryption for Widevine and other DRM Systems.
At a glance
- What is it?
- A media packaging tool and SDK for DASH and HLS whose codec matrix names two subtitle inputs as open issues, whose license is recorded inconsistently across two files, and whose container image is built as a CMake Debug configuration.
- Who is it for?
- Shaka Packager fits a pipeline team that has to deliver adaptive streams with real DRM rather than produce a preview file, and its codec matrix is the most useful thing in the repository because it says what will not work. Three checks before you adopt it.
- Can I use it commercially?
- Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
- Is it still maintained?
- Yes. The repository last received commits 10 days ago.
- What is it written in?
- Mainly C++, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- shaka-project/shaka-packager2,667 ★ · +43
| Repository | 2026-10-04 | 2026-11-14 |
|---|---|---|
| shaka-project/shaka-packager | 2.6k | 2.7k |
43 Stars in the last 41 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
The license is recorded in one place and filed in two others
The license field recorded for this repository is unasserted, which is the absence of a value rather than a statement about the terms. The tree, meanwhile, carries two license files at the root. One is `LICENSE`, and next to it sits `chromium-LICENSE`, which points at the third party code the build vendors in, consistent with the `.gitmodules` file also sitting at the root. The README does not name a license anywhere, so a reader looking for the terms has three files to reconcile and no document to reconcile them with. This article does not pick one for you. What can be said is that the recorded field and the repository contents disagree about whether a license is declared, and that anyone shipping this in a product should read both files rather than trust the field. The naming of the second file is itself a clue about the shape of the codebase, since it ties the vendored parts to a browser engine's own terms rather than to the project's.
The container image is a Debug build with three binaries copied out
The Dockerfile is a two stage build on Alpine 3.19, and the middle stage configures the project explicitly as a Debug build with Ninja.
RUN cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -G Ninja
RUN cmake --build build/ --config Debug --parallelTwo details there are deliberate. `RUN rm -rf build` appears before the configure step, so a build directory copied in from the checkout cannot influence the result, and the comment above it says the build is taken from the current directory rather than from what has been merged. The final stage then installs only libstdc++ and python3 and copies exactly three results into `/usr/bin`.
COPY --from=builder /shaka-packager/build/packager/packager \
/shaka-packager/build/packager/mpd_generator \
/shaka-packager/build/packager/pssh-box.py \
/usr/bin/The Python helper needs its proto directory beside it, and the file explains that the copy of that directory has to be its own instruction because Docker's copy skips the directory itself.
Two subtitle inputs are still open issues inside the support matrix
The support tables are honest enough to carry their own gaps. In the subtitle table, WebVTT in MP4 is marked for input with a reference to issue 405, and Teletext is marked for input with a reference to issue 272, which in each case means the capability is requested rather than shipped. Text TTML input carries a footnote instead: it is supported only when the output is TTML, as a pass through, and only for DASH, with a further reference to issue 584. DVB-SUB is input only and TTML in MP4 is output only. The video and audio matrix does the same thing more quietly, marking Opus in ISO-BMFF as experimental, listing Vorbis with no ISO-BMFF column at all, and giving WVM exactly three entries. For a packager, a matrix that names what fails is worth more than a feature list.
Three of the four key systems carry a limited support footnote
Four key systems are named: Widevine, PlayReady, FairPlay, and Marlin. Only Widevine is listed without a marker. The other three each carry a superscript that resolves to a single note at the bottom of the list reading limited support, which covers everything from PlayReady through Marlin in one phrase rather than one phrase each. That grouping makes the footnote easy to skim past, because it sits after the platform list rather than next to the key systems. The encryption standards underneath are narrower and unmarked: CENC and SAMPLE-AES. Two audio containers also carry footnotes of a different kind, one pointing at a section of an HTTP live streaming draft for packed audio, and one flagging the Opus row as experimental. Anyone planning a PlayReady or FairPlay delivery is working from a footnote that says less than the table above it implies.
The README apologises for its own absolute URLs in a broken comment block
The first lines of the document are a comment that was converted into Markdown reference definitions, each line opening with the same bracketed word and a hash. The text inside explains a real decision: absolute URLs are used because that is the simplest way to make the links work on GitHub and on Docker Hub, and the lines go on to concede that in a cloned repository the links point back to the main repository, suggesting that anyone who cares should update them in their clone, with a reference to issue 408 for the background. So the project knowingly trades clone correctness for link portability, and says so at the top of the file. What it does not do is hide the artefact of the conversion, which means the reasoning is stored as link definitions rather than as a comment and renders differently depending on the reader.
Three acquisition routes, and not one command line in the README
The document lists three ways to obtain the tool: a container image with instructions kept in a separate file under docs, prebuilt binaries from the releases page, or a source build whose details also live under docs. No shell command appears anywhere in it, which is unusual for a project of this size and means the first thing a new user has to do is leave the README. The source build follows the CMake and Ninja route that the Dockerfile uses, so the two paths agree on the build system even though neither is spelled out in the document a reader lands on. One further detail sits unexplained: an `npm/` directory at the root beside the C++ sources, with no mention of it in the README and no explanation of what it packages.
Three point releases in thirteen days, and a branch already past the newest tag
The release list holds v3.9.1 on 2026-07-15, v3.9.2 on 2026-07-17, and v3.9.3 on 2026-07-27. The mechanism behind those tags is in the tree rather than in the document: `.release-please-config.json` and `.release-please-manifest.json`, which is the automation that cuts a release from commit history and keeps the version in one file. The default branch was last pushed on 2026-08-21, about a month after the newest tag, and the repository is not archived. So the tag you would install is a month behind the branch, which is the normal arrangement for release automation and worth knowing before reading a bug fix as fixed. The change record itself is a CHANGELOG.md at the root, next to CONTRIBUTING.md, CODE_OF_CONDUCT.md, and SECURITY.md.
Agent instruction files, a link test, and a build matrix share the root
Several root entries describe how the project is built and checked rather than what it does. `AGENTS.md` sits beside `AGENT-ATTRIBUTION.md`, a pair that records instructions for automated coding agents and attribution for work they contributed. `build-matrix.json` names the configurations the project expects to build across, and `link-test/` implies a test that links the result rather than only running it. `.clang-format` fixes the C++ style, `CMakeLists.txt` is the build entry point, and `include/` and `packager/` are the two source trees. Alongside them are the human-facing files an Apache style project keeps: AUTHORS, CONTRIBUTORS, a code of conduct, a security policy, and a changelog. The document's useful links section also names four players, Shaka Player, dash.js, hls.js, and ExoPlayer, which tells you what the output is expected to be tested against. Two other root entries have no counterpart in the README at all: the platform list inside the document names Linux, Mac, and Windows with cross compiling for ARM also supported, and nothing in the tree records which of those the CI actually builds beyond the matrix file.
Editorial conclusion
Shaka Packager fits a pipeline team that has to deliver adaptive streams with real DRM rather than produce a preview file, and its codec matrix is the most useful thing in the repository because it says what will not work. Three checks before you adopt it. Verify the license from the files themselves, since the metadata records nothing and the tree holds both a LICENSE and a chromium-LICENSE. Read the limited support footnote, which covers PlayReady, FairPlay, and Marlin. And build from source if you care about build type, because the published container image is a CMake Debug build and the release binaries are a separate path.
Frequently asked questions
what is shaka packager
It is a tool and a media packaging SDK for DASH and HLS packaging and encryption, written in C++. It prepares and packages media for online streaming, handles both video on demand and live, and works with the Widevine, PlayReady, FairPlay, and Marlin key systems using CENC or SAMPLE-AES.
how to install shaka packager
The README lists three routes and gives no command for any of them: run the Docker image, download prebuilt binaries from the releases page, or build from source. The container instructions are kept in a separate file under docs, and the build instructions in another file there.
Which DRM key systems does shaka packager support?
Four are named: Widevine, PlayReady, FairPlay, and Marlin. PlayReady, FairPlay, and Marlin each carry a footnote that resolves to a note reading limited support, and the encryption standards listed are CENC and SAMPLE-AES.
Does shaka packager replace ffmpeg?
The repository makes no such comparison and names no alternative tools. What it does list is a set of players to verify output against: Shaka Player and dash.js for DASH on the web, hls.js for HLS on the web, and ExoPlayer for DASH and HLS on Android.
What license is shaka packager under?
The recorded license field is empty, while the tree contains both a LICENSE file and a chromium-LICENSE file for the vendored third party code. The README does not state a license, so the files themselves are the only source.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/shaka-project-shaka-packager)Star history chart for your README
[](https://hysenlabs.com/projects/shaka-project-shaka-packager)Was this useful?