Skip to main content

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)

Source distribution for frenchephemeris 1.0.0
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)

Table of built distributions (wheels) for frenchephemeris 1.0.0
File Actions
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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Security 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.

Select from 6 files

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 log

A 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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page