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 built for visual inspection and careful alignment. It does not acquire recordings and it does not perform analysis for you. Your lab can add support for its own file types and workflows through plugins.
A real recording session: three cameras at 230 fps with per-camera 2D pose drawn over each view, triangulated 3D pose on the right, and wheel-encoder velocity below — one second of it, at the speed it was recorded, every source moving on one master clock. The whole folder was opened by dropping it on the window; a session plugin recognised the layout and placed each file, including the shared time base. Nothing in AvialSync knows this lab's format.
What it gives you
- Several camera recordings playing together on one clock.
- Sensor, electrode, and tracking traces beside the video, up to 50 kHz across many channels.
- Alignment by offset, drift, or TTL/event evidence, with the original files left unchanged.
- Event marks, A/B time ranges, and exports of snapshots or selected spans for analysis elsewhere.
Install
Desktop installer (recommended). Download from the
Releases page: AvialSync-Setup.exe on Windows,
AvialSync.dmg on macOS, or AvialSync.AppImage on Linux. Everything needed is bundled. The
artifacts are not yet code-signed, so the first launch needs
one extra click.
PyPI, on Python 3.11 or 3.12:
python -m pip install avialsync
avialsync
The pip caveat.
pipinstalls every Python dependency but cannot install the two native components AvialSync needs for video: libmpv and FFmpeg. They are shared libraries and programs, not Python packages —python-mpvis only a binding to a libmpv that must already exist on the machine. Without them AvialSync still opens and every time-series feature works, but video stays disabled and aMissing libmpvdialog appears. Install them once withbrew install ffmpeg mpv,sudo apt install ffmpeg libmpv2,sudo dnf install ffmpeg mpv-libs, orsudo pacman -S ffmpeg mpv. Windows needs a manual libmpv download — full instructions.
Apple silicon is required for the .dmg, and glibc 2.39+ for the AppImage; outside those, use pip.
See Installation for details.
First session
avialsync demo
That generates and opens a complete sample session — four cameras, sensor and ephys traces, tracking — so you can try everything before touching your own data. With your own recordings:
- Drag video and data files onto the window, or use Open Videos and Open Sensor/Ephys Data.
- Video appears at the top, traces below it.
- Drag the shared time bar to inspect one moment across every recording.
- If recordings do not line up, use the synchronization tools to align a visible event or TTL pulse.
A camera with no coverage at the selected time shows No Footage rather than a stale frame, and Data Streams shows when each file has data.
Documentation
Full documentation is at avialsync.readthedocs.io — quickstart, first-session tutorial, supported formats, synchronization, troubleshooting, plugin guide, and a technical reference covering architecture, data handling, performance, and the development and release process.
How it compares
Neighbouring open-source tools, described as their authors position them. 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 | AGPL-3.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.
It is not an acquisition system, not a replacement for your analysis pipeline, and it never silently changes scientific timestamps.
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 under "Pending" in HANDOUT.md.
Contributions are accepted under CLA.md: you keep the copyright in your work and grant the right to ship it under both licences below. One line in your first pull request covers it.
Licence
AvialSync is free software under the GNU AGPL v3 or later. Use it, study it, modify it, redistribute it. The one condition is reciprocity: if you convey a modified version — including letting others use it over a network — you publish your changes under the same licence.
Running it in your lab, modifying it for your own use, publishing results, and writing plugins for
your own rig all sit inside this and cost nothing. A plugin that uses only the documented
TimeSeriesSource, VideoSource and SessionSource interfaces is your own work and you choose its
licence, so a loader for a proprietary instrument format need not be published.
Other arrangements are possible in situations the AGPL cannot accommodate; see licensing in the documentation.
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.0b8.tar.gz.
File metadata
- Download URL: avialsync-0.1.0b8.tar.gz
- Upload date:
- Size: 11.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
053fd3eb5f9a9ff30c928d6ee5e7227b3e2d20526208447d91d784bbd230d742
|
|
| MD5 |
7e5e69ffef532943104de2651ce648d2
|
|
| BLAKE2b-256 |
dbd80b15b858fcd3c19a0cc86d4f60417dc9c14520c91af6c836998676138b5c
|
Provenance
The following attestation bundles were made for avialsync-0.1.0b8.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.0b8.tar.gz -
Subject digest:
053fd3eb5f9a9ff30c928d6ee5e7227b3e2d20526208447d91d784bbd230d742 - Sigstore transparency entry: 2357259864
- Sigstore integration time:
-
Permalink:
anzalks/avialsync@52d2bbd31f41a58f5d28a4fb42485d6003284961 -
Branch / Tag:
refs/tags/v0.1.0b8 - Owner: https://github.com/anzalks
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@52d2bbd31f41a58f5d28a4fb42485d6003284961 -
Trigger Event:
push
-
Statement type:
File details
Details for the file avialsync-0.1.0b8-py3-none-any.whl.
File metadata
- Download URL: avialsync-0.1.0b8-py3-none-any.whl
- Upload date:
- Size: 601.6 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 |
28a7b8431b3e3dadceae2b6e6c2f292ae2e71168afb4a01f8b8d44fcc55e2326
|
|
| MD5 |
7b497a26b50b49e345ac053300ebd6ae
|
|
| BLAKE2b-256 |
82712866b0cf9e207a3d7d32591628505a79e583b7d05d36f317c9ba7f76fb2f
|
Provenance
The following attestation bundles were made for avialsync-0.1.0b8-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.0b8-py3-none-any.whl -
Subject digest:
28a7b8431b3e3dadceae2b6e6c2f292ae2e71168afb4a01f8b8d44fcc55e2326 - Sigstore transparency entry: 2357260391
- Sigstore integration time:
-
Permalink:
anzalks/avialsync@52d2bbd31f41a58f5d28a4fb42485d6003284961 -
Branch / Tag:
refs/tags/v0.1.0b8 - Owner: https://github.com/anzalks
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@52d2bbd31f41a58f5d28a4fb42485d6003284961 -
Trigger Event:
push
-
Statement type: