github TheNickOfTime/handbrake-web v0.8.0

one day ago

Long time, no see! After a year (nearly to the date), HandBrake Web v0.8.0 is here!

I'm sorry for how long this took - maintaining a project like this in my limited free time is no easy task, and the past year has been difficult for me in a variety of ways. With apologies out of the way, I am happy to say that this update has a large number of improvements. The primary focus of this update was under-the-hood optimization and bug fixing, so things will not feel "new", but I promise you that this update for the project is the most substantial one so far.

Featured Changes

Overhauled Build Process

The build process for HandBrake Web has been revamped pretty much top to bottom. This comes with a variety of benefits/improvements:

Custom Built HandBrake v1.10.2

Previously, the image build process would simply install HandBrake from Debian's package repository. This was bad for a variety of reasons - HandBrake themselves don't recommend doing this, and even at the time of the last release, the packaged HandBrake v1.6.2 was horrifically out of date.

As of v0.8.0, this project automatically (using Renovate) builds HandBrake from source whenever there is a new release from the HandBrake team. This means that we are shipping with the latest version of HandBrake (v1.10.2 at the time of publishing), and staying on top of future versions will be much easier and faster.

Additionally, the custom build of HandBrake has fewer external dependencies, which has had a great impact on final image size.

Distroless Base Image

The final images for this project now use Google's distroless base images. As a result, our final images only include what is absolutely necessary to run the project. This has a variety of implications, but is mostly impactful to final image size.

Application Bundling

The server and worker applications are now bundled with esbuild (the client already was previously). Through the magic of dependency tree-shaking, only the code and dependencies that are actually needed are included in the final build. This has a drastic impact on final image size.

Final Image Size Reduction

As a result of these build changes, the server and worker images have gone from 1.04 GB and 1.29 GB to 222 MB and 394 MB respectively.

Client Updates

Massive Refactoring

This is the biggest change that you will never notice. Nearly every aspect of the client has been rewritten or refactored, now more closely following best practices (who was the idiot who wrote all this over a year ago?). There is still more work to do here, but for now it means maintaining the client code is immeasurably easier, which means fixing bugs and implementing features should be faster.

Updated Job Creation Dialog

job creation dialog

The job creation dialog has been refined both visually and functionally:

  • The styling of the dialog has been updated to be more in line with the rest of the application - previously was looking pretty plain/vanilla HTML.
  • The order of sections has been revised - you now select the preset you intend to use before anything else.
  • File extension selection has been removed and uses the extension provided by the selected preset (how it should have always been)
  • ISO images can now be selected as the input file in the File Browser (previously wasn't possible).

Updated Worker Display

worker display

The display for worker information has been updated to include a ton more useful and relevant information such as:

  • Application Version
  • HandBrake Version
  • Supported Hardware Capabilities

Server Updates

Better Job Assignment Handling

Workers will not get assigned jobs that they are not capable of handling - for example, a worker without an NVIDIA GPU will not be assigned a job that requires NVENC encoding.

Overhauled Database Interaction

The server now uses Kysely to manage interacting with the SQLite database the application uses for a variety of persistent data. This comes with a variety of benefits:

  • Better TypeScript integration
  • Better handling for future schema migrations

As a result, all database-related code has been refactored, reexamined, and optimized.

Revised Configuration Handling

In addition to a handful of new configuration options, the handling of the configuration file in general has been revised and improved (it's a lot less jank now).

Worker Updates

Improved Support for Intel QSV

The worker now includes up to date drivers that allow the most recent Intel GPUs to be supported for Intel QSV hardware encoding.

Improved Handling of Connecting/Disconnecting to the Server

Both the server and workers handle disconnecting from one another much more gracefully. The primary impact of this is preventing an issue where a worker could enter a state of working on more than one job at a time.

Documentation

Documentation over at the Wiki has been... well... it didn't really exist before, and now it does! Hopefully this is a huge improvement for people getting started with the project, or using advanced features. There is still more work to do here, so please contribute to the wiki if you can!

Bonus handbrake-cli Image

As a byproduct of the new build pipeline, I have published a fully-featured, but minimally-sized wrapper image for using HandBrakeCLI directly via Docker. If you're using this project, this may not appeal to you, but I think someone out there will find this useful! Read more about it over at the wiki.

All Changes

Click to see all pull requests merged in this release
  • feat: fix sass @import deprecation errors and broken @use instances by @TheNickOfTime in #312
  • feat: update client node tsconfig by @TheNickOfTime in #313
  • deps: manual update by @TheNickOfTime in #311
  • build(deps): bump the patch-and-minor-updates group across 3 directories with 11 updates by @dependabot[bot] in #319
  • devcontainer: updating the devcontainer config & dockerfile by @TheNickOfTime in #322
  • deps: prepping repo for utilizing pnpm by adding .pnpm-store to .gitignore by @TheNickOfTime in #323
  • deps: migrate package management from npm to pnpm by @TheNickOfTime in #355
  • dependabot: updating dependabot config by @TheNickOfTime in #358
  • deps: manually update dependencies by @TheNickOfTime in #359
  • feat: refactoring the client to better follow best practices for easier maintainability by @TheNickOfTime in #369
  • dependabot: have dependabot only look at the root pnpm workspace by @TheNickOfTime in #379
  • build(deps): bump the patch-and-minor-updates group with 18 updates by @dependabot[bot] in #380
  • fix: client build failing due to missing routeTree.gen file by @TheNickOfTime in #378
  • feat: update the worker dockerfile to build the latest release tag of handbrake from GitHub by @TheNickOfTime in #377
  • chore: adding the 'triage' label and default project to new issues made with templates by @TheNickOfTime in #383
  • fix: bad sizing on the add directory input in the file browser by @TheNickOfTime in #382
  • fix: queue card ETA display by piping transcode_eta through the secondsToTime function by @TheNickOfTime in #395
  • feat: update file system operations in the worker transcode script to perform asynchronously rather than synchronously by @TheNickOfTime in #397
  • fix: queue jobs unable to reorder due to passing the wrong id to the database query by @TheNickOfTime in #398
  • chore: update the devcontainer to build the latest version of HandBrake to mimick the actual deployment environment by @TheNickOfTime in #400
  • fix: worker typescript errors preventing tsc from suceeding by @TheNickOfTime in #414
  • feat: update the worker build script to bundle the application with esbuild by @TheNickOfTime in #415
  • feat: make the worker image distroless by @TheNickOfTime in #408
  • fix: server typescript errors preventing a sucessful build by @TheNickOfTime in #426
  • chore: reduce devcontainer image size by utilizing multi-stage build by @TheNickOfTime in #407
  • chore: update the devcontainer config to use node v24 and pnpm v10 by @TheNickOfTime in #428
  • build(deps-dev): bump @types/node from 22.16.5 to 24.5.1 by @dependabot[bot] in #381
  • feat: bundle the server application with esbuild by @TheNickOfTime in #429
  • feat: update the sever image to be distroless by @TheNickOfTime in #430
  • build(deps): bump the patch-and-minor-updates group with 11 updates by @dependabot[bot] in #431
  • feat: updating the worker build process to be aligned with the server build process by @TheNickOfTime in #432
  • feat: updating the client lint script command by @TheNickOfTime in #433
  • chore: adding a workflow to run the 'lint' command across all projects to verify code quality by @TheNickOfTime in #434
  • feat: build HandBrake separately from other dockerfiles by @TheNickOfTime in #436
  • feat: adding a workflow for updating the handbrake build version with renovate by @TheNickOfTime in #437
  • chore(deps): update dependency handbrake to v1.10.2 by @handbrake-web-renovate[bot] in #439
  • feat: update docker images to use the separately built handbrake image by @TheNickOfTime in #440
  • feat: build handbrake with support for intel, nvidia, and amd GPUs by @TheNickOfTime in #444
  • feat: renaming the handbrake-build job by @TheNickOfTime in #447
  • feat: add concurrency to the docker-publish workflow by @TheNickOfTime in #448
  • feat: only run docker publish if files that affect builds are modified by @TheNickOfTime in #449
  • feat: adding custom script to wait for handbrake-build to finish by @TheNickOfTime in #451
  • build(deps): bump the patch-and-minor-updates group with 12 updates by @dependabot[bot] in #453
  • feat: make the shared folder a full fledged library folder by @TheNickOfTime in #456
  • feat: update the database to use Kysely for better typesafety by @TheNickOfTime in #457
  • feat: use kysely's migration system by @TheNickOfTime in #459
  • fix: only run the migration backup step if there are migrations to run by @TheNickOfTime in #462
  • feat: add watcher option to start the queue if it is stopped by @TheNickOfTime in #461
  • feat: improve config file handling with support for schema migrations and other improvements by @TheNickOfTime in #464
  • fix: temporarily hard-code import paths for migration scripts to prevent esbuild bundling errors by @TheNickOfTime in #466
  • fix: out of date config typings that I forgot about by @TheNickOfTime in #467
  • feat: add a configuration option to control the state the queue will be when the application starts by @TheNickOfTime in #468
  • feat: automatically copy the builtin presets from handbrake's source during the server image build process by @TheNickOfTime in #470
  • chore: adding github cli feature and github pull request extension to the devcontainer config by @TheNickOfTime in #473
  • feat: make a unified logger script in the shared project for use across all projects by @TheNickOfTime in #474
  • feat: use the extension from the preset rather than manually specifying one at time of job creation by @TheNickOfTime in #475
  • fix: prevent crash when removing finished/stopped jobs from the queue by @TheNickOfTime in #478
  • feat: prevent presets from being deleted that are being used by non-finished jobs in the queue by @TheNickOfTime in #479
  • fix: can't select default preset in job creation overlay by @TheNickOfTime in #480
  • fix: queue status not returning to idle when no jobs are available for workers by @TheNickOfTime in #481
  • build(deps): bump the patch-and-minor-updates group with 17 updates by @dependabot[bot] in #484
  • fix: prevent workers from working on multiple jobs at once by @TheNickOfTime in #482
  • feat: handle worker/server disconnecting from eachother better by @TheNickOfTime in #486
  • fix: check for permissions issues at startup to prevent permissions errors at runtime by @TheNickOfTime in #487
  • feat: allow '.iso' files to be selected in the file browser by @TheNickOfTime in #435
  • chore: remove/update unwanted/messy console/debug logs by @TheNickOfTime in #488
  • feat: add a lint command to the shared project by @TheNickOfTime in #494
  • feat: only run typescript check if files in project paths are modified by @TheNickOfTime in #495
  • fix: shared module export types order by @TheNickOfTime in #493
  • feat: adding sub-project commands to the root package.json by @TheNickOfTime in #492
  • feat: add support for env variable DEFAULT_PRESETS_PATH in order to support other development environments by @TheNickOfTime in #491
  • chore: add CONTRIBUTING.md by @TheNickOfTime in #490
  • docs: add a page to the wiki to go over cross-container volume mapping behavior by @TheNickOfTime in #396
  • docs: renaming about-volume-mapping to "About Volume Mapping" for better formatting by @TheNickOfTime in #496
  • fix: worker data path race condition by @TheNickOfTime in #500
  • build(deps): bump the patch-and-minor-updates group across 1 directory with 14 updates by @dependabot[bot] in #508
  • feat: update the worker image to include support for intel QSV again by @TheNickOfTime in #503
  • fix: updating handbrake version back to 1.10.2 by @TheNickOfTime in #512
  • devcontainer: update devcontainer to use new file structure from base image handbrake-build by @TheNickOfTime in #515
  • devcontainer: add github markdown styling extension to devcontainer config by @TheNickOfTime in #514
  • feat: update how PR tags are handled for handbrake-build by @TheNickOfTime in #521
  • feat: updating all docker images to use debian 13 as a base by @TheNickOfTime in #520
  • fix: only use handbrake-build PR number if it exists by @TheNickOfTime in #522
  • chore: update the devcontainer to trixie base by @TheNickOfTime in #523
  • build(deps): bump the patch-and-minor-updates group with 10 updates by @dependabot[bot] in #518
  • build(deps): bump the patch-and-minor-updates group across 1 directory with 12 updates by @dependabot[bot] in #527
  • feat: implement worker "properties" that provide various version and hardware capability information by @TheNickOfTime in #530
  • fix: worker capabilities check fails in distroless container by @TheNickOfTime in #532
  • chore: update final dockerfiles to use the purpose built debian 13 node 24 distroless container by @TheNickOfTime in #534
  • build(deps): bump the patch-and-minor-updates group with 11 updates by @dependabot[bot] in #529
  • docs: adding a hardware acceleration wiki page and update the readme section on transcoding by @TheNickOfTime in #501
  • fix: allow failed jobs to be restarted by @TheNickOfTime in #540
  • fix: typo leading to misnamed worker logs by @TheNickOfTime in #542
  • fix: don't show queue warning if the queue is stopped by @TheNickOfTime in #543
  • chore: re-enabling arm64 builds for the worker image by @TheNickOfTime in #424
  • chore: adding example compose files to reference in documentation by @TheNickOfTime in #546
  • docs: adding an 'Installation' wiki page by @TheNickOfTime in #547
  • docs: fix bad wikilink on wiki home page by @TheNickOfTime in #551
  • docs: adding a new presets wiki page by @TheNickOfTime in #552
  • docs: adding a hardware acceleration section back to the readme by @TheNickOfTime in #555
  • docs: updating the features section of the readme by @TheNickOfTime in #556
  • actions: trigger server/worker docker image builds if the handbrake-build dockerfile/workflow are modified by @TheNickOfTime in #557
  • docs: creating a 'HandBrakeCLI Image' wiki page by @TheNickOfTime in #558
  • docs: updating the wiki home page information and layout by @TheNickOfTime in #559
  • actions: update wiki-publish workflow and adjust location of images for use in wiki by @TheNickOfTime in #560
  • docs: fix presets wiki page images by @TheNickOfTime in #561
  • feat: enable dolby vision support in the build process by @TheNickOfTime in #544
  • fix: HANDBRAKE_BUILD_TAG error in docker-publish by @TheNickOfTime in #562
  • chore: update readme images by @TheNickOfTime in #567
  • build(deps): bump the patch-and-minor-updates group across 1 directory with 19 updates by @dependabot[bot] in #572
  • devcontainer: allow configuring devcontainer user id and group by @TheNickOfTime in #574
  • fix: missing enocoder display names on preset cards by @TheNickOfTime in #573
  • feat: clarify why save configuration button is greyed out when config is up to date by @TheNickOfTime in #575
  • fix: adding logging to see eligible jobs by @TheNickOfTime in #576
  • docs: adding contributing link to the readme by @TheNickOfTime in #578
  • docs: remove setup warning from the readme by @TheNickOfTime in #577

New Contributors

  • @handbrake-web-renovate[bot] made their first contribution in #439

Full Changelog: v0.7.0...v0.8.0

Support HandBrake Web

HandBrake Web is developed and made available completely for free. If you enjoy using the project, consider supporting the project with a donation.

Don't miss a new handbrake-web release

NewReleases is sending notifications on new releases.