Ballistic Calculator 2 — 1.0.0
The first release of the Avalonia rewrite. Windows, Linux and macOS, from one codebase, with no emulation layer.
Released 2026-07-31 — tag 1.0.0.
This replaces the WinForms Ballistic Calculator .NET.
It is not an update to it: nothing is shared but the trajectory engine, and the two can be installed side by
side. Your files mostly come with you — old .ammo ammunition files load (the Load dialog offers them and
saves back in the current .ammox format), .drg drag tables and .reticle files are unchanged because
those formats belong to the engine library, and an old .trajectory file opens, through a migration path
for the layout that kept the zeroing inside the rifle. It does not work in the other direction: a shot saved
by this release will not open in the WinForms application.
Download
Take the archive that matches your machine, unpack it into a folder you can write to, and run it. There is no installer and no updater.
| Platform | Archive | Run |
|---|---|---|
| Windows x64 / ARM64 | BallisticCalculatorPortable-win-x64.zip, …-win-arm64.zip |
BallisticCalculator2.exe |
| Linux x64 / ARM64 | BallisticCalculatorPortable-linux-x64.tar.gz, …-linux-arm64.tar.gz |
./BallisticCalculator2 |
| macOS Apple Silicon / Intel | BallisticCalculatorPortable-osx-arm64.tar.gz, …-osx-x64.tar.gz |
./BallisticCalculator2 |
The reticle editor is a second executable in the same folder — ReticleEditor.exe / ./ReticleEditor.
Prerequisite: the .NET 8 runtime. The builds are framework-dependent. The plain runtime is enough — Avalonia does not need the Desktop Runtime.
Match the archive to the machine on macOS. An osx-arm64 build on an Intel Mac fails at start with
nothing useful said about why; uname -m settles it. Verified running on both.
The Unix builds ship as .tar.gz rather than .zip on purpose — zip carries no permission bits, so a
zipped Linux or macOS build arrives with its launcher not executable.
Full instructions, including what the application stores and where, are in Installation and first run.
Code signing
The two Windows archives are signed. The Linux and macOS binaries are not — there is nothing signtool
can do with an ELF or a Mach-O binary. macOS builds are not notarised, so Finder refuses the launcher on
a double-click; starting it from Terminal is unaffected. Notarisation needs an Apple Developer ID, a .app
bundle and a submission step, and is deliberately not done for this release.
What it does
Trajectory
- 3DOF point-mass integration with the correction terms that matter in the field: spin drift, crosswind aerodynamic jump (Litz / Applied Ballistics) and the Coriolis effect (barrel azimuth plus shooter latitude)
- Uphill and downhill shots, scope cant, and multiple wind zones along the flight path
- Zeroing with a different cartridge, atmosphere or wind than the shot — zero supersonic, shoot subsonic
- Dialed clicks (H/V) carried through, with the click value taken from the sight
- Station pressure or sea-level pressure, temperature, humidity, altitude
Spin drift and aerodynamic jump need the rifling twist plus the bullet’s diameter and length; Coriolis needs the barrel azimuth and your latitude. Leave them out and those terms are simply absent — not estimated.
Drag models
- All the standard curves: G1, G2, G5, G6, G7, G8, GI, GS, RA4
- Custom drag tables (
.drg) — the projectile’s own measured Cd curve, which is where real accuracy comes from - Approximate a drag table you do not have, two ways, each with its own editor:
- from a multi-BC curve — BC quoted at several Mach numbers, as published on many data sheets; a mixed G1/G7 curve is normalised at each knot’s own Mach
- from measured downrange velocities — radar or chronograph data, against the atmosphere the data was measured in
- Convert a BC between standard tables (the everyday G1 ↔ G7 question) at a reference velocity you choose, with the reference Mach and a transonic warning stated rather than hidden
Reading the answer
- Table — range, velocity, Mach, drop, hold, clicks, windage, time of flight, energy, optimal game weight; exportable to CSV in either an invariant format or your local one for Excel
- Chart — drop, velocity, Mach, energy or windage, over line of sight or over muzzle level
- Sight picture — your trajectory through your own reticle, with BDC marks labelled by your range, a target box drawn to scale, and a moving-target aim-off box
- Summary — zero adjustment, point-blank range and the dead-zone span (bottom- and centre-aimed), near and far zero, the distance the bullet goes subsonic, target size
- Compare — several trajectories on one chart with a legend
- Imperial or metric throughout, and angular units in mrad, MOA, mils, thousands, in/100yd or cm/100m
- MDI window surface: several shots open at once, each in its own window, layout remembered between sessions
Analysis
- Hit probability — a Monte-Carlo estimate over your error budget: group size (1σ per axis), shooting position, range and wind estimation error, and the ammunition’s muzzle-velocity deviation. Reports the single-shot probability, how many shots a first hit needs at 50/75/90/95/98%, an impact scatter drawn against the vital zone to scale, and the mean and 90% radial miss
- Point-blank range, moving-target lead, and the subsonic distance
Libraries and editors
- Ammunition library — save and load a load, with its drag table
- Sight and barrel presets — a sight preset fills height and click values and suggests its zero distance
- Reticle editor — a separate application: build a reticle element by element, in mrad or MOA, with a live render, a selection halo, four coordinate readout units, adjustable font size, and unsaved-change guards on New, Open and close
What ships in data/
| 34 reticles | Real optics — Trijicon ACOG and VCOG, Leupold CMR/CCH, Elcan Specter, EOTech Vudu, Nightforce Huron, PSO-1, Mil-Dot, MOA grid, an H58-style grid, M16 irons. Each has a companion .md sheet giving the pattern element by element, the full calibration, a mark-by-mark table and how the load was identified, plus a README index |
| 62 drag tables | Measured .drg curves, Lapua and others |
| 80 ammunition files | Sample loads from .22 to .50 BMG, including air rifle and shotgun |
| 26 sight and barrel presets | 11 sights and 15 barrels, in data/dictionaries.xml |
Every reticle here is a -style rendering built from published subtension data. None is a manufacturer file and none is exact — a mark is “400 m” only for the load the reticle was etched for, which is why the application labels each mark from your trajectory instead of from the etching.
On updating: everything inside data belongs to the release and is replaced; everything outside it —
including user-dictionaries.xml and appstate.json, which live beside the executable — is yours and is
never touched. Keep your own reticles and loads in a folder of your own. See
Updating the application.
Documentation
A full user guide ships with this release — installation, one article per tab of the Shot Parameters dialog, the reticle editor, the drag-model articles, and what the model includes, which states term by term what is computed and what is left out.
Four reference articles are still stubs and say so on the page: the summary view, saving and exporting, the units reference, and file formats.
Known problems
The full list, with causes and workarounds, is in Known problems. The four worth knowing before you start:
- Under WSL (WSLg), modal dialogs are covered by the main window and reappear seconds later. Not an application problem, or even an Avalonia one — a twelve-line Tk program reproduces it. Correct on a real Linux desktop (verified on Ubuntu 24.04) and on Windows. Keep the dialog clear of the main window.
- On Linux, the Open and Save dialogs ignore the application font size — they are the desktop’s (GTK) dialogs, not ours.
- The reticle editor has no undo. It does guard unsaved documents; within one,
Save Asbefore an experiment. - macOS is not notarised — see Code signing above.
And one thing reported as a problem that is not: the table can stop before the maximum range you asked for. The solver abandons a shot below 50 ft/s or past 10,000 ft of drop, so a load asked for more range than it can carry ends where it ran out. Rows stop; nothing errors.
RISK NOTICE
The application performs a very limited simulation of a complex physical process and therefore makes a great many approximations. The calculation results MUST NOT be considered as completely and reliably reflecting the actual behaviour or characteristics of projectiles. While these results may be used for educational purposes, they must NOT be considered reliable in any area where an incorrect calculation could lead to a wrong decision, financial harm, or risk to human life.
Under the hood
- .NET 8, Avalonia UI 11.3 with Classic.Avalonia.Theme, SkiaSharp for reticle rendering, ScottPlot for charts, Iciclecreek.Avalonia.WindowManager for the MDI surface
- BallisticCalculator 1.1.13 and Gehtsoft.Measurements 1.1.18
- 1,006 automated tests pass — controls 322, panels 557, reticle editor 89, application 38; UI tests run
headless through
Avalonia.Headless - The shared calculation and domain layers (
Common/) carry no desktop UI dependency, so the planned Android application can be built on them rather than around them. That work has not started. - GNU General Public License v2
Problems and suggestions: open an issue, saying which platform you are on — Windows, a real Linux desktop, or WSL.