Transparent. Modular. Accurate. Language-Agnostic.
Jzero is designed to be:
- Understandable — Each calculation is traceable to its source
- Modular — Components work independently and compose cleanly
- Accurate — Swiss Ephemeris for primary calculations (±0.0001°), CSV interpolation as fallback
- Maintainable — Clear separation of concerns, minimal dependencies
- Accessible — Use from JavaScript directly, or from any language via HTTP API
┌─────────────────────────────────────────────────┐
│ Application Layer │
│ (Web UI, API, CLI tools, integrations) │
└────────────────────┬────────────────────────────┘
│
┌────────────────────┴────────────────────────────┐
│ High-Level Calculations │
│ astrology/calculations/ │
│ ├── transits.js Transit interpretation │
│ ├── progressions.js Secondary progressions │
│ ├── synastry.js Chart comparison │
│ └── houses.js House system selection │
└────────────────────┬────────────────────────────┘
│
┌────────────────────┴────────────────────────────┐
│ Core Calculations │
│ astrology/core/ │
│ ├── swiss-ephemeris.js Primary accuracy │
│ ├── ephemeris.js CSV fallback │
│ ├── planets.js Planetary positions │
│ ├── houses.js House systems │
│ ├── julianDay.js Time conversions │
│ ├── time-corrections.js ΔT, DST │
│ └── calculator.js Birth chart aggregator │
└────────────────────┬────────────────────────────┘
│
┌────────────────────┴────────────────────────────┐
│ Utilities │
│ astrology/utilities/ │
│ ├── geolocation.js City database │
│ └── chart-database.js Chart storage │
└─────────────────────────────────────────────────┘
Swiss Ephemeris wrapper for professional-grade planetary positions.
- Accuracy: ±0.0001°
- Valid range: 1900–2100
- Used when the
swissephnpm package is available
CSV-based planetary position lookup with linear interpolation.
- Accuracy: ±0.1°
- Coverage: 1950–2050
- Used automatically when Swiss Ephemeris is not available
Converts between calendar dates and Julian Day numbers.
dateToJulianDayTT(year, month, day, hour, minute, second)→ JD_TTcalculateDeltaT(jd)→ ΔT correction (UTC → TT)calculateLST(jd, longitude)→ Local Sidereal Time- ΔT polynomial from NASA (±0.1 second accuracy)
Geocentric ecliptic coordinates for all 10 bodies via Swiss Ephemeris.
calculatePlanetPosition(planet, jd)→ {longitude, latitude, distance}calculateAllPlanets(jd)→ all planets at oncelongitudeToZodiac(longitude)→ sign + degree
Calculates zodiac house divisions.
- Placidus (default) — time-above-horizon method
- Porphyry — quadrant trisection
- Whole Sign — 30° sign divisions
- Equal House — 30° divisions from Ascendant
- ΔT (Dynamic Time vs UTC)
- DST detection
- UTC/TT conversion
Orchestrates a complete birth chart: Julian Day → planets → houses → angles.
Current planet positions vs. natal chart. Returns aspects and interpretation.
calculateSecondaryProgression(natalChart, years)— 1 day = 1 yearcalculateSolarArc(natalChart, years)calculateTertiaryProgression(natalChart, months)calculateSolarReturn(natalChart, year)
calculateSynastry(chart1, chart2)— inter-aspects, composite, compatibility scorescalculateCompositeChart(chart1, chart2)— midpoint chartfindRelationshipThemes(synastry)— key relationship patterns
House system selector that delegates to the appropriate algorithm in core.
~100 major cities with coordinates and IANA timezone names.
searchCities(query)— partial name matchfindClosestCity(lat, lon)— nearest city by coordinatesgetCityByName(name)— exact name lookup
In-memory CRUD for calculated charts (save, load, search, delete).
Input: { year, month, day, hour, minute, location }
│
├─→ dateToJulianDayTT() → JD_TT (Terrestrial Time)
├─→ getLocation() / coordinates → { lat, lon, timezone }
├─→ getAllPlanetPositions(jd) → planetary longitudes/signs
├─→ getHouses(jd, lat, lon) → 12 house cusps + angles
│
└─→ Chart: { jd, planets, houses, angles }
| Component | Accuracy | Source |
|---|---|---|
| Julian Day | ±0.001 sec | NASA ΔT polynomial |
| Planetary positions | ±0.0001° | Swiss Ephemeris |
| CSV fallback | ±0.1° | Interpolation |
| House cusps | ±0.01° | Placidus algorithm |
| Time zones | Exact | IANA database |
- Cleaner import/export syntax
- Tree-shaking support
- Future-proof (ES standard)
- Pure functions with no side effects
- Easier to test and reason about
- Composable calculations
- Swiss Ephemeris: ±0.0001° accuracy, professional standard
- CSV fallback: works without native dependencies, ±0.1° accuracy
- The system detects availability and uses the best option automatically
- Consistent across all calculations
- Handles relativistic corrections automatically
- Matches astronomical literature conventions
- Add calculation to
astrology/core/houses.js - Export from
astrology/index.js
- Extend
calculatePlanetPosition()inastrology/core/planets.js - Swiss Ephemeris supports asteroids, Chiron, lunar nodes
- Add route to
server/api.js - Call calculation functions from
astrology/index.js - See SERVER_API.md for response format conventions
Questions? Open a discussion on GitHub Discussions.