Skip to content

fusionstrings/panchangam

Repository files navigation

Panchangam (Wasm)

JSR NPM

High-Precision Vedic Astrology & Calendar Library

Powered by Swiss Ephemeris | Compiled to WebAssembly | Built for the Edge

🌟 Why Panchangam?

Most Vedic astrology libraries rely on static lookup tables or simplified algorithms that trade accuracy for speed. Panchangam bridges the gap between ancient Vedic requirements and modern astronomical precision.

  1. Astronomical Precision ("Drik Ganita"): We wrap the industry-standard Swiss Ephemeris (used by NASA/JPL) to calculate planetary positions to millisecond precision. No approximations.
  2. The "Udaya Tithi" Standard: In Vedic traditions, the day doesn't start at midnight; it starts at Sunrise. We calculate exact local sunrise times (taking atmospheric refraction and altitude into account) to determine the correct Tithi, Nakshatra, and Yoga for any location on Earth.
  3. Wasm-First Performance: Written in Rust and compiled to WebAssembly, this library runs with near-native performance in Node.js, Deno, and Cloudflare Workers. It's designed for serverless scalability.

✨ Features

  • Swiss Ephemeris v2.10.03: The gold standard for planetary calculations.
  • Vedic Calendar (Panchang):
    • Tithi: Lunar day (1-30) with precise start and end times.
    • Nakshatra: 27 Lunar mansions with start and end times.
    • Yoga: 27 Luni-solar combinations.
    • Karana: 11 Half-Tithis.
    • Vara: Weekday based on sunrise-to-sunrise logic.
  • Advanced Astronomy:
    • True Ayanamsa: Support for Lahiri (Chitrapaksha), Raman, Krishnamurti, True Chitrapaksha, and more.
    • Planetary Dignity: Automatic calculation of Exalted, Debilitated, Own Sign, Friend/Enemy status.
    • Planetary War (Graha Yuddha): Detects when planets are dangerously close (< 1°).
    • Extended Muhurat: Real-time calculation of:
      • Rahu Kalam, Yamaganda, Gulika (8-part day division)
      • Brahma Muhurta (Pre-dawn spiritual window)
      • Abhijit Muhurta (Mid-day victory period)

🚀 Usage

Installation

Panchangam is available on JSR and NPM.

Deno:

deno add jsr:@fusionstrings/panchangam

Node.js / Bun:

npm install @fusionstrings/panchangam

Quick Start: Daily Panchang

Calculate comprehensive Panchang data including precise end times.

import { calculate_daily_panchang, Location } from "@fusionstrings/panchangam";

// 1. Define Location: New Delhi (28.61 N, 77.20 E, 225m)
const delhi = new Location(28.6139, 77.2090, 225.0);

// 2. Calculate for January 1, 2024
// params: (year, month, day, location, ayanamsha_mode)
// mode 1 = Lahiri (Standard)
const result = calculate_daily_panchang(2024, 1, 1, delhi, 1);

// 3. Output Results
console.log(`Sunrise: ${new Date(result.sunrise).toLocaleTimeString()}`);
console.log(`Tithi: ${result.tithi_name}`);
console.log(
  `  - Ends at: ${
    result.tithi_end_time
      ? new Date(result.tithi_end_time).toLocaleString()
      : "N/A"
  }`,
);
console.log(`Nakshatra: ${result.nakshatra_name}`);
console.log(
  `  - Ends at: ${
    result.nakshatra_end_time
      ? new Date(result.nakshatra_end_time).toLocaleString()
      : "N/A"
  }`,
);

Advanced: Planetary Positions & Dignity

Get precise sidereal positions and dignity status for all planets.

import { calculate_planets, p_julday } from "@fusionstrings/panchangam";

// Julian Day for calculation
const jd = p_julday(2024, 1, 1, 12.0, 1); // Noon UT

// Calculate Sidereal positions (Mode 1 = Lahiri)
const planets = calculate_planets(jd, 1);

planets.forEach((p) => {
  console.log(`${p.name}: ${p.longitude.toFixed(2)}°`);
  console.log(`  Dignity: ${p.dignity}`); // Exalted, Own Sign, Friend, etc.
  console.log(`  Speed: ${p.speed.toFixed(4)}/day`);
  if (p.is_retrograde) console.log("  [Retrograde]");
});

Muhurat Calculation

Determine auspicious and inauspicious time windows.

// Accessed via the daily panchang result
const muhurats = result.muhurats;

console.log("--- Inauspicious Periods ---");
console.log(
  `Rahu Kalam: ${new Date(muhurats.rahu_kalam.start).toLocaleTimeString()} - ${
    new Date(muhurats.rahu_kalam.end).toLocaleTimeString()
  }`,
);
console.log(
  `Yamaganda: ${new Date(muhurats.yamaganda.start).toLocaleTimeString()} - ${
    new Date(muhurats.yamaganda.end).toLocaleTimeString()
  }`,
);

console.log("--- Auspicious Periods ---");
console.log(
  `Brahma Muhurta: ${
    new Date(muhurats.brahma_muhurta.start).toLocaleTimeString()
  }`,
);
console.log(
  `Abhijit Muhurta: ${
    new Date(muhurats.abhijit_muhurta.start).toLocaleTimeString()
  }`,
);

Planetary War (Graha Yuddha)

Detect planetary wars where planets are within 1° of each other.

import { check_graha_yuddha, p_julday } from "@fusionstrings/panchangam";

const jd = p_julday(2024, 1, 1, 12.0, 1);
const wars = check_graha_yuddha(jd, 1) as any[]; // Mode 1 = Lahiri

if (wars.length > 0) {
  console.log("Planetary War Detected!");
  wars.forEach((war) => {
    console.log(
      `${war.planet1_name} vs ${war.planet2_name} (Diff: ${
        war.longitude_diff.toFixed(
          4,
        )
      }°)`,
    );
    console.log(`Winner: Planet ID ${war.winner_id} (Brighter)`);
  });
} else {
  console.log("No planetary wars currently.");
}

Vimshottari Dasha

Calculate the current ruling planetary periods.

import { calculate_vimshottari } from "@fusionstrings/panchangam";

// Birth details
const birth_moon_long = 45.5; // Example longitude
const birth_time_ms = new Date("1990-01-01").getTime();
const current_time_ms = Date.now();

const dasha = calculate_vimshottari(
  birth_moon_long,
  birth_time_ms,
  current_time_ms,
);

console.log(`Current Mahadasha: ${dasha.mahadasha}`);
console.log(`Current Antardasha: ${dasha.antardasha}`);
console.log(`Current Pratyantardasha: ${dasha.pratyantardasha}`);
console.log(
  `Ends: ${new Date(dasha.pratyantardasha_end_date).toLocaleDateString()}`,
);

House Calculation

Calculate Ascendant and House Cusps for various systems (Placidus, Whole Sign, etc.).

import {
  calculate_houses,
  Location,
  p_julday,
} from "@fusionstrings/panchangam";

const jd = p_julday(2024, 1, 1, 12.0, 1);
const loc = new Location(28.6139, 77.2090, 0.0);

// 'P' = Placidus, 'W' = Whole Sign, 'E' = Equal
// Mode 1 = Lahiri Ayanamsha (Sidereal)
const houses = calculate_houses(jd, loc.latitude, loc.longitude, "P", 1);

console.log(`Ascendant: ${houses.ascendant.toFixed(2)}°`);
houses.cusps.forEach((cusp, i) => {
  console.log(`House ${i + 1}: ${cusp.toFixed(2)}°`);
});

🛠️ Development

Project Structure

  • src/lib.rs: Wasm entry point.
  • src/vedic/: Core algorithms (Tithi, Nakshatra, Dignity, Muhurat).
  • src/astronomy/: Swiss Ephemeris wrappers and solvers.
  • scripts/build_npm.ts: Build script.

Development / Building from Source

If you want to contribute or build the latest version from source:

Prerequisites:

One-Step Build:

deno task build

This generates:

  • ./lib/panchangam.js: The ESM entry point.
  • ./lib/panchangam.wasm: The compiled Wasm binary.
  • ./lib/panchangam.d.ts: Fully typed TypeScript definitions.

Runnable Examples

You can run the full examples provided in the examples/ directory:

# Basic Features (Daily Panchang, Planets, etc.)
deno run -A examples/demo.ts

# Advanced Features (Vargas, Shadbala, Jaimini)
deno run -A examples/demo_advanced.ts

# Ashtakavarga & Special Points
deno run -A examples/demo_ashtakavarga.ts

Testing

Run the verification suite:

deno task test

License

MIT