Angelus

Angelus is an Elixir ephemeris library backed by NAIF CSPICE and JPL kernels. It provides geocentric ecliptic positions for a small, explicit set of astrological bodies while keeping kernel loading and native SPICE integration visible to the caller.

The v0.1 scope is intentionally limited to ephemeris generation. Natal charts, houses, aspects, orbs, dignities, transits, and other chart-level features are out of scope for this release.

Features

Supported Bodies

Angelus v0.1 supports these public body atoms:

[
  :sun,
  :moon,
  :mercury,
  :venus,
  :mars,
  :jupiter,
  :saturn,
  :uranus,
  :neptune,
  :pluto,
  :true_node,
  :mean_node,
  :chiron,
  :lilith
]

The public datetime range is 1900-01-01 through 2100-01-24, inclusive.

Installation

Angelus is not yet published to Hex. Add it from Git while the package is under development:

def deps do
  [
    {:angelus, github: "angelus-astro/angelus", tag: "v0.1.0"}
  ]
end

When published to Hex, the dependency will be:

def deps do
  [
    {:angelus, "~> 0.1.0"}
  ]
end

Requirements

Precompiled CSPICE-enabled native workers are produced only for macOS Apple Silicon and Linux glibc x86_64.

Quick Start

Fetch dependencies and compile the native worker:

mix deps.get
mix compile

When installed from Hex on one of those supported platforms, compilation downloads the matching precompiled spice_worker. Local development in this repository can force a source build with ANGELUS_FORCE_BUILD=1 or just build.

Download the default v0.1 kernel set:

mix angelus.kernels

This downloads JPL/NAIF kernels into priv/kernels/. It does not load them at runtime.

Load kernels explicitly before calculating positions:

{:ok, _metadata} = Angelus.load_kernels()

{:ok, positions} = Angelus.positions([:sun, :moon], ~U[1990-05-24 06:30:00Z])

positions.sun.longitude
positions.moon.distance_au

Query one body at a time with Angelus.position/3:

{:ok, sun} = Angelus.position(:sun, ~U[2000-01-01 12:00:00Z])

sun.longitude

Kernel Loading

Angelus.load_kernels/0 loads the default files from priv/kernels/.

Use :base_path when kernels live somewhere else:

Angelus.load_kernels(base_path: "/opt/angelus/kernels")

Use :replace to clear an already-loaded kernel set before loading another one:

Angelus.load_kernels(base_path: "/opt/angelus/kernels", replace: true)

You can also pass explicit absolute kernel paths:

Angelus.load_kernels([
  "/opt/angelus/kernels/latest_leapseconds.tls",
  "/opt/angelus/kernels/pck00011.tpc",
  "/opt/angelus/kernels/gm_de440.tpc",
  "/opt/angelus/kernels/de442.bsp",
  "/opt/angelus/kernels/mar099.bsp",
  "/opt/angelus/kernels/jup349.bsp",
  "/opt/angelus/kernels/sat459.bsp",
  "/opt/angelus/kernels/ura184_part-1.bsp",
  "/opt/angelus/kernels/ura184_part-2.bsp",
  "/opt/angelus/kernels/ura184_part-3.bsp",
  "/opt/angelus/kernels/nep105.bsp",
  "/opt/angelus/kernels/plu060.bsp"
])

Explicit paths must form the complete supported v0.1 kernel set. See Angelus.Spice.default_kernel_files/0 for the required filenames.

Return Values

Position APIs return tagged tuples:

{:ok, %Angelus.Ephemeris.BodyPosition{}}
{:ok, %{sun: %Angelus.Ephemeris.BodyPosition{}, moon: %Angelus.Ephemeris.BodyPosition{}}}
{:error, reason}

Angelus.Ephemeris.BodyPosition includes:

Development

Common commands:

mix setup
mix compile
mix test
mix consistency

By default, mix compile may use a published precompiled worker. To force a local source build while working on this repository:

ANGELUS_FORCE_BUILD=1 mix compile

For a fast stub worker without CSPICE:

ANGELUS_FORCE_BUILD=1 mix compile -- SKIP_CSPICE=1

If you have just installed, the repository also provides:

just build             # compile with CSPICE support
just build-stub        # compile stub worker only, no CSPICE download
just test              # run unit tests
just test-integration  # build with CSPICE and run integration tests
just clean             # remove local build outputs and downloaded native libraries

Unit tests can run against the stub worker. Integration tests require the real CSPICE worker and downloaded kernels.

Kernel and Data Licensing

Angelus does not include third-party astrological ephemeris code or data. JPL/NAIF kernels are downloaded separately and distributed under their respective terms.

The source code in this repository is MIT licensed. Native artefacts include components from NAIF CSPICE, distributed under NAIF's respective terms.

Angelus is not affiliated with or endorsed by NASA, JPL, NAIF, IAU, or SOFA.