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 modern   # or: 1800–2401 only, ~69 MB
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, modern, dev, extended for −13200 … +17191, asteroids, all). Every set except compact stores JPL's coefficients exactly as published (bit-identical); compact (~13 MB, 1800–2400) is a lossy refit for size-constrained installs (planets ≤ 0.001″, Moon ≤ 0.04″ from JPL), and mobile (2.0 MB, 1800–2400, planets and minor bodies ≤ 0.007″, Moon ≤ 0.4″) is for apps: smaller than the Swiss Ephemeris files for the same years and bodies (2.1 MB). 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.2.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.2.0
File Size Uploaded Provenance Actions
frenchephemeris-1.2.0.tar.gz 1.5 MB With provenance Details for frenchephemeris-1.2.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for frenchephemeris 1.2.0
File Actions
frenchephemeris-1.2.0-cp39-abi3-win_amd64.whl CPython 3.9 abi3 Windows x86-64 Details for frenchephemeris-1.2.0-cp39-abi3-win_amd64.whl
frenchephemeris-1.2.0-cp39-abi3-manylinux_2_28_x86_64.whl CPython 3.9 abi3 Linux glibc 2.28+ x86-64 Details for frenchephemeris-1.2.0-cp39-abi3-manylinux_2_28_x86_64.whl
frenchephemeris-1.2.0-cp39-abi3-manylinux_2_28_aarch64.whl CPython 3.9 abi3 Linux glibc 2.28+ ARM64 Details for frenchephemeris-1.2.0-cp39-abi3-manylinux_2_28_aarch64.whl
frenchephemeris-1.2.0-cp39-abi3-macosx_11_0_arm64.whl CPython 3.9 abi3 macOS 11.0+ ARM64 Details for frenchephemeris-1.2.0-cp39-abi3-macosx_11_0_arm64.whl
frenchephemeris-1.2.0-cp39-abi3-macosx_10_12_x86_64.whl CPython 3.9 abi3 macOS 10.12+ x86-64 Details for frenchephemeris-1.2.0-cp39-abi3-macosx_10_12_x86_64.whl

Total release size: 6.8 MB

Release files / frenchephemeris-1.2.0.tar.gz

Download URL frenchephemeris-1.2.0.tar.gz
Size 1.5 MB
Tags Source
SHA-256 checksum
How to use checksums
9371924c23247085c995b4cd42fb415c242296b39de040d993cdadcdecb7b24e
BLAKE2b-256 checksum
How to use checksums
494240301adb9010b4e01d2d3d9e9c57e6c238b79d1f0a53e3fcf97ba54f7d76
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.2.0-cp39-abi3-win_amd64.whl

Download URL frenchephemeris-1.2.0-cp39-abi3-win_amd64.whl
Size 950.6 kB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
467c825df75dd56d309030b4e08b50f840a20374cd3c0deed9b47764274804d9
BLAKE2b-256 checksum
How to use checksums
54afca906249de9dccd8a4b5a2f570ce258da321a1443ed847ceb1da8ae2bcd0
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.2.0-cp39-abi3-manylinux_2_28_x86_64.whl

Download URL frenchephemeris-1.2.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
f627b0459a26d0f0cf9193701fa45443e35d8cea24ad07761f4cabb1b85c89c1
BLAKE2b-256 checksum
How to use checksums
b299d2f35cce7e1fe78c59d678e8733037f68feceb3360aeca1c1d88992828ed
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.2.0-cp39-abi3-manylinux_2_28_aarch64.whl

Download URL frenchephemeris-1.2.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
845fb41ce1a278fa2e8becadf66323437ca77ff3dab330866cedf2e01642986d
BLAKE2b-256 checksum
How to use checksums
de60da202f9232a1827653d4f1c529c1b6898f86aac309f4a4663855195b8b25
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.2.0-cp39-abi3-macosx_11_0_arm64.whl

Download URL frenchephemeris-1.2.0-cp39-abi3-macosx_11_0_arm64.whl
Size 996.1 kB
Tags CPython 3.9 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
43b508863d1122b5d9bfa74b804597073ccc6d74256bd39a1a7a11f6d161f805
BLAKE2b-256 checksum
How to use checksums
c0281a85beb15f80ac6ad38b5a6e029ce8b6a41a29f02a35f37a157462998668
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.2.0-cp39-abi3-macosx_10_12_x86_64.whl

Download URL frenchephemeris-1.2.0-cp39-abi3-macosx_10_12_x86_64.whl
Size 1.0 MB
Tags CPython 3.9 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
5165f999121b3d96c336ab26ba69c350905c6ed5fef2a78dfe1223e6c94933f4
BLAKE2b-256 checksum
How to use checksums
f4b824fbb6820db03c6cdf7c6c55d823f142e15384a701e3cf0187f79aa68de4
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.2.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.2.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