FrenchEphemeris
A fast, thread-safe ephemeris and astrology-geometry engine in Rust, with Python bindings (PyO3). Its planetary, lunar and minor-body positions come directly from NASA/JPL ephemerides (DE441/DE442, sb441-n16, Horizons). It implements the classic astrology API: houses, ayanamsas, nodes and Lilith, fixed stars, rise/set, eclipses, occultations, heliacal events and hypothetical bodies. It was written as an independent replacement for the Swiss Ephemeris in FreeAstroAPI.
Repository: https://github.com/FreeAstroApi/frenchephemeris
Headline numbers
Measured in October 2026 on an Apple M4 (macOS, single machine) against Swiss Ephemeris
2.10.03 via pyswisseph 2.10.3.2 with its standard .se1 files: accuracy with
FrenchEphemeris 0.1.0 (planetary positions have not changed since), throughput with 0.1.4.
Method, sample sizes and the commands to reproduce every figure are in
docs/ENGINE_REPORT.md; results on other hardware will differ.
| Physical accuracy vs JPL Horizons (astrometric ICRF, years 0–1550, same DE441) | ≤ 0.0005″ |
| After 1550 (DE442 vs Horizons' DE441) | ≤ 0.13″ inner planets/Sun/Moon, ≤ 1.76″ Uranus–Pluto |
| Range | −13198 … +17190 with the optional extended packs |
| Agreement with Swiss Ephemeris 2.10, 1800–2100 charts | Sun ≤ 0.07″, Moon ≤ 0.83″, nodes ≤ 0.04″, no sign or retrograde flips in 8,400 samples |
Per-call throughput through swe_compat (Python, with speeds, 1–8 threads) |
~500,000–580,000 tropical / ~390,000 sidereal positions/s vs Swiss ~310,000 / ~260,000 |
| Batch API, 10 bodies × 10,000 times (Python, numpy out) | ~4.5 million positions/s |
| Rust kernel, 10-body chart with speeds, one core | 10 µs |
| Eclipses vs the NASA Five Millennium Canons, years 0–2400 | 0 missed, 0 spurious, 0 type mismatches |
No global mutable state: the engine is immutable and Send + Sync, and batch calls release
the GIL and run across cores.
Layout
crates/fe-core Rust kernel
crates/fe-py PyO3 bindings -> Python package `frenchephemeris` (python/)
tools/ pack builders and table generators (Python)
harness/ differential checks vs JPL DE files and Horizons
docs/ design, data format and validation reports
See docs/ARCHITECTURE.md and docs/FORMAT.md.
Comparisons with the Swiss Ephemeris were run with pyswisseph as a black-box oracle. Those
scripts and their outputs (fixture generators gen_*.py, harness/compare_swiss.py and
similar) are kept in a private validation corpus and are not part of this repository; the
reports in docs/ describe how each comparison was made.
Quickstart (Python)
pip install maturin && maturin build --release -o dist && pip install dist/*.whl
python -m frenchephemeris.packs download # standard packs, ~256 MB, checksummed
python -m frenchephemeris.packs download --set dev # or: 1900–2100 only, ~27 MB
import numpy as np
import frenchephemeris as fe
import frenchephemeris.swe_compat as swe # pyswisseph-style calls
jd = swe.julday(1990, 5, 17, 14.5)
(lon, lat, dist, speed, *_), _ = swe.calc_ut(jd, swe.MOON, swe.FLG_SPEED)
cusps, ascmc = swe.houses(jd, 48.8566, 2.3522, b"P")
swe.set_sid_mode(swe.SIDM_LAHIRI) # per thread / async task, not process-wide
(sid_lon, *_), _ = swe.calc_ut(jd, swe.SUN, swe.FLG_SIDEREAL)
eng = fe.open_default() # native engine
pos = eng.calc_batch_ut(jd + np.arange(1000.0), list(range(10))) # shape (1000, 10, 6)
python -m frenchephemeris.packs list shows every pack and set (standard, dev,
extended for −13200 … +17191, asteroids, all). Packs go to $FRENCHEPHEMERIS_DATA
or a per-user data directory (python -m frenchephemeris.packs path).
Building
cargo build --release --workspace
FE_PACK_DIR=~/path/to/packs cargo test --release --workspace --exclude fe-py # pack tests skip without packs
pytest tests # after installing the wheel
Building the packs yourself
The published packs can be rebuilt from the public JPL files into data/packs/
(Python 3.9+, numpy):
python tools/build_pack.py # DE441+DE442, years -1..2400 (~247 MB)
python tools/build_pack.py --range 1900 2100 # small DE442-only development pack
python tools/build_ext_pack.py --era past # optional: -13200 .. -1
python tools/build_ext_pack.py --era future # optional: 2401 .. 17191
python tools/fetch_minor.py && python tools/fit_minor.py # Chiron, Pholus, Ceres–Vesta, Eris, Eros
build_pack.py expects de442.bsp in data/sources/ and reads DE441 remotely with HTTP
range requests. frenchephemeris.open_default() looks for packs in $FRENCHEPHEMERIS_DATA
(or the per-user data directory), then data/packs/ in a source checkout;
$FRENCHEPHEMERIS_PACK names the main pack directly. Rust tests read $FE_PACK_DIR.
Licensing
FrenchEphemeris is dual-licensed:
- AGPL-3.0-only (LICENSE) — free, with the AGPL's obligations, including offering the source of modified versions to users who interact with them over a network (§ 13); or
- a commercial licence — USD 200 one-time, per company, for the full term of copyright with all updates, including use behind your own APIs and apps for unlimited end users — for closed-source or otherwise non-AGPL use; see COMMERCIAL-LICENSE.md, contact contact@freeastroapi.com.
SPDX: AGPL-3.0-only OR LicenseRef-FrenchEphemeris-Commercial.
Copyright (C) 2026 Gabriel Naulleau EI, trading as FreeAstroAPI.
Contributions require the contributor licence agreement in CONTRIBUTING.md.
Data sources and attribution
Third-party data and their terms are listed in NOTICE: NASA/JPL DE441/DE442 and
small-body ephemerides (Park et al. 2021), ERFA (BSD-3) coefficient tables, the IAU WGSN
star names (CC BY 4.0), Hipparcos (ESA; van Leeuwen 2007), SIMBAD (CDS), IERS EOP and leap
seconds, USNO and Stephenson–Morrison–Hohenkerk Delta T, NASA eclipse catalogues
(F. Espenak), the ELP 2000-82B and ELP/MPP02 lunar theories (Chapront-Touzé, Chapront,
Francou), and the published astronomy and astrology
definitions behind each feature. Per-constant provenance is in the docs/*REPORT*.md files.
The Swiss Ephemeris was used only as a black-box oracle through its public API to measure
compatibility. No Swiss code, data files or outputs are part of this repository; the
oracle comparison fixtures are kept in a private corpus (FE_ORACLE_DIR), and the tests
that need them are skipped without it.
Trademarks
"Swiss Ephemeris" is a trademark of its owner. FrenchEphemeris is an independent
implementation; it is not affiliated with, sponsored or endorsed by the owner or the
authors of the Swiss Ephemeris. The
name is used here only to describe compatibility and to report measured comparisons. The
swe_compat Python module is an interface-compatibility layer that accepts the same
function names and argument shapes; it contains no Swiss Ephemeris code.
"FrenchEphemeris" and "FreeAstroAPI" are trade names of Gabriel Naulleau EI; see TRADEMARKS.md for how forks and derived works may refer to them.
Disclaimer
FrenchEphemeris is provided "as is", without warranty of any kind, as stated in the AGPL-3.0 (sections 15–16) and in the commercial licence. Results are intended for astrology, education and general astronomy. It is not designed or certified for navigation, surveying, spacecraft operations, legal or civil timekeeping, or any safety-critical use. Positions far from the present (before about 1600 and after about 2100) inherit the uncertainties of the underlying models (Delta T, minor-body orbits), which are documented in the reports.
Security
See SECURITY.md to report a vulnerability. Community rules are in CODE_OF_CONDUCT.md.
Metadata
Release files for frenchephemeris 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| frenchephemeris-1.0.0.tar.gz | 1.5 MB | With provenance | Details for frenchephemeris-1.0.0.tar.gz |
Built distributions (wheels)
| File | Actions Reset | |||
|---|---|---|---|---|
| frenchephemeris-1.0.0-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details for frenchephemeris-1.0.0-cp39-abi3-win_amd64.whl |
| frenchephemeris-1.0.0-cp39-abi3-manylinux_2_28_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.28+ x86-64 | Details for frenchephemeris-1.0.0-cp39-abi3-manylinux_2_28_x86_64.whl |
| frenchephemeris-1.0.0-cp39-abi3-manylinux_2_28_aarch64.whl | CPython 3.9 | abi3 | Linux glibc 2.28+ ARM64 | Details for frenchephemeris-1.0.0-cp39-abi3-manylinux_2_28_aarch64.whl |
| frenchephemeris-1.0.0-cp39-abi3-macosx_11_0_arm64.whl | CPython 3.9 | abi3 | macOS 11.0+ ARM64 | Details for frenchephemeris-1.0.0-cp39-abi3-macosx_11_0_arm64.whl |
| frenchephemeris-1.0.0-cp39-abi3-macosx_10_12_x86_64.whl | CPython 3.9 | abi3 | macOS 10.12+ x86-64 | Details for frenchephemeris-1.0.0-cp39-abi3-macosx_10_12_x86_64.whl |
Total release size: 6.7 MB
Release files / frenchephemeris-1.0.0.tar.gz
| Download URL | frenchephemeris-1.0.0.tar.gz |
|---|---|
| Size | 1.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3f4aab6bfd2bbdefc4e3a46e1f6f269a4851ac7ca3d8966a4df536977a20d6ed
|
|
BLAKE2b-256 checksum How to use checksums |
0fbf3667dbd104d4e6582fc7406018cd8b762a471a7b43f145a84c460e97d5b4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logRelease files / frenchephemeris-1.0.0-cp39-abi3-win_amd64.whl
| Download URL | frenchephemeris-1.0.0-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 936.2 kB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
619c453e39d78dd5f25007351ece3d0dfa9048eb9c9c68c29160a6e16cf05fd3
|
|
BLAKE2b-256 checksum How to use checksums |
a7cb7bfb2618bec55c50821a47170d474b2132993fd0f355ecae2ae98cf0d48b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logRelease files / frenchephemeris-1.0.0-cp39-abi3-manylinux_2_28_x86_64.whl
| Download URL | frenchephemeris-1.0.0-cp39-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.9 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
0b364bdff7491c7f1c5a7e1b6489eb864acd25f443b59680c855d19816dbc2f8
|
|
BLAKE2b-256 checksum How to use checksums |
bacbe006d86779bf3c5fe400cd041bd9c0cc9ab34b035e24b88308327e80cca3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logRelease files / frenchephemeris-1.0.0-cp39-abi3-manylinux_2_28_aarch64.whl
| Download URL | frenchephemeris-1.0.0-cp39-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.9 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
a86ddcb5b63955f7e861b6e2d3093477b4609d35e28b3a437a3b9daa37feb44d
|
|
BLAKE2b-256 checksum How to use checksums |
90f33d075dec87b4c98822301b1a1b76d065f10ac81a3622fc1b5f989685f747
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logRelease files / frenchephemeris-1.0.0-cp39-abi3-macosx_11_0_arm64.whl
| Download URL | frenchephemeris-1.0.0-cp39-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 981.0 kB |
| Tags | CPython 3.9 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
3e8377b8f78ccfd1d902b75d9553934d85bf302cec2e6afcebf878a3ba3c41d5
|
|
BLAKE2b-256 checksum How to use checksums |
4874fc2f91364e76d4b75f0fe783ef4e6dabfc54b42930d64dfcfc83495c1f5f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logRelease files / frenchephemeris-1.0.0-cp39-abi3-macosx_10_12_x86_64.whl
| Download URL | frenchephemeris-1.0.0-cp39-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 997.7 kB |
| Tags | CPython 3.9 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
d467a8c6aeb590397fbf4237099984354e798616102e95d41f72562eefa4a073
|
|
BLAKE2b-256 checksum How to use checksums |
25fb9452665f72c10e7105cf00d1c686e26e9f80bb97284effed5b8ff6ccd7f1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logSecurity for frenchephemeris 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 6 files in this release have been uploaded with provenance metadata.
Attestation for frenchephemeris-1.0.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.