Warning
Alpha software. Expect breaking changes, incomplete features, and rough edges.
A cross-platform ballistic trajectory calculator built with Flutter. Powered by bclibc — a high-performance (3-DOF + spin drift) C++ ballistic solver engine with RK4/Euler integration.
UI/UX inspired by the Strilets ballistic calculator app
| Home | Conditions | Trajectory Tables |
![]() |
![]() |
![]() |
| Convertors | My Profiles | Reticle |
![]() |
![]() |
![]() |
- ebalistyka
- Shooting profiles — create and manage profiles combining weapon, ammunition, and sight configurations
- Weapon, ammo & sight wizards — step-by-step setup with optional import from a built-in collection
- Trajectory tables — compute and display ballistic tables with HTML export
- Environmental conditions — atmosphere, wind, Coriolis, target parameters
- Reticle view — SVG mil-reticle with live drop/windage adjustment indicator, theme-aware colours
- Multi-BC & custom drag — G1/G7 multi-BC tables and full custom drag curve support
- Powder sensitivity — temperature-based MV correction tables
- Configurable units — choose your preferred measurement system per quantity in settings
- Adjustment display — arrows / signs / letters format, configurable in settings
- Import / Export — profiles in
.ebcp(native) and.a7p(Archer Ballistic Profile) formats; full backup via Settings
Latest release: GitHub Releases
| Platform | File | Notes |
|---|---|---|
| Linux x86_64 | ebalistyka_linux_x86_64.AppImage | requires FUSE 2 |
| Linux x86_64 (portable) | ebalistyka_linux_x86_64.tar.gz | no FUSE required |
| Linux x86_64 (snap) | ebalistyka_linux_x86_64.snap | or snap install ebalistyka |
| Linux x86_64 (flatpak) | ebalistyka_linux_x86_64.flatpak | sideload — see Linux — Flatpak |
| Linux arm64 | ebalistyka_linux_aarch64.AppImage | requires FUSE 2 |
| Linux arm64 (portable) | ebalistyka_linux_aarch64.tar.gz | no FUSE required |
| Linux arm64 (snap) | ebalistyka_linux_aarch64.snap | or snap install ebalistyka |
| Linux arm64 (flatpak) | ebalistyka_linux_aarch64.flatpak | sideload — see Linux — Flatpak |
| Linux x86_64 (deb) | ebalistyka_linux_x86_64.deb | Debian/Ubuntu — see Linux — deb |
| Linux arm64 (deb) | ebalistyka_linux_aarch64.deb | Debian/Ubuntu — see Linux — deb |
| Linux x86_64 (rpm) | ebalistyka_linux_x86_64.rpm | Fedora/RHEL/openSUSE — see Linux — rpm |
| Linux arm64 (rpm) | ebalistyka_linux_aarch64.rpm | Fedora/RHEL/openSUSE — see Linux — rpm |
| Linux x86_64 (AUR) | yay -S ebalistyka-bin |
Arch / Manjaro — see Linux — AUR |
| Linux arm64 (AUR) | yay -S ebalistyka-bin |
Arch / Manjaro — see Linux — AUR |
| Windows x64 | ebalistyka_windows_x86_64.msix | install ebalistyka_cert.cer first (self-signed) |
| Windows x64 (portable) | ebalistyka_windows_x86_64.zip | extract and run |
| Android arm64 | ebalistyka_android_arm64.apk | enable "Install from unknown sources" |
| Android armv7 | ebalistyka_android_armeabi_v7a.apk | enable "Install from unknown sources" |
| Android x86_64 | ebalistyka_android_x86_64.apk | enable "Install from unknown sources" |
chmod +x ebalistyka_linux_x86_64.AppImage
./ebalistyka_linux_x86_64.AppImageIf FUSE 2 is not available on your system:
./ebalistyka_linux_x86_64.AppImage --appimage-extract-and-runInstall from the Snap Store (auto-updates included):
sudo snap install ebalistykaOr sideload a .snap file from GitHub Releases:
sudo snap install ebalistyka_linux_x86_64.snap --dangerousInstall from a .flatpak sideload file (Flathub not yet available):
# Install flatpak runtime if needed
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install --user flathub org.gnome.Platform//48
# Install the app
flatpak install --user ebalistyka_linux_x86_64.flatpakRun:
flatpak run io.github.o_murphy.ebalistykaInstall on Debian/Ubuntu and derivatives:
sudo dpkg -i ebalistyka_linux_x86_64.debUninstall:
sudo dpkg -r ebalistykaInstall on Fedora/RHEL/openSUSE:
sudo rpm -i ebalistyka_linux_x86_64.rpmNote for Debian/Ubuntu users: if you are testing the
.rpmon a Debian-based system, RPM cannot resolve package names likegtk3fromapt. Use--nodepsto skip dependency checks — the bundle is self-contained and does not actually require them to be installed via RPM:sudo rpm -i --nodeps ebalistyka_linux_x86_64.rpm
Uninstall:
sudo rpm -e ebalistykaInstall via any AUR helper:
yay -S ebalistyka-binOr manually with makepkg:
git clone https://aur.archlinux.org/ebalistyka-bin.git
cd ebalistyka-bin
makepkg -siUninstall:
sudo pacman -R ebalistyka-binUpdates are delivered via zsync. Download AppImageUpdate, then run:
chmod +x AppImageUpdate-x86_64.AppImage
./AppImageUpdate-x86_64.AppImage ebalistyka_linux_x86_64.AppImageThe tool fetches only the changed blocks from the latest GitHub Release — no need to re-download the full file.
The MSIX is signed with a self-signed certificate. Before installing, trust the certificate:
- Download
ebalistyka_cert.cerfrom the release - Double-click → Install Certificate → Local Machine → Trusted Root Certification Authorities
- Install
ebalistyka_windows_x86_64.msix
Download the APK for your device ABI from the release and open it to install — if unsure, pick the universal APK. Android will verify the app via Google Play before installing.
ebalistyka-app/
├── lib/
│ ├── features/ # Screen-level feature modules
│ │ ├── home/ # Main screen: profiles, shot, reticle, chart, tables
│ │ ├── conditions/ # Environmental conditions input
│ │ ├── tables/ # Trajectory tables & HTML export
│ │ ├── convertors/ # Unit converters (angular, velocity, length, …)
│ │ └── settings/ # App settings (units, adjustments, theme, locale)
│ ├── core/
│ │ ├── providers/ # Riverpod providers (app state, settings, DB, l10n)
│ │ ├── extensions/ # Typed getters/setters on ObjectBox entities
│ │ ├── formatting/ # UnitFormatterImpl — localized value formatting
│ │ ├── models/ # FieldConstraints and other shared models
│ │ ├── services/ # A7pService, import/export orchestration
│ │ └── collection/ # Built-in weapon/ammo/sight collection assets
│ ├── shared/
│ │ ├── widgets/ # Reusable widgets (pickers, inputs, dialogs, wizards)
│ │ ├── models/ # UI-layer models (AdjustmentData, ChartPoint, …)
│ │ ├── helpers/ # Formatting helpers, drag model info
│ │ ├── mixins/ # WizardFormMixin
│ │ └── constants/ # UI dimensions, null string sentinel
│ ├── update/ # Update checker and utilities
│ └── l10n/ # Generated AppLocalizations (EN + UA)
├── packages/
│ ├── bclibc_ffi/ # Dart FFI bindings for the C++ solver
│ ├── ebalistyka_db/ # ObjectBox schema + .ebcp export DTOs
│ ├── a7p/ # .a7p protobuf encode/decode + ProfileExport converter
│ └── reticle_gen/ # SVG mil-reticle generator
└── external/
└── bclibc/ # C++ ballistic solver engine (LGPL-3, git submodule)
State management: Riverpod
Navigation: go_router
Local database: ObjectBox
Ballistic engine: bclibc (C++ via FFI)
Localisation: Flutter ARB / flutter_localizations (EN + UA)
- Flutter ≥ 3.41.7 (stable channel)
- CMake ≥ 3.13
- C++17 compiler (GCC / Clang on Linux, MSVC 2022 on Windows)
git clone --recurse-submodules https://github.com/o-murphy/ebalistyka-app.git
cd ebalistyka-app# System dependencies (Ubuntu/Debian)
sudo apt-get install -y \
clang cmake ninja-build pkg-config \
libgtk-3-dev liblzma-dev libstdc++-12-dev \
libclang-dev fuse libfuse2
flutter pub get
cd packages/bclibc_ffi && dart run ffigen --config ffigen.yaml && cd ../..
flutter build linux --releaseOutput: build/linux/x64/release/bundle/
# Requires Visual Studio 2022 with C++ workload
flutter pub get
cd packages\bclibc_ffi; dart run ffigen --config ffigen.yaml; cd ..\..
flutter build windows --releaseOutput: build\windows\x64\runner\Release\
flutter pub get
cd packages/bclibc_ffi && dart run ffigen --config ffigen.yaml && cd ../..
flutter build apk --release --target-platform android-arm64Output: build/app/outputs/flutter-apk/app-release.apk
GitHub Actions workflows publish a GitHub Release on every push to main:
| Workflow | Artifact |
|---|---|
build-portable.yml |
Linux portable tar.gz (x86_64 + aarch64) |
build-appimage.yml |
Linux AppImage (x86_64 + aarch64) |
build-snap.yml |
Linux Snap (x86_64 + aarch64) |
build-flatpak.yml |
Linux Flatpak (x86_64 + aarch64) |
build-deb.yml |
Linux deb (x86_64 + aarch64) |
build-rpm.yml |
Linux rpm (x86_64 + aarch64) |
build-exe.yml |
Windows MSIX installer |
build-apk.yml |
Android APK (arm64 + armv7 + x86_64) |
build.yml |
Reusable build workflow called by the above |
publish.yml |
Publishes to Snap Store on GitHub Release |
scripts/update-aur.sh |
Updates aur/PKGBUILD checksums (run manually after release) |
Flutter's Impeller renderer (enabled by default on Android since Flutter 3.16) tessellates SVG paths — including circles — into coarse polygons, which makes reticle and target SVGs look jagged. Until Flutter/Impeller resolves path tessellation quality for small shapes, Impeller is explicitly disabled for Android in android/app/src/main/AndroidManifest.xml:
<meta-data
android:name="io.flutter.embedding.android.EnableImpeller"
android:value="false" />This forces the app to use Skia, which renders SVG circles smoothly. Re-enable Impeller only after verifying that circle/arc quality is acceptable on your target Android version.
On Android, file_picker cannot filter by custom extensions (.ebcp, .a7p) because Android does not know their MIME types. The import dialogs open with FileType.any and validate the extension after the user selects a file. Selecting a wrong file type shows an error message.
| Package | Role |
|---|---|
| flutter_riverpod | State management |
| go_router | Navigation |
| flutter_localizations | EN + UA localisation |
| flutter_svg | SVG reticle & target rendering |
| window_manager | Desktop window size / title / icon |
| file_picker | Import file picker |
| share_plus | Export / share files |
| url_launcher | External links |
| package_info_plus | App version info |
| flutter_markdown_plus | App help widgets |
| ota_update | autoupdate for Android sideloadinstallations |
| Package | Role |
|---|---|
| bclibc | C++ ballistic solver engine (3-DOF + spin drift, RK4) — LGPL-3 |
| ffi | Dart ↔ C FFI bindings |
| Package | Role |
|---|---|
| objectbox | Local database |
| archive | .ebcp zip archive read/write |
| json_annotation | Export DTO serialisation |
| Package | Role |
|---|---|
| protobuf | .a7p protobuf encode/decode |
| crypto | .a7p checksum verification |
| Package | Role |
|---|---|
| xml | SVG reticle generation |
Copyright (C) 2026 Yaroshenko Dmytro (o-murphy)
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License v3.0 as published by the Free Software Foundation.
See LICENSE for the full text. See CHANGELOG for release history.
Note
bclibc (the ballistic solver engine, located in external/bclibc) is licensed separately under the GNU Lesser General Public License v3.0. See external/bclibc/LICENSE.
Warning
Risk notice. This application performs approximate simulations of complex physical processes. Calculation results must not be considered as completely or reliably reflecting actual projectile behaviour. Results may be used for educational purposes only and must not be relied upon in any context where an incorrect calculation could cause financial harm or put a human life at risk.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.





