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 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 |
![]() |
![]() |
![]() |
- 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
ebalistyka-app/
├── lib/
│ ├── features/ # Screen-level feature modules
│ │ ├── home/ # Profiles & shot details
│ │ ├── conditions/ # Environmental input
│ │ ├── tables/ # Trajectory tables & export
│ │ ├── convertors/ # Unit converters
│ │ └── settings/ # App settings
│ ├── core/ # Providers, services, coordinators
│ └── shared/ # Icons, shared widgets
├── packages/
│ ├── bclibc_ffi/ # Dart FFI bindings for the C++ solver
│ ├── ebalistyka_db/ # ObjectBox data layer + export DTOs (.ebcp)
│ ├── a7p/ # .a7p format: protobuf encode/decode + ProfileExport converter
│ └── reticle_gen/ # SVG 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)
- Flutter ≥ 3.41.6 (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# Install 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
# Install Flutter packages
flutter pub get
# Generate FFI bindings
cd packages/bclibc_ffi && dart run ffigen --config ffigen.yaml && cd ../..
# Build
flutter build linux --releaseThe output bundle is at 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 --releaseThe output is at build\windows\x64\runner\Release\.
GitHub Actions workflows are provided for automated builds:
| Workflow | Trigger |
|---|---|
build-appimage.yml |
PR to main/develop → Linux AppImage |
build-exe.yml |
PR to main/develop → Windows EXE |
build.yml |
Reusable — called by the above |
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 |
|---|---|
| bclibc | C++ ballistic solver engine — LGPL-3 |
| flutter_riverpod | State management |
| go_router | Navigation |
| objectbox | Local database |
| protobuf | .a7p protobuf serialisation |
| file_picker | Import file picker |
| share_plus | Export / share files |
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.





