Caelus

The ephemeris is now just code.

Add to Claude / CursorGitHub
curl "https://www.ephemengine.com/api/chart?date=1990-06-10T14:30:00Z&lat=27.94&lon=-82.46" · demo endpoint, full chart as JSON

loading playground…

Accuracy (vs Swiss Ephemeris, 1900–2099)

Sun–Saturn≤ 1″
Uranus / Neptune≤ 1.9″ / ≤ 4.6″
Moon (1920–2080 tier)≤ 2.5″
Moon (series, embedded)≤ 10″
Pluto / Chiron≤ 2.5″ / ≤ 1″
Angles & Placidus cusps≤ 3.2″
True node≤ 1′ vs SE built-in (≤ 1″ vs JPL DE431)
Mean Lilith≤ 1.3″
8 new house systemsexact (0.0″)
Rise/set/transit≤ 0.5 s
Crossings & phases≤ 4 s
Asteroids (big 4 + Pholus)≤ 1″
Uranian bodies≤ 2.3″
Fixed stars≤ 0.6″
Sidereal (7 ayanamsas)≤ 0.3″ added
Eclipsestypes exact; max ≤ 9 s

Within 1′ chart-display precision. Full table →

The Packages

Four packages, all MIT, all on npm. Per-body accuracy against Swiss Ephemeris: Validation · Sources.

caelusThe engine: positions, houses, aspects. Zero dependencies, ~85 KB gzipped
caelus-mcpSeven chart tools for AI agents over MCP. Runs with npx, no install
caelus-birthLocal birth time + place to UT: DST, historical timezones, edge cases flagged
caelus-wheelReact SVG chart wheel. SSR-safe, ~3.4 KB gzipped

Get Started: Compute a Chart

npm install caelus

import { Engine, fmtLon } from "caelus";
import { embeddedData } from "caelus/data-embedded";

const engine = new Engine(embeddedData);
const chart = engine.chart(1990, 6, 10, 14, 30, 0, 27.95, -82.46, "placidus");
fmtLon(chart.bodies.sun.lon);        // "19°27' Gemini"
chart.bodies.saturn.retrograde;      // true
chart.angles, chart.cusps, chart.aspects;

The same code runs in the browser, on edge runtimes, and in Node. Times are UT; for local birth times use caelus-birth below. Full API: the package README.

Get Started: Ask Your AI About the Sky

No code required. caelus-mcp gives Claude, Cursor, or any MCP client seven chart tools. Add this to claude_desktop_config.json or .cursor/mcp.json:

{
  "mcpServers": {
    "caelus": { "command": "npx", "args": ["caelus-mcp"] }
  }
}

Then ask in plain language:

Tools: natal_chart, current_sky, transits, synastry, find_aspect_dates, rectification_grid, sky_events. Positions are computed by the engine, never recalled from training data, and every answer is deterministic.

Get Started: Real Birth Times and a Wheel

caelus-birth converts a local birth time and place to UT with historical timezone rules. A four-hour timezone mistake moves the Ascendant about 60°; this package exists so that never happens silently. caelus-wheel renders the chart as an SVG wheel (live demo).

import { toUT } from "caelus-birth";
import { ChartWheel } from "caelus-wheel";

const t = toUT({ year: 1990, month: 6, day: 10, hour: 14, minute: 30,
                 lat: 27.95, lon: -82.46 });   // resolves America/New_York, EDT
const chart = engine.chart(/* t.utc fields */);

<ChartWheel chart={chart} size={520} showAspects />

What This Is

Caelus computes apparent geocentric positions for the Sun, Moon, eight planets, Pluto, Chiron, and both lunar nodes, with speeds, retrograde flags, ASC/MC, twelve house systems, and major aspects. Optional bodies (Lilith, asteroids, Uranians) load from data packs. Valid 1800–2149. The coefficient data ships inside the bundle: VSOP87D planets, an abridged ELP-2000/82 Moon, Meeus's Pluto series, and Chebyshev fits of JPL data for Chiron and the precise-Moon tier.

The engine takes injected data and does no I/O, so one codebase serves three runtimes: this page (charts compute client-side in ~2 ms), the demo endpoint GET /api/chart, and Node, where caelus-mcp exposes seven chart tools to AI agents over MCP.

Why It Exists

Most astrology software computes positions with Swiss Ephemeris, and it earned that position: JPL DE431 compressed to 0.001″. It is also a 1997 C library with process-global state, it reads 2–97 MB of ephemeris files from a filesystem, and since v2.10.1 (June 2021) it is AGPL-3.0, dual-licensed at 700 CHF for closed source. None of that maps onto browsers or edge runtimes.

The MIT-licensed alternatives are astronomy libraries, not astrology engines: astronomy-engine stops at ±1 arcminute and computes no houses, nodes, or Chiron; astronomia has sub-arcsecond planets and no astrology layer. Caelus is written from the published record and covers the chart core at chart precision. Engine-by-engine comparison: Sources.

How It Is Checked

Two stages, both in CI. The Python reference is compared to Swiss Ephemeris 2.10 at hundreds of random instants across 1900–2099: planets ≤1″, precise-tier Moon ≤2.5″, angles and Placidus cusps ≤3.2″. The TypeScript engine must match the reference across 3,218 golden fixtures; worst recorded deviation 1.64 nano-arcseconds. Per-body deltas: Validation. Bugs the suite caught: Build Notes.

npm install caelusGitHubREST APIMCP Server