Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
84 changes: 84 additions & 0 deletions .github/release-notes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
Align synchronizes camera footage and separately recorded audio using waveform
matching, timecode, and recording metadata.

## What's new in @VERSION@

- **Much faster synchronization.** MOV, MP4 and WAV (including RF64/BW64) are
read natively instead of through FFmpeg. On a 22-file test set, a full
synchronization dropped from about 11 s to under 1 s with the same accuracy.
- **Faster media export.** Camera files with replacement audio are written
natively, in a fraction of a second instead of several seconds.
- **Smaller macOS app.** macOS no longer bundles FFmpeg; Linux and Windows ship
a slimmer FFmpeg build (about 9 MB instead of 19 MB).
- **Refined interface.** Round timeline ruler steps, smoother progress,
a real drop zone, clearer search-accuracy settings, and Ctrl shortcuts on
Windows and Linux (F11 for full screen).
- **Updates on every platform.** Align checks for a new release at launch and
offers it in a small card. One click downloads it, verifies its checksum and
installs it: through the Windows installer, by replacing the app on macOS, or
through `dnf`/`pacman` on Fedora and Arch. Copies of 0.1.0 do not check for
updates, so install this release manually once.
- **Windows fixes.** Premiere Pro and Final Cut Pro exports now reference
Windows media with valid file URLs, the app has its icon, and no console
windows flash while it works.

## Downloads

| Platform | Installer |
| :--- | :--- |
| macOS 15+ (Apple Silicon) | `Align-@VERSION@-macOS-arm64.dmg` |
| Windows 10/11 (x64) | `Align-@VERSION@-Windows-x64-Setup.exe` |
| Fedora (x86_64) | `Align-@VERSION@-Fedora-x86_64-Setup.run` or `Align-@VERSION@-Fedora-x86_64.rpm` |
| Omarchy / Arch Linux (x86_64) | `Align-@VERSION@-Omarchy-x86_64-Setup.run` or `align-@VERSION@-1-x86_64.pkg.tar.zst` |

Every build includes the desktop app, the CLI, the MCP server, and the AAF
module. No separate Python installation is needed.

### macOS

Open the DMG and drag **Align** to **Applications**. The app is ad-hoc signed,
not Developer ID signed or notarized. If macOS says the app is damaged, move it
to `/Applications`, then for a copy downloaded from this release run:

```sh
sudo xattr -dr com.apple.quarantine "/Applications/Align.app"
open "/Applications/Align.app"
```

### Windows

Run `Align-@VERSION@-Windows-x64-Setup.exe`. It installs for the current user,
adds Align to the Start menu, and installs the Microsoft VC++ runtime if needed.
Running it over 0.1.0 upgrades that installation. The installer is unsigned, so
SmartScreen may ask for confirmation.

### Fedora and Omarchy / Arch

The `.run` installers open a graphical installer in Align's style and ask for
system authorization. Run them as your ordinary user:

```sh
chmod +x Align-@VERSION@-Fedora-x86_64-Setup.run
./Align-@VERSION@-Fedora-x86_64-Setup.run
```

Or install the native package directly with
`sudo dnf install ./Align-@VERSION@-Fedora-x86_64.rpm` or
`sudo pacman -U ./align-@VERSION@-1-x86_64.pkg.tar.zst`. Choose one method; each
`.run` contains the same package. Linux requires glibc 2.39+, a working Vulkan
driver, and GTK 4 with polkit for the graphical installer. Later versions install
from inside Align, behind the same system authorization prompt.

## Sources and verification

`align-source-<platform>.tar.gz` contains the corresponding Align source, locked
and vendored Rust dependencies, the FFmpeg source used on Linux and Windows, and
the AAF component sources. License notices are included in every installer.
Align is licensed under GPL-3.0-only.

Each download has a `.sha256` file. Verify from the download directory, for
example `shasum -a 256 -c Align-@VERSION@-macOS-arm64.dmg.sha256`.

Every installer in this release was built and checked by GitHub Actions: tests
and lint on all three platforms, end-to-end synchronization and export checks,
and a package installation test on Fedora and Arch Linux.
195 changes: 139 additions & 56 deletions .github/workflows/align-rs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ on:
- "Cargo.lock"
- "about.toml"
- "script/**"
- "Support/aaf/**"
- "Support/**"
- "docs/**"
- "README.md"
- "LICENSE"
Expand All @@ -21,7 +21,7 @@ on:
- "Cargo.lock"
- "about.toml"
- "script/**"
- "Support/aaf/**"
- "Support/**"
- "docs/**"
- "README.md"
- "LICENSE"
Expand Down Expand Up @@ -104,19 +104,32 @@ jobs:
path: release-smoke/


# Tags vX.Y.Z build and publish every installer. A manual run on any
# branch builds the same installers as artifacts without publishing.
release:
name: release binaries (${{ matrix.os }})
env:
VELOPACK_VERSION: 1.2.0
needs: check-test
if: startsWith(github.ref, 'refs/tags/align-rs-v')
if: startsWith(github.ref, 'refs/tags/v') || github.event_name == 'workflow_dispatch'
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-latest, windows-latest, ubuntu-latest]
# Linux binaries are built against the oldest glibc the packages
# support (2.39), so they run on current Fedora and Arch.
os: [macos-latest, windows-latest, ubuntu-24.04]
steps:
- uses: actions/checkout@v4
- name: Check the tag matches the workspace version
if: startsWith(github.ref, 'refs/tags/v')
shell: bash
run: |
workspace_version="$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1)"
if [[ "${GITHUB_REF_NAME#v}" != "$workspace_version" ]]; then
echo "Tag $GITHUB_REF_NAME does not match Cargo.toml version $workspace_version" >&2
exit 1
fi
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- uses: msys2/setup-msys2@v2
Expand All @@ -127,7 +140,10 @@ jobs:
curl diffutils make mingw-w64-x86_64-gcc nasm pkgconf tar xz
- name: Install build dependencies (Linux)
if: runner.os == 'Linux'
run: sudo apt-get update && sudo apt-get install -y nasm libxkbcommon-dev libxkbcommon-x11-dev libwayland-dev libasound2-dev libudev-dev libvulkan-dev
run: >-
sudo apt-get update && sudo apt-get install -y nasm libxkbcommon-dev
libxkbcommon-x11-dev libwayland-dev libasound2-dev libudev-dev libvulkan-dev
libgtk-4-dev rpm
- name: Install assembler (macOS)
if: runner.os == 'macOS'
run: brew install nasm
Expand Down Expand Up @@ -184,88 +200,155 @@ jobs:
name: sources-${{ runner.os }}
path: target/release-sources/
if-no-files-found: error

- name: Build DMG (macOS)
if: runner.os == 'macOS'
shell: bash
run: |
version="$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1)"
python -m venv target/dmg-venv
target/dmg-venv/bin/python -m pip install dmgbuild==1.6.7
AAF_DIR="$PWD/target/release" \
RELEASE_LICENSES="$PWD/dist-bundle/ThirdPartyLicenses" \
ALIGN_SKIP_LAUNCH_CHECK=1 \
./script/package-macos.sh "$PWD/target/macos-package"
mkdir -p installers
PYTHON="$PWD/target/dmg-venv/bin/python" ./script/create-macos-dmg.sh \
target/macos-package/Align.app "installers/Align-$version-macOS-arm64.dmg"
- uses: actions/setup-dotnet@v5
if: runner.os == 'Windows'
with:
dotnet-version: "8.0.x"
- name: Install Velopack packager
run: dotnet tool install --global vpk --version ${{ env.VELOPACK_VERSION }}
- name: Build installable update package
- name: Build installer and update feed (Windows)
if: runner.os == 'Windows'
shell: bash
run: |
version="${GITHUB_REF_NAME#align-rs-v}"
workspace_version="$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1)"
if [[ "$version" != "$workspace_version" ]]; then
echo "Tag version $version does not match Cargo.toml version $workspace_version" >&2
exit 1
fi
exe=""
icon="Support/AppIcon.png"
extra=()
if [[ "${{ runner.os }}" == "Windows" ]]; then
exe=".exe"
icon=""
elif [[ "${{ runner.os }}" == "macOS" ]]; then
icon="Support/AppIcon.icns"
extra+=(--bundleId com.align.app)
fi
args=(pack --packId com.align.app --packTitle Align --packVersion "$version" --packDir dist-bundle --mainExe "align$exe" --outputDir velopack-release)
if [[ -n "$icon" ]]; then args+=(--icon "$icon"); fi
vpk "${args[@]}" "${extra[@]}"
dotnet tool install --global vpk --version ${{ env.VELOPACK_VERSION }}
./script/package-windows.sh dist-bundle installers
# The update feed lets installed copies update in place; the
# generic Setup name duplicates the versioned installer.
rm installers/updates/com.align.app-win-Setup.exe
mv installers/updates/* installers/
rmdir installers/updates
- name: Build Fedora package and installer (Linux)
if: runner.os == 'Linux'
run: |
version="$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1)"
./script/package-fedora.sh dist-bundle installers
./script/package-fedora-gui.sh "installers/Align-$version-Fedora-x86_64.rpm" \
"installers/Align-$version-Fedora-x86_64-Setup.run"
# Artifacts drop Unix permissions; the Arch job unpacks this.
tar -czf linux-stage.tar.gz -C dist-bundle .
- uses: actions/upload-artifact@v4
if: runner.os == 'Linux'
with:
name: linux-stage
path: linux-stage.tar.gz
if-no-files-found: error
- name: List installers
shell: bash
run: ls -la installers/ && cat installers/*.sha256
- uses: actions/upload-artifact@v4
with:
name: align-${{ runner.os }}
path: dist-bundle/
name: installers-${{ runner.os }}
path: installers/
if-no-files-found: error

arch:
name: Omarchy / Arch package
needs: release
runs-on: ubuntu-24.04
container: archlinux:latest
steps:
- name: Install packaging tools
run: pacman -Syu --noconfirm --needed base-devel gtk4 pkgconf
- uses: actions/checkout@v4
- uses: actions/download-artifact@v5
with:
name: linux-stage
- name: Build package and installer
run: |
version="$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1)"
mkdir stage out
tar -xzf linux-stage.tar.gz -C stage
# makepkg refuses to run as root.
useradd --create-home builder
chown -R builder "$PWD"
su builder -c "bash ./script/package-arch.sh stage out"
bash ./script/package-arch-gui.sh "out/align-$version-1-x86_64.pkg.tar.zst" \
"out/Align-$version-Omarchy-x86_64-Setup.run"
mkdir installers
mv out/*.pkg.tar.zst* out/*.run* installers/
- name: Install and run the package
run: |
pacman -U --noconfirm installers/*.pkg.tar.zst
align-cli --help >/dev/null
printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | align-mcp | grep -q align_sync
pacman -Qkk align
- uses: actions/upload-artifact@v4
with:
name: updates-${{ runner.os }}
path: velopack-release/
name: installers-Arch
path: installers/
if-no-files-found: error

fedora:
name: Fedora package check
needs: release
runs-on: ubuntu-24.04
container: fedora:latest
steps:
- uses: actions/download-artifact@v5
with:
name: installers-Linux
- name: Install and run the package
run: |
dnf install -y ./Align-*-Fedora-x86_64.rpm
align-cli --help >/dev/null
printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | align-mcp | grep -q align_sync
rpm -V align
sha256sum -c ./*.sha256

publish-release:
name: publish GitHub release
needs: release
if: startsWith(github.ref, 'refs/tags/align-rs-v')
needs: [release, arch, fedora]
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v5
with:
pattern: updates-*
pattern: installers-*
path: release-assets
merge-multiple: true
- uses: actions/download-artifact@v5
with:
pattern: sources-*
path: release-assets
merge-multiple: true
- name: Verify source bundles for every platform
- name: Verify every download
shell: bash
run: |
for platform in Linux macOS Windows; do
test -s "release-assets/align-source-$platform.tar.gz"
(cd release-assets && sha256sum -c "align-source-$platform.tar.gz.sha256")
version="${GITHUB_REF_NAME#v}"
cd release-assets
for asset in \
"Align-$version-macOS-arm64.dmg" \
"Align-$version-Windows-x64-Setup.exe" \
"Align-$version-Fedora-x86_64-Setup.run" \
"Align-$version-Fedora-x86_64.rpm" \
"Align-$version-Omarchy-x86_64-Setup.run" \
"align-$version-1-x86_64.pkg.tar.zst" \
align-source-Linux.tar.gz align-source-macOS.tar.gz align-source-Windows.tar.gz; do
test -s "$asset"
done
sha256sum -c ./*.sha256
test -s releases.win.json
sed "s/@VERSION@/$version/g" ../.github/release-notes.md > ../release-notes.md
- uses: softprops/action-gh-release@v2
with:
name: Align ${{ github.ref_name }}
body_path: release-notes.md
generate_release_notes: true
fail_on_unmatched_files: true
body: |
Corresponding source archives for each platform are attached as
`align-source-<platform>.tar.gz`, with SHA-256 checksums. They include
Align, vendored Rust dependencies, FFmpeg (Linux and Windows), and AAF
component sources.
Dependency notices are included in the installers.

### macOS installation

The app is not Developer ID signed or notarized. If macOS says the
app is damaged, move `Align.app` to `/Applications`, then run the
following commands in Terminal. Only do this for a copy downloaded
from this project's official release.

```sh
sudo xattr -dr com.apple.quarantine "/Applications/Align.app"
open "/Applications/Align.app"
```
files: release-assets/*
Loading
Loading