Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog. Brahe's versioning and deprecation policy is modeled on NumPy's policy rather than strict SemVer — see the versioning documentation for the full policy, including the transitional deprecation window currently in effect.
Each release groups entries under the Keep a Changelog section headings in the order Added, Changed, Deprecated, Removed, Fixed. Entries in Deprecated correspond to APIs that still work in this release but emit a DeprecationWarning or FutureWarning; entries in Removed list APIs that previous releases had deprecated.
[1.5.2] - 2026-05-18¶
Fixed¶
- Fix issue with new release workflow
CHANGELOGgeneration that would result in an error causing the release to fail. Release notes now must be manually generated and committed prior to running the release action. @duncaneddy (#334)
[1.5.1] - 2026-05-18¶
Added¶
DNumericalOrbitPropagator::builder()- typestate builder that names required fields and lets optional fields be set by name or omitted.build()is only callable onceepoch,state, andforce_configare all set, enforced viaSet/Unsetmarker type parameters. @markusz (#321)- Added
states_ecefandstates_eme2000toSGPPropagator. @duncaneddy (#331) - Added
states_eme2000toKeplerianPropagator. @duncaneddy (#331) - Added
states_eci,states_ecef,states_gcrf,states_itrf, andstates_eme2000toNumericalOrbitPropagator. @duncaneddy (#331) - Added
statestoNumericalPropagator. @duncaneddy (#331) - New high-fidelity propagator benchmarks under
benchmarks/comparative/tasks/propagation_tasks.py:numerical_rk4_grav5x5,numerical_rk4_grav20x20_sun_moon,numerical_rk4_grav80x80_full. Each runs RK4 over one LEO revolution with matched force-model and frame settings on both sides (OreKit loads brahe'sEGM2008_360.gfcviaICGEMFormatReader, GCRF inertial frame, ITRF / IAU 2006/2000A body-fixed rotation, DE-440 third-body ephemerides, identical spacecraft mass / area / Cd / Cr). @duncaneddy (#332) - New function-level acceleration benchmarks under
benchmarks/comparative/tasks/force_model_tasks.pyfor point-mass gravity, 20×20 and 80×80 spherical-harmonic gravity, and third-body Sun/Moon. These evaluate a single acceleration at a fixed state and epoch, isolating force-model code from integrator behaviour. @duncaneddy (#332) - "Force Model" section in
docs/about/benchmarks.mddocumenting the new function-level comparisons. @duncaneddy (#332) GravityModel::load_uncached(model)— explicit cold-load primitive for users who need deterministic memory or want to profile the parse path. @duncaneddy (#332)GravityModel::compute_spherical_harmonics_with_workspace(...)andaccel_gravity_spherical_harmonics_with_workspace(...)— variants that accept caller-supplied V/W work matrices, letting hot-path callers (the numerical propagator's dynamics closure, batch orbit-determination residual code) amortize the per-callDMatrix::zeros((n_max + 2)²)allocation. At 80×80 the saved allocation+memset is ~15 µs per call. @duncaneddy (#332)clear_gravity_model_cache()— manual cache invalidation, useful after replacing aFromFile(path)source on disk or in tests. @duncaneddy (#332)mimallocas the global allocator for thebrahe-pyPython extension and the comparative-benchmark Rust binary. The brahe core library remains allocator-agnostic so downstream Rust consumers pick their own. @duncaneddy (#332)- Added
SECONDS_PER_DAYconstant. @duncaneddy (#333)
Changed¶
NumericalOrbitPropagatorandNumericalPropagatornow no longer store accelerations by default to save space and improve performance. @duncaneddy (#330)- The FD fallback for HermiteQuintic is removed. Previously, calling HermiteQuintic on a trajectory without stored accelerations would silently degrade to finite-difference acceleration estimation if 3+ points were available; now it errors. Combined with the earlier store_accelerations: false default flip, any code path that today uses HermiteQuintic either needs NumericalPropagationConfig::with_store_accelerations(true) (propagator path) or trajectory.enable_acceleration_storage() (direct path). @duncaneddy (#330)
- Performance, numerical propagator (no behaviour change): the
DNumericalOrbitPropagatorhot path now caches the ECI→body-fixed rotation across integrator stages, shares oneArc<GravityModel>across propagators with the same gravity config (no more 60 ms.gfcreload per construction), borrows the state vector instead of cloning it on every stage call, returns the orbital derivative as a stack-allocatedVector6<f64>instead of allocating a freshDVector, and reuses the spherical-harmonic V/W work matrices across stages. @duncaneddy (#332) GravityModel::from_model_typeis now process-wide cache-backed. Repeated calls for the sameGravityModelTypeparse the.gfcfile once (~60 ms cold), then return owned clones from the cachedArc(~1 ms each). The public signature is unchanged. Cache is documented as unbounded — see the# Cautionblock on the function for the growth caveat with many distinctFromFile(path)sources, and useclear_gravity_model_cache()as the escape hatch. @duncaneddy (#332)bias_precession_nutationswitched fromiauXys06a(full IAU 2000A nutation, ~1300 terms) toiauXys00b(truncated IAU 2000B, ~77 terms). Per-call cost dropped from ~150 µs to ~2.3 µs; agreement with the full series is sub-milliarcsecond, no regressions in tests. @duncaneddy (#332)- Refreshed benchmark plots and docs. @duncaneddy (#332)
- Changed how adding a flaot second time to an Epoch (
epc + 42.5) processes the internal addition. Previously, it would loop of remaining nanoseconds and convert them into integer seconds. For large second values, this would result in many loops for a single step, meaning that time addition, a frequent code hot-path, would grow linearly in time. Now it is an O(1) operation. @duncaneddy (#333)
Fixed¶
- Update urllib3 to mitigate security vulnerability. @duncaneddy (#326)
- Some estimation plots used unicode sigma instead of
$\sigma$. When latex is installed and defaults to pdfLaTeX compiler, this causes an error. Switch to$\sigma$everywhere. @duncaneddy (#331) DNumericalOrbitPropagator::propagate_tomay hang with fixed-step RK4. Atsrc/propagators/dnumerical_orbit_propagator.rs:2312the restore-dt_nextguard used>instead of>=. Withtarget_epoch = epc + N * step_sizeconstructed by repeated arithmetic, float drift could leavetarget_relslightly larger than the integer multiple; Fixed by changing the comparison to>=so the restore fires whenever the integrator returned its preferred step. @duncaneddy (#332)- Workspace mismatch in
benchmarks/comparative/implementations/rust/Cargo.toml: the crate predated the brahe repo-root workspace and would fail with "current package believes it's in a workspace when it's not". Added an empty[workspace]table so cargo treats the bench as its own workspace root. @duncaneddy (#332)
[1.5.0] - 2026-05-06¶
Added¶
- Added
accel_earth_zonal_gravity— a hand-rolled closed-form J2–J6 zonal acceleration that mirrorsaccel_gravity_spherical_harmonicswithm = 0but evaluates ~1.5–2x faster, with agreement to <3 km over a 24 h LEO propagation when both are driven in the same Earth-fixed frame. @markusz (#302) - Added
GravityConfiguration::EarthZonal { degree }variant and supportingZonalHarmonicsDegreeenum (J2..J6) so the numerical propagator can use the fast zonal path directly. @markusz (#302) - Added
FrameTransformationModel(variantsFullEarthRotation,EarthRotationOnly) and aframe_transformfield onForceModelConfig.EarthRotationOnlyskips precession, nutation, and polar motion for ~1.5x faster ECI↔ECEF rotations at the cost of ~0.07° pole-tilt accuracy;FullEarthRotation(default) preserves prior behavior. @markusz (#302) - Added
J3_EARTH,J4_EARTH,J5_EARTH, andJ6_EARTHconstants derived from EGM2008. @markusz (#302) - Added Python bindings for
accel_earth_zonal_gravity,ZonalHarmonicsDegree,FrameTransformationModel,GravityConfiguration.earth_zonal(...), and the newJ3_EARTH–J6_EARTHconstants. @markusz (#302) - Added coefficient-derivation tests verifying each
J_n_EARTHconstant matches-C_n,0 * sqrt(2n + 1)against the EGM2008 fully-normalized Stokes coefficients. @markusz (#302)
Changed¶
- Refined
J2_EARTHto be derived from the EGM2008C_2,0Stokes coefficient (1.0826261738522227e-3) instead of GGM05s. Downstream values change in the 5th significant digit. @markusz (#302) - Reused a single ECI→body-fixed rotation per dynamics step across gravity, NRLMSISE-00 density, and drag inside
DNumericalOrbitPropagatorrather than recomputing the rotation per force term. @markusz (#302) - Update package lockfile. @duncaneddy (#306)
Removed¶
- Removed rust artifact caching from CI since existing rust environment already provides (working) caching. @duncaneddy (#315)
Fixed¶
- Add missing
CHANGELOG.mdrelease entries. @duncaneddy (#306) - Fix error with release note generation step of release workflow. @duncaneddy (#306)
- Fix issue with awk-based release-note generation step of release workflow not populating release note contents. @duncaneddy (#306)
- Fixed Starlink examples and documentation prose that still referenced the removed
bh.datasets.celestrak/bh::datasets::celestrakAPI. @Mtrya (#310) - Fix 3rd party changes PRs not generating changelog fragments. @duncaneddy (#317)
[1.4.2] - 2026-04-23¶
Fixed¶
- Fix
brahe-pyCrate not using rootCargo.tomlas single-source-of-truth for package version. #298 - Corrected
format_exponentialexponent offset in TLE generation (#300). BSTAR and second time derivative values are no longer 10x too small.
[1.4.1] - 2026-04-21¶
Changed¶
- Improve documentation around versioning practices. #282
- Add deprecation section to changelog #284
- Bump version for v1.4.1 release #295
Fixed¶
- Fix a permissions issue that pervented CHANGELOG validation from running on fork PRs #293
[1.4.0] - 2026-04-17¶
Added¶
Changed¶
- Refactored repository structure to use a Rust workspace to breakup the python module from the core rust module. This pure-rust package consumers to avoid having to build the
cdylib, which is only needed for python module builds. #278 pyo3andnumpyare now optional dependencies, activated via thepythonfeature flag. Pure-Rust consumers that do not need the Python bindings no longer compile these crates.- Split the repository into a Cargo workspace so the PyO3 bindings live in a dedicated
brahe-pymember crate atcrates/brahe-py/. The publishedbrahecrate now builds only anrlib, eliminating the unnecessarycdylibartifact previously produced for every pure-Rust consumer. Rust downstream (use brahe::*) and Python downstream (import brahe) are unchanged.
Fixed¶
- Fixed issue that would cause tests and auto-merge to not run on dependabot PRs #278
[1.3.4] - 2026-04-15¶
Fixed¶
- Fix failing celestrak queries by migrating from celestrak.com to celestrak.org #272
[1.3.3] - 2026-04-10¶
Added¶
- Add JD_J2000 constant to python bindings #264
[1.3.2] - 2026-04-06¶
Changed¶
- Updated JOSS manuscript to comply with latest guidelines #256
Fixed¶
- Fixed issue with SGP4 propagators erroring during parallel propagation on satellite reentry. Addressed by adding a
termination_errorfield to SGPPropagators which will be documented and stop propagation rather than erroring all propagation. Issued with documentation builds in CI failing due to dependency changes. Fixed by updatinguv.lock#256
[1.3.1] - 2026-03-29¶
Added¶
- Added retry logic and exponential back-off to Celestrak client Added process-based rate-limiting to Celestrak client #244
Changed¶
Fixed¶
- Pointed
mikedocumentation deployment to useproperdocs.yml#244 - Fix
mike set-defaultinvocation to useproperdocs.ymlconfig #246
[1.3.0] - 2026-03-29¶
Added¶
- Added python constructors for CCSDS OPM and OMM file types #225
- Added dedicated
celestrakandspacetracksubmodules to the brahe CLI for querying and interfacing with space track. Addedto_dict()andto_json()methods for GPRecord python module to enable easy interoperability #227 - Added additional python test coverage #228
- Added
estimationmodule with support forEKF,UKF, andBLS(batched least-squares) filters Added estimation plotting routines Added implementations of magnetic field models. In particular the IGRF and WMMHR models. Addedfrom_unix_timestampandunix_timestampmethods to support interoperability with native unix time systems Added sponsor logo #241
Changed¶
- Added additional test coverage #225
- Renamed
MJD2000constant toMJD_J2000to align withJD_J2000naming #231 - Improved documentation code samples by auto-generating, capturing, and rendering script outputs so values are guaranteed to be kept up to date. #234
- Migrated to
properdocsfrommkdocsfor documentation due to instability in project. #241
Fixed¶
- Fixed issue with anomaly conversion CLI not properly using
use_degrees#225
[1.2.0] - 2026-03-21¶
Added¶
- Added polygon tessellation for large area access computation #199
- Added additional benchmarks and comparisons to OreKit in
benchmarks/comparisons#209 - Add support for CCSDS OEM, OMM, OPM (blue-book) and CDM (pinkbook) types. Methods exist to load, access, modify, and create these data objects. #214
- Add full support for XML and JSON output across OEM, OPM, and OMM files. #222
Changed¶
- Have Propagators set a UUID by default Have Locations set a UUID by default Migrated default-generated UUIDs to UUIDv7 #202
- Removed
releaseenvironment flag from github release workflows Only retain last 3 minor documentation verions to prevent unbounded growth of github pages deployments. #209 - Cleaned up space-track and celestrak documentation to improve readability and understandability #214
- Added coverage reporting for python bindings and module #218
- Improved CCSDS module round trip test coverage Ensures that default OEM to Trajectory conversion returns a
DOrbitTrajectoryso that it can immediately be used with access computation. #222
Fixed¶
- Reverted compilation regression due to dependabot update. Ignored packages to prevent future regressions #194
- Skip running CI-related tests on fork-PRs so that tests pass. #204
- Changes access module type annotations from
ListtoSequenceso that LSPs don't erroneously report a warning thatlocation_accessesand other functions might mutate the list. Fix issue where python bindings for access properties would return a copy of the underlying data so mutations would not persist. IntroduceAccessPropertyViewso that it is now properly possible to access, set, and modify access properties in python. #206 - Fixed issue with Gabbard plots not generating properly #218
- Fix coverage reporting #220
[1.1.4] - 2026-03-05¶
Fixed¶
- Fix regression from dependabot update Included type annotations in package generation #188
[1.1.3] - 2026-03-04¶
Added¶
- Added
SubdivisionConfiga subfield ofAccessSearchConfigto control how subdivisions are created #181
Changed¶
- Migrated to PyO3
v0.28Update Cargo dependencies #179 - Removed
time_stepparameter from internalfind_access_windowsmethod. Configuration of stepping and subdivision is now unified as a property ofAccessSearchConfig#181
Fixed¶
- Fixed issue in dataframe creation from dependabot update. #179
[1.1.2] - 2026-02-14¶
Fixed¶
- Fix spacetrack client erroring out when query returns a lot of results
- Fix spacetrack
cdm_publicroute having wrong parent stem #169
[1.1.1] - 2026-02-14¶
Added¶
- Added ability to configure
TrajectoryModeonSGP4Propagatorfor applications where memory-use management is key. #167
Changed¶
- The JOSS paper submission used code examples with the older celestrak API. This PR updates the code examples to use the updated, stabilized API.
- Slightly adjust language in paper to avoid silly page overflow #165
- Changed default interpolator used by
NumericalOrbitPropgatorfor event detection from linear to 3rd degree Hermite. #167
Fixed¶
- Make
.current_epoch()property a method, not property in python bindings. - Fixed issue with event detection system in
NumericalOrbitPropagatorwhere it not correctly process events co-located with the current time, and would sometimes miss events in between time steps. #167
[1.1.0] - 2026-02-10¶
Added¶
- Added
par_propagate_to_dmethod. #109 - Add Github issue templates for bugs and feature requests #113
- Add arXiv citation to README and documentation. #124
- Modified python bindings to support access computation with numerical orbit propagators. #126
- Added
spacetrackclient module, enabling direct interaction with space-track.org APIs #150 - Added BSL-1.0 to allowed dependency license list
- Added GCAT dataset interface #152
- Added simplified
CelestrakClientinterface to bridge gap between new interface and old one. #157
Changed¶
- Bump version for 1.0.1 release #106
- Renamed
par_propagate_totopar_propagate_to_s - Move SGPPropagator to D-Type event detection. #109
- Update documentation to add JOSS paper submission badge. #113
- Update JOSS workflow to export tex artifacts to support arXiv upload. #122
- Moved all Brahe errors in python bindings from
OSErrortoBraheErrorto make them more distinguishable and easy to handle. #126 - Updated JOSS paper with new required sections. #137
- Enable manual triggering of latest documentation build in CI for handling EOP-update edge cases for releases. #139
- Overhauled
celestrakclient. Thecelestrakclient now uses a common type and query structure shared with thespacetrackmodule. In particular, theGPRecordserves as the common representation of OMM elements returned by both sites. This enables greater interoperability between other library modules that can consume or act onGPRecordtypes. Thecelestrakmodule is now it's own, stand-alone, module independent ofdatasets. - Migrate developer workflow from
make.pyto just - Remove dependency on BTreeCursor nightly feature, allowing crate to compile with stable rust. #150
- Adjusted
CelestrakQuerypython bindings to properly use properties instead of methods for specific dataset queries. Example: New:CelestrakQuery.gpvs Old:CelestrakQuery.gp()#157
Fixed¶
- Enabled event detection in
par_propagate_tomethod in Python #109 - Fixed broken documentation links in readme. (Thank you Stuart Bartlett for pointing it out) #129
- Fix broken links in main documentation landing page. #131
- Fix provider names for SSC stations in NASA Near Earth Network #143
- Fix https://duncaneddy.github.io/brahe/ to redirect to the current default root URL. #147
- Fixed tables in ephemeris documentation not being justified. #152
- Reverted
pyo3version update due to incompatibility withnumpydepdency - Prevented dependabot from auto-updating
pyo3#157 - Properly pass environment secrets from the
releaseworkflow to child-workflows #159
[1.0.1] - 2025-12-04¶
Added¶
- Added
from_omm_elementstoSGPPropagator. Supports direct initialization of propagator from OMM elements without needing to go through TLE lines. This is both more accurate as well as more robust to TLE ID depletion. #102 - Add support for event detection to
SGPPropagator - Add
AOIEntryEventandAOIExitEventas premade event detectors. #104
Fixed¶
- Fix typo in JOSS paper title #99
[1.0.0] - 2025-11-29¶
Added¶
{D}NumericalOrbitPropagatorand python bindings{D}NumericalPropagatorand python bindings- Event detection system for numerical propagators to find events during propagation #89
- Mean to osculating, osculating to mean orbital element transformations
- Update OrbitStateProviders to provide
state(s)_koe_meanandstate(s)_koe_osc - Implement ECI<>ROE direct transformations
- Add
ephemeris_agetoSGPPropagator - Implement Largrange, cubic Hermite, and quintic Hermite interpolation methods.
- Add
WalkerConstellationGeneratorwhich enables rapidly generating propagators with walker-geometry configurations. #96
Changed¶
- Make access computation use D-type propagators.
- Standardize on
- Add support for D-type returns to
KeplerianPropagatorandSGPPropagator - Standardized trait traits for
{S|D}StateProvider,{S|D}CovarianceProvider,{S|D}StatePropagator DTrajectoryandDOrbitTrajectorycan now store trajectories of arbitrary lengthDTrajectoryandDOrbitTrajectorycan now store stm and sensitivity matricies alongside state and covariance.- Improved test coverage across modules
- Changed how third-body ephemeris sources are defined and loaded. DE source is now a parameter instead of set by function name. Dynamically load BSP files when called.
- Changed how Gravity models are defined in terms of enumeration types.
- Renamed
state_cartesian_to_osculatingandstate_osculating_to_cartesianasstate_eci_to_koeandstate_koe_to_eci#89 - Improve trajectory module test coverage
- Improve events module test coverage
- Changed CI release workflow to publish documentation updates only after packages have been successfully published #96
Fixed¶
- Numerical integration
stepandstep_with_varmatnow take explicit parameter values. #89
Removed¶
- Removed
STrajectory6from python bindings. #89
[0.4.0] - 2025-11-28¶
Added¶
- Add space weather data management and access modeled on Earth orientation data provider design. #73
- Added support for control inputs to numerical integration
- Added support for integration of sensitivity matrices to numerical integration functions
- Added support for analytical and numerical computation of sensitivity matrix
- Added documentation for integration with control inputs and sensitivity matrix integration
- Added documentation for computation and handling of sensitivity matrices #78
- Add JOSS draft paper #80
- Added NRLMSISE-00 atmospheric density model implementation #82
Changed¶
- Consolidates internal implementation of numerical integration
- Added additional numerical integration tests to improve coverage
- Consolidates duplicate type definitions across integrator files #78
- Refactor
celestrak.rsandnaif.rsmodules to useHttpClientstructure to enable mocking and mock testing through mockall to make struct calls - Refactored main package documentation #84
Fixed¶
- Auto-merge of bundled data update wasn't auto-merging #75
- Removed erroring cache-check in python test workflow #78
[0.3.0] - 2025-11-18¶
Added¶
- Added
Integratorssubmodule with complete rust implementation, python bindings, documentation, and examples - Support for
RK4,RKF45,DP54, andRKN1210numerical integration methods - License validation and compliance checks. Package is now automatically checked to ensure all dependencies have permissive, commercially-adoptable licenses #63
- NAIF Development Ephemeride dataset download and caching
- High-accuracy DE440s-based ephemeris prediction
- High-accuracy DE440s-based third-body acceleration prediction
- Python bindings for orbit dynamics functions #68
- Added
geo_smafunction to directly return the semi-major axis needed for a geostationary orbit. #69
Changed¶
- Moved mathematics capabilities from
utilssubmodule to dedicatedmathsubmodule. - Bumped version to
0.2.0for release - Removed Rust test sections from coverage reporting #63
- Orbit dynamics functions which previously required a position-only vector can now accept either a position-only or a state vector. Conversion will be handled by the
IntoPositiontrait. #68
Fixed¶
- Fix inconsistencies in Python API reference header levels
- Missing Ground station
- Miscellaneous documentation improvements and fixes #63
[0.2.0] - 2025-11-17¶
Added¶
- Added
relative_motionsubmodule to contain functionality related to relative motion - Implemented RTN rotation and state transformations:
rotation_eci_to_rtn,rotation_rtn_to_eci,state_eci_to_rtn, andstate_rtn_to_eci - Implemented Relative Orbital Element (ROE) state transformations
state_oe_to_roeandstate_roe_to_oe - Added
util::mathfunctionssqrtmandspd_sqrtmto calculate matrix square root - Added
util::mathfunctionsoe_to_radiansandoe_to_degreesto reduce duplication in converting angle values in orbital element calcualtions #57 - Implement
CovarianceProvidertrait forOrbitTrajectory. Providescovariance,covariance_eci,covariance_gcrf, andcovariance_rtn - Add
interpolationsubmodule to store consistent covariance interpolation methods - Implement covariance rotation from ECI to RTN frame
- Extends
OrbitTrajectoryto optionally store covariance information. #59
Changed¶
- Don't run PR tests on release CHANGELOG update. #49
- Unit test and PR test workflows now cancel in-progress runs if a new commit lands
- Added concurrency guards to auto-merge workflows. #53
- Moved where internal vector/matrix (e.g.
SMatrix3,SVector6) type aliases are defined fromcoordinatessubmodule toutils#57
Fixed¶
- Don't trigger multiple changelog merges on changelog a PR. #49
- Only trigger auto-merge on
openeddue to changelog PRs not issuinglabeledevents #51 - Added additional triggers to auto-merge workflows to ensure they are properly triggered. #53
- Fixed assorted typos and errors in docstrings related to covariance interpolation features. #61
- Fixes package-data update CI workflow by moving to auto-PR, auto-merge approach #64
[0.1.3] - 2025-11-12¶
Added¶
- Added python missing bindings for
states_icrfandstates_gcrfforKeplerianPropagatorandSGPPropagator - Added additional tests across various module to improve test coverage. #36
Changed¶
- Refactor
frames.rsfile into submodule with subfiles for long-term maintainability. #14 - Automatically create and merge PRs for changelog updates #16
- Auto-merge changelog PRs
- Auto-merge dependabot PRs
- Expand dependabot to cover python and rust packages #26
- Bump package version to
v0.1.3#34 - Skip unit test suite on auto-generated changelog PRs. #44
Fixed¶
- PR changelogs were not being incorporated into the package changelog due to main-branch protection #16
- Stop generation changelog PRs for auto-generated changelog PRs #26
- Fixed issue with release pipeline release note generation #38
- Fix auto-merge for changelog PRs by using PAT #40
- Fix auto-merge workflow to accept PAT owner as actor. #42
- Fix workflow release step to use workflow PAT and declare base branch #46