High-Precision Vedic Astrology & Calendar Library
Powered by Swiss Ephemeris | Compiled to WebAssembly | Built for the Edge
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.
- Astronomical Precision ("Drik Ganita"): We wrap the industry-standard Swiss Ephemeris (used by NASA/JPL) to calculate planetary positions to millisecond precision. No approximations.
- 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.
- 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.
- 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)
Panchangam is available on JSR and NPM.
Deno:
deno add jsr:@fusionstrings/panchangamNode.js / Bun:
npm install @fusionstrings/panchangamCalculate 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"
}`,
);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]");
});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()
}`,
);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.");
}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()}`,
);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)}°`);
});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.
If you want to contribute or build the latest version from source:
Prerequisites:
One-Step Build:
deno task buildThis generates:
./lib/panchangam.js: The ESM entry point../lib/panchangam.wasm: The compiled Wasm binary../lib/panchangam.d.ts: Fully typed TypeScript definitions.
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.tsRun the verification suite:
deno task testMIT