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). 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.1.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.1.0
File Size Uploaded Provenance Actions
frenchephemeris-1.1.0.tar.gz 1.5 MB With provenance Details for frenchephemeris-1.1.0.tar.gz

Built distributions (wheels)

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

Total release size: 6.7 MB

Release files / frenchephemeris-1.1.0.tar.gz

Download URL frenchephemeris-1.1.0.tar.gz
Size 1.5 MB
Tags Source
SHA-256 checksum
How to use checksums
cb8ada1d5591c250470ba7ff0435267c5ef505e3f8e0aaa6cc1d937f3c6271a8
BLAKE2b-256 checksum
How to use checksums
5f097ffb28dbef9d9f7ed040dd57614db14b78ace022249bf6419667f973f297
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.1.0-cp39-abi3-win_amd64.whl

Download URL frenchephemeris-1.1.0-cp39-abi3-win_amd64.whl
Size 949.7 kB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
c61cbc546aeb955c23ee3a026bf99f5083715ba578c2a157c68000177f98d913
BLAKE2b-256 checksum
How to use checksums
a79256236283ace0277009ceb00ddfaebc231b9d4af47961741b1ff04dd3dffb
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.1.0-cp39-abi3-manylinux_2_28_x86_64.whl

Download URL frenchephemeris-1.1.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
5ad5c62bb0a8985405f167eda9054d416209675228dcbcbb89c9996f33cdfc09
BLAKE2b-256 checksum
How to use checksums
c236437fc257649f0a7aa69667bd02133a82e4fa8aab6cf3627e25ac859bde60
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.1.0-cp39-abi3-manylinux_2_28_aarch64.whl

Download URL frenchephemeris-1.1.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
1ef38a1dc2b311995663a9c9bbdc6e92704e2b4a0378572eb0f77606aa6aafbb
BLAKE2b-256 checksum
How to use checksums
512d0377a043f01f684b555780ab6286bd0e5f92f0dd6453d94ff387b3e7c435
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.1.0-cp39-abi3-macosx_11_0_arm64.whl

Download URL frenchephemeris-1.1.0-cp39-abi3-macosx_11_0_arm64.whl
Size 994.4 kB
Tags CPython 3.9 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
4fe65ee5caa268940cd85b79804b4703818668c508909dede799039a29abc2b4
BLAKE2b-256 checksum
How to use checksums
6bde3967f2cd1dd5318d546d93289212d9a1f0a8be1008f4fa7ce32603f0f8fb
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.1.0-cp39-abi3-macosx_10_12_x86_64.whl

Download URL frenchephemeris-1.1.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
99362dcd6291d288dcc05b62e4272ddd0d9122a0cde6203ccf35a87486adf62c
BLAKE2b-256 checksum
How to use checksums
d8c3a755be0da3320cfc0dac31e5465c326210e0e2c89c0c7fbf8c81cf65abda
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.1.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.1.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