Skip to content

Releases: duncaneddy/brahe

Release v1.7.0

Choose a tag to compare

@github-actions github-actions released this 21 Jul 23:07

Important

This release adds support for arbitrary-central-body orbit propagation, extending Brahe support beyond Earth or other planets and interplanetary trajectories. As such it contains multiple breaking changes to the NumericalOrbitPropagator class.

There are also a number of other fun improvements added with this release:

  • Native SPICE kernel support for planetary body positions and frames
  • Support for cislunar and mars reference frames and trajectories
  • Added Permenant Tide, Solid Earth Tide, and Ocean Tide force models
  • Support for conversions to/from synodic reference frames
  • API Clients for JPL Small Bodies Database and Horizons systems for SPICE kernel download
  • Datasets to download and access FK5, Hipparcos, and Tycho2 star catalogs
  • Overhaul MeanToOsculating orbital element conversions, adding support for numerical-averaging based conversions
  • Added builder-pattern constructors for major, complex classes making them easier toconstruct andcustomize
  • Review and improvement of error system in the package. Standardizing use of Result in Rust API, and improving Python errors

Added

  • Native SPICE kernel support: SPK and BPCK readers (DAF container, SPK Type 2/3, binary PCK Type 2), usable standalone or via the global registry. @duncaneddy (#376)
  • Global multi-kernel registry: load_kernel, unload_kernel, clear_kernels, loaded_kernels; kernels stay resident simultaneously with most-recently-loaded precedence and epoch-aware chain fallback. @duncaneddy (#376)
  • NAIFId enum (planets, planetary-system barycenters, major moons, Id(i32) catch-all) and FrameId enum (MoonPaDe440 = 31008 + Id(i32)); all query functions take impl Into<NAIFId> / impl Into<FrameId>, so raw integer IDs keep working. Python mirrors as NAIFId/FrameId IntEnums. @duncaneddy (#376)
  • SPICEKernel enum covering every downloadable kernel — DE (de430–de442s), JPL satellite ephemeris kernels (mar099, mar099s, jup365, sat441, ura184, nep097, plu060), and binary PCK (moon_pa_de440) — plus KernelSource for bring-your-own kernel paths. @duncaneddy (#376)
  • load_common_kernels() (de440s + moon_pa_de440, ~46 MB) and load_all_kernels() (~2.5 GB) pre-initialization helpers. @duncaneddy (#376)
  • Generic NAIF-ID ephemeris queries: spk_position, spk_velocity, spk_state (pooled, cross-kernel chaining) and kernel-scoped spk_position_from_kernel / spk_velocity_from_kernel / spk_state_from_kernel. @duncaneddy (#376)
  • Per-body kernel-backed accessors {body}_{position,velocity,state}_spice for Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, and the SSB. The five outer planets return true body centers via a two-leg DE + satellite-ephemeris-kernel sum (kernel auto-downloaded on first use: mar099s ~68 MB, jup365 ~1.1 GB, sat441 ~662 MB, ura184 ~387 MB, nep097 ~105 MB); {planet}_barycenter_{position,velocity,state}_spice variants provide the planetary-system barycenter from the DE kernel alone. @duncaneddy (#376)
  • PCK orientation queries with typed attitude returns: pck_euler_angle (EulerAngle, ZXZ), pck_euler_angle_and_rates, pck_euler_rates, pck_quaternion (Quaternion), pck_rotation_matrix (RotationMatrix), plus the raw pck_euler_angles. @duncaneddy (#376)
  • Epoch::spice_et() — SPICE ephemeris time (TDB seconds past J2000) convenience accessor; Epoch::seconds_past_j2000_as_time_system for other time systems. @duncaneddy (#376)
  • datasets::naif::download_spice_kernel for any known NAIF kernel (DE, satellite ephemeris, binary PCK), exposed in Python as datasets.naif.download_spice_kernel. @duncaneddy (#376)
  • ANISE validation suite (mm-level matched-ET comparisons, network-gated lunar DCM validation) and native-vs-ANISE criterion benchmarks. @duncaneddy (#376)
  • Learn/API documentation for the spice module and four standalone examples, enabled in CI with cached kernels. @duncaneddy (#376)
  • Lunar reference frames LCI/LFPA/LFME and Mars frames MCI/MCMF with {rotation|position|state}_{from}_to_{to} transformations, cross-center state_eci_to_lci/state_eci_to_mci, and automatic moon_pa_de440 PCK loading. @duncaneddy (#377)
  • Native IAU/WGCCRE 2015 body-rotation engine (rotation_icrf_to_body_fixed_iau, iau_rotation_model_ids) with an embedded 17-body coefficient table transcribed from pck00011.tpc and validated against ANISE. @duncaneddy (#377)
  • Centralized ReferenceFrame enum and frame router (rotation_frame_to_frame, position_frame_to_frame, state_frame_to_frame) with generic NAIF-ID variants (BodyCenteredICRF, BodyFixedIAU, BodyFixedPCK) and "ECI"/"ECEF" string aliases. @duncaneddy (#377)
  • CentralBody abstraction (Earth, Moon, Mars, EMB, SSB, Custom) with from_naif_id(), and ForceModelConfig::for_body(), lunar_default() (GRGM660PRIM 50×50, Earth+Sun third bodies, Moon+Earth occultation), mars_default() (GMM-2B 50×50, exponential drag, Mars occultation), and cislunar_default() (EMB-centered) constructors. @duncaneddy (#377)
  • Barycentric (EMB/SSB) propagation with correct direct/differential third-body handling; ThirdBody gains Earth, Phobos, Deimos, and Custom { name, naif_id, gm } variants. @duncaneddy (#377)
  • Multi-body eclipse modeling via occulting_bodies on the SRP configuration and new OccultingBody type. @duncaneddy (#377)
  • Body-generic dynamics functions: accel_third_body_for_body, eclipse_conical_for_body, eclipse_cylindrical_for_body, accel_relativity_for_body, accel_drag_for_body, state_eci_to_koe_for_body. @duncaneddy (#377)
  • state_bci, state_bcbf, and state_in_frame(frame, epoch) on the orbit state-provider traits (DOrbitStateProvider/SOrbitStateProvider), implemented on the numerical, Keplerian, and SGP propagators and both trajectory types. @duncaneddy (#377)
  • OrbitFrame::BodyCenteredInertial(center): non-Earth propagator trajectories carry their center's NAIF ID, and trajectory Earth-frame conversions (point queries, batch to_*, covariance, CCSDS OEM export) re-center through the frame router; state_koe_osc returns elements about the trajectory's own center using that body's GM. @duncaneddy (#377)
  • User-defined body-fixed frames: register_custom_frame(key, rotation, omega=None) + ReferenceFrame::BodyFixedCustom{center, key} (epoch->DCM callback with optional angular-velocity callback; numeric transport-term fallback), with a runnable example. @duncaneddy (#377)
  • state_koe_to_eci_for_body (inverse of state_eci_to_koe_for_body), ReferenceFrame::ECI/ECEF aliases, kernel_is_loaded(), and the SECONDS_PER_JULIAN_CENTURY constant. @duncaneddy (#377)
  • just setup recipe for local development (uv venv, pre-commit hooks, and pre-downloading the de440s/moon_pa_de440/mar099s kernels tests expect cached). @duncaneddy (#377)
  • NAIF mar099s Mars satellite kernel support (download_satellite_kernel, load_kernel("mar099s")) for Phobos/Deimos ephemerides. @duncaneddy (#377)
  • Physical constants R_MARS, OMEGA_MARS, OMEGA_MOON, GM_PHOBOS, GM_DEIMOS. @duncaneddy (#377)
  • ForceModelConfig::validate() with clear errors for invalid central-body/force-model combinations, called automatically at propagator construction. @duncaneddy (#377)
  • Python bindings for all of the above (ReferenceFrame, CentralBody, OccultingBody, extended ThirdBody, config constructors, frame functions, state_in_frame). @duncaneddy (#377)
  • CI caching of kernel and gravity-model downloads across jobs and workflow runs, with a weekly keep-warm workflow. @duncaneddy ([#377](https://github.com...
Read more

Latest Release (v1.7.0)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 24 Oct 19:09

This is the latest stable release of Brahe.

Current version: v1.7.0 (v1.7.0)

For detailed release notes, see the versioned release.

Release v1.6.2

Choose a tag to compare

@github-actions github-actions released this 01 Jul 17:26

Added

  • Added native Linux arm64 wheel builds to the latest and release workflows, with platform-specific wheel artifact names to avoid artifact collisions. @hectcastro (#372)
  • CachingEOPProvider / CachingSpaceWeatherProvider (and initialize_eop() / initialize_sw()) now seed a missing cache from the compiled-in bundled data, so EOP and space-weather initialization succeed offline without an immediate network download. @duncaneddy (#374)
  • EOP and space-weather downloads now retry transient failures (connection errors, timeouts, HTTP 429/5xx) with exponential backoff and jitter (up to 4 attempts). @duncaneddy (#374)

Changed

Fixed

  • Fix compilation issue due to transitive dependency breaking change in ureq/time crates. Pin time until issue is resolved. @duncaneddy (#373)
  • Fixed issue with failing tests due to inability to update outdated EOP products. @duncaneddy (#373)
  • initialize_eop() / initialize_sw() no longer fail on a fresh/empty cache when the remote EOP or space-weather server is transiently unreachable (e.g. Standard EOP download request failed: io: Connection refused in CI); bundled data is used instead. @duncaneddy (#374)

Release v1.6.1

Choose a tag to compare

@github-actions github-actions released this 17 Jun 07:59

Added

  • Added "Getting Started" section to main documentation page. @duncaneddy (#356)
  • integration flag to rust and python test suites, replacing ci. @duncaneddy (#365)
  • par_propagate_to (Python) now accepts a list that mixes KeplerianPropagator, SGPPropagator, and NumericalOrbitPropagator instances. Propagators are grouped by type and each group is propagated in parallel; results are written back to the original objects in place, preserving list order. @duncaneddy (#366)
  • MANUAL example flag for examples that must never run automatically (scaffolding templates and credential-gated examples), so the --ignore live-network run no longer sweeps them in. @duncaneddy (#366)

Changed

  • Update C04 data source to point to currently updating data series. @duncaneddy (#356)
  • Makes the plots submodule of the python package an optional dependency installed with brahe[plots] and not installed by default to avoid importing the heavy dependencies by default. @duncaneddy (#360)
  • Optimized the serial spherical-harmonic gravity evaluation (GravityModel::compute_spherical_harmonics / compute_spherical_harmonics_with_workspace) by precomputing the V/W recurrence reciprocal coefficients and reading the recurrence and accumulation buffers through bounds-check-free column slices. The workspace path is ~1.7–1.8× faster at degree/order 20–80 (the range common to LEO propagation) and ~1.6× faster at 360×360, with results unchanged to within 1e-12 relative. Measured on a 10-core Apple M1 Max. @duncaneddy (#361)
  • Raised the ParallelMode::Auto parallelization threshold for spherical-harmonic gravity from degree 150 to 210. The faster serial path moved the serial/parallel break-even point, so Auto now stays serial until parallel evaluation is at least as fast. @duncaneddy (#361)
  • compute_spherical_harmonics, compute_spherical_harmonics_with_workspace, accel_gravity_spherical_harmonics, and accel_gravity_spherical_harmonics_with_workspace now take a parallel: ParallelMode argument; GravityConfiguration::SphericalHarmonic gained a parallel field (defaults to Auto). @duncaneddy (#361)
  • Updated CI workflow to only run integration tests weekly and at release time to reduce frequent occurrence of CI tests failing due to external integration test failures. @duncaneddy (#365)
  • Improved CI caching to large texture / basemap files to be updated with integration tests weekly and avoid redownload on most CI runs. @duncaneddy (#365)
  • Updated pyo3 dependency version. @duncaneddy (#365)
  • Updated uv.lock. @duncaneddy (#365)
  • Tagged TEMPLATE.{py,rs} and getting_started/clients_spacetrack.{py,rs} as MANUAL so they are excluded from all automated example runs. @duncaneddy (#366)
  • Raised the per-example TIMEOUT to 600s for the starlink_propagation.py examples, which propagate the full live Starlink constellation and exceeded the default 180s limit during the weekly/release live-network run. @duncaneddy (#366)

Removed

Fixed

  • CSSI space weather data loader has been fixed to use the observed f107 rather than the adjusted f107. @jackyarndley (#362)
  • The NRLMSISE-00 implementation has been updated to use the previous day observed f107 as is standard. @jackyarndley (#362)
  • Fixed race condition in examples CI tests where two could download the same Natural Earth basemap and corrupt the file for both. @duncaneddy (#365)
  • Fixed regression from lazy-impoting brahe.plots that caused static-analyzers (griffee) to fail path-traversal. This caused build-docs to fail and slipped through due to other test-failure noise. @duncaneddy (#365)
  • Fixed test-examples flakyness on external integration dependencies. Ignore testing integration-based examples by default, but exercise them weekly in the integration tests to ensure continued coverage. @duncaneddy (#365)
  • par_propagate_to (Python) no longer raises TypeError when given a list containing more than one propagator type; mixed-type lists are now propagated correctly. @duncaneddy (#366)
  • Fixed the release test-examples integration job failing on --ignore: IGNORE was an overloaded bucket that mixed live-network examples with templates, credential-gated, slow, and broken examples, so opting into the live-network set pulled in examples that could never pass there. @duncaneddy (#366)

Release v1.6.0

Choose a tag to compare

@github-actions github-actions released this 06 Jun 06:43

Added

  • Add RKF78 / RKF78Integrator support for high-order adaptive integration in Rust and Python. @Mtrya (#339)
  • Add RKF78 tests, examples, and API/reference documentation. @Mtrya (#339)
  • Added GMAT baselines. @duncaneddy (#340)
  • Added Basilisk baselines. @duncaneddy (#340)
  • profiles/ subdirectory with short, standalone rust and python scripts for use with profiling tools. @duncaneddy (#341)
  • Added justfile commands to run profiling scripts. @duncaneddy (#341)
  • Add baselines against Nyx 2.4.0 / ANISE 0.10.1. @duncaneddy (#342)
  • Added datasets.icgem submodule to integrate with ICGEM gravity field model distribution network. Listing and downloading models uses the local brahe cache to minimize network traffic. @duncaneddy (#343)
  • Added brahe vs astrojax benchmarks. @duncaneddy (#344)
  • Add ci-success stage to enable gating CI auto-merge on completion. @duncaneddy (#350)

Changed

  • Extend numerical propagation integrator selection and comparison examples to include RKF78. @Mtrya (#339)
  • Split baselines into speed and accuracy tests. @duncaneddy (#340)
  • Added ICGEMModel(body, model_name) to GravityModelType enabling ICGEM models to be specified for numerical orbit propagators. @duncaneddy (#343)
  • Scaled back python-version test matrix on PRs to minimum supported python version. @duncaneddy (#345)
  • Removed anise default feature dependency to just pull in SPICE kernel features. @duncaneddy (#350)

Fixed

  • EulerAngleOrder semantics now match what brahe's documentation always described and what the comparative benchmark expects. Prior to this fix, attitude.euler_angle_to_quaternion disagreed with OreKit, GMAT, and Basilisk. The discrepancy was traced through to a convention mismatch between the per-order formulas (faithfully transcribed from Diebel 2006) and the aerospace rotation-sequence interpretation users (and the docs) assumed. @duncaneddy (#338)
  • Fixed issue with CHANGELOG parsing in PRs where a blank line after a section header would fail to validate. @duncaneddy (#338)
  • Fixed issue with Orekit access baseline not properly inserting leap seconds in accuracy computation leading to in accurate error. @duncaneddy (#340)
  • Fixed build breaking from conflicting nalgebra required dependencies. @duncaneddy (#350)
  • Regression in use of custom python-based access constraints where they would give an error at use. @nkgotcode @duncaneddy (#354)

Release v1.5.2

Choose a tag to compare

@github-actions github-actions released this 18 May 16:27

Added

  • DNumericalOrbitPropagator::builder() - typestate builder that names required fields and lets optional fields be set by name or omitted. build() is only callable once epoch, state, and force_config are all set, enforced via Set/Unset marker type parameters. @markusz (#321)
  • Added states_ecef and states_eme2000 to SGPPropagator. @duncaneddy (#331)
  • Added states_eme2000 to KeplerianPropagator. @duncaneddy (#331)
  • Added states_eci, states_ecef, states_gcrf, states_itrf, and states_eme2000 to NumericalOrbitPropagator. @duncaneddy (#331)
  • Added states to NumericalPropagator. @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's EGM2008_360.gfc via ICGEMFormatReader, 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.py for 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.md documenting 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(...) and accel_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-call DMatrix::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 a FromFile(path) source on disk or in tests. @duncaneddy (#332)
  • mimalloc as the global allocator for the brahe-py Python 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_DAY constant. @duncaneddy (#333)

Changed

  • NumericalOrbitPropagator and NumericalPropagator now 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 DNumericalOrbitPropagator hot path now caches the ECI→body-fixed rotation across integrator stages, shares one Arc<GravityModel> across propagators with the same gravity config (no more 60 ms .gfc reload per construction), borrows the state vector instead of cloning it on every stage call, returns the orbital derivative as a stack-allocated Vector6<f64> instead of allocating a fresh DVector, and reuses the spherical-harmonic V/W work matrices across stages. @duncaneddy (#332)
  • GravityModel::from_model_type is now process-wide cache-backed. Repeated calls for the same GravityModelType parse the .gfc file once (~60 ms cold), then return owned clones from the cached Arc (~1 ms each). The public signature is unchanged. Cache is documented as unbounded — see the # Caution block on the function for the growth caveat with many distinct FromFile(path) sources, and use clear_gravity_model_cache() as the escape hatch. @duncaneddy (#332)
  • bias_precession_nutation switched from iauXys06a (full IAU 2000A nutation, ~1300 terms) to iauXys00b (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_to may hang with fixed-step RK4. At src/propagators/dnumerical_orbit_propagator.rs:2312 the restore-dt_next guard used > instead of >=. With target_epoch = epc + N * step_size constructed by repeated arithmetic, float drift could leave target_rel slightly 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)
  • Fix issue with new release workflow CHANGELOG generation 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)

Release v1.5.0

Choose a tag to compare

@github-actions github-actions released this 18 May 06:00
76bc613

[1.5.0] - 2026-05-06

Added

  • Added accel_earth_zonal_gravity — a hand-rolled closed-form J2–J6 zonal acceleration that mirrors accel_gravity_spherical_harmonics with m = 0 but 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 supporting ZonalHarmonicsDegree enum (J2..J6) so the numerical propagator can use the fast zonal path directly. @markusz (#302)
  • Added FrameTransformationModel (variants FullEarthRotation, EarthRotationOnly) and a frame_transform field on ForceModelConfig. EarthRotationOnly skips 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, and J6_EARTH constants derived from EGM2008. @markusz (#302)
  • Added Python bindings for accel_earth_zonal_gravity, ZonalHarmonicsDegree, FrameTransformationModel, GravityConfiguration.earth_zonal(...), and the new J3_EARTHJ6_EARTH constants. @markusz (#302)
  • Added coefficient-derivation tests verifying each J_n_EARTH constant matches -C_n,0 * sqrt(2n + 1) against the EGM2008 fully-normalized Stokes coefficients. @markusz (#302)

Changed

  • Refined J2_EARTH to be derived from the EGM2008 C_2,0 Stokes 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 DNumericalOrbitPropagator rather than recomputing the rotation per force term. @markusz (#302)
  • Update package lockfile. @duncaneddy (#306)
  • Migrate from towncrier CHANGELOG workflow to self-built scripted extraction workflow to eliminate need for news/* segments and generation. @duncaneddy (#320)
  • Removed the auto-approval/merge workflows. These generated a significant number of relatively useless PR's creating noise in PR history. Permissions are properly configured so these updates directly merge into main. @duncaneddy (#320)
  • Contributor PRs directly run tests by default. @duncaneddy (#320)

Removed

  • Removed rust artifact caching from CI since existing rust environment already provides (working) caching. @duncaneddy (#315)

Fixed

  • Add missing CHANGELOG.md release 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::celestrak API. @Mtrya (#310)
  • Fix 3rd party changes PRs not generating changelog fragments. @duncaneddy (#317)

Release v1.4.2

Choose a tag to compare

@github-actions github-actions released this 23 Apr 15:07
3379b17

[1.4.2] - 2026-04-23

Fixed

  • Fix brahe-py Crate not using root Cargo.toml as single-source-of-truth for package version. #298
  • Corrected format_exponential exponent offset in TLE generation (#300). BSTAR and second time derivative values are no longer 10x too small.

Release v1.4.0

Choose a tag to compare

@github-actions github-actions released this 17 Apr 21:45
33937f1

[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
  • pyo3 and numpy are now optional dependencies, activated via the python feature 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-py member crate at crates/brahe-py/. The published brahe crate now builds only an rlib, eliminating the unnecessary cdylib artifact 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

Release v1.3.1

Choose a tag to compare

@github-actions github-actions released this 31 Mar 22:12
8ee0a6e

[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
  • Added python constructors for CCSDS OPM and OMM file types #225
  • Added dedicated celestrak and spacetrack submodules to the brahe CLI for querying and interfacing with space track.
    Added to_dict() and to_json() methods for GPRecord python module to enable easy interoperability #227
  • Added additional python test coverage #228
  • Added estimation module with support for EKF, UKF, and BLS (batched least-squares) filters
    Added estimation plotting routines
    Added implementations of magnetic field models. In particular the IGRF and WMMHR models.
    Added from_unix_timestamp and unix_timestamp methods to support interoperability with native unix time systems
    Added sponsor logo #241

Changed

  • Set default celestrak client cache age to 2 hours. #244
  • Bump version for v1.3.1 #248
  • Added additional test coverage #225
  • Renamed MJD2000 constant to MJD_J2000 to align with JD_J2000 naming #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 properdocs from mkdocs for documentation due to instability in project. #241

Fixed

  • Pointed mike documentation deployment to use properdocs.yml #244
  • Fix mike set-default invocation to use properdocs.yml config #246
  • Fixed issue with anomaly conversion CLI not properly using use_degrees #225