This release is a pre-release and may not be stable for production use.
AvialSync
The Advanced Video and Instrument Alignment Library.
AvialSync is a desktop viewer for looking through an experiment in time.
Use it when you have video from one or more cameras together with recordings such as sensors, electrodes, behavioural tracking, or other time-stamped measurements. It places them on one shared timeline so you can move to an event and inspect what each recording shows at that moment.
It is designed for visual inspection and careful alignment. It does not acquire recordings and it does not perform scientific analysis for you. Your lab can add support for its own file types and workflows through plugins.
One camera and three channels of the bundled sample session on a single master timeline.
Reproduce this from a clean clone with
conda run -n avialsync python tools/generate_demo_screenshots.py.
Why use it?
- View several camera recordings together.
- Inspect sensor and tracking traces alongside the video.
- Move through an experiment with one shared time control.
- Align recordings with offsets, drift, or TTL/event evidence, while keeping the original files unchanged.
- Mark events, compare time ranges, and export snapshots or selected data for analysis elsewhere.
Install and open your first experiment
The simplest route is the desktop artifact from the GitHub Releases page:
use AvialSync-Setup.exe on Windows, open AvialSync.dmg on macOS and drag AvialSync to
Applications, or mark AvialSync.AppImage executable and open it on Linux. The AppImage is
portable: no system-wide installation is required. Then open AvialSync like any other desktop
application.
These artifacts are not yet code-signed or notarized, so the operating system warns about an
unidentified developer on first launch. On macOS, right-click AvialSync and choose Open
once (or run xattr -dr com.apple.quarantine /Applications/AvialSync.app); on Windows, choose
More info → Run anyway in the SmartScreen prompt.
Two installers have a deliberate support boundary; use the PyPI install below if you fall outside one:
| Installer | Requires | Otherwise |
|---|---|---|
AvialSync.dmg |
Apple silicon | Intel Macs: pip install avialsync |
AvialSync.AppImage |
glibc 2.39 or newer (Ubuntu 24.04+, Fedora 40+) | Debian 12, Ubuntu 22.04: pip install avialsync |
The AppImage also needs FUSE 2 to mount itself; without it, run
./AvialSync.AppImage --appimage-extract-and-run.
If you use Python, install it from PyPI with Python 3.11 or 3.12:
python -m pip install avialsync
avialsync
Windows source checkout prerequisites
The release installer bundles its media runtime. If you run AvialSync from a Git checkout instead,
install Python 3.11 or 3.12, FFmpeg (for ffprobe.exe), and libmpv before starting the application.
Create the project environment and install its dependencies with:
conda create -n avialsync python=3.12 -y
conda run -n avialsync python -m pip install -e ".[dev]"
Install a standalone shared FFmpeg build (for example, winget install --id Gyan.FFmpeg.Shared -e).
AvialSync discovers the standard WinGet FFmpeg location even if conda activate changes PATH.
Install a compatible Windows libmpv
build and put its libmpv-2.dll in the conda environment's Library\bin directory, or otherwise
ensure that DLL is on PATH. Do not use conda's FFmpeg package for this checkout: it can conflict
with the Qt DLLs. A current GPU driver is also required for the Windows OpenGL video renderer. These
two native components cannot be supplied by the Python .[dev] install; the desktop installer bundles
and validates them, so end users do not perform these steps.
Run the application or its demo with:
conda run -n avialsync avialsync
conda run -n avialsync python tools/launch_demo.py
conda run -n avialsync avialsync demo
After conda activate avialsync, the equivalent commands are avialsync and
python C:\path\to\avialsync\tools\launch_demo.py. The python prefix is required for the demo
script; running a .py file directly can use Windows' unrelated file association. The launcher
delegates to avialsync demo, so both launch paths have identical behavior.
The demo creates three 30 fps CFR cameras, one VFR camera, a four-channel sensor trace, a dense
ephys/TTL trace with gaps, and DLC-style tracking in your platform application-data folder. Camera 2
has a known +1.234 s mapping and camera 3 a known 1000 ppm drift mapping. First-run generation is
shown in the progress-and-log dialog; later runs validate and reuse the cached files.
When the window opens:
- Drag video and recording files into the window, or use Open Videos and Open Sensor/Ephys Data.
- Video appears at the top; traces appear below it.
- Drag the shared time bar to inspect a moment across every available recording.
- If recordings do not line up, use the synchronization tools to align a visible event or TTL pulse.
If a camera has no recording at the selected time, it clearly shows No Footage. The Data Streams section shows when each file is available on the shared timeline.
Documentation
Start with the Quickstart, then use the first-session tutorial. The documentation also includes supported formats, troubleshooting, synchronization guidance, and a separate technical reference for people maintaining the software or writing plugins.
How it compares
Neighbouring open-source tools, described as their authors position them. Pick the one that matches your problem — they overlap less than the names suggest.
| AvialSync | PlotJuggler | Rerun | Foxglove | |
|---|---|---|---|---|
| Primary use | Scrub multi-camera video against dense signals | Plot and analyse time series | Log and replay multimodal robot data | Inspect and visualise robotics data |
| Video playback | libmpv, frame-exact when paused | Not a focus | Yes, alongside other modalities | Yes |
| Dense signals | 50 kHz × many channels via a decimation pyramid | Strong, its core purpose | Yes | Yes |
| Per-source offset/drift | Yes, with evidence-based TTL alignment | Manual offsets | Timeline-based | Timeline-based |
| Data model | Reads your files in place | Reads your files in place | You log into its own format | ROS/MCAP-oriented |
| Licence | Apache-2.0 | MPL-2.0 | Apache-2.0 | Source-available + hosted |
If you mainly plot signals, PlotJuggler is likely a better fit. If you are in a ROS ecosystem, Foxglove and Rerun are built for it. AvialSync exists for the narrower case where the video and the signal have to agree on the same instant, and the recordings came off independently-clocked hardware.
What AvialSync does not do
AvialSync is not an acquisition system, a replacement for your analysis pipeline, or a tool that silently changes scientific timestamps. It helps you inspect and align recordings; analysis remains in your existing tools or in lab-provided plugins.
For developers
The documentation site is built with Read the Docs. Local preview:
python -m pip install -e ".[docs]"
sphinx-build -W --keep-going -b html docs docs/_build/html
Development
conda run -n avialsync pip install -e ".[dev]"
QT_QPA_PLATFORM=offscreen conda run -n avialsync pytest -x -q
GitHub Actions is the sole publisher for release artifacts and PyPI distributions. Do not upload packages from a developer workstation. A release tag runs cross-platform validation, builds the wheel and source distribution, and smoke-tests the wheel in a clean environment before building the platform installers. PyPI publishing starts only after every installer succeeds, and GitHub creates the release last.
The release workflow itself pins and verifies the AppImage build tool before creating the Linux AppImage; no package-upload token or repository variable is needed.
Two things must exist before a tag can complete, and neither lives in this repository. Both fail late — after every installer has already been built — so confirm them before tagging:
- PyPI trusted publishing for the
avialsyncproject, naming this repository, theReleaseworkflow, and thepypienvironment. If thepypiGitHub environment has required reviewers, the release waits for an approval rather than failing. - A tag reachable from
main. The workflow refuses to publish a side branch, and it also requires the tag,pyproject.toml, andsrc/avialsync/__init__.pyto name one identical version — which is whattools/prepare_release.pyguarantees.
Release artifacts are not yet code-signed or notarized. packaging/windows/sign.ps1 and
packaging/macos/sign_notarize.sh are placeholders, and nothing in CI invokes them; signing needs
an Apple Developer account and a Windows code-signing certificate. Until then, every download
carries the first-launch warnings described under Install.
To prepare a future tag release from a clean main checkout, use the guarded helper rather than
editing versions or creating tags by hand:
conda run -n avialsync python tools/prepare_release.py 0.1.0b1 --dry-run
conda run -n avialsync python tools/prepare_release.py 0.1.0b1
It validates the version, updates both package-version authorities, builds and checks wheel/sdist,
commits the change, creates annotated v0.1.0b1, and pushes it. GitHub Actions remains the sole
publisher. The helper permits only the offline graphify-out/graph.json as a pre-existing dirty
file; commit or resolve every other change first.
Contributing
Contributions are welcome — see CONTRIBUTING.md for setup, the four-command gate every change must pass, and the architecture rules that exist because breaking them caused real bugs. Participation is governed by our Code of Conduct.
Good places to start are format plugins (the TimeSeriesSource /VideoSource
contracts are frozen — see the plugin guide), platform
verification on real hardware, and the open items in RECOVERY_PLAN.md.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file avialsync-0.1.0b5.tar.gz.
File metadata
- Download URL: avialsync-0.1.0b5.tar.gz
- Upload date:
- Size: 11.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f3aca263b88fd39f50875adfca8f1ca3e88e621290960ca1154ef4b889958ddb
|
|
| MD5 |
03eee2c00d36f5fdd655d5c777bb652c
|
|
| BLAKE2b-256 |
1984fd76639449747828d8af77a2d8d4549011c6c48757f1a35f20584b19a8d5
|
Provenance
The following attestation bundles were made for avialsync-0.1.0b5.tar.gz:
Publisher:
release.yml on anzalks/avialsync
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
avialsync-0.1.0b5.tar.gz -
Subject digest:
f3aca263b88fd39f50875adfca8f1ca3e88e621290960ca1154ef4b889958ddb - Sigstore transparency entry: 2335570884
- Sigstore integration time:
-
Permalink:
anzalks/avialsync@155c2a6a7dc4727fdb18d272449a38428e8b8c50 -
Branch / Tag:
refs/tags/v0.1.0b5 - Owner: https://github.com/anzalks
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@155c2a6a7dc4727fdb18d272449a38428e8b8c50 -
Trigger Event:
push
-
Statement type:
File details
Details for the file avialsync-0.1.0b5-py3-none-any.whl.
File metadata
- Download URL: avialsync-0.1.0b5-py3-none-any.whl
- Upload date:
- Size: 572.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b776bc792ce9957b2223006de47a9fb03f3f597a43edc58dc8fb66998b7955a
|
|
| MD5 |
598c620d6923decba0786834a6a004bb
|
|
| BLAKE2b-256 |
112807ec9c9dd50c3d3d21af55d0a9d61555dcf1fc893af0ae7cd56f9a32a63a
|
Provenance
The following attestation bundles were made for avialsync-0.1.0b5-py3-none-any.whl:
Publisher:
release.yml on anzalks/avialsync
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
avialsync-0.1.0b5-py3-none-any.whl -
Subject digest:
6b776bc792ce9957b2223006de47a9fb03f3f597a43edc58dc8fb66998b7955a - Sigstore transparency entry: 2335570890
- Sigstore integration time:
-
Permalink:
anzalks/avialsync@155c2a6a7dc4727fdb18d272449a38428e8b8c50 -
Branch / Tag:
refs/tags/v0.1.0b5 - Owner: https://github.com/anzalks
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@155c2a6a7dc4727fdb18d272449a38428e8b8c50 -
Trigger Event:
push
-
Statement type: