eBalistyka o-murphy
winget install --id=o-murphy.ebalistyka -e Ballistic Calculator
winget install --id=o-murphy.ebalistyka -e Ballistic Calculator
A high performance cross-platform ballistic calculator
> [!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
<b>Home</b>
<b>Conditions</b>
<b>Trajectory Tables</b>
<img src="docs/screenshots/home.png" width="200" />
<img src="docs/screenshots/conditions.png" width="200" />
<img src="docs/screenshots/tables_trajectory.png" width="200" />
<b>Convertors</b>
<b>My Profiles</b>
<b>Reticle</b>
<img src="docs/screenshots/convertors.png" width="200" />
<img src="docs/screenshots/my_profiles.png" width="200" />
<img src="docs/screenshots/reticle.png" width="200" />
.ebcp (native) and .a7p (Archer Ballistic Profile) formats; full backup via SettingsLatest 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 |
chmod +x ebalistyka_linux_x86_64.AppImage
./ebalistyka_linux_x86_64.AppImage
If FUSE 2 is not available on your system:
./ebalistyka_linux_x86_64.AppImage --appimage-extract-and-run
Install from the Snap Store (auto-updates included):
sudo snap install ebalistyka
Or sideload a .snap file from GitHub Releases:
sudo snap install ebalistyka_linux_x86_64.snap --dangerous
Install from repo
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak remote-add --if-not-exists o-murphy https://o-murphy.github.io/flatpak-repo/o_murphy.flatpakrepo
flatpak install o-murphy io.github.o_murphy.ebalistyka
Install 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//50
# Install the app
flatpak install --user ebalistyka_linux_x86_64.flatpak
Run:
flatpak run io.github.o_murphy.ebalistyka
Install on Debian/Ubuntu and derivatives:
sudo dpkg -i ebalistyka_linux_x86_64.deb
Uninstall:
sudo dpkg -r ebalistyka
Install on Fedora/RHEL/openSUSE:
sudo rpm -i ebalistyka_linux_x86_64.rpm
> Note for Debian/Ubuntu users: if you are testing the .rpm on a Debian-based system, RPM cannot resolve package names like gtk3 from apt. Use --nodeps to skip dependency checks — the bundle is self-contained and does not actually require them to be installed via RPM:
> bash > sudo rpm -i --nodeps ebalistyka_linux_x86_64.rpm >
Uninstall:
sudo rpm -e ebalistyka
Install via any AUR helper:
yay -S ebalistyka-bin
Or manually with makepkg:
git clone https://aur.archlinux.org/ebalistyka-bin.git
cd ebalistyka-bin
makepkg -si
Uninstall:
sudo pacman -R ebalistyka-bin
Updates are delivered via zsync. Download AppImageUpdate, then run:
chmod +x AppImageUpdate-x86_64.AppImage
./AppImageUpdate-x86_64.AppImage ebalistyka_linux_x86_64.AppImage
The tool fetches only the changed blocks from the latest GitHub Release — no need to re-download the full file.
winget install -e --id o-murphy.ebalistyka
The MSIX is signed with a self-signed certificate. Before installing, trust the certificate:
ebalistyka_cert.cer from the releaseebalistyka_windows_x86_64.msixDownload 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)
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 --release
Output: 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 --release
Output: 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-arm64
Output: 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:
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.
ebalistyka)| 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 sideload installations |
packages/bclibc_ffi| Package | Role |
|---|---|
| bclibc | C++ ballistic solver engine (3-DOF + spin drift, RK4) — LGPL-3 |
| ffi | Dart ↔ C FFI bindings |
packages/ebalistyka_db| Package | Role |
|---|---|
| objectbox | Local database |
| archive | .ebcp zip archive read/write |
| json_annotation | Export DTO serialisation |
packages/a7p| Package | Role |
|---|---|
| protobuf | .a7p protobuf encode/decode |
| crypto | .a7p checksum verification |
packages/reticle_gen| 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.
| 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" |