{"id":31021701,"url":"https://github.com/duncaneddy/brahe","last_synced_at":"2026-04-02T20:23:41.379Z","repository":{"id":62560401,"uuid":"179412132","full_name":"duncaneddy/brahe","owner":"duncaneddy","description":"A practical astrodynamics for research and engineering applications","archived":false,"fork":false,"pushed_at":"2026-03-04T01:43:47.000Z","size":1519709,"stargazers_count":65,"open_issues_count":2,"forks_count":6,"subscribers_count":7,"default_branch":"main","last_synced_at":"2026-03-04T02:24:48.228Z","etag":null,"topics":["astrodynamics","guidance-navigation-control","orbital-mechanics","orbital-simulation","python","rust","satellites","space"],"latest_commit_sha":null,"homepage":"https://duncaneddy.github.io/brahe/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/duncaneddy.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-04-04T03:08:49.000Z","updated_at":"2026-03-04T01:16:00.000Z","dependencies_parsed_at":"2024-01-09T06:24:41.151Z","dependency_job_id":"023626a4-9b8e-421f-9868-b8060e4dabbc","html_url":"https://github.com/duncaneddy/brahe","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/duncaneddy/brahe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duncaneddy%2Fbrahe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duncaneddy%2Fbrahe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duncaneddy%2Fbrahe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duncaneddy%2Fbrahe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/duncaneddy","download_url":"https://codeload.github.com/duncaneddy/brahe/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duncaneddy%2Fbrahe/sbom","scorecard":{"id":359644,"data":{"date":"2025-08-11","repo":{"name":"github.com/duncaneddy/brahe","commit":"e189bae21fe709c5fcb8f1c8142cc9273220b511"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.4,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/commit.yml:1","Warn: no topLevel permission defined: .github/workflows/document_update.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/test_python.yml:1","Warn: no topLevel permission defined: .github/workflows/test_rust.yml:1","Warn: no topLevel permission defined: .github/workflows/update_bundled_data.yml:1","Warn: no topLevel permission defined: .github/workflows/update_docs.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:66: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:72: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:87: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:96: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:102: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test_python.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/test_python.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test_python.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/test_python.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test_rust.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/test_rust.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test_rust.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/test_rust.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test_rust.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/test_rust.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test_rust.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/test_rust.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test_rust.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/test_rust.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update_bundled_data.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/update_bundled_data.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/update_bundled_data.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/update_bundled_data.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update_docs.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/update_docs.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update_docs.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/duncaneddy/brahe/update_docs.yml/main?enable=pin","Warn: pipCommand not pinned by hash: scripts/build-docs.sh:20","Warn: pipCommand not pinned by hash: scripts/build-docs.sh:22","Warn: pipCommand not pinned by hash: .github/workflows/release.yml:43","Warn: pipCommand not pinned by hash: .github/workflows/test_python.yml:22","Warn: pipCommand not pinned by hash: .github/workflows/test_python.yml:24","Warn: pipCommand not pinned by hash: .github/workflows/update_docs.yml:23","Info:   0 out of  14 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   7 third-party GitHubAction dependencies pinned","Info:   0 out of   6 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}}]},"last_synced_at":"2025-08-18T10:29:05.159Z","repository_id":62560401,"created_at":"2025-08-18T10:29:05.159Z","updated_at":"2025-08-18T10:29:05.159Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30090037,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T18:31:08.343Z","status":"ssl_error","status_checked_at":"2026-03-04T18:31:07.708Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["astrodynamics","guidance-navigation-control","orbital-mechanics","orbital-simulation","python","rust","satellites","space"],"created_at":"2025-09-13T11:28:16.383Z","updated_at":"2026-04-02T20:23:41.373Z","avatar_url":"https://github.com/duncaneddy.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/duncaneddy/brahe/\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/duncaneddy/brahe/main/docs/assets/logo-gold.png\" alt=\"Brahe\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003cem\u003eBrahe - Practical Astrodynamics\u003c/em\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://duncaneddy.github.io/brahe/latest\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/docs-latest-blue.svg\" alt=\"Docs\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://github.com/duncaneddy/brahe/actions/workflows/unit_tests.yml\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://github.com/duncaneddy/brahe/actions/workflows/unit_tests.yml/badge.svg\" alt=\"Tests\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://codecov.io/gh/duncaneddy/brahe\"\u003e  \n    \u003cimg src=\"https://codecov.io/gh/duncaneddy/brahe/graph/badge.svg?token=1JDXP549Q4\"\u003e\u003c/a\u003e\n\u003ca href=\"https://crates.io/crates/brahe\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://img.shields.io/crates/v/brahe.svg\" alt=\"Crate\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://pypi.org/project/brahe\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://img.shields.io/pypi/v/brahe?color=blue\" alt=\"PyPi\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://github.com/duncaneddy/brahe/blob/main/LICENSE\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/License-MIT-green.svg\", alt=\"License\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://joss.theoj.org/papers/a7ec6268a42c9fada797a3cb213c1d17\"\u003e\n    \u003cimg src=\"https://joss.theoj.org/papers/a7ec6268a42c9fada797a3cb213c1d17/status.svg\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://arxiv.org/abs/2601.06452\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/arXiv-2601.06452-b31b1b.svg\" alt=\"arXiv\"\u003e\n\u003c/a\u003e\n\u003c/p\u003e\n\n----\n\n**Documentation:** [https://duncaneddy.github.io/brahe/latest](https://duncaneddy.github.io/brahe/latest)\n\n**Rust Library Reference:** [https://docs.rs/crate/brahe/latest](https://docs.rs/crate/brahe/latest)\n\n**Source Code:** [https://github.com/duncaneddy/brahe](https://github.com/duncaneddy/brahe)\n\n----\n\n# Brahe\n\nBrahe is a modern satellite dynamics library for research and engineering applications. It is designed to be quick-to-deploy, composable, extensible, and easy-to-learn. The north-star of the development is enabling users to solve meaningful problems quickly and correctly.\n\nBrahe is permissively licensed under an [MIT License](https://github.com/duncaneddy/brahe/blob/main/LICENSE) to enable people to use and build on the work without worrying about licensing restrictions. We want people to be able to stop reinventing the astrodynamics \"wheel\" because commercial licenses are expensive and open-source options are hard to use.\n\nWe try to prioritize making the software library easy to learn, use, and verify. Many astrodynamics libraries are written with many layers of abstraction for flexibility that can make it challenging for new users to understand _where_ the actual logic and algorithms are being executed. Brahe is written in a modern style with an emphasis on code clarity and modularity to make it easier to understand what individual functions are actually doing. This approach has the added benefit of making it easier to verify and validate the correctness of the implementation.\n\nIf you do find this useful, please consider starring the repository on GitHub to help increase its visibility. If you're using Brahe for school, research, a commercial endeavour, or flying a mission. I'd love to know about it.\n\nWe hope you find Brahe useful for your work!\n\n\n## Going Further\n\nIf you want to learn more about how to use the package the documentation is structured in the following way:\n\n- **[Learn](https://duncaneddy.github.io/brahe/latest/learn/)**: Provides short-form documentation of major concepts of the package.\n- **[Examples](https://duncaneddy.github.io/brahe/latest/examples/)**: Provides longer-form examples of how-to examples of how to accomplish common tasks.\n- **[Python API Reference](https://duncaneddy.github.io/brahe/latest/library_api/)**: Provides detailed reference documentation of the Python API.\n- **[Rust API Reference](https://docs.rs/brahe)**: Provides detailed reference documentation of the Rust API.\n\n## Quick Start\n\n### Python\n\nTo install the latest release of brahe for Python, simply run:\n\n```bash\npip install brahe\n```\n\nYou can then import the package in your Python code with:\n\n```python\nimport brahe as bh\n```\n\nAnd do something fun like calculate the orbital-period of a satellite in low Earth orbit:\n\n``` python\nimport brahe as bh\n\n# Define the semi-major axis of a low Earth orbit (in meters)\na = bh.constants.R_EARTH + 400e3  # 400 km altitude\n\n# Calculate the orbital period\nT = bh.orbital_period(a)\n\nprint(f\"Orbital Period: {T / 60:.2f} minutes\")\n# Outputs:\n# Orbital Period: 92.56 minutes\n```\n\nor find the when the ISS will next pass overhead:\n\n``` python\nimport brahe as bh\n\nbh.initialize_eop()\n\n# Download ISS TLE and create a propagator\nclient = bh.celestrak.CelestrakClient()\niss = client.get_sgp_propagator(catnr=25544, step_size=60.0)\n\n# Propagate for 24 hours\nepoch_start = iss.epoch\nepoch_end = epoch_start + 24 * 3600.0\niss.propagate_to(epoch_end)\n\n# Compute upcoming passes over San Francisco\npasses = bh.location_accesses(\n    bh.PointLocation(-122.4194, 37.7749, 0.0),  # San Francisco\n    iss,\n    epoch_start,\n    epoch_end,\n    bh.ElevationConstraint(min_elevation_deg=10.0),\n)\nprint(f\"Number of passes in next 24 hours: {len(passes)}\")\n# Example Output: Number of passes in next 24 hours: 5\n```\n\nIf you want to see more examples of how to use brahe, you can find even more with full source code in the [Examples section](https://duncaneddy.github.io/brahe/latest/examples/index.html) of the documentation.\n\n## Citing Brahe\n\nIf you use Brahe in your work, please cite the following paper:\n\n```bibtex\n@article{eddy2026brahe,\n      title={{Brahe: A Modern Astrodynamics Library for Research and Engineering Applications}}, \n      author={Duncan Eddy and Mykel J. Kochenderfer},\n      year={2026},\n      eprint={2601.06452},\n      archivePrefix={arXiv},\n      primaryClass={astro-ph.IM},\n      url={https://arxiv.org/abs/2601.06452}, \n}\n```\n\n## Versioning\n\n\u003e [!WARNING]\n\u003e Brahe generally follows [SemVer](https://semver.org/). New patch versions should be rare. Public facing APIs should not significantly change, though may still change, especially for new features that are still being refined based on user feedback. We want to avoid the forever \"0.x\" versioning trap that many Rust and scientific software projects fall into, which can deter users from adopting the software.\n\u003e \n\u003e If you need guaranteed stability you should pin your project to a specific major.minor.patch version (e.g., `1.2.3`) rather than using a floating version specifier (e.g., `^1.2.0` or `\u003e=1.2.0`).\n\n## License\n\nThe project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\nWe want to make it easy for people to use and build on the work without worrying about licensing restrictions!\n\n## Contributing\n\nIf you find a bug, have a feature request, want to contribute, please open an issue or a pull request on the GitHub repository. Contributions are welcome and encouraged! If you see something missing, but don't know how to start contributing, please open an issue and we can discuss it. We are building software to help everyone on this planet explore the universe. We encourage you to bring your unique perspective to help make us stronger. We appreciate contributions from everyone, no prior space experience is needed to participate.\n\n## AI Usage\n\nThe development of Brahe has roots in 2014 when I first started writing astrodynamics software for my PhD. The main algorithms and code structure evolved over the years based on my own experience applying the software to both research problems and operational space missions. The core functionality of the library (time handling, reference frames, reference frame transformations, coordinate transformations) were all developed before the usage of AI tools. AI tools have since been sparingly adopted to help with improving and expanding capabilities that were on the nice-to-have feature list. They have also been used to help with writing documentation and improve code coverage. However, all results and outputs are manually reviewed, run, tested, and verified manually before being merged into the main branch. \n\nFor new contributions, we allow the use of AI-assited coding, however we expect that PRs will be manually reviewed and tested before being submitted and that all PRs follow the same standards of code clarity, modularity, and correctness as the rest of the codebase.\n\n## Sponsors\n\nWe are pleased to acknowledge the following sponsors for their support:\n\n\u003ca href=\"https://www.northwoodspace.io/\"\u003e\n    \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/5/5b/Northwood_Space_logo.svg\" alt=\"Northwood Space\" width=\"200\"\u003e\n\u003c/a\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fduncaneddy%2Fbrahe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fduncaneddy%2Fbrahe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fduncaneddy%2Fbrahe/lists"}