Skip to content

o-murphy/ebalistyka-app

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

159 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ebalistyka

Made in Ukraine

License Release Status Flutter Shield Linux Windows Android

AUR Version Snapcraft Version

Google Play

Build (Android) Build (Windows) Build (Linux portable) Build (Linux AppImage) Build (Linux Snap) Build (Linux Flatpak) Build (Linux deb) Build (Linux rpm)

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


Screenshots

Home Conditions Trajectory Tables
Convertors My Profiles Reticle

Table of Contents


Features

  • 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

Download & Installation

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"

Linux — run

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

Linux — Snap

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

Linux — Flatpak

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//48

# Install the app
flatpak install --user ebalistyka_linux_x86_64.flatpak

Run:

flatpak run io.github.o_murphy.ebalistyka

Linux — deb

Install on Debian/Ubuntu and derivatives:

sudo dpkg -i ebalistyka_linux_x86_64.deb

Uninstall:

sudo dpkg -r ebalistyka

Linux — rpm

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:

sudo rpm -i --nodeps ebalistyka_linux_x86_64.rpm

Uninstall:

sudo rpm -e ebalistyka

Linux — AUR (Arch/Manjaro)

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

Linux — AppImage update

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.

Windows — install MSIX

The MSIX is signed with a self-signed certificate. Before installing, trust the certificate:

  1. Download ebalistyka_cert.cer from the release
  2. Double-click → Install CertificateLocal MachineTrusted Root Certification Authorities
  3. Install ebalistyka_windows_x86_64.msix

Android — install APK

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.


Architecture

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)


Building

Prerequisites

  • Flutter ≥ 3.41.7 (stable channel)
  • CMake ≥ 3.13
  • C++17 compiler (GCC / Clang on Linux, MSVC 2022 on Windows)

Clone

git clone --recurse-submodules https://github.com/o-murphy/ebalistyka-app.git
cd ebalistyka-app

Linux

# 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/

Windows

# 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\

Android

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

CI

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)

Android notes

Impeller disabled

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.

File import

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.


Dependencies

App (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 sideloadinstallations

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

License

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.

About

A high performance cross-platform ballistic calculator

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

 
 
 

Contributors