Built for Every Practitioner

Who Uses Moira

Three distinct audiences, each with different needs, different workflows, and different reasons to choose Moira over the alternatives.

Developers

Building production applications

Moira's MIT license and layered import surfaces make it a practical foundation for applications that need astronomical computation under a permissive engine license. Teams remain responsible for the terms of other code, data, dependencies, and distribution choices.

Key Capabilities
  • REST API backend for chart calculations
  • Batch processing of historical ephemeris data
  • Real-time transit and progression alerts
  • Synastry and composite chart generation
  • Integration with existing Python data pipelines
  • Custom aspect orb policies via AspectPolicy
MIT License
Moira's repository is MIT-licensed. The MIT license permits commercial and closed-source use subject to its notice and disclaimer; adopters remain responsible for the licenses of their other code, data, and dependencies.
Review the official LICENSE →
Python-governed API
Prebuilt wheels provide the native runtime; source builds use C++17 and CMake
Typed returns
All vessels are typed dataclasses, so IDE autocomplete works
Policy objects
Customize aspect orbs, house systems, and ayanamshas per request

These summaries are product information, not legal advice. Review the official license texts and obtain legal advice for your architecture and distribution.

FastAPI integration patternDevelopers
from moira.facade import Moira, HouseSystem
from datetime import datetime, timezone

# Initialize once; kernel auto-detected
m = Moira()

def calculate_chart(birth_dt: datetime, lat: float, lon: float) -> dict:
    chart = m.chart(birth_dt)
    houses = m.houses(birth_dt, latitude=lat, longitude=lon,
                      system=HouseSystem.PLACIDUS)
    aspects = m.aspects(chart)

    return {
        "planets": {
            name: {"longitude": p.longitude, "speed": p.speed}
            for name, p in chart.planets.items()
        },
        "asc": houses.asc,
        "mc": houses.mc,
        "aspects": [
            {"body1": a.body1, "aspect": str(a.aspect), "orb": a.orb}
            for a in aspects
        ],
    }

Researchers

Reproducible astronomical studies

Moira publishes named calculation stages, scoped validation reports, versioned numerical receipts, and a physical ΔT model for research that requires reproducible methods and explicit evidence boundaries.

Key Capabilities
  • Named reduction pipeline with inspectable per-stage evidence
  • Physical ΔT model with calibrated ±1σ uncertainty
  • Gaia DR3 stellar positions with parallax and proper motion
  • Asteroid family membership catalog (342 families; 200,726 unique numbered asteroids; 221,095 membership rows)
  • Light-time split: observed vs. true stellar position
  • Full orbital elements from SPICE state vectors on demand
Documented pipeline
Named reduction stages and receipts are published for admitted surfaces
Physical ΔT model
Four-component model with calibrated ±1σ uncertainty reporting
Gaia DR3 provenance
1,809 stars with parallax, proper motion, and BP-RP color
Versioned evidence
Historical numerical receipts are published with raw artifacts and explicit engine versions
Reproducible research workflowResearchers
from moira.facade import Moira, delta_t, delta_t_breakdown
from moira.classical import star_at
from moira.stars import star_light_time_split
from datetime import datetime, timezone

m = Moira(kernel_path="/data/de441.bsp")
jd_tt = 2451545.0  # J2000.0

# Inspect ΔT with full breakdown
dt_val = delta_t(jd_tt)
breakdown = delta_t_breakdown(jd_tt)
print(f"ΔT = {dt_val:.6f}s  ±{breakdown.uncertainty_1sigma:.4f}s")

# Gaia DR3 stellar positions with light-time split
observed, true_pos = star_light_time_split("Arcturus", jd_tt)
print(f"Observed: {observed.longitude:.6f}°")
print(f"True:     {true_pos.longitude:.6f}°")
print(f"Δ = {abs(observed.longitude - true_pos.longitude)*3600:.4f} arcsec")

Practitioners

Professional astrological work

Moira provides broad Western, Hellenistic, Medieval, and Vedic computation surfaces, from primary directions to Vimshottari Dasha, in a single library.

Key Capabilities
  • 22 house systems including Placidus, Koch, Regiomontanus, Whole Sign, and more
  • 512 Arabic Parts / Lots
  • Primary directions with explicit latitude doctrine
  • Firdaria, Zodiacal Releasing, Profections
  • Vimshottari Dasha with antardasha and pratyantardasha
  • Synastry, composite, and Davison charts
  • Harmograms (H1–H5 spectral harmonic analysis)
  • Heliacal and acronychal phenomena
12 ayanamshas
The admitted sidereal registry includes Lahiri, Fagan-Bradley, and source-specific true-star systems
512 Arabic Parts
A source-governed registry spanning common and specialist lot definitions
Vedic surface
moira.vedic: a dedicated specialist surface with Panchanga and Jaimini
Harmograms
Policy-explicit spectral and sampled-trace tools
Traditional techniques workflowPractitioners
from moira.vedic import vimshottari
from moira.classical import firdaria, zodiacal_releasing
from moira.predictive import synastry_aspects, composite_chart

# Vimshottari Dasha with sub-periods
periods = vimshottari(
    chart.planets["Moon"].longitude,
    chart.jd_ut,
    levels=3,
)
for period in periods[:3]:
    print(f"{period.planet:10s} {period.start_jd:.5f} → {period.end_jd:.5f}")
    for sub in period.sub[:2]:
        print(f"  {sub.planet:10s} {sub.start_jd:.5f}")

# Synastry between two charts
chart_b = m.chart(partner_dt)
synastry = synastry_aspects(chart, chart_b)
for a in synastry[:5]:
    print(f"{a.body1} {a.aspect} {a.body2} — orb {a.orb:.2f}°")

Ready to get started?

Install Moira, download a JPL kernel, and compute your first chart in under five minutes.