Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
8b00be5
feat(ui): make advanced mode app-wide, and curate the method dropdowns
StuartCameronCode Aug 14, 2026
94537d5
feat(ui): suggest passes from the source, name presets after it, warn…
StuartCameronCode Aug 14, 2026
9866997
refactor: delete the superseded settings panels, group presets by que…
StuartCameronCode Aug 14, 2026
0539120
feat(filters): add DFTTest, FFT3DFilter, TTempSmooth, aWarpSharp2 and…
StuartCameronCode Aug 14, 2026
f5a29ee
feat(filters): add Anti-Aliasing and Stabilize passes, plus LUTDeRainbow
StuartCameronCode Aug 15, 2026
927d474
feat(deps): add the fluxsmooth plugin, unlocking FluxSmooth and STPresso
StuartCameronCode Aug 15, 2026
bec41dd
docs: record why one filter justified the deps 1.9.0 release
StuartCameronCode Aug 15, 2026
8ead6be
feat(filters): add CTMF, DCTFilter, a Grain pass, Rotate/Flip and Smo…
StuartCameronCode Aug 15, 2026
566ca62
feat(deps): add bifrost and retinex, for shimmering rainbows and shad…
StuartCameronCode Aug 15, 2026
fd1d661
ci: allow testing an unpublished deps bundle via workflow artifact
StuartCameronCode Aug 16, 2026
72dc396
ci: let deps_run_id name several build-deps runs at once
StuartCameronCode Aug 16, 2026
25d05d3
fix(deps): make the three new plugins actually build on macOS and Linux
StuartCameronCode Aug 16, 2026
d65229c
fix(deps): build the three new plugins on macOS x64 too
StuartCameronCode Aug 16, 2026
40f88d1
fix(worker): normalize template line endings, fixing SmoothLevels on …
StuartCameronCode Aug 16, 2026
84d8ee3
fix(anti-alias): clear _FieldBased around the pass, fixing daa on x86
StuartCameronCode Aug 16, 2026
3181138
fix(anti-alias): mark _FieldBased for the pass — znedi3 requires it, …
StuartCameronCode Aug 16, 2026
4ee577a
docs: record the znedi3 _FieldBased trap and what it cost
StuartCameronCode Aug 16, 2026
84743a3
docs: probe every unshipped Core/Strong filter, and correct what that…
StuartCameronCode Aug 17, 2026
76a90d3
docs: probe the Useful tier, and record what deferring 21 of 22 taught
StuartCameronCode Aug 17, 2026
4b9d4b0
fix(color): carry the source's colour tags to the output
StuartCameronCode Aug 17, 2026
0eb0011
feat(presets): wire the passes that shipped and nothing turned on
StuartCameronCode Aug 17, 2026
d131085
feat(filters): add Cnr4 as a second Chroma Denoise method, and surfac…
StuartCameronCode Aug 17, 2026
77b4740
feat(filters): restore detail after denoising, and automatic levels /…
StuartCameronCode Aug 17, 2026
c0bf204
feat: add a Frame Rate pass and a preview histogram
StuartCameronCode Aug 17, 2026
52a2148
feat(deps): add Bwdif, FillBorders, RemoveDirt, DeDot and LGhost to t…
StuartCameronCode Aug 17, 2026
1d77af1
feat(deinterlace): add Bwdif as the fast tier
StuartCameronCode Aug 17, 2026
2062db9
feat(filters): add RemoveDirt as a fast SpotLess method, and DeDot fo…
StuartCameronCode Aug 17, 2026
57ca210
feat(templates): vendor deflicker, autochromafix, mClean and Temporal…
StuartCameronCode Aug 17, 2026
fdf631a
feat(filters): add Deflicker, Edge Repair and Ghost Removal passes
StuartCameronCode Aug 17, 2026
7587010
feat(filters): wire mClean, TemporalDegrain2 and automatic chroma ali…
StuartCameronCode Aug 17, 2026
516168b
feat(presets): turn on the filters each source preset was named for
StuartCameronCode Aug 17, 2026
9169ade
feat: subtitle burn-in and custom VapourSynth injection
StuartCameronCode Aug 17, 2026
15c209a
docs: record the traps the build-out found
StuartCameronCode Aug 17, 2026
7e45421
test: cover the four new passes end to end in script generation
StuartCameronCode Aug 17, 2026
de4c303
docs: bring the README filter list up to date
StuartCameronCode Aug 17, 2026
a374715
fix(packaging): ship every vendored template module, not a hand-writt…
StuartCameronCode Aug 17, 2026
677b046
feat(subtitles): transcribe before the encode, then mux as a post-pass
StuartCameronCode Aug 17, 2026
a3f3e85
docs: record the subtitle ordering and the trim-sync trap
StuartCameronCode Aug 17, 2026
722d3f0
fix: make mClean and TemporalDegrain2 reachable, and close the flagge…
StuartCameronCode Aug 17, 2026
53e1512
chore: bump app version to 1.0.0
StuartCameronCode Aug 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions .github/scripts/fetch-deps-bundle.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#!/usr/bin/env bash
#
# Fetch one platform's dependency bundle for a CI run and print the path of the
# downloaded .zip on stdout. Everything else goes to stderr, so the caller can
# do:
#
# ZIP=$(bash .github/scripts/fetch-deps-bundle.sh macos-arm64 deps-v1.9.0 1.9.0)
#
# Two sources, chosen by whether $DEPS_RUN_ID is set:
#
# (default) the published release named by app/assets/deps-version.json. This
# is the real thing — the same tag, asset name and URL a shipped app
# downloads at runtime — so the normal gate exercises the normal
# path.
#
# $DEPS_RUN_ID the workflow-run artifact from a build-deps-* run. Lets a deps
# change be tested BEFORE anything is published, which is otherwise
# a chicken-and-egg problem: ci-test.yml and nightly.yml can only
# download published assets, so a new bundle had to be released to
# find out whether it worked. Artifacts are private to the repo,
# need no tag, and expire on their own, so there is nothing to clean
# up and nothing a user could stumble into. Pass it via
# workflow_dispatch:
#
# gh workflow run ci-test.yml --ref <branch> \
# -f deps_run_id="<macos-id>,<windows-id>,<linux-id>"
#
# It takes a LIST because one CI dispatch runs all four platform
# jobs, while macOS, Windows and Linux are three separate
# build-deps-* workflows and therefore three separate run IDs. Each
# job tries every ID in turn and takes the first that holds an
# artifact for its platform, so the same list works for all of them
# and the order does not matter.
#
# Requires `actions: read` on the workflow token; the callers
# declare it.
#
# The artifact path deliberately does NOT check the version in the artifact
# name against deps-version.json. The whole point is testing a bundle that has
# not been released yet, and it may well be a throwaway version string.
set -euo pipefail

PLATFORM="${1:?usage: fetch-deps-bundle.sh <platform> <release-tag> <version>}"
TAG="${2:?missing release tag}"
VER="${3:?missing version}"

if [ -n "${DEPS_RUN_ID:-}" ]; then
rm -rf .deps-artifact
ZIP=""
FROM_RUN=""

# A run that built a different platform simply has no matching artifact, and
# `gh run download` exits non-zero for that. That is expected here, not a
# failure, so keep trying the rest of the list before giving up.
for RUN in $(echo "$DEPS_RUN_ID" | tr ',' ' '); do
echo "looking for a $PLATFORM artifact in run $RUN" >&2
if gh run download "$RUN" \
--pattern "VapourBox-deps-*-${PLATFORM}" --dir .deps-artifact >&2 2>/dev/null; then
# gh nests each artifact in a directory named after it, so glob rather
# than assuming a layout.
ZIP=$(find .deps-artifact -name "VapourBox-deps-*-${PLATFORM}.zip" | head -1)
if [ -n "$ZIP" ]; then FROM_RUN="$RUN"; break; fi
fi
rm -rf .deps-artifact
done

if [ -z "$ZIP" ]; then
echo "::error::no $PLATFORM deps artifact in any of: $DEPS_RUN_ID" >&2
echo "Check the build-deps-* run actually produced one — the artifact is" >&2
echo "named VapourBox-deps-<version>-${PLATFORM}." >&2
exit 1
fi
echo "::warning::Testing an UNPUBLISHED deps bundle for ${PLATFORM} from run ${FROM_RUN}, not ${TAG}." >&2
else
echo "deps source: release $TAG" >&2
ZIP="VapourBox-deps-${VER}-${PLATFORM}.zip"
gh release download "$TAG" --pattern "$ZIP" --dir . --clobber >&2
fi

echo "$ZIP"
45 changes: 30 additions & 15 deletions .github/workflows/ci-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,25 @@ on:
pull_request:
paths-ignore: ['**.md', 'docs/**', 'licenses/**']
workflow_dispatch:
inputs:
deps_run_id:
description: 'Optional build-deps-* run IDs (comma-separated) to take the deps bundles from, instead of the release named in deps-version.json'
required: false
type: string

concurrency:
group: ci-test-${{ github.ref }}
cancel-in-progress: true

# `actions: read` is what `gh run download` needs for the deps_run_id path
# below. The repo default is the restricted token (contents + packages read,
# everything else none), so without this an artifact fetch 404s. Deliberately
# read-only: pulling an unpublished bundle must not require a write-scoped
# token on a workflow that runs against pull requests.
permissions:
contents: read
actions: read

env:
WHISPER_MODEL_URL: https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.bin

Expand Down Expand Up @@ -58,14 +72,15 @@ jobs:
- name: Download dependencies (${{ matrix.arch }})
env:
GH_TOKEN: ${{ github.token }}
DEPS_RUN_ID: ${{ inputs.deps_run_id }}
run: |
VER="${{ steps.deps.outputs.ver }}"
ZIP="VapourBox-deps-${VER}-macos-${{ matrix.arch }}.zip"
mkdir -p deps/macos-${{ matrix.arch }}
gh release download "${{ steps.deps.outputs.tag }}" --pattern "$ZIP" --dir . --clobber
unzip -q -o "$ZIP" -d deps/macos-${{ matrix.arch }}
rm -f "$ZIP"
xattr -cr deps/macos-${{ matrix.arch }} 2>/dev/null || true
PLATFORM="macos-${{ matrix.arch }}"
mkdir -p "deps/$PLATFORM"
ZIP=$(bash .github/scripts/fetch-deps-bundle.sh "$PLATFORM" \
"${{ steps.deps.outputs.tag }}" "${{ steps.deps.outputs.ver }}")
unzip -q -o "$ZIP" -d "deps/$PLATFORM"
rm -rf "$ZIP" .deps-artifact
xattr -cr "deps/$PLATFORM" 2>/dev/null || true

# The whisper small model (~466 MB) is architecture-independent; cache it.
- name: Cache whisper model
Expand Down Expand Up @@ -132,15 +147,15 @@ jobs:
shell: bash
env:
GH_TOKEN: ${{ github.token }}
DEPS_RUN_ID: ${{ inputs.deps_run_id }}
run: |
VER="${{ steps.deps.outputs.ver }}"
ZIP="VapourBox-deps-${VER}-windows-x64.zip"
mkdir -p deps/windows-x64
gh release download "${{ steps.deps.outputs.tag }}" --pattern "$ZIP" --dir . --clobber
ZIP=$(bash .github/scripts/fetch-deps-bundle.sh windows-x64 \
"${{ steps.deps.outputs.tag }}" "${{ steps.deps.outputs.ver }}")
# The Windows deps zip uses backslash separators; 7-Zip handles that
# (info-zip `unzip` warns and exits non-zero, tripping `set -e`).
7z x "$ZIP" -o"deps/windows-x64" -y >/dev/null
rm -f "$ZIP"
rm -rf "$ZIP" .deps-artifact

- name: Cache whisper model
uses: actions/cache@v5
Expand Down Expand Up @@ -214,13 +229,13 @@ jobs:
- name: Download dependencies (linux-x64)
env:
GH_TOKEN: ${{ github.token }}
DEPS_RUN_ID: ${{ inputs.deps_run_id }}
run: |
VER="${{ steps.deps.outputs.ver }}"
ZIP="VapourBox-deps-${VER}-linux-x64.zip"
mkdir -p deps/linux-x64
gh release download "${{ steps.deps.outputs.tag }}" --pattern "$ZIP" --dir . --clobber
ZIP=$(bash .github/scripts/fetch-deps-bundle.sh linux-x64 \
"${{ steps.deps.outputs.tag }}" "${{ steps.deps.outputs.ver }}")
unzip -q -o "$ZIP" -d deps/linux-x64
rm -f "$ZIP"
rm -rf "$ZIP" .deps-artifact

- name: Cache whisper model
uses: actions/cache@v5
Expand Down
41 changes: 26 additions & 15 deletions .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,21 @@ on:
- windows
- linux
default: all
deps_run_id:
description: 'Optional build-deps-* run IDs (comma-separated) to take the deps bundles from, instead of the release named in deps-version.json'
required: false
type: string

concurrency:
group: nightly-${{ github.ref }}
cancel-in-progress: true

# See ci-test.yml: `actions: read` is what the deps_run_id path needs, and the
# repo's default token does not grant it.
permissions:
contents: read
actions: read

env:
WHISPER_MODEL_URL: https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.bin

Expand Down Expand Up @@ -64,14 +74,15 @@ jobs:
- name: Download dependencies (${{ matrix.arch }})
env:
GH_TOKEN: ${{ github.token }}
DEPS_RUN_ID: ${{ inputs.deps_run_id }}
run: |
VER="${{ steps.deps.outputs.ver }}"
ZIP="VapourBox-deps-${VER}-macos-${{ matrix.arch }}.zip"
mkdir -p deps/macos-${{ matrix.arch }}
gh release download "${{ steps.deps.outputs.tag }}" --pattern "$ZIP" --dir . --clobber
unzip -q -o "$ZIP" -d deps/macos-${{ matrix.arch }}
rm -f "$ZIP"
xattr -cr deps/macos-${{ matrix.arch }} 2>/dev/null || true
PLATFORM="macos-${{ matrix.arch }}"
mkdir -p "deps/$PLATFORM"
ZIP=$(bash .github/scripts/fetch-deps-bundle.sh "$PLATFORM" \
"${{ steps.deps.outputs.tag }}" "${{ steps.deps.outputs.ver }}")
unzip -q -o "$ZIP" -d "deps/$PLATFORM"
rm -rf "$ZIP" .deps-artifact
xattr -cr "deps/$PLATFORM" 2>/dev/null || true

- name: Cache whisper model
uses: actions/cache@v5
Expand Down Expand Up @@ -139,13 +150,13 @@ jobs:
shell: bash
env:
GH_TOKEN: ${{ github.token }}
DEPS_RUN_ID: ${{ inputs.deps_run_id }}
run: |
VER="${{ steps.deps.outputs.ver }}"
ZIP="VapourBox-deps-${VER}-windows-x64.zip"
mkdir -p deps/windows-x64
gh release download "${{ steps.deps.outputs.tag }}" --pattern "$ZIP" --dir . --clobber
ZIP=$(bash .github/scripts/fetch-deps-bundle.sh windows-x64 \
"${{ steps.deps.outputs.tag }}" "${{ steps.deps.outputs.ver }}")
7z x "$ZIP" -o"deps/windows-x64" -y >/dev/null
rm -f "$ZIP"
rm -rf "$ZIP" .deps-artifact

- name: Cache whisper model
uses: actions/cache@v5
Expand Down Expand Up @@ -217,13 +228,13 @@ jobs:
- name: Download dependencies (linux-x64)
env:
GH_TOKEN: ${{ github.token }}
DEPS_RUN_ID: ${{ inputs.deps_run_id }}
run: |
VER="${{ steps.deps.outputs.ver }}"
ZIP="VapourBox-deps-${VER}-linux-x64.zip"
mkdir -p deps/linux-x64
gh release download "${{ steps.deps.outputs.tag }}" --pattern "$ZIP" --dir . --clobber
ZIP=$(bash .github/scripts/fetch-deps-bundle.sh linux-x64 \
"${{ steps.deps.outputs.tag }}" "${{ steps.deps.outputs.ver }}")
unzip -q -o "$ZIP" -d deps/linux-x64
rm -f "$ZIP"
rm -rf "$ZIP" .deps-artifact

- name: Cache whisper model
uses: actions/cache@v5
Expand Down
Loading
Loading