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
32 changes: 12 additions & 20 deletions .github/release-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,16 @@ 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.
- **Application menu on Windows and Linux.** The Menu button is available in
the top toolbar and on the empty start screen. It opens About, Check for
Updates, Use with AI Agents, Path Fixer, analysis-cache settings, and theme
selection using the same actions as the native macOS menu. macOS continues
to use its native menu bar without an in-window Menu button.
- **Consistent menu contents.** The in-window menu follows the registered
application menus, including the selected theme. macOS system items such as
Services, Hide, and Window are omitted.
- **Escape to dismiss.** Escape closes the application menu, timeline context
menu, and About panel. Clicking outside the application menu also closes it.

## Downloads

Expand Down Expand Up @@ -49,8 +41,8 @@ open "/Applications/Align.app"

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.
Running it over an earlier version upgrades that installation. The installer is
unsigned, so SmartScreen may ask for confirmation.

### Fedora and Omarchy / Arch

Expand Down
10 changes: 5 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ resolver = "2"
edition = "2024"
rust-version = "1.85"
license = "GPL-3.0-only"
version = "0.2.0"
version = "0.3.0"

[workspace.dependencies]
align-core = { path = "crates/align-core" }
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@
Synchronize camera footage and separately recorded audio using waveforms,
timecode, and recording metadata.

<a href="https://github.com/FedyaLight/align/releases/download/v0.2.0/Align-0.2.0-macOS-arm64.dmg"><img src="docs/assets/download-macos.svg" alt="Download for macOS" height="60"></a>&nbsp;
<a href="https://github.com/FedyaLight/align/releases/download/v0.2.0/Align-0.2.0-Windows-x64-Setup.exe"><img src="docs/assets/download-windows.svg" alt="Download for Windows" height="60"></a>
<a href="https://github.com/FedyaLight/align/releases/download/v0.3.0/Align-0.3.0-macOS-arm64.dmg"><img src="docs/assets/download-macos.svg" alt="Download for macOS" height="60"></a>&nbsp;
<a href="https://github.com/FedyaLight/align/releases/download/v0.3.0/Align-0.3.0-Windows-x64-Setup.exe"><img src="docs/assets/download-windows.svg" alt="Download for Windows" height="60"></a>

Version 0.2.0 · [Linux (Fedora, Arch) and all downloads](https://github.com/FedyaLight/align/releases/latest)
Version 0.3.0 · [Linux (Fedora, Arch) and all downloads](https://github.com/FedyaLight/align/releases/latest)

<a href="https://github.com/FedyaLight/align/raw/main/docs/assets/Align-demo.mp4"><img src="docs/assets/align-demo.gif" width="760" alt="Align synchronizing a multicam shoot: cameras and recorders dropped in, clips turn green on one timeline"></a>

Expand Down
1 change: 1 addition & 0 deletions Support/Linux/com.align.app.metainfo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
<provides><binary>align</binary></provides>
<content_rating type="oars-1.1"/>
<releases>
<release version="0.3.0" date="2026-09-30"/>
<release version="0.2.0" date="2026-09-28"/>
<release version="0.1.0" date="2026-09-27"/>
</releases>
Expand Down
97 changes: 97 additions & 0 deletions crates/align-gpui/src/app_menu.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
//! Project the registered application menus into the in-window menu.

use gpui::{OwnedMenu, OwnedMenuItem};

use crate::{HideApp, HideOthersApp, ShowAllApps};

pub fn in_window_menus(menus: Vec<OwnedMenu>) -> Vec<OwnedMenu> {
menus
.into_iter()
.filter_map(|mut menu| {
if menu.name.as_ref() == "Window" {
return None;
}
let mut items = Vec::new();
for item in menu.items {
let item = match item {
OwnedMenuItem::SystemMenu(_) => continue,
OwnedMenuItem::Action { ref action, .. }
if action.as_any().is::<HideApp>()
|| action.as_any().is::<HideOthersApp>()
|| action.as_any().is::<ShowAllApps>() =>
{
continue;
}
OwnedMenuItem::Submenu(submenu) => {
let Some(submenu) = in_window_menus(vec![submenu]).pop() else {
continue;
};
OwnedMenuItem::Submenu(submenu)
}
item => item,
};
if matches!(item, OwnedMenuItem::Separator)
&& (items.is_empty() || matches!(items.last(), Some(OwnedMenuItem::Separator)))
{
continue;
}
items.push(item);
}
if matches!(items.last(), Some(OwnedMenuItem::Separator)) {
items.pop();
}
menu.items = items;
(!menu.items.is_empty()).then_some(menu)
})
.collect()
}

#[cfg(test)]
mod tests {
use super::*;
use crate::LightAppearance;
use gpui::{Menu, MenuItem, SystemMenuType};

#[test]
fn registered_submenus_keep_their_actions_without_platform_only_items() {
let menus = vec![
Menu {
name: "Custom".into(),
items: vec![
MenuItem::separator(),
MenuItem::action("A renamed system command", HideApp),
MenuItem::os_submenu("Services", SystemMenuType::Services),
MenuItem::submenu(Menu {
name: "New settings group".into(),
items: vec![
MenuItem::action("Another system command", HideOthersApp),
MenuItem::separator(),
MenuItem::action("✓ Custom appearance", LightAppearance),
MenuItem::separator(),
MenuItem::action("Show applications", ShowAllApps),
],
}),
MenuItem::separator(),
],
}
.owned(),
Menu {
name: "Window".into(),
items: vec![MenuItem::action("Window command", LightAppearance)],
}
.owned(),
];

let projected = in_window_menus(menus);
assert_eq!(projected.len(), 1, "Window must not appear in the popup");
let [OwnedMenuItem::Submenu(submenu)] = projected[0].items.as_slice() else {
panic!("Only the custom settings group should remain");
};
assert_eq!(submenu.name.as_ref(), "New settings group");
let [OwnedMenuItem::Action { name, action, .. }] = submenu.items.as_slice() else {
panic!("System commands and orphan separators must be removed recursively");
};
assert_eq!(name, "✓ Custom appearance");
assert!(action.as_any().is::<LightAppearance>());
}
}
1 change: 1 addition & 0 deletions crates/align-gpui/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#[global_allocator]
static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;

mod app_menu;
mod icons;
mod lane;
mod motion;
Expand Down
Loading
Loading