Panchang Core — Advanced Vedic Astrology Engine for PHP

Introduction

Authentic Vedic Panchanga calculation engine with Swiss Ephemeris precision.

Overview

Panchang Core is a comprehensive PHP package for calculating Vedic Panchanga elements, Muhūrtas, Karmakala windows, and Hindu festivals with high astronomical precision. Built on Swiss Ephemeris FFI, it provides a reusable calculation engine for authentic Vedic astrology applications.

Complete Panchanga

Tithi, Vara, Nakṣatra, Yoga, Karaṇa with precise fractions

🕉

237 Festival Definitions

Comprehensive library of festival definitions covering major and minor observances for all regions and traditions.

Muhūrta

Abhijit, Brahma Muhūrta, Rahu Kāla, Gulika, Yamaganda, Varjyam, Pradosha

Special Yogas

Sarvartha Siddhi, Amrit Siddhi, Ravi Yoga, Pushya variants, Dwipushkar, Tripushkar, Ganda Mula, Aadal, Vidaal, and Jwalamukhi.

Disha & Vaasa

Disha Shool, Nakshatra Shool, Rahu Vaasa, Chandra Vaasa, Shiva Vaasa, Agni Vaasa, and Yogini Vaasa for general panchang and electional screening.

Regional Support

Smarta, Vaishnava, North, South, Bengal, Maharashtra, Tamil traditions

Localization & Calendar Types

English, Hindi, and Gujarati localization with Amanta and Purnimanta month representation.

Classical Sources

Important: This is a source-integrity map, not a manuscript-critical proof. The codebase mixes direct conventions, package rule mappings, regional almanac conventions, modern references, and legacy helpers. For complete details, see docs/TRADITIONAL_TEXT_SOURCES.md.

Tier 1: Direct or Standard Panchang Conventions

Standard Panchang conventions used for calculations
Source Implementation
Sūrya Siddhānta 1.29 Tithi calculation (30 lunar days, 12° each)
Sūrya Siddhānta 8.1 Nakṣatra calculation (27 lunar mansions, 13°20' each)
Sūrya Siddhānta 3.1-3 Yoga calculation (27 combinations, 13°20' Sun-Moon sum)
Muhūrta Chintāmaṇi Chapter 2 Karana calculation (11 half lunar days, 6° each)
Sūrya Siddhānta 1.10-1.11 Muhūrta, Ghaṭikā, Pala time units

Tier 2: Package Rule Mappings

Package rule mappings attributed to traditional literature
Source Implementation
Muhūrta Chintāmaṇi Universal bad tithis, Vara-Tithi Yogas
Bṛhat Saṃhitā Muhurta rules, Samvatsara, Ritu
Māyamata Vāstu muhurta guidance
Vaikhānasa Āgama Āgama-based muhurta guidance
Aśvalāyana Gṛhya Sūtra Gṛhya-sūtra muhurta guidance
Muhūrta Mārtaṇḍa Advanced muhurta calculations
Gargiya Jyotisha Rikta Tithi dosha

Tier 3: Festival-Resolution Logic

Festival resolution sources
Source Implementation
Nirṇaya Sindhu Festival timing, Bhadra rules
Muhūrta Chintāmaṇi Aruṇodaya, Pradoṣa, Ekadashi handling
Hari Bhakti Vilāsa Vaishnava Ekadashi rules

Tier 4: Published Panchang Conventions

Published Panchang conventions
Source Implementation
Tamil Gowri/Pambu Panchangam Gowri Panchangam (8-part day/night division)
Sarāvalī Kala Vela rules (Rahu, Gulika, Yamaghantaka)
Aṣṭāṅga Hṛdaya Brahma Muhurta timing
Charaka Saṃhitā Muhurta concepts
Manusmṛti Brahma Muhurta for Vedic study
Sandhyāvandanam Tradition Sandhya windows (living tradition)

Tier 5: Modern Systems

Modern systems used
Source Implementation
Swiss Ephemeris Planetary longitudes, Ayanāṃśa, Vara
KP System Varjyam (Visha Ghati) calculation
Ernst Wilhelm's Classical Muhurta Bhadra subdivisions

What This Does NOT Claim

  • ❌ Every package rule is 1:1 from a single primary text
  • ❌ All regional or sectarian variants are covered
  • ❌ Modern almanac conventions are identical across traditions
  • ❌ Independent verification against critical Sanskrit editions

System Setup

Configuring PHP FFI and Swiss Ephemeris data files.

FFI Requirement

Panchang Core uses the PHP FFI extension to achieve maximum astronomical precision. This must be installed and enabled on your server.

1. Enable FFI Extension

Linux (Ubuntu/Debian)

sudo apt install php8.3-ffi

Linux (RHEL/CentOS)

sudo dnf install php-ffi

macOS (Homebrew)

Included by default in brew install php.

Windows

Included with PHP 8.3+. Enable in php.ini as shown below.

2. Configure php.ini

Add or uncomment high-privilege FFI settings in your php.ini:

php.ini
extension=ffi
ffi.enable=1

3. Verify Setup

php -r "echo extension_loaded('ffi') ? 'FFI loaded' : 'FFI not loaded';"
php -r "echo ini_get('ffi.enable') ? 'FFI enabled' : 'FFI not enabled';"

📂 Ephemeris Data Files

The calculation engine requires .se1 data files. You can download the verified set from the official release page:

Download Ephe Files

Required for dates 3000 BCE – 3000 CE

Download Zip

Installation

Composer Install
composer require jayeshmepani/panchang-core

Requirements

  • PHP 8.3+— uses typed constants, readonly classes, enums
  • Swiss Ephemeris FFI— jayeshmepani/swiss-ephemeris-ffi
  • Carbon— nesbot/carbon
  • FFI Extension— required for Swiss Ephemeris

Quick Start

Standalone Usage
<?php

require 'vendor/autoload.php';

use JayeshMepani\PanchangCore\Traits\CliBootstrap;
use Carbon\CarbonImmutable;

// Initialize standalone environment (loads config & sets up DI)
CliBootstrap::init(__DIR__);

// Create fully wired PanchangService
$panchang = CliBootstrap::makePanchangService();

// Calculate panchanga
$date = CarbonImmutable::parse('2026-03-24');
$details = $panchang->getDayDetails(
    date: $date,
    lat: 23.2472446,
    lon: 69.668339,
    tz: 'Asia/Kolkata'
);

echo "Tithi: " . $details['Tithi']['name'] . "\n";
echo "Nakshatra: " . $details['Nakshatra']['name'] . "\n";

🪐 Ayanamsa Authority

The Ayanamsa defines the starting point of the sidereal zodiac. For Panchanga calculations, this is a fixed religious and legal anchor.

Locked Standard

Strict Lahiri (Chitra Paksha)

For any authentic Hindu Panchanga (Tithi, Vara, Nakshatra, Yoga, Karana), Lahiri is the absolute mandatory standard. Using any other Ayanamsa results in incorrect festival dates and Nakshatra transitions.

This package does not support and has intentionally removed all other Ayanamsa systems to maintain calculation integrity.

System Core Policy

Ayanamsa Standard Status
Lahiri (Chitra Paksha) National Standard of India Hardcoded Core

Configuration

Global settings and formatting preferences available in config/panchang.php.

Overview

When running inside Laravel, you can publish the configuration file to config/panchang.php. These settings control default locale, calendar type, and representation formatting across package output without truncating the raw calculation floats.

Default Calculation Options

The defaults array configures localization, calendar-system selection, and formatting representations.

Default calculation configuration options
Setting Description Acceptable Values
locale Language used for localized names and descriptions. en, hi, gu
calendar_type Preferred lunar month naming system for representation. amanta: month ends at Amavasya
purnimanta: month ends at Purnima
measurement_system Unit system for generic dimensions and lengths. indian_metric: Metric (meters, km)
western: Imperial (feet, miles)
date_time_format String formatting of generic date-time outputs. indian_12h: "24/03/2026 06:14:00 AM"
indian_24h: "24/03/2026 06:14:00"
iso8601: "2026-03-24T06:14:00+05:30"
time_notation Global time output behavior (sunrise, sunset, muhurtas). 12h: "06:14:00 AM"
24h: "06:14:00"
coordinate_format Format for geographical coordinates. decimal: 23.2472446, 69.668339
dms: "23°14'50.1\"N, 69°40'06.0\"E"
angle_unit Format for astronomical degrees (planet longitudes, Ascendant, Ayanamsa). degree: 350.5234°
dms: "350°31'24\""
duration_format How lengths of time are formatted. mixed: "1h 30m 0s"
minutes: 90.0
seconds: 5400.0
hours: 1.5

Festival Calculation Settings

The festivals array provides defaults for region and tradition if not explicitly supplied.

Festival calculation configuration
Setting Description Acceptable Values
default_tradition Default sect or tradition used to resolve conflicting festival rules. Smarta, Vaishnava
default_region Default geographical region for festival rule variations. North, South, Bengal, Maharashtra, Tamil, Gujarat

Cache Settings

The cache array controls package cache behavior in Laravel applications.

Cache configuration options
Setting Description Default / Environment
enabled Enable package cache. PANCHANG_CACHE_ENABLED=true
ttl Cache lifetime in seconds. PANCHANG_CACHE_TTL=86400
prefix Cache key prefix. PANCHANG_CACHE_PREFIX=panchang_

⚠️ Critical Implementation Notes

1. Panchang Day Context (Sunrise to Sunrise)

Most Important: In Vedic Panchang, a day runs from sunrise to next sunrise, NOT midnight to midnight. This affects:

  • Tithi calculation: The tithi at sunrise determines the day's primary tithi
  • Festival resolution: If a tithi ends before sunrise, it belongs to the previous Panchang day
  • Time outputs: Times earlier than sunrise are dated to the next civil date
// Example: Sunrise at 6:14 AM
// Event at 5:30 AM belongs to NEXT Panchang day
$details = $panchang->getDayDetails($date, $lat, $lon, $tz);
// Times before sunrise in output are dated to next civil date

2. ISO Timestamps vs Time-Only Fields

All time-like fields include date-qualified companions with _iso suffix:

// Time-only (for display)
$varjyam_start = $details['Varjyam']['varjyam_start']; // "03:31:48 AM"

// Full ISO timestamp (for storage/database)
$varjyam_start_iso = $details['Varjyam']['varjyam_start_iso']; // "28/03/2026 03:31:48 AM"

// ALWAYS use _iso fields when:
// - Storing in database
// - Displaying to users
// - Comparing across timezones

3. Multiple Varjyam Windows

Varjyam can occur 0, 1, or 2 times per day depending on nakshatra transitions:

// Check how many windows exist
$windowCount = $details['Varjyam']['window_count']; // 0, 1, or 2

// Access all windows
foreach ($details['Varjyam']['windows'] as $window) {
    echo $window['start'] . " - " . $window['end'];
}

// Top-level keys maintain backward compatibility
$details['Varjyam']['varjyam_start']; // First window start
$details['Varjyam']['varjyam_end'];   // First window end

4. Pradosha Kaal Calculation

Pradosha is computed from two factors:

  1. Night fraction: First 1/5th of night (sunset to next sunrise)
  2. Trayodashi overlap: Only auspicious when Trayodashi tithi overlaps the window
// Returns both base and effective windows
$pradosha = $details['Pradosha_Kaal'];
$base_window = $pradosha['pradosha_window'];           // Base 1/5th night
$effective = $pradosha['effective_trayodashi_window']; // Overlap with T13

5. Hindu Calendar Month Resolution

The package uses exact amavasya-to-amavasya solar transit logic:

  • Amanta: Month ends at new moon (amavasya)
  • Purnimanta: Month ends at full moon (purnima)
  • Adhika Masa: Extra month when two amavasyas occur without solar transit
  • Kshaya Masa: Lost month when no amavasya occurs in solar month (rare)

Note: Final month output can differ from simpler longitude-only heuristics used by other packages.

6. Karmakala Windows in getDayDetails()

The following dedicated Karmakala outputs are available:

$badTimes   = $details['Rahu_Kaal_Gulika_Yamaganda'];
$abhijit    = $details['Abhijit_Muhurta'];
$praharas   = $details['Prahara_Full_Day'];
$daylight   = $details['Daylight_Fivefold_Division']; // Pratah, Sangava, Madhyahna, Aparahna, Sayahna
$brahma     = $details['Brahma_Muhurta'];
$dur        = $details['Dur_Muhurta_Full_Day'];
$nishita    = $details['Nishita_Muhurta'];            // Night midpoint
$vijaya     = $details['Vijaya_Muhurta'];             // 11th of 15 day muhurtas
$godhuli    = $details['Godhuli_Muhurta'];            // Evening twilight
$sandhya    = $details['Sandhya'];                    // Pratah, Madhyahna, Sayahna
$gowri      = $details['Gowri_Panchangam'];           // Tamil 8-part division
$kalaVela   = $details['Kala_Vela'];                  // Kala, Mrityu, etc.
$karmakala  = $details['Karmakala_Windows'];
$varjyam    = $details['Varjyam'];
$amrita     = $details['Amrita_Kaal'];
$pradosha   = $details['Pradosha_Kaal'];

7. Special Yoga and Vaasa Outputs

Festival snapshots expose general panchang/electional signals without requiring consumers to rebuild the rule tables:

$specialYogas = $snapshot['Special_Yogas'];
$anandadi     = $snapshot['Anandadi_Yoga'];
$amritadi     = $snapshot['Amritadi_Yoga'];
$panchak      = $snapshot['Panchak'];
$maitreya     = $snapshot['Maitreya_Yoga'];
$gajachchhaya = $snapshot['Gajachchhaya_Yoga'];
$nakShool     = $snapshot['Nakshatra_Shool'];
$dishaShool   = $snapshot['Disha_Shool'];
$rahuVaasa    = $snapshot['Rahu_Vaasa'];
$chandraVaasa = $snapshot['Chandra_Vaasa'];
$shivaVaasa   = $snapshot['Shiva_Vaasa'];
$agniVaasa    = $snapshot['Agni_Vaasa'];
$yoginiVaasa  = $snapshot['Yogini_Vaasa'];
$ekadashi     = $snapshot['Ekadashi_Observance'];

Nakshatra

Enum: JayeshMepani\PanchangCore\Core\Enums\Nakshatra

Represents the 27 lunar mansions in Vedic astrology. Each nakṣatra spans 13°20' of the zodiac.

Quick Usage

use JayeshMepani\PanchangCore\Core\Enums\Nakshatra;

// Get nakshatra from moon longitude
$nakshatra = Nakshatra::fromLongitude(125.3); // Magha

echo $nakshatra->getName();          // "Magha"
echo $nakshatra->getDeity();         // "Pitṛs"
echo $nakshatra->getRulingPlanet(); // "Sun"
echo $nakshatra->getSymbol();       // "Royal Throne"

// Get pada (quarter)
$pada = Nakshatra::getPada(125.3);    // 2
echo "Pada: $pada\n";                // Pada: 2

// Get longitude range
$range = Nakshatra::Ashwini->getLongitudeRange();
echo $range['start'] . "° - " . $range['end'] . "°\n"; // 0° - 13.333°

Cases

Ashwini
Bharani
Krittika
Rohini
Mrigashira
Ardra
Punarvasu
Pushya
Ashlesha
Magha
PurvaPhalguni
UttaraPhalguni
Hasta
Chitra
Swati
Vishakha
Anuradha
Jyeshtha
Mula
PurvaAshadha
UttaraAshadha
Shravana
Dhanishta
Shatabhisha
PurvaBhadrapada
UttaraBhadrapada
Revati

Methods

getName()

Get Sanskrit name

public function getName(): string
Returns:string— Sanskrit name

getDeity()

Get deity of the nakṣatra

public function getDeity(): string
Returns:string— Deity name

getRulingPlanet()

Get ruling planet

public function getRulingPlanet(): string
Returns:string— Planet name

getSymbol()

Get Vedic symbol

public function getSymbol(): string
Returns:string— Symbol description

getLongitudeRange()

Get Vedic longitude range

public function getLongitudeRange(): array{start: float, end: float}
Returns:array— Longitude range in degrees

fromLongitude()

Get nakṣatra from longitude

public static function fromLongitude(float $longitude): self
Parameters:
  • $longitude(float) — Longitude in degrees (0–360)
Returns:self— Nakṣatra instance

getPada()

Get pada (quarter) from longitude

public static function getPada(float $longitude): int
Parameters:
  • $longitude(float) — Longitude in degrees
Returns:int— Pada number (1–4)

Tithi

Enum: JayeshMepani\PanchangCore\Core\Enums\Tithi

Represents the 30 lunar days in a Hindu lunar month. Each tithi is completed when the Moon gains 12° on the Sun.

Quick Usage

use JayeshMepani\PanchangCore\Core\Enums\Tithi;

// Get tithi by index (1-30)
$tithi = Tithi::from(12); // Shukla Dwadashi

echo $tithi->getName();            // "Dwadashi"
echo $tithi->getPaksha()->name;    // "Shukla"

// Check paksha
if ($tithi->getPaksha() === Paksha::Shukla) {
    echo "Waxing moon phase\n";
}

// Get normalized index (1-15 for both pakshas)
echo $tithi->getNormalizedIndex(); // 12

Cases

ShuklaPratipada
ShuklaDwitiya
ShuklaTritiya
ShuklaChaturthi
ShuklaPanchami
ShuklaShashthi
ShuklaSaptami
ShuklaAshtami
ShuklaNavami
ShuklaDashami
ShuklaEkadashi
ShuklaDwadashi
ShuklaTrayodashi
ShuklaChaturdashi
Purnima
KrishnaPratipada
KrishnaDwitiya
KrishnaTritiya
KrishnaChaturthi
KrishnaPanchami
KrishnaShashthi
KrishnaSaptami
KrishnaAshtami
KrishnaNavami
KrishnaDashami
KrishnaEkadashi
KrishnaDwadashi
KrishnaTrayodashi
KrishnaChaturdashi
Amavasya

Methods

getName()

Get Sanskrit name

public function getName(): string
Returns:string— Name (e.g., 'Shukla Pratipada', 'Purnima')

getPaksha()

Get pakṣa (fortnight)

public function getPaksha(): Paksha
Returns:Paksha— Shukla or Krishna

getNormalizedIndex()

Get normalized index (1–15)

public function getNormalizedIndex(): int
Returns:int— Index within pakṣa

isEkadashi()

Check if this is Ekadashi

public function isEkadashi(): bool
Returns:bool

isPurnimaOrAmavasya()

Check if Purnima or Amavasya

public function isPurnimaOrAmavasya(): bool
Returns:bool

fromLongitudes()

Get tithi from Sun-Moon longitudes

public static function fromLongitudes(float $sunLon, float $moonLon): self
Parameters:
  • $sunLon(float) — Sun longitude in degrees
  • $moonLon(float) — Moon longitude in degrees
Returns:self

getFractionRemaining()

Get fraction remaining in tithi

public static function getFractionRemaining(float $sunLon, float $moonLon): float
Returns:float— Fraction (0.0–1.0)

Paksha

Enum: JayeshMepani\PanchangCore\Core\Enums\Paksha

Represents the two fortnights in a lunar month.

Cases

Shukla = 0
Krishna = 1

Methods

getName()

Get Sanskrit name (localized)

public function getName(?string $locale = null): string
Parameters:
  • $locale (string|null) — Locale code ('en', 'hi', 'gu'). Defaults to configured locale.
Example:
use JayeshMepani\PanchangCore\Core\Enums\Paksha;

$paksha = Paksha::Shukla;
echo $paksha->getName();        // "Shukla Paksha" (using configured locale)
echo $paksha->getName('hi');    // "शुक्ल पक्ष"

isShukla()

Check if this is the Shukla (bright) fortnight

public function isShukla(): bool

isKrishna()

Check if this is the Krishna (dark) fortnight

public function isKrishna(): bool

opposite()

Get the opposite paksha (Shukla ↔ Krishna)

public function opposite(): self

getRawName()

Get raw programmatic name without localization

public function getRawName(): string
Example:
echo Paksha::Shukla->getRawName();  // "Shukla"
echo Paksha::Krishna->getRawName(); // "Krishna"

getDescription()

Get description

public function getDescription(): string

getTithiRange()

Get tithi range

public function getTithiRange(): array{start: int, end: int}

containsTithi()

Check if tithi belongs to this pakṣa

public function containsTithi(int $tithiIndex): bool

normalizeTithi()

Normalize tithi to 1–15 range

public function normalizeTithi(int $tithiIndex): int

Yoga

Enum: JayeshMepani\PanchangCore\Core\Enums\Yoga

Represents the 27 yogas. Each yoga is completed when the Sun-Moon longitude sum advances by 13°20'.

Cases

Vishkumbha
Priti
Ayushman
Saubhagya
Shobhana
Atiganda
Sukarma
Dhriti
Shula
Ganda
Vriddhi
Dhruva
Vyaghata
Harshana
Vajra
Siddhi
Vyatipata
Variyana
Parigha
Shiva
Siddha
Sadhya
Shubha
Shukla
Brahma
Indra
Vaidhriti

Methods

getName()

Get Sanskrit name (localized)

public function getName(?string $locale = null): string
Parameters:
  • $locale (string|null) — Locale code ('en', 'hi', 'gu'). Defaults to configured locale.

fromLongitudes()

Get yoga from Sun-Moon longitudes

public static function fromLongitudes(float $sunLon, float $moonLon): self

getFractionRemaining()

Calculate the fraction of the current yoga that has elapsed

public static function getFractionRemaining(float $sunLon, float $moonLon): float
Parameters:
  • $sunLon (float) — Sun longitude in degrees.
  • $moonLon (float) — Moon longitude in degrees.
Returns:float — Fraction from 0.0 to 1.0

Karana

Enum: JayeshMepani\PanchangCore\Core\Enums\Karana

Represents the 11 karanas (half lunar days). Each tithi is divided into two karanas. Index values: 0-10 (normalized in v4.0 from 1-11).

Cases

Bava = 0
Balava = 1
Kaulava = 2
Taitila = 3
Gara = 4
Vanija = 5
Vishti = 6
Shakuni = 7
Chatushpada = 8
Naga = 9
Kintughna = 10

Methods

getName()

Get Sanskrit name (localized)

public function getName(?string $locale = null): string
Parameters:
  • $locale (string|null) — Locale code ('en', 'hi', 'gu'). Defaults to configured locale.

fromTithi()

Get karana from tithi

public static function fromTithi(int $tithiIndex, float $fraction): self

getFromLongitudes()

Get karana directly from Sun-Moon longitudes

public static function getFromLongitudes(float $sunLon, float $moonLon): array{0: self, 1: int}
Parameters:
  • $sunLon (float) — Sun longitude.
  • $moonLon (float) — Moon longitude.
Returns:array — [Karana enum, index]

Vara

Enum: JayeshMepani\PanchangCore\Core\Enums\Vara

Represents the 7 weekdays, each ruled by a planet.

Cases

Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday

Methods

getName()

Get Sanskrit name

public function getName(): string

getEnglishName()

Get English name

public function getEnglishName(): string

getRulingPlanet()

Get ruling planet

public function getRulingPlanet(): string

fromJulianDay()

Get weekday from Julian Day

public static function fromJulianDay(float $jd): self

Core Enums

Basic enumeration types used throughout the package.

Ritu (Seasons)

Represents the 6 Hindu seasons. Each ṛtu spans 2 lunar months.

Vasanta(Spring)
Grishma(Summer)
Varsha(Monsoon)
Sharad(Autumn)
Hemanta(Pre-Winter)
Shishira(Winter)

Methods

getName()

Get ritu name (localized)

public function getName(?string $locale = null): string

fromSunLongitude()

Get ritu from Sun longitude

public static function fromSunLongitude(float $sunLon): self
Usage:PanchangaEngine::getRitu($sunLon)returns season from Sun longitude

Masa (Lunar Months)

Represents the 12 lunar months in the Hindu calendar.

Chaitra
Vaishakha
Jyeshtha
Ashadha
Shravana
Bhadrapada
Ashvina
Kartika
Margashirsha
Pausha
Magha
Phalguna

Methods

getName()

Get masa name (localized)

public function getName(?string $locale = null): string

fromSunLongitude()

Get masa from Sun longitude

public static function fromSunLongitude(float $sunLon): self

fromAmantaIndex()

Get masa from Amanta month index (0-11)

public static function fromAmantaIndex(int $index): self
Usage:PanchangaEngine::getHinduMonth($sunLon, $moonLon)

Samvatsara (60-Year Cycle)

Represents the 60 years in the Jupiter cycle.

Prabhava
Vibhava
Shukla
Pramoda
Prajapati
… (60 total)
Usage:PanchangaEngine::getSamvatsara($vikramSamvat)

Rasi (Zodiac Signs)

Represents the 12 zodiac signs in Vedic astrology.

Mesha(Aries)
Vrishabha(Taurus)
Mithuna(Gemini)
Karka(Cancer)
Simha(Leo)
Kanya(Virgo)
Tula(Libra)
Vrischika(Scorpio)
Dhanu(Sagittarius)
Makara(Capricorn)
Kumbha(Aquarius)
Meena(Pisces)
Usage:Used internally for sign calculations. Each rasi spans 30°.

Vimshottari Dasha

Planetary periods in Vedic astrology, summing to 120 years.

Ketu(7 yr)
Venus(20 yr)
Sun(6 yr)
Moon(10 yr)
Mars(7 yr)
Rahu(18 yr)
Jupiter(16 yr)
Saturn(19 yr)
Mercury(17 yr)

Muhurta

Represents the 30 divisions of a day (15 day + 15 night, approx 48 minutes each). Expanded from 15 to 30 cases in v4.0.

Rudra
Ahi
Mitra
Pitri
Vasu
Varaha
Vishvedeva
Vidhi
… (30 total)
Usage:MuhurtaService::calculateMuhurtaTable($sunrise, $sunset, $nextSunrise)

Methods

getName()

Get muhurta name (localized)

public function getName(?string $locale = null): string

getDaySequence()

Get the 15 daytime muhurtas

public static function getDaySequence(): array

getNightSequence()

Get the 15 nighttime muhurtas

public static function getNightSequence(): array

Choghadiya

8 day and night time divisions primarily used in North & West India.

Udveg(Inauspicious)
Chal(Neutral)
Labh(Auspicious)
Amrita(Very Auspicious)
Kala(Inauspicious)
Shubh(Auspicious)
Rog(Inauspicious)
Usage:MuhurtaService::calculateChogadiyaTable()

Hora

24 hourly planetary divisions of a day.

Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars

Methods

getName()

Get hora name (localized)

public function getName(?string $locale = null): string

getSequence()

Get the full 24-hour planetary hora sequence for a weekday

public static function getSequence(Vara $vara): array
Parameters:
  • $vara (Vara) — Weekday enum.
Returns:array — Array of 24 Hora enums.

toPlanetIndex()

Get planet index for localization mapping

public function toPlanetIndex(): int
Usage:MuhurtaService::calculateHoraTable()— Each hora spans ~1 hour

CalendarType

Enum: JayeshMepani\PanchangCore\Core\Enums\CalendarType

Determines how lunar months are named and which festivals are observed. Amanta months end on Amavasya (New Moon), while Purnimanta months end on Purnima (Full Moon).

Cases

Amanta
Purnimanta

Methods

getLocalizedName()

Get the localized name for this calendar type.

public function getLocalizedName(?string $locale = null): string
Parameters:
  • $locale (string|null) — Locale code ('en', 'hi', 'gu'). Defaults to null.
Returns:string — Localized calendar type name.
Example:
use JayeshMepani\PanchangCore\Core\Enums\CalendarType;

$amanta = CalendarType::Amanta;
echo $amanta->getLocalizedName('hi'); // "अमांत"

isAmanta()

Check if this calendar follows the Amavasya-Ending system.

public function isAmanta(): bool
Returns:bool — True for Amanta, false otherwise.

isPurnimanta()

Check if this calendar follows the Purnima-Ending system.

public function isPurnimanta(): bool
Returns:bool — True for Purnimanta, false otherwise.

PanchangService

Service: JayeshMepani\PanchangCore\Panchanga\PanchangService

The primary facade-like service that orchestrates all underlying astronomical and astrological components to provide high-level daily and yearly details.

Public Methods

configure()

Configure the Swiss Ephemeris path for standalone usage.

public function configure(string $ephePath = ""): void

getDayDetails()

Returns exhaustive Panchanga and Muhurta details for a given date and location.

public function getDayDetails(CarbonImmutable $date, float $lat, float $lon, string $tz, float $elevation=0.0, ?CarbonImmutable $calculationAt=null, CalendarType|string $calendarType=CalendarType::Amanta, array $options=[]): array

getFestivalSnapshot()

A lightweight version of getDayDetails() containing only the data required for festival resolution.

public function getFestivalSnapshot(CarbonImmutable $date, float $lat, float $lon, string $tz, float $elevation=0.0, ?CarbonImmutable $calculationAt=null, CalendarType|string $calendarType=CalendarType::Amanta): array

getFestivalYearCalendar()

Builds a complete Gregorian-year calendar of festivals, correctly handling relative dates and consolidation.

public function getFestivalYearCalendar(int $year, float $lat, float $lon, string $tz, float $elevation=0.0, ?CarbonImmutable $calculationAt=null, CalendarType|string $calendarType=CalendarType::Amanta): array

getMonthCalendar()

Build a month-wise calendar summary with canonical festival orchestration, moon visibility fields, and compact daily Panchang snapshots.

public function getMonthCalendar(int $year, int $month, float $lat, float $lon, string $tz, float $elevation=0.0, array $options=[], ?CarbonImmutable $calculationAt=null, CalendarType|string $calendarType=CalendarType::Amanta): array

getElectionalSnapshot()

Return electional-analysis inputs built from day details, planetary states, sunrise context, and transit moorthy helpers.

public function getElectionalSnapshot(CarbonImmutable $date, float $lat, float $lon, string $tz, float $elevation=0.0, array $options=[]): array

getDailyMuhurtaEvaluation()

Checks current time against all doshas (Bhadra, Varjyam, Rahu Kaal, etc.) and returns a rejection report.

public function getDailyMuhurtaEvaluation(CarbonImmutable $date, float $lat, float $lon, string $tz, ?CarbonImmutable $currentAt=null, float $elevation=0.0, array $options=[]): array

FestivalService

Service: JayeshMepani\PanchangCore\Festivals\FestivalService

Calculates 237 Hindu festivals based on Tithi, Nakshatra, and complex regional traditions.

Methods

resolveFestivalsForDate()

The primary resolution method using triple-day context (yesterday, today, tomorrow) for high-precision boundaries.

public function resolveFestivalsForDate(CarbonImmutable $date, array $todayDetails, array $tomorrowDetails, ?array $yesterdayDetails = null, ?callable $fetchHistoricalSnapshot = null, bool $includeExtraWinners = false): array
Example:
$today = $panchang->getFestivalSnapshot(CarbonImmutable::parse('2026-03-24'), 23.247, 69.668, 'Asia/Kolkata');
$tomorrow = $panchang->getFestivalSnapshot(CarbonImmutable::parse('2026-03-25'), 23.247, 69.668, 'Asia/Kolkata');

$festivals = $festivalService->resolveFestivalsForDate(
    CarbonImmutable::parse('2026-03-24'),
    $today,
    $tomorrow
);

foreach ($festivals as $festival) {
    echo $festival['name'] . "\n";
}

buildFestivalPayload()

Build the canonical resolved festival object used by service and script outputs. It preserves raw rule keys for integrations while adding localized companion labels for human-facing JSON.

public function buildFestivalPayload(string $name, array $rules, ?array $resolved=null): array

getDailyObservances()

Return generic daily vrata/observance guidance (e.g. Pradosha, Ekadashi).

public function getDailyObservances(array $panchangDetails): array

getFestivalsForYear()

Intentionally disabled at this catalog layer. Year-wide festival output is built by PanchangService::getFestivalYearCalendar(), which owns location-aware Panchang orchestration.

public function getFestivalsForYear(int $year, string $pakshaSystem='Amanta'): array
Throws:LogicException

OutputGeneratorService

Service: JayeshMepani\PanchangCore\Panchanga\OutputGeneratorService

Designed for batch processing and CLI tools. It simplifies the creation of large JSON payloads for static site generation or mobile app bundling.

Batch Methods

generateTodayPanchang()

Generates a snapshot of everything happening "Right Now" including full day details and a muhurta evaluation.

public function generateTodayPanchang(float $lat, float $lon, string $tz, float $elevation=0.0, CalendarType|string $calendarType=CalendarType::Amanta): array

generateFestivals()

Generates a massive year-long JSON-ready array of every festival defined in the package.

public function generateFestivals(int $year, float $lat, float $lon, string $tz, float $elevation=0.0, CalendarType|string $calendarType=CalendarType::Amanta): array

generateEclipses()

Generates a list of all solar and lunar eclipses for a range of years.

public function generateEclipses(int $startYear, int $endYear, float $lat, float $lon, string $tz): array

generateAll()

Combines festivals, eclipses, and today's details into one final unified payload.

public function generateAll(int $festivalYear, int $eclipseStartYear, int $eclipseEndYear, float $lat, float $lon, string $tz, float $elevation=0.0, CalendarType|string $calendarType=CalendarType::Amanta): array

configure()

Global configuration for the service (typically used in standalone mode).

public static function configure(string $ephePath): void
Parameters:
  • $ephePath(string) — Absolute path to ephemeris files

Output Notes

  • Hindu_Calendar in service output includes Month_Amanta, Month_Purnimanta, Is_Adhika, Is_Kshaya, Amanta_Index, and Purnimanta_Index.
  • Service-level month resolution uses exact solar transit boundaries between amavasyas for final day output.
  • Saṅkrānti tagging is mapped to civil-day ingress (00:00-24:00 local date), so pre-sunrise ingress remains on that same calendar date.
  • Empty arrays such as Bhadra: [] or Dharma_Sindhu: [] are valid when no applicable window exists for that Panchang day.
  • The verified festival catalog currently contains 237 definitions after merging true alias/variant duplicates; distinct festivals that fall on the same tithi remain separate entries.
  • Named Karmakala windows are exposed directly in Karmakala_Windows so festival-side karmakala_type concepts such as sunrise, madhyahna, aparahna, pradosha, and nishitha map cleanly to daily output.

AstronomyService

Service: JayeshMepani\PanchangCore\Astronomy\AstronomyService

High-precision astronomical engine powered by Swiss Ephemeris FFI.

Methods

getPlanets()

Returns absolute tropical longitudes for all major planets at a given timestamp.

public function getPlanets(array $birth): array

getPlanetaryStates()

Returns a detailed state map for each planet including sign index, speed, and status flags.

public function getPlanetaryStates(array $birth, string $nodeMode = 'mean', float $stationTolerance = 1.0e-6): array
Returns: array{planet_name: {longitude, sign_index, sign_name, speed, is_retrograde, is_combust, is_stationary}}

getAscendant()

Calculates the precise longitude of the Ascendant (Lagna) for the given coordinates and time.

public function getAscendant(array $birth): float

SunService

Service: JayeshMepani\PanchangCore\Astronomy\SunService

Dedicated engine for solar/lunar rise and set timings and local time divisions.

Methods

getSunriseSunset() / getMoonriseMoonset()

Calculates rise/set times with sub-second precision.

public function getSunriseSunset(array $birth): array
public function getMoonriseMoonset(array $birth): array

getIshtkaal()

Calculates Ishtkaal (Vedic time elapsed since local sunrise).

public function getIshtkaal(CarbonImmutable $currentTime, CarbonImmutable $sunrise): string

getDaylightFivefoldDivision()

Divides the day into Pratah, Sangava, Madhyahna, Aparahna, and Sayahna windows.

public function getDaylightFivefoldDivision(CarbonImmutable $sunrise, CarbonImmutable $sunset): array

getSolarTransits()

Calculates the local solar noon and transit boundaries for the observer.

public function getSolarTransits(array $birth): array

PanchangaEngine

Service: JayeshMepani\PanchangCore\Panchanga\PanchangaEngine

Core panchanga calculation engine for tithi, yoga, karana, and seasonal logic (no ephemeris dependencies).

Methods

calculateTithi()

Calculate Tithi from Sun and Moon longitudes.

public function calculateTithi(float $sunLon, float $moonLon): array
Parameters:
$sunLon(float) — Sun longitude in degrees.
$moonLon(float) — Moon longitude in degrees.
Returns:array{index, name, paksha, fraction_left}
Example:

$tithi = $engine->calculateTithi(350.5, 125.3);
echo $tithi['name']; // "Dwadashi"
                

getNakshatraInfo()

Determine Nakshatra and Pada from a specific longitude.

public function getNakshatraInfo(float $longitude): array
Parameters:
$longitude(float) — Celestial longitude in degrees.
Returns:array[name, pada, lord]

calculateYoga()

Calculate Yoga from the sum of Sun and Moon longitudes.

public function calculateYoga(float $sunLon, float $moonLon): array
Parameters:
  • $sunLon(float) — Sun longitude.
  • $moonLon(float) — Moon longitude.
Returns:array{index, name}

getKarana()

Get the Karana (half-tithi) from celestial longitudes.

public function getKarana(float $sunLon, float $moonLon): array
Parameters:
  • $sunLon(float) — Sun longitude.
  • $moonLon(float) — Moon longitude.
Returns:array[name, number]

calculateVara()

Calculate weekday (Vara) relative to local sunrise.

public function calculateVara(array $birth, SunService $sunService): array
Parameters:
  • $birth(array) — Timestamp details with location and time.
  • $sunService(SunService) — Helper for sunrise timing.
Returns:array{index, name, lord}

getRitu()

Identify the Vedic season (Ritu) based on solar longitude.

public function getRitu(float $sunLon): string
Parameters:
  • $sunLon(float) — Sun longitude.
Returns:string — Sanskrit name of the season (e.g., "Sharad").

getAyana()

Identify the solar hemisphere (Uttarayana or Dakshinayana).

public function getAyana(float $sunLon): string
Parameters:
  • $sunLon(float) — Sun longitude.
Returns:string — "Uttarayana" or "Dakshinayana".

getSamvat()

Calculate Vikram Samvat and Saka Samvat years.

public function getSamvat(int $year, int $month): array
Parameters:
  • $year(int) — Gregorian year.
  • $month(int) — Gregorian month (1-12).
Returns:array{Vikram_Samvat, Saka_Samvat}

getSamvatsara()

Identify the Samvatsara name in the 60-year Jupiter cycle.

public function getSamvatsara(int $vikramSamvat): string
Parameters:
  • $vikramSamvat(int) — Vikram Samvat year.
Returns:string — Samvatsara name.

getHinduMonth()

Identify the Hindu lunar month for a given moment.

public function getHinduMonth(float $sunLon, float $moonLon, string $paksha='Shukla'): array
Parameters:
  • $sunLon(float) — Sun longitude.
  • $moonLon(float) — Moon longitude.
  • $paksha(string) — Current lunar phase.
Returns:array{Amanta, Purnimanta, Amanta_Index, Purnimanta_Index}

Note: This method documents the simpler PanchangaEngine month helper. Final PanchangService day output uses a stricter true-month resolution based on exact amavasya and sankranti boundaries, and therefore also exposes flags such as Is_Adhika and Is_Kshaya.

getSamvatsaraNorth()

Calculate North Indian Samvatsara name (variant cycle).

public function getSamvatsaraNorth(int $vikramSamvat): string
Parameters:
  • $vikramSamvat(int) — Vikram Samvat year.
Returns:string — North Samvatsara name.

getKaliSamvat()

Calculate the year in the Kali Yuga era.

public function getKaliSamvat(int $vikramSamvat): int
Parameters:
  • $vikramSamvat(int) — Vikram Samvat year.
Returns:int — Kali Samvat year.

getGujaratiSamvat()

Calculate the year in the Gujarati (Kartikadi) Samvat era.

public function getGujaratiSamvat(int $vikramSamvat, int $monthIdx): int
Parameters:
  • $vikramSamvat(int) — Vikram Samvat year.
  • $monthIdx(int) — Month index (0-11).
Returns:int — Gujarati Samvat year.

calculatePanchakaRahita()

Calculate Panchaka Rahita status for Muhurta selection (classical residual logic).

public function calculatePanchakaRahita(int $tithi, int $vara, int $nak, int $lagna): array
Parameters:
  • $tithi(int) — Tithi index.
  • $vara(int) — Weekday index.
  • $nak(int) — Nakshatra index.
  • $lagna(int) — Lagna index.
Returns:array{status, classification}

calculateKundaLagna()

Calculate Kunda Lagna (Ascendant * 81) used for birth time rectification.

public function calculateKundaLagna(float $ascendantLongitude): array
Parameters:
  • $ascendantLongitude(float) — Longitude of the Ascendant.
Returns:array{degrees, rasi}

isVishtiKarana()

Determine if the current moment falls under the inauspicious Vishti Karana (Bhadra).

public function isVishtiKarana(float $sunLon, float $moonLon): bool
Parameters:
  • $sunLon(float) — Sun longitude.
  • $moonLon(float) — Moon longitude.
Returns:bool — True if Bhadra is active.

CliBootstrap

Trait: JayeshMepani\PanchangCore\Traits\CliBootstrap

CLI Bootstrap trait for streamlined CLI script setup and service dependency injection. Sets up env(), config(), and the DI container so the package works without a full Laravel framework.

Usage in Scripts

require __DIR__ . '/vendor/autoload.php';

CliBootstrap::init(__DIR__);
$panchangService = CliBootstrap::makePanchangService();

Static Methods

init()

Set up the standalone environment. Call this once at the top of a script.

public static function init(string $baseDir): void
Parameters:
  • $baseDir (string) — Directory containing vendor/autoload.php and config/
Returns:void
Example:
CliBootstrap::init(__DIR__);

makePanchangService()

Create a fully wired PanchangService for standalone usage.

public static function makePanchangService(): PanchangService
Returns:PanchangService — Fully configured service instance.
Example:
$panchangService = CliBootstrap::makePanchangService();

makeEclipseService()

Create an EclipseService.

public static function makeEclipseService(): EclipseService
Returns:EclipseService

makeOutputGenerator()

Create an OutputGeneratorService.

public static function makeOutputGenerator(PanchangService $panchang): OutputGeneratorService
Parameters:
  • $panchang (PanchangService) — PanchangService instance
Returns:OutputGeneratorService

MuhurtaService

Service: JayeshMepani\PanchangCore\Panchanga\MuhurtaService

Advanced engine for time-based divisions, auspicious periods, and negative time clusters.

Methods

calculateHora()

Return the currently active Hora at the supplied calculation moment.

public function calculateHora(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, CarbonImmutable $birthAt, int $varaIdx): array

calculateChogadiya()

Return the currently active Chogadiya at the supplied calculation moment.

public function calculateChogadiya(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, CarbonImmutable $birthAt, int $varaIdx): array

calculateMuhurtaTable()

Calculate all 30 named Muhurtas for a full 24-hour cycle.

public function calculateMuhurtaTable(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise): array
Parameters:
  • $sunrise(CarbonImmutable) — Current day sunrise.
  • $sunset(CarbonImmutable) — Current day sunset.
  • $nextSunrise(CarbonImmutable) — Next day sunrise.
Returns:array — 30 muhurta objects with {name, start, end}.

calculateChogadiyaTable()

Calculate 8 day and 8 night Chogadiya periods.

public function calculateChogadiyaTable(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, int $varaIdx): array
Parameters:
  • $sunrise(CarbonImmutable) — Sunrise time.
  • $sunset(CarbonImmutable) — Sunset time.
  • $nextSunrise(CarbonImmutable) — Next sunrise time.
  • $varaIdx(int) — Weekday index (0-6).
Returns:array — Detailed list of 16 Chogadiya divisions.

calculateDaylightFivefoldDivision()

Calculate the canonical five daylight divisions: Pratah, Sangava, Madhyahna, Aparahna, and Sayahna.

public function calculateDaylightFivefoldDivision(CarbonImmutable $sunrise, CarbonImmutable $sunset): array

calculateNishitaMuhurta()

Calculate the 8th of 15 night Muhurtas centered on the night midpoint.

public function calculateNishitaMuhurta(CarbonImmutable $sunset, CarbonImmutable $nextSunrise): array

calculateVijayaMuhurta()

Calculate the 11th of 15 daytime Muhurtas.

public function calculateVijayaMuhurta(CarbonImmutable $sunrise, CarbonImmutable $sunset): array

calculateGodhuliMuhurta()

Calculate the evening twilight Godhuli Muhurta near sunset.

public function calculateGodhuliMuhurta(CarbonImmutable $sunset, CarbonImmutable $nextSunrise): array

calculateSandhya()

Calculate Pratah, Madhyahna, and Sayahna Sandhya windows.

public function calculateSandhya(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, CarbonImmutable $solarNoon): array

calculateGowriPanchangam()

Calculate weekday-specific Gowri Panchangam day and night divisions.

public function calculateGowriPanchangam(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, int $varaIdx): array

calculateKalaVela()

Calculate Kala Vela day/night divisions and named Kala Vela windows.

public function calculateKalaVela(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, int $varaIdx): array

calculateHoraTable()

Identify the 24 planetary Hora rulers for the day.

public function calculateHoraTable(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, int $varaIdx): array
Parameters:
  • $sunrise(CarbonImmutable) — Sunrise time.
  • $sunset(CarbonImmutable) — Sunset time.
  • $nextSunrise(CarbonImmutable) — Next sunrise time.
  • $varaIdx(int) — Weekday index (0-6).
Returns:array — 24 Hora objects with {planet, start, end}.

calculateAbhijitMuhurta()

Determine the most auspicious midday period (Abhijit).

public function calculateAbhijitMuhurta(CarbonImmutable $sunrise, CarbonImmutable $sunset): array
Parameters:
  • $sunrise(CarbonImmutable) — Sunrise time.
  • $sunset(CarbonImmutable) — Sunset time.
Returns:array{start, end, duration}.

calculateBrahmaMuhurta()

Identify the pre-dawn auspicious period (Brahma Muhurta).

public function calculateBrahmaMuhurta(CarbonImmutable $sunrise): array
Parameters:
$sunrise(CarbonImmutable) — Sunrise time.
Returns:array{start, end, name}

calculateLagna()

Calculate the current sidereal Lagna/ascendant sign for one timestamp and location.

public function calculateLagna(CarbonImmutable $current, CarbonImmutable $sunrise, float $sunriseSunLongitude, float $ayanamsaDeg, float $lat, float $lon, SwissEphFFI $sweph): array
Returns:array — Current Lagna longitude, sign index/name, degree in sign, and applied ayanamsa.

calculateLagnaTable()

Calculate full 12/13 Lagna (Ascendant) intervals for the day with exact sign entry times.

public function calculateLagnaTable(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, float $sunriseSunLon, float $ayanamsa, float $lat, float $lon, SwissEphFFI $sweph): array
Parameters:
  • $sunrise, $sunset, $nextSunrise(CarbonImmutable) — Boundary timestamps.
  • $sunriseSunLon(float) — Sun longitude at sunrise.
  • $ayanamsa(float) — Calculation offset.
  • $lat, $lon(float) — Coordinates.
Returns:array — List of sign durations with start/end times.

calculatePrahara()

Calculate 8 Prahara (4 day + 4 night) as per Srimad Bhagavata Purana.

public function calculatePrahara(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise): array
Parameters:
  • $sunrise, $sunset, $nextSunrise(CarbonImmutable) — Boundary timestamps.
Returns:array — 8 canonical Prahara periods.

calculateDurMuhurta()

Identify specific inauspicious Muhurtas from the daily 30-period table.

public function calculateDurMuhurta(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, int $varaIdx): array
Parameters:
  • $sunrise, $sunset, $nextSunrise(CarbonImmutable) — Boundary timestamps.
  • $varaIdx(int) — Weekday index.
Returns:array — List of Dur-Muhurta periods.

calculateVarjyam()

Calculate one Varjyam (Tyajyam) window for a specific Nakshatra span.

public function calculateVarjyam(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, int $nakIdx, float $nakStartJd, float $nakEndJd): array
Parameters:
  • $sunrise, $sunset, $nextSunrise(CarbonImmutable) — Boundary timestamps.
  • $nakIdx(int) — Nakshatra index.
  • $nakStartJd, $nakEndJd(float) — Nakshatra span boundaries.
Returns:array — Varjyam window payload for that Nakshatra. Day-level aggregation is done in PanchangService.

calculateAmritaKaal()

Calculate Amrita Kaal (auspicious period — opposite of Varjyam).

public function calculateAmritaKaal(CarbonImmutable $sunrise, array $varjyam): array
Parameters:
  • $sunrise(CarbonImmutable) — Sunrise time.
  • $varjyam(array) — Calculated Varjyam results.
Returns:array{amrita_kaal_start, amrita_kaal_end, duration_minutes}

calculatePradoshaKaal()

Legacy helper around sunset. Full Trayodashi-overlap Pradosha logic in day output is computed by PanchangService.

public function calculatePradoshaKaal(CarbonImmutable $sunset, int $tithiNum): array
Parameters:
  • $sunset(CarbonImmutable) — Sunset time.
  • $tithiNum(int) — Absolute Tithi index.
Returns:array — Pradosha timings.

calculateBadTimes()

Calculate Rahu Kala, Gulika, and Yamaganda for a given day.

public function calculateBadTimes(CarbonImmutable $sunrise, CarbonImmutable $sunset, int $varaIdx): array
Parameters:
  • $sunrise, $sunset(CarbonImmutable) — Sunrise/Sunset.
  • $varaIdx(int) — Weekday index.
Returns:array — Set of bad time intervals.

EclipseService

Service: JayeshMepani\PanchangCore\Astronomy\EclipseService

Predict solar and lunar eclipses with sub-second precision, including contact times, magnitudes, and visibility assessment.

Methods

getEclipsesForYear()

Find all eclipses occurring in a specific calendar year globally or for a location.

public function getEclipsesForYear(int $year, float $lat, float $lon, string $tz): array
Parameters:
  • $year(int) — Gregorian year.
  • $lat, $lon(float) — Coordinates.
  • $tz(string) — Timezone.
Returns:array — List of eclipse events with times, type, and visibility.

BhadraEngine

Service: JayeshMepani\PanchangCore\Festivals\Utils\BhadraEngine

Advanced Bhadra (Vishti Karana) analysis according to Muhūrta Chintāmaṇi and Nirṇaya Sindhu.

Methods

calculateBhadra()

Calculate Bhadra subdivisions (Mukha, Madhya, Puchha) and location (Bhadravāsa/Lok).

public function calculateBhadra(float $sunriseJd, float $vishtiStartJd, float $vishtiEndJd, int $moonRasi, int $tithi, string $paksha): array
Parameters:
  • $sunriseJd(float) — Julian Day of sunrise.
  • $vishtiStartJd(float) — Julian Day of Vishti Karana start.
  • $vishtiEndJd(float) — Julian Day of Vishti Karana end.
  • $moonRasi(int) — Moon's Rasi (sign) index.
  • $tithi(int) — Tithi index.
  • $paksha(string) — 'Shukla' or 'Krishna'.
Returns:array— {mukha, madhya, puchha, lok, status}

ElectionalEvaluator

Service: JayeshMepani\PanchangCore\Panchanga\ElectionalEvaluator

The calculation engine for classical electional (Muhurta) doshas and transit classifications.

Static Methods

calculatePanchakaDosha()

Calculates the 5-fold Panchaka classification based on Tithi, Vara, Nakshatra, and Lagna.

public static function calculatePanchakaDosha(int $tithiNumber, int $varaNumber, int $nakshatraNumber, int $lagnaNumber): array
Returns: array{remainder: int, classification: string, is_auspicious: bool}

calculateDagdhaTithi() / calculateDagdhaYoga()

Checks if current weekday/tithi/moon-sign combinations result in 'Burnt' (Dagdha) status.

public static function calculateDagdhaTithi(int $tithiNumber, int $moonSignIdx): array
public static function calculateDagdhaYoga(int $varaNumber, int $tithiNumber): array

calculateRiktaTithi()

Identifies if the tithi is a 'Rikta' (Empty) tithi (4, 9, 14).

public static function calculateRiktaTithi(int $tithiNumber, bool $isKrishnaPaksha): array

calculateTransitMoorthy()

Classifies planetary transit quality (Gold, Silver, Copper, Iron) relative to the Moon's sign.

public static function calculateTransitMoorthy(string $nakshatraName): array
Returns: array{quality: string, label: string, is_auspicious: bool}

calculateBhadra()

Checks if Bhadra (Vishti Karana) is active based on moon sign index.

public static function calculateBhadra(int $moonSignIdx): array

calculateVarjyam() / calculateAmritaKaal()

Static calculation for Visha Ghati and its corresponding auspicious window.

public static function calculateVarjyam(int $nakshatraNumber, float $nakshatraStartTime, float $nakshatraDurationMinutes): array
public static function calculateAmritaKaal(int $varaNumber, float $sunrise, float $sunset, float $nextSunrise, float $currentTime): array

calculateAbhijitCancellation()

Checks if Abhijit Muhurta is cancelled due to a Wednesday (Budhavara).

public static function calculateAbhijitCancellation(float $sunrise, float $sunset, int $varaNumber, float $currentTime): array

generateRejectionReport()

Takes a bundle of evaluation results and generates a human-readable list of active doshas and an overall verdict.

public static function generateRejectionReport(array $evaluationResults): array

KalaNirnayaEngine

Service: JayeshMepani\PanchangCore\Panchanga\KalaNirnayaEngine

Advanced engine for resolving festival dates based on Punya Kaal, Viddha Tithi, and complex religious timing priorities.

Public Methods

determineEkadashi()

Resolves Smarta vs Vaishnava Ekadashi dates based on Arunodaya and Dashami-overlap rules.

public function determineEkadashi(CarbonImmutable $date, array $panchangData): array

calculatePunyaKaal()

Identifies the auspicious 'Punya Kaal' window for Sankrantis.

public function calculatePunyaKaal(string $sankrantiName, float $sankrantiJd, float $sunriseJd, float $sunsetJd): array

generateKalaNirnayaReport()

Generates a detailed report explaining WHY a specific festival was resolved to a specific day.

public function generateKalaNirnayaReport(string $festivalName, CarbonImmutable $date, array $panchangDetails): array

VimshottariDasha

Enum: JayeshMepani\PanchangCore\Core\Enums\VimshottariDasha

Calculates planetary periods (Dashas) based on birth Nakshatra.

Methods

getName()

Get dasha name (localized)

public function getName(?string $locale = null): string

fromNakshatra()

Identifies the starting Dasha lord.

public static function fromNakshatra(Nakshatra $nak): self

getDashaYears()

Returns the planetary duration in years.

public function getDashaYears(): int

JSON Response Schema

Complete reference of keys returned by the getDayDetails() "God Object".

v4.0.0 Breaking Change: Inside the nested Panchanga block, Sunrise, Sunset, Moonrise, and Moonset are now objects. Top-level convenience fields such as Sunrise and Moonrise still expose formatted strings.

Core Panchang

  • Tithi — {index, name, paksha, paksha_name, end, end_iso, fraction_remaining}
  • Nakshatra — {index, name, lord, pada, end, end_iso, fraction_remaining}
  • Yoga — {index, name, end, end_iso}
  • Karana — {index, name, number, end, end_iso}
  • Vara — {index, name, lord}

Sun & Moon (Structured Objects)

  • Sunrise / Sunset — {jd, iso, display, timestamp}
  • Moonrise / Moonset — {jd, iso, display, timestamp}
  • Ishtkaal — (Local time elapsed since sunrise)
  • Sun_Longitude / Moon_Longitude — (Decimal Degrees)
  • Sun_Sign / Moon_Sign — {index, name}

Auspicious & Inauspicious Windows

KeyTypeStructure
Abhijit_MuhurtaObject{start, end, duration}
Brahma_MuhurtaObject{start, end, name}
Rahu_Kaal_Gulika_YamagandaObject{rahu_kaal: {start, end}, gulika, yamaganda}
VarjyamObject{window_count, windows: [{start, end, start_iso, end_iso}]}
Amrita_KaalObject{window_count, windows: [...]}
Pradosha_KaalObject{pradosha_window, effective_trayodashi_window}
BhadraArray|null[{name, start, end, mukha, madhya, puchha, lok, status}]

CLI Tooling & Scripts

Built-in scripts for rapid data generation, batch processing, and data export.

All scripts utilize the CliBootstrap trait for environment-aware dependency injection. Use these for generating JSON data suitable for static sites, mobile apps, or offline use.

Available Scripts

Script Description Output
panchang_today.php Generates today's complete panchang and muhurta evaluation today_panchang.json
panchang_festivals.php [year] Exports all festivals for a given year festivals_YYYY.json
panchang_eclipses.php [start] [end] Exports eclipses for a range of years eclipses_YYYY_YYYY.json
panchang_month_output.php [year] [month] Exports monthly panchang data; defaults to current month when no year/month is passed Prints to stdout
panchang_raw_output.php Combines today's data, festivals, and eclipses meta.json, festivals_YYYY.json, etc.

Usage Examples

Generate Today's Panchang
cd scripts
php panchang_today.php
Generate Festivals for 2026
cd scripts
php panchang_festivals.php 2026
Generate Monthly Data
cd scripts
php panchang_month_output.php 2026 4 > month_2026_04.json

Localization and Calendar Types

Use environment variables to control output format:

Localized Output
PANCHANG_LOCALE=hi PANCHANG_CALENDAR_TYPE=purnimanta php panchang_today.php

Supported locales: en, hi, gu. Calendar types: amanta, purnimanta.

Configuration

Complete reference for config/panchang.php.

Key Type Default Description
ephe_path string __DIR__ . '/../ephe' Path to Swiss Ephemeris .se1 files.
defaults.locale string 'en' Output localization. Supported values: en, hi, gu.
defaults.calendar_type string 'amanta' Preferred lunar month representation. Supported values: amanta, purnimanta.
defaults.measurement_system string 'indian_metric' Unit system for generic measurements.
defaults.date_time_format string 'indian_12h' Date-time output format.
defaults.time_notation string '12h' Time output notation.
festivals.default_tradition string 'Smarta' Default tradition used for festival resolution.
festivals.default_region string 'North' Default region used for festival resolution.
festivals.supported_traditions array ['Smarta', 'Vaishnava'] Supported tradition identifiers for consumer-side validation.
festivals.supported_regions array ['North', 'South', 'Bengal', 'Maharashtra', 'Tamil', 'Gujarat'] Supported region identifiers for consumer-side validation.
defaults.coordinate_format string 'decimal' Coordinate output format.
defaults.angle_unit string 'degree' Angle formatting for longitudes and ayanamsa.
defaults.duration_format string 'mixed' Duration formatting mode.
cache.enabled bool true Enable package caching.
cache.ttl int 86400 Cache time-to-live in seconds.
cache.prefix string 'panchang_' Cache key prefix.

Batch Processing

Efficiently generating large JSON datasets for applications.

If you are building a static website or a mobile app that needs to work offline, use OutputGeneratorService to export pre-calculated data.

use JayeshMepani\PanchangCore\Panchanga\OutputGeneratorService;

$generator = app(OutputGeneratorService::class);

// 1. Export 10 years of eclipses
$eclipses = $generator->generateEclipses(2025, 2035, 23.24, 69.66, 'Asia/Kolkata');

// 2. Export full year of festivals
$festivals = $generator->generateFestivals(2026, 23.24, 69.66, 'Asia/Kolkata');

// 3. One massive unified export
$all = $generator->generateAll(2026, 2026, 2030, 23.24, 69.66, 'Asia/Kolkata');

Localization

Multilingual support for English, Hindi, and Gujarati.

The package automatically translates all display names (Tithi, Nakshatra, Ritu, etc.) and descriptions based on the defaults.locale config or environment variable.

Switching Locales at Runtime

// Using environment variables (Global)
putenv('PANCHANG_LOCALE=gu');

// The output of any service will now use Gujarati script
$details = Panchang::getDayDetails($date, $lat, $lon, $tz);
echo $details['Tithi']['name']; // "વદ તેરસ"

Direct Localization Usage

Use the Localization class directly for custom translations:

use JayeshMepani\PanchangCore\Core\Localization;

// Get translated Nakshatra name
$nakshatraName = Localization::translate('Nakshatra', 'Ashwini', 'hi'); // "अश्विनी"

// Get translated Tithi
$tithiName = Localization::translate('Tithi', 15, 'gu'); // "પૂનમ"

// Available categories: Nakshatra, Vara, Tithi, Rasi, Yoga, Karana, Choghadiya, Muhurta, Masa, Paksha, Ritu, Ayana, Planet, Samvatsara, Vrata, Eclipse, Festival

Supported Languages

  • en — English
  • hi — Hindi (Devanagari script)
  • gu — Gujarati (Gujarati script)

The Localization class contains comprehensive translations for all panchang elements, including festival names, planetary names, and astrological terms.

Usage Patterns (How do I...?)

Practical code snippets for specific needs.

I only want today's Tithi name

$details = Panchang::getDayDetails($date, $lat, $lon, $tz);
echo "Today is: " . $details['Tithi']['name'];

I want to check if Bhadra (Vishti) is active right now

$eval = Panchang::getDailyMuhurtaEvaluation($date, $lat, $lon, $tz, CarbonImmutable::now());
if ($eval['evaluation_results']['bhadra']['is_active']) {
    echo "Bhadra is active!";
}

I want to get the start and end time of a specific Nakshatra

$details = Panchang::getDayDetails($date, $lat, $lon, $tz);
echo "Starts: " . $details['Nakshatra']['start_iso'];
echo "Ends: " . $details['Nakshatra']['end_iso'];

Constants & Enums

Available options for calculation parameters.

Ayanamsa System

  • LAHIRI — Chitra Paksha (fixed, mandatory for this package)

Traditions

  • Smarta— Standard Dharmasindhu rules
  • Vaishnava— ISKCON/Gaudiya rules

Regions

  • North— Purnimanta calendar (UP, Delhi, Rajasthan)
  • South— Amanta calendar (Karnataka, Andhra, TN)
  • Maharashtra, Gujarat— Regional variations
  • Bengal— Solar calendar variations

Laravel Integration

Complete guide for using Panchang Core in Laravel applications.

Installation

composer require jayeshmepani/panchang-core

Configuration

Publish the configuration file:

php artisan vendor:publish --provider="JayeshMepani\PanchangCore\PanchangServiceProvider" --tag="panchang-config"

This creates config/panchang.php:

return [
    'ephe_path' => env('PANCHANG_EPHE_PATH', __DIR__ . '/../ephe'),
    'defaults' => [
        'locale' => env('PANCHANG_LOCALE', 'en'),
        'calendar_type' => env('PANCHANG_CALENDAR_TYPE', 'amanta'),
        'measurement_system' => 'indian_metric',
        'date_time_format' => 'indian_12h',
        'time_notation' => '12h',
        'coordinate_format' => 'decimal',
        'angle_unit' => 'degree',
        'duration_format' => 'mixed',
    ],
    'festivals' => [
        'default_tradition' => 'Smarta',
        'default_region' => 'North',
        'supported_traditions' => ['Smarta', 'Vaishnava'],
        'supported_regions' => ['North', 'South', 'Bengal', 'Maharashtra', 'Tamil', 'Gujarat'],
    ],
    'cache' => [
        'enabled' => true,
        'ttl' => 86400,
        'prefix' => 'panchang_',
    ],
];

Using the Facade

use JayeshMepani\PanchangCore\Facades\Panchang;
use Carbon\CarbonImmutable;

// Get complete panchanga
$details = Panchang::getDayDetails(
    date: CarbonImmutable::parse('2026-03-24'),
    lat: 23.2472,
    lon: 69.6683,
    tz: 'Asia/Kolkata'
);

echo $details['Tithi']['name'];    // "Dwadashi"
echo $details['Nakshatra']['name']; // "Magha"

Service Container

Or inject via constructor:

use JayeshMepani\PanchangCore\Panchanga\PanchangService;

class PanchangController extends Controller
{
    public function __construct(
        private PanchangService $panchang
    ) {}

    public function show()
    {
        $details = $this->panchang->getDayDetails(
            date: CarbonImmutable::now(),
            lat: 28.6139,
            lon: 77.2090,
            tz: 'Asia/Kolkata'
        );

        return view('panchang', compact('details'));
    }
}

Return Value Structures

Complete data structures returned by main methods.

getDayDetails() Return Structure

[
  'Display_Settings' => [...],
  'Units' => [...],
  'Tithi' => ['index' => 12, 'name' => 'Dwadashi', 'paksha' => 'Shukla'],
  'Nakshatra' => ['index' => 10, 'name' => 'Magha', 'pada' => 2, 'lord' => 'Sun'],
  'Yoga' => ['index' => 9, 'name' => 'Shula'],
  'Karana' => ['index' => 23, 'name' => 'Bava'],
  'Vara' => ['index' => 2, 'name' => 'Tuesday', 'lord' => 'Mars'],
  'Hindu_Calendar' => [
    'Month_Amanta' => 'Chaitra',
    'Month_Purnimanta' => 'Chaitra',
    'Is_Adhika' => false,
    'Is_Kshaya' => false,
    'Amanta_Index' => 1,
    'Purnimanta_Index' => 1,
  ],
  'Rahu_Kaal_Gulika_Yamaganda' => [...],
  'Abhijit_Muhurta' => [...],
  'Hora_Full_Day' => [...],
  'Chogadiya_Full_Day' => [...],
  'Muhurta_Full_Day' => [...],
  'Prahara_Full_Day' => [...],
  'Lagna_Full_Day' => [...],
  'Dur_Muhurta_Full_Day' => [...],
  'Daylight_Fivefold_Division' => [...],
  'Nishita_Muhurta' => [...],
  'Vijaya_Muhurta' => [...],
  'Godhuli_Muhurta' => [...],
  'Sandhya' => [...],
  'Gowri_Panchangam' => [...],
  'Kala_Vela' => [...],
  'Karmakala_Windows' => [...],
  'Varjyam' => [...],
  'Amrita_Kaal' => [...],
  'Pradosha_Kaal' => [...],
  'Bhadra' => [...],
  'Dharma_Sindhu' => [...],
  'Festivals' => [...],
  'Daily_Observances' => [...],
  'Special_Yogas' => [...],
  'Anandadi_Yoga' => [...],
  'Amritadi_Yoga' => [...],
  'Panchak' => [...],
  'Maitreya_Yoga' => [...],
  'Gajachchhaya_Yoga' => [...],
  'Nakshatra_Shool' => [...],
  'Disha_Shool' => [...],
  'Rahu_Vaasa' => [...],
  'Chandra_Vaasa' => [...],
  'Shiva_Vaasa' => [...],
  'Agni_Vaasa' => [...],
  'Yogini_Vaasa' => [...],
  'Ekadashi_Observance' => [...],
  'Transitions' => [...],
  'Resolution_Context' => [...],
]

getFestivalSnapshot() Return Structure

[
  'Festivals' => [
    [
      'name' => 'Holika Dahan',
      'description' => 'Holika bonfire ritual',
      'deity' => 'Vishnu/Prahlada',
      'fasting' => false,
      'regions' => ['Pan-India'],
      'aliases' => [],
      'observance_note' => null,
      'calculation_basis' => [
        'type' => 'tithi',
        'type_name' => 'tithi',
        'basis' => 'tithi',
        'basis_name' => 'tithi',
        'tithi' => [...],
        'paksha' => 'Shukla',
        'paksha_name' => 'Shukla',
        'month' => [
          'calendar_type' => 'amanta',
          'value' => 'Phalguna',
          'name' => 'Phalguna',
        ],
        'karmakala_type' => 'pradosha',
        'karmakala_type_name' => 'pradosha',
      ],
      'resolution' => [...],
      'rules_applied' => [...],
    ],
  ],
  'Tithi' => [...],
  'Vara' => [...],
  'Nakshatra' => [...],
  'Yoga' => [...],
  'Karana' => [...],
  'Sunrise' => '06:14:00 AM',
  'Sunset' => '06:52:00 PM',
  'Moonrise' => '10:12:35 PM',
  'Moonset' => '09:00:37 AM',
  'Moonrise_Date' => '2026-04-05',
  'Moonset_Date' => '2026-04-06',
  'Moonrise_ISO' => '05/04/2026 10:12:35 PM',
  'Moonset_ISO' => '06/04/2026 09:00:37 AM',
  'Moonset_Day_Relation' => 'next_day',
  'Special_Yogas' => [...],
  'Anandadi_Yoga' => [...],
  'Amritadi_Yoga' => [...],
  'Panchak' => [...],
  'Maitreya_Yoga' => [...],
  'Gajachchhaya_Yoga' => [...],
  'Nakshatra_Shool' => [...],
  'Disha_Shool' => [...],
  'Rahu_Vaasa' => [...],
  'Chandra_Vaasa' => [...],
  'Shiva_Vaasa' => [...],
  'Agni_Vaasa' => [...],
  'Yogini_Vaasa' => [...],
  'Ekadashi_Observance' => [...],
  'Resolution_Context' => [...],
]

Festival metadata keeps canonical values for code and localized companion fields for display. The calculation_basis.month block follows the active calendar_type only; it does not emit both amanta and purnimanta months in the same localized output.

getMonthCalendar() Return Structure

[
  '2026-04-01' => [
    'date' => '2026-04-01',
    'day' => 1,
    'tithi' => [...],
    'nakshatra' => [...],
    'yoga' => [...],
    'karana' => [...],
    'vara' => [...],
    'sun_sign' => [...],
    'moon_sign' => [...],
    'sunrise' => '06:43:00 AM',
    'sunset' => '07:11:00 PM',
    'moonrise' => '...',
    'moonset' => '...',
    'moonrise_date' => '2026-04-01',
    'moonset_date' => '2026-04-02',
    'moonrise_iso' => '01/04/2026 06:26:00 PM',
    'moonset_iso' => '02/04/2026 06:05:00 AM',
    'moonset_day_relation' => 'next_day',
    'moon_visibility' => [
      'starts_at' => '...',
      'starts_on' => '2026-04-01',
      'starts_iso' => '...',
      'ends_at' => '...',
      'ends_on' => '2026-04-02',
      'ends_iso' => '...',
      'ends_day_relation' => 'next_day',
    ],
    'hindu_calendar' => [...],
    'festivals' => [...],
    'daily_observances' => [...],
    'sankranti' => null,
  ],
]

Moon visibility note: month output preserves compact moonrise and moonset display fields, but also includes date-qualified fields because a moonset can occur after midnight on the next civil date.

Real-World Examples

Complete working examples for common use cases.

1. Daily Panchang Display

// Show today's panchang
$today = Panchang::getDayDetails(
    date: CarbonImmutable::now(),
    lat: $userLat,
    lon: $userLon,
    tz: $userTz
);

echo "Tithi: " . $today['Tithi']['name'];
echo "Nakshatra: " . $today['Nakshatra']['name'];

2. Festival Calendar

// Get festivals for entire month
$monthFestivals = [];
for ($day = 1; $day <= 31; $day++) {
    $date = CarbonImmutable::create(2026, 10, $day);
    $fest = Panchang::getFestivalSnapshot($date, $lat, $lon, $tz);
    
    if (!empty($fest['Festivals'])) {
        $monthFestivals[$day] = $fest['Festivals'];
    }
}

3. Tradition-Specific Resolution

// Smarta-style date resolution (date-scoped festivals)
$smarta = Panchang::getDayDetails(
    CarbonImmutable::parse('2026-09-06'),
    28.61, 77.20, 'Asia/Kolkata'
)['Festivals'];

// Next-day festival context (for comparison)
$vaishnava = Panchang::getDayDetails(
    CarbonImmutable::parse('2026-09-07'),
    28.61, 77.20, 'Asia/Kolkata'
)['Festivals'];

4. Planetary Positions for a Timestamp

// Get planetary positions and ascendant for a timestamp/location
$timestampData = [
    'year' => 1990, 'month' => 5, 'day' => 15,
    'hour' => 14, 'minute' => 30, 'second' => 0,
    'tz' => 'Asia/Kolkata', 'lat' => 28.61, 'lon' => 77.20
];

$planets = $astronomy->getPlanets($timestampData);
$ascendant = $astronomy->getAscendant($timestampData);

echo "Sun: " . $planets['Sun'] . "°\n";
echo "Ascendant: " . $ascendant . "°";

5. Comprehensive Full-Day Data

// Get all advanced time divisions for a date
$details = Panchang::getDayDetails($date, $lat, $lon, $tz);

$lagnas   = $details['Lagna_Full_Day'];     // Exact Sign entry times
$horas    = $details['Hora_Full_Day'];       // 24 planetary rulers
$praharas = $details['Prahara_Full_Day'];    // 8 canonical periods
$muhurtas = $details['Muhurta_Full_Day'];    // 30 named Muhurtas
$badTimes = $details['Rahu_Kaal_Gulika_Yamaganda']; // Rahu, Gulika, Yamaganda
$durs     = $details['Dur_Muhurta_Full_Day']; // Inauspicious Muhurtas
$sandhya  = $details['Sandhya'];              // Pratah / Madhyahna / Sayahna
$gowri    = $details['Gowri_Panchangam'];     // Day + night Gowri divisions
$karmakala = $details['Karmakala_Windows'];   // Named daily windows

6. Transit-Only Muhurta Evaluation

$evaluation = Panchang::getDailyMuhurtaEvaluation(
    date: CarbonImmutable::now()->startOfDay(),
    lat: $lat,
    lon: $lon,
    tz: $tz,    currentAt: CarbonImmutable::now($tz)
);

$verdict = $evaluation['rejection_report']['overall_verdict'];
$bhadraActive = $evaluation['evaluation_results']['bhadra']['is_active'];
$varjyamActive = $evaluation['evaluation_results']['varjyam']['is_active'];

7. Raw JSON Exporter

Use this when you want the complete all-in-one package output in a single JSON file:

php scripts/panchang_raw_output.php > output.json

This writes meta, festivals_2026, eclipses_2026_2032, todays_complete_details, and muhurta_evaluation in one file.

Additional standalone exporters are available in scripts/:

php scripts/panchang_today.php
php scripts/panchang_month_output.php 2026 4 > month_2026_04.json
php scripts/panchang_eclipses.php 2026 2032
php scripts/panchang_festivals.php 2026

panchang_today.php writes today_panchang.json automatically and also prints JSON to stdout. panchang_month_output.php prints JSON to stdout only, so choose the filename with shell redirection. panchang_eclipses.php writes eclipses_YYYY_YYYY.json automatically and also prints JSON to stdout. panchang_festivals.php writes festivals_YYYY.json automatically and prints status lines; do not redirect its stdout as raw JSON.

Use PANCHANG_LOCALE=en|hi|gu and PANCHANG_CALENDAR_TYPE=amanta|purnimanta to generate localized/calendar-type variants. For a dedicated output directory, move implicit-output files after generation and redirect stdout-only scripts directly:

cd scripts
dir="output/amanta/gu"
mkdir -p "$dir"

PANCHANG_CALENDAR_TYPE=amanta PANCHANG_LOCALE=gu php panchang_today.php > /tmp/today.log
mv -f today_panchang.json "$dir/today.json"

PANCHANG_CALENDAR_TYPE=amanta PANCHANG_LOCALE=gu php panchang_festivals.php 2026 > /tmp/festivals.log
mv -f festivals_2026.json "$dir/festivals_2026.json"

PANCHANG_CALENDAR_TYPE=amanta PANCHANG_LOCALE=gu php panchang_month_output.php 2026 4 > "$dir/month_2026_04.json"

PANCHANG_CALENDAR_TYPE=amanta PANCHANG_LOCALE=gu php panchang_eclipses.php 2026 2032 > /tmp/eclipses.log
mv -f eclipses_2026_2032.json "$dir/eclipses_2026_2032.json"

Accuracy & Date Range

Technical specifications of the Swiss Ephemeris astronomical engine.

Precision Modes

Mode Date Range Precision
High Precision 13,201 BCE to 17,191 CE 0.001 arcsec
Standard 3,000 BCE to 3,000 CE 0.1 arcsec

*High Precision requires .se1 data files from Astro.com.

Ephemeris File Structure

Files are split into 600-year periods:

  • sepl_*.se1/semo_*.se1 — Common Era (AD) Dates
  • seplm*.se1/semom*.se1 — Before Common Era (BC)
  • se00*.se1 — Asteroids (Range: 5401 BCE to 5399 CE)

Calculation Precision

  • IEEE 754 — Double precision (53-bit significand)
  • Lossless — No intermediate rounding in formulas
  • High Convergence — 80 iterations for 1e-24 JD precision

Error Handling

Understanding and handling errors.

Common Exceptions

Common exceptions and how to handle them
Exception When It Occurs How to Handle
RuntimeException Swiss Ephemeris file not found Set correct ephe_path in config
InvalidArgumentException Invalid latitude/longitude Validate coordinates before calling
RuntimeException Timezone not found Use valid PHP timezone identifiers

Best Practices

try {
    $details = Panchang::getDayDetails(
        date: $date,
        lat: $lat, // Validate: -90 to 90
        lon: $lon, // Validate: -180 to 180
        tz: $tz    // Validate: timezone_exists($tz)
    );
} catch (RuntimeException $e) {
    Log::error('Panchang calculation failed', [
        'error' => $e->getMessage(),
        'location' => compact('lat', 'lon', 'tz')
    ]);

    return response()->json([
        'error' => 'Unable to calculate panchang for this location'
    ], 500);
}

FAQ & Troubleshooting

Common questions and solutions.

⚠️ Why are my calculations different from other panchang apps?
Answer
  • Ayanamsa: Lahiri is fixed and cannot be changed in this package.
  • Location: Ensure exact latitude/longitude.
  • Tradition: Smarta vs Vaishnava have different rules.
  • Precision Mode: Ensure you have .se1 ephemeris files installed for 0.001" accuracy. Without them, the engine falls back to the Moshier model (0.1" precision).
  • Panchang Day: Remember we use sunrise-to-sunrise days, not midnight-to-midnight.
⚠️ Why is the time wrong in my database/storage?
Answer

Always use _iso fields for storage. Time-only fields lack date context:

// WRONG - loses date context
DB::table('events')->insert([
    'varjyam_start' => $details['Varjyam']['varjyam_start'] // "03:31 AM"
]);

// CORRECT - includes full date
DB::table('events')->insert([
    'varjyam_start' => $details['Varjyam']['varjyam_start_iso'] // "28/03/2026 03:31 AM"
]);
⚠️ Why does Varjyam show different times than expected?
Answer

Varjyam can occur 0, 1, or 2 times per day. Always check window_count:

// Check how many windows exist
$count = $details['Varjyam']['window_count'];

if ($count === 0) {
    // No Varjyam today
} elseif ($count === 1) {
    // One window - use top-level keys
    $start = $details['Varjyam']['varjyam_start'];
} else {
    // Two windows - iterate windows array
    foreach ($details['Varjyam']['windows'] as $window) {
        // Process each window
    }
}
⚠️ Why is the Hindu month different from other calendars?
Answer

We use exact amavasya-to-amavasya solar transit logic, not simple longitude heuristics:

  • Month is determined by which solar transit occurs between two amavasyas
  • Adhika Masa (extra month) occurs when two amavasyas happen without a solar transit
  • Kshaya Masa (lost month) occurs when no amavasya occurs in a solar month (very rare)

This is more accurate than simpler methods but can differ from other packages.

Can I change the ayanamsa?
Answer
No. This package is Lahiri-only by design for Panchang correctness.
Why is Janmashtami on different dates?
Answer

This is normal. Smarta tradition celebrates on one day (ashtami at sunrise), Vaishnava on another (ashtami + Rohini nakshatra at midnight). Use the configured festival tradition profile or compare adjacent-day festival outputs.

How accurate are the calculations?
Answer

We use Swiss Ephemeris which provides accuracy to within 1 arcsecond for planetary positions. All calculations use IEEE 754 double precision with no intermediate rounding.

Can I use this for historical dates?
Answer

Yes! Swiss Ephemeris supports dates from 3000 BCE to 3000 CE. Just pass any valid CarbonImmutable date.

How do I handle multiple traditions?
Answer

Calculate for both traditions and compare:

$smarta = $panchang->getDayDetails($date, $lat, $lon, $tz, elevation: 0.0, options: ['tradition' => 'Smarta']);
$vaishnava = $panchang->getDayDetails($date, $lat, $lon, $tz, elevation: 0.0, options: ['tradition' => 'Vaishnava']);

// Compare festivals
$smartaFestivals = $smarta['Festivals'];
$vaishnavaFestivals = $vaishnava['Festivals'];

Breaking Changes in v4.0.0

Important changes when upgrading from v3.x to v4.0.0.

Upgrade Notes

This is a major release with several breaking changes. Please review the changes below before upgrading.

1. Default Configuration Changes

Setting v3.x Default v4.0.0 Default
defaults.locale 'hi' (Hindi) 'en' (English)
defaults.calendar_type 'purnimanta' 'amanta'

2. Method Signature Changes

All enum getName() methods now accept an optional $locale parameter:

// v3.x
$name = Nakshatra::Ashwini->getName(); // "Ashwini"

// v4.0.0
$name = Nakshatra::Ashwini->getName();              // Uses configured locale
$name = Nakshatra::Ashwini->getName('hi');         // "अश्विनी"
$name = Nakshatra::Ashwini->getName('gu');         // "અશ્વિની"

3. Time Field Structure Changes

Sunrise, Sunset, Moonrise, and Moonset in the Panchanga output now return objects instead of strings:

// v3.x (string)
$details['Panchanga']['Sunrise']; // "06:14:00 AM"

// v4.0.0 (object)
$details['Panchanga']['Sunrise']; // ['jd' => 2461234.5, 'iso' => '2026-04-16T06:14:00+05:30', 'display' => '06:14:00 AM', 'timestamp' => 1234567890]
$details['Panchanga']['Sunrise']['display'];  // "06:14:00 AM"
$details['Panchanga']['Sunrise']['jd'];        // Julian Day
$details['Panchanga']['Sunrise']['iso'];        // ISO timestamp
$details['Panchanga']['Sunrise']['timestamp'];  // Unix timestamp

4. Enum Value Changes

Enum Change
Paksha Values changed from string ('Shukla', 'Krishna') to int (0, 1)
Karana Index values changed from 1-11 to 0-10. Fixed typo: KimstughnaKintughna
Muhurta Expanded from 15 to 30 cases (15 day + 15 night muhurtas)
Yoga Fixed typo: VishkambhaVishkumbh, AindraIndra

5. Removed Methods

The following methods have been removed:

  • Masa::getEnglishApproximation() - removed
  • Masa::getRulingNakshatra() - removed
  • Ritu::getEnglishName() - removed
  • Ritu::getMonths() - removed
  • Karana::getType() - removed
  • Karana::isVishti() - removed

6. PHP 8.3+ Requirement

This package targets PHP 8.3+ and the current Composer platform config is pinned accordingly.

7. Calendar Type Parameter

Methods like getDayDetails() support an optional calendarType parameter. If omitted, the default remains CalendarType::Amanta:

// v3.x
$details = $panchang->getDayDetails($date, $lat, $lon, $tz);

// Explicit enum
$details = $panchang->getDayDetails($date, $lat, $lon, $tz, 0.0, null, CalendarType::Amanta);

// Or use string
$details = $panchang->getDayDetails($date, $lat, $lon, $tz, 0.0, null, 'amanta');
$details = $panchang->getDayDetails($date, $lat, $lon, $tz, 0.0, null, 'purnimanta');

License

AGPL-3.0 License

This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).

The core engine utilize the Swiss Ephemeris for precision calculations, which follows a dual-licensing model:

  • Open Source: Licensed under GNU AGPLv3. If you use this package in a free/open-source project, your project must also be licensed under AGPLv3.
  • Commercial: If you wish to use this package in a closed-source or commercial application, you MUST purchase a commercial license from Astrodienst AG.

For more details, see the full license text.

Complete Public API Surface (Live from src)

This section is a direct reflection snapshot of all public methods and public constants currently declared in src/.

Use this as the definitive signature reference when integrating the package.

## JayeshMepani\PanchangCore\Astronomy\AstronomyService
- __construct(SwissEph\FFI\SwissEphFFI $sweph): void
- configure(string $ephePath = ""): void
- getAscendant(array $birth): float
- getAyanamsa(float $jd): float
- getPlanetaryStates(array $birth, string $nodeMode = "mean", float $stationTolerance = 1.0E-6): array
- getPlanets(array $birth): array
- setAyanamsa(float $jd): void
- toJulianDayUtc(array $birth): float

## JayeshMepani\PanchangCore\Astronomy\EclipseService
- __construct(SwissEph\FFI\SwissEphFFI $sweph): void
- configure(string $ephePath = ""): void
- getEclipsesForYear(int $year, float $lat, float $lon, string $tz): array

## JayeshMepani\PanchangCore\Astronomy\SunService
- __construct(SwissEph\FFI\SwissEphFFI $sweph): void
- configure(string $ephePath = ""): void
- getBirthDatetime(array $birth): Carbon\CarbonImmutable
- getIntervalAndStart(array $birth): array
- getMoonriseMoonset(array $birth): array
- getSolarTransits(array $birth): array
- getSunriseSunset(array $birth): array
- getTwilightTimes(array $birth): array
- isDayBirth(array $birth): bool
- jdToCarbonPublic(float $jd, string $timezone): Carbon\CarbonImmutable

## JayeshMepani\PanchangCore\Core\AstroCore
- countSigns(int $targetSign, int $startSign, bool $forward = true): int
- formatAngle(float $angle): string|float
- formatCoordinate(float $coordinate): string|float
- formatDateTime(Carbon\CarbonImmutable $time): string
- formatDuration(float $minutes): string|float
- formatTime(Carbon\CarbonImmutable $time): string
- getAngularDistance(float $a, float $b): float
- getConfig(string $key, mixed $default = null): mixed
- getHouseNumFromLagna(int $signIdx, int $ascSignIdx): int
- getSign(float $lon): int
- getSignLon(float $lon): float
- getTimeDiffMinutesPrecise(DateTimeInterface $target, DateTimeInterface $reference): float
- normalize(float $x): float
- toDms(float $deg): string

## JayeshMepani\PanchangCore\Core\Constants\ClassicalTimeConstants
const SECONDS_PER_DAY
const MINUTES_PER_DAY
const SECONDS_PER_HOUR
const MINUTES_PER_HOUR
const SECONDS_PER_MINUTE
const GHATIKA_IN_MINUTES
const GHATIKA_PER_DAY
const PALA_IN_SECONDS
const MUHURTA_IN_MINUTES
const MUHURTA_PER_DAY
const ARUNODAYA_MINUTES
const ARUNODAYA_PER_DAY
const PRADOSHA_MINUTES
const PRADOSHA_PER_DAY
const BRAHMA_MUHURTA_MINUTES
const BRAHMA_MUHURTA_OFFSET_MINUTES
const DEGREES_PER_SIGN
const DEGREES_PER_NAKSHATRA
const DEGREES_PER_TITHI
const TITHIS_PER_PAKSHA
const NAKSHATRAS_TOTAL
const SIGNS_TOTAL
const CIRCLE_DEGREES
const JD_EPSILON
const BINARY_SEARCH_ITERATIONS
const DEGREE_EPSILON
const JUPITER_CYCLE_YEARS
const KALI_ERA_OFFSET
const VIKRAMA_ERA_OFFSET
const SHAKA_ERA_OFFSET
const BHADRA_TITHIS
const EKADASHI_TITHI
const CHATURDASHI_TITHI
const PURNIMA_TITHI
const SCORE_TITHI_AT_KARMAKALA
const SCORE_TITHI_AT_SUNRISE
const SCORE_TITHI_DURING_DAY
const SCORE_TITHI_DURING_NIGHT
const SCORE_WEEKDAY_MATCH
const SCORE_NAKSHATRA_MATCH
const SCORE_VRIDDHI_FIRST_DAY
const SCORE_KSHAYA_PENALTY

## JayeshMepani\PanchangCore\Core\Enums\CalendarType
const Amanta
const Purnimanta
- cases(): array
- from(string|int $value): static
- getLocalizedName(string $locale = null): string
- isAmanta(): bool
- isPurnimanta(): bool
- tryFrom(string|int $value): static

## JayeshMepani\PanchangCore\Core\Enums\Choghadiya
const Udveg
const Chal
const Labh
const Amrit
const Kaal
const Shubh
const Rog
- cases(): array
- from(string|int $value): static
- fromTime(float $jdSunrise, float $jdSunset, float $jdCurrent, JayeshMepani\PanchangCore\Core\Enums\Vara $vara): self
- getDaySequence(JayeshMepani\PanchangCore\Core\Enums\Vara $vara): array
- getName(string $locale = null): string
- getNature(): string
- getNightSequence(JayeshMepani\PanchangCore\Core\Enums\Vara $vara): array
- isAuspicious(): bool
- tryFrom(string|int $value): static

## JayeshMepani\PanchangCore\Core\Enums\Hora
const Sun
const Venus
const Mercury
const Moon
const Saturn
const Jupiter
const Mars
- cases(): array
- from(string|int $value): static
- getName(string $locale = null): string
- getSequence(JayeshMepani\PanchangCore\Core\Enums\Vara $vara): array
- tryFrom(string|int $value): static

## JayeshMepani\PanchangCore\Core\Enums\Karana
const Bava
const Balava
const Kaulava
const Taitila
const Gara
const Vanija
const Vishti
const Shakuni
const Chatushpada
const Naga
const Kintughna
- cases(): array
- from(string|int $value): static
- fromTithi(int $tithiIndex, float $fraction): self
- getFromLongitudes(float $sunLon, float $moonLon): array
- getName(string $locale = null): string
- tryFrom(string|int $value): static

## JayeshMepani\PanchangCore\Core\Enums\Masa
const Chaitra
const Vaishakha
const Jyeshtha
const Ashadha
const Shravana
const Bhadrapada
const Ashvina
const Kartika
const Margashirsha
const Pausha
const Magha
const Phalguna
- cases(): array
- from(string|int $value): static
- fromAmantaIndex(int $index): self
- fromIndex(int $index): self
- fromSunLongitude(float $sunLon): self
- getName(string $locale = null): string
- tryFrom(string|int $value): static

## JayeshMepani\PanchangCore\Core\Enums\Muhurta
const Rudra
const Sarpa
const Mitra
const Pitri
const Vasu
const Vara
const Vishvedeva
const Vidhi
const Brahma
const Indra
const Indragni
const Daitya
const Varuna
const Aryaman
const Bhaga
const Ishvara
const Ajapada
const Ahirbudhnya
const Pushya
const Nasatya
const Yama
const Vahni
const Dhala
const Shashi
const Aditya
const Guru
const Acyuta
const Arka
const Tvashta
const Vayu
- cases(): array
- from(string|int $value): static
- getDaySequence(): array
- getName(string $locale = null): string
- getNightSequence(): array
- tryFrom(string|int $value): static

## JayeshMepani\PanchangCore\Core\Enums\Nakshatra
const Ashwini
const Bharani
const Krittika
const Rohini
const Mrigashira
const Ardra
const Punarvasu
const Pushya
const Ashlesha
const Magha
const PurvaPhalguni
const UttaraPhalguni
const Hasta
const Chitra
const Swati
const Vishakha
const Anuradha
const Jyeshtha
const Mula
const PurvaAshadha
const UttaraAshadha
const Shravana
const Dhanishta
const Shatabhisha
const PurvaBhadrapada
const UttaraBhadrapada
const Revati
- cases(): array
- from(string|int $value): static
- fromLongitude(float $longitude): self
- getDeity(): string
- getLongitudeRange(): array
- getName(string $locale = null): string
- getPada(float $longitude): int
- getRulingPlanet(): string
- getSymbol(): string
- tryFrom(string|int $value): static

## JayeshMepani\PanchangCore\Core\Enums\Paksha
const Shukla
const Krishna
- cases(): array
- containsTithi(int $tithiIndex): bool
- from(string|int $value): static
- getDescription(): string
- getName(string $locale = null): string
- getRawName(): string
- getTithiRange(): array
- isKrishna(): bool
- isShukla(): bool
- normalizeTithi(int $tithiIndex): int
- opposite(): self
- toAbsoluteTithi(int $normalizedTithi): int
- tryFrom(string|int $value): static

## JayeshMepani\PanchangCore\Core\Enums\Rasi
const Mesha
const Vrishabha
const Mithuna
const Karka
const Simha
const Kanya
const Tula
const Vrischika
const Dhanu
const Makara
const Kumbha
const Meena
- cases(): array
- from(string|int $value): static
- fromLongitude(float $longitude): self
- getElement(): string
- getEnglishName(): string
- getLongitudeRange(): array
- getName(string $locale = null): string
- getRulingPlanet(): string
- getSymbol(): string
- tryFrom(string|int $value): static

## JayeshMepani\PanchangCore\Core\Enums\Ritu
const Vasanta
const Grishma
const Varsha
const Sharad
const Hemanta
const Shishira
- cases(): array
- from(string|int $value): static
- fromMonth(int $monthIndex): self
- fromSunLongitude(float $sunLon): self
- getName(string $locale = null): string
- tryFrom(string|int $value): static

## JayeshMepani\PanchangCore\Core\Enums\Samvatsara
const Prabhava
const Vibhava
const Shukla
const Pramoda
const Prajapati
const Angirasa
const Srimukha
const Bhava
const Yuva
const Dhata
const Ishvara
const Bahudhanya
const Pramathi
const Vikrama
const Vrisha
const Chitrabhanu
const Svabhanu
const Tarana
const Parthiva
const Vyaya
const Sarvajit
const Sarvadhari
const Virodhi
const Vikriti
const Khara
const Nandana
const Vijaya
const Jaya
const Manmatha
const Durmukhi
const Hevilambi
const Vilambi
const Vikari
const Sharvari
const Plava
const Shubhakritu
const Shobhakritu
const Krodhi
const Vishvavasu
const Parabhava
const Plavanga
const Kilaka
const Saumya
const Sadharana
const Virodhikritu
const Paritapi
const Pramadi
const Ananda
const Rakshasa
const Nala
const Pingala
const Kalayukti
const Siddharthi
const Raudri
const Durmati
const Dundubhi
const Rudhirodgari
const Raktakshi
const Krodhana
const Akshaya
- cases(): array
- from(string|int $value): static
- fromGregorianYear(int $gregorianYear): self
- fromYear(int $year): self
- getName(string $locale = null): string
- tryFrom(string|int $value): static

## JayeshMepani\PanchangCore\Core\Enums\Tithi
const ShuklaPratipada
const ShuklaDwitiya
const ShuklaTritiya
const ShuklaChaturthi
const ShuklaPanchami
const ShuklaShashthi
const ShuklaSaptami
const ShuklaAshtami
const ShuklaNavami
const ShuklaDashami
const ShuklaEkadashi
const ShuklaDwadashi
const ShuklaTrayodashi
const ShuklaChaturdashi
const Purnima
const KrishnaPratipada
const KrishnaDwitiya
const KrishnaTritiya
const KrishnaChaturthi
const KrishnaPanchami
const KrishnaShashthi
const KrishnaSaptami
const KrishnaAshtami
const KrishnaNavami
const KrishnaDashami
const KrishnaEkadashi
const KrishnaDwadashi
const KrishnaTrayodashi
const KrishnaChaturdashi
const Amavasya
- cases(): array
- from(string|int $value): static
- fromLongitudes(float $sunLon, float $moonLon): self
- getFractionRemaining(float $sunLon, float $moonLon): float
- getName(string $locale = null): string
- getNormalizedIndex(): int
- getPaksha(): JayeshMepani\PanchangCore\Core\Enums\Paksha
- isChaturdashi(): bool
- isEkadashi(): bool
- isPurnimaOrAmavasya(): bool
- tryFrom(string|int $value): static

## JayeshMepani\PanchangCore\Core\Enums\Vara
const Sunday
const Monday
const Tuesday
const Wednesday
const Thursday
const Friday
const Saturday
- cases(): array
- from(string|int $value): static
- fromDayOfWeek(int $dayOfWeek): self
- fromJulianDay(float $jd): self
- getEnglishName(): string
- getName(string $locale = null): string
- getRulingPlanet(): string
- tryFrom(string|int $value): static

## JayeshMepani\PanchangCore\Core\Enums\VimshottariDasha
const Sun
const Moon
const Mars
const Rahu
const Jupiter
const Saturn
const Mercury
const Ketu
const Venus
- cases(): array
- from(string|int $value): static
- fromNakshatra(JayeshMepani\PanchangCore\Core\Enums\Nakshatra $nakshatra): self
- getDashaYears(): int
- getName(string $locale = null): string
- tryFrom(string|int $value): static

## JayeshMepani\PanchangCore\Core\Enums\Yoga
const Vishkumbha
const Priti
const Ayushman
const Saubhagya
const Shobhana
const Atiganda
const Sukarma
const Dhriti
const Shula
const Ganda
const Vriddhi
const Dhruva
const Vyaghata
const Harshana
const Vajra
const Siddhi
const Vyatipata
const Variyana
const Parigha
const Shiva
const Siddha
const Sadhya
const Shubha
const Shukla
const Brahma
const Indra
const Vaidhriti
- cases(): array
- from(string|int $value): static
- fromLongitudes(float $sunLon, float $moonLon): self
- getFractionRemaining(float $sunLon, float $moonLon): float
- getName(string $locale = null): string
- tryFrom(string|int $value): static

## JayeshMepani\PanchangCore\Core\Localization
- translate(string $type, string|int $key, string $locale = null): string

## JayeshMepani\PanchangCore\Facades\Panchang

## JayeshMepani\PanchangCore\Festivals\FestivalFamilyOrchestrator
const FESTIVAL_FAMILIES
const EXCEPTION_LOGIC
- resolveFestivalFamily(string $familyName, array $baseDate, array $panchangData, string $tradition = null, string $region = null): array

## JayeshMepani\PanchangCore\Festivals\FestivalRuleEngine
- annotateMonthAnomalies(array $dateToDetails): array
- resolveMajorFestival(string $festivalName, array $rule, Carbon\CarbonImmutable $date, array $today, array $tomorrow): array
- resolveNakshatraBasedFestival(string $festivalName, array $rule, Carbon\CarbonImmutable $date, array $today, array $tomorrow): array

## JayeshMepani\PanchangCore\Festivals\FestivalService
const TITHI_VRATAS
const FESTIVALS
const MONTHS
- __construct(JayeshMepani\PanchangCore\Festivals\FestivalRuleEngine $ruleEngine): void
- buildFestivalPayload(string $name, array $rules, array $resolved = null): array
- getDailyObservances(array $panchangDetails): array
- getFestivalsForYear(int $year, string $pakshaSystem = "Amanta"): array
- resolveFestivalsForDate(Carbon\CarbonImmutable $date, array $todayDetails, array $tomorrowDetails, array $yesterdayDetails = null, callable $fetchHistoricalSnapshot = null, bool $includeExtraWinners = false): array
- usesClassicalResolver(array $rules): bool

## JayeshMepani\PanchangCore\Festivals\Utils\BhadraEngine
- calculateBhadra(float $sunriseJd, float $vishtiStartJd, float $vishtiEndJd, int $moonRasiIndex, int $tithiIndex, string $paksha): array

## JayeshMepani\PanchangCore\PanchangServiceProvider
- boot(): void
- register(): void

## JayeshMepani\PanchangCore\Panchanga\ElectionalEvaluator
- calculateAbhijitCancellation(float $sunrise, float $sunset, int $varaNumber, float $currentTime): array
- calculateAmritaKaal(int $varaNumber, float $sunrise, float $sunset, float $nextSunrise, float $currentTime): array
- calculateBhadra(int $moonSignIdx): array
- calculateDagdhaTithi(int $tithiNumber, int $moonSignIdx): array
- calculateDagdhaYoga(int $varaNumber, int $tithiNumber): array
- calculatePanchakaDosha(int $tithiNumber, int $varaNumber, int $nakshatraNumber, int $lagnaNumber): array
- calculateRiktaTithi(int $tithiNumber, bool $isKrishnaPaksha): array
- calculateTransitMoorthy(string $nakshatraName): array
- calculateVarjyam(int $nakshatraNumber, float $nakshatraStartTime, float $nakshatraDurationMinutes): array
- generateRejectionReport(array $evaluationResults): array

## JayeshMepani\PanchangCore\Panchanga\ElectionalRuleBook
const UNIVERSAL_BAD_TITHIS
const UNIVERSAL_BAD_CHOGADIYA
const UNIVERSAL_GOOD_CHOGADIYA
const UNIVERSAL_GOOD_HORAS
const UNIVERSAL_BAD_YOGAS
const UNIVERSAL_GOOD_KARANAS
const UNIVERSAL_BAD_KARANAS
const COMBUSTION_ORBS
const COMBUSTION_ORBS_RETRO
const VARA_TITHI_YOGAS

## JayeshMepani\PanchangCore\Panchanga\KalaNirnayaEngine
const GHATI_IN_MINUTES
const PALA_IN_SECONDS
const GHATIKA_PER_DAY
const ARUNODAYA_GHATIKAS
const ARUNODAYA_MINUTES
const SANKRANTI_PUNYA_KAAL
const TITHI_NAMES
const FESTIVAL_RULES
- __construct(float $latitude, float $longitude): void
- calculatePunyaKaal(string $sankrantiName, float $sankrantiJd, float $sunriseJd, float $sunsetJd): array
- configure(string $ephePath = ""): void
- determineEkadashi(float $ekadashiStartJd, float $ekadashiEndJd, float $dashamiEndJd, float $dvadashiStartJd, float $sunriseJd, float $nextSunriseJd, string $tradition = "Vaishnava"): array
- determineViddhaTithi(int $tithiNumber, float $tithiStartJd, float $tithiEndJd, float $sunriseDay1Jd, float $sunriseDay2Jd, float $prevTithiEndJd): array
- generateKalaNirnayaReport(int $tithiNumber, float $tithiStartJd, float $tithiEndJd, float $prevTithiEndJd, float $sunriseJd, float $sunsetJd, float $nextSunriseJd): array
- resolveFestivalDate(string $festivalName, float $tithiStartJd, float $tithiEndJd, float $sunriseJd, float $sunsetJd, float $nextSunriseJd): array

## JayeshMepani\PanchangCore\Panchanga\MuhurtaService
- __construct(JayeshMepani\PanchangCore\Muhurta\Planetary\HoraCalculator $horaCalculator, JayeshMepani\PanchangCore\Muhurta\Planetary\ChogadiyaCalculator $chogadiyaCalculator, JayeshMepani\PanchangCore\Muhurta\Classical\DailyPeriodsCalculator $dailyPeriodsCalculator, JayeshMepani\PanchangCore\Muhurta\Classical\InauspiciousPeriodsCalculator $inauspiciousPeriodsCalculator, JayeshMepani\PanchangCore\Muhurta\Regional\GowriPanchangamCalculator $gowriPanchangamCalculator, JayeshMepani\PanchangCore\Muhurta\Lagna\LagnaTableCalculator $lagnaTableCalculator): void
- calculateAbhijitMuhurta(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset): array
- calculateAmritaKaal(Carbon\CarbonImmutable $sunrise, array $varjyam): array
- calculateBadTimes(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, int $varaIdx): array
- calculateBrahmaMuhurta(Carbon\CarbonImmutable $sunrise): array
- calculateChogadiya(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, Carbon\CarbonImmutable $current, int $varaIdx): array
- calculateChogadiyaTable(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, int $varaIdx): array
- calculateDaylightFivefoldDivision(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset): array
- calculateDurMuhurta(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, int $varaIdx): array
- calculateGodhuliMuhurta(Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise): array
- calculateGowriPanchangam(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, int $varaIdx): array
- calculateHora(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, Carbon\CarbonImmutable $current, int $varaIdx): array
- calculateHoraTable(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, int $varaIdx): array
- calculateKalaVela(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, int $varaIdx): array
- calculateLagna(Carbon\CarbonImmutable $current, Carbon\CarbonImmutable $sunrise, float $sunriseSunLongitude, float $ayanamsaDeg, float $lat, float $lon, SwissEph\FFI\SwissEphFFI $sweph): array
- calculateLagnaTable(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, float $sunriseSunLongitude, float $ayanamsaDeg, float $lat, float $lon, SwissEph\FFI\SwissEphFFI $sweph): array
- calculateMuhurtaTable(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise): array
- calculateNishitaMuhurta(Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise): array
- calculatePradoshaKaal(Carbon\CarbonImmutable $sunset, int $tithiNum): array
- calculatePrahara(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise): array
- calculateSandhya(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, Carbon\CarbonImmutable $solarNoon): array
- calculateVarjyam(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, int $nakshatraIndex, float $nakshatraStartJd, float $nakshatraEndJd): array
- calculateVijayaMuhurta(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset): array

## JayeshMepani\PanchangCore\Panchanga\OutputGeneratorService
- __construct(JayeshMepani\PanchangCore\Panchanga\PanchangService $panchangService, JayeshMepani\PanchangCore\Astronomy\EclipseService $eclipseService): void
- generateAll(int $festivalYear, int $eclipseStartYear, int $eclipseEndYear, float $lat, float $lon, string $tz, float $elevation = 0, JayeshMepani\PanchangCore\Core\Enums\CalendarType|string $calendarType = JayeshMepani\PanchangCore\Core\Enums\CalendarType::Amanta): array
- generateEclipses(int $startYear, int $endYear, float $lat, float $lon, string $tz): array
- generateFestivals(int $year, float $lat, float $lon, string $tz, float $elevation = 0, JayeshMepani\PanchangCore\Core\Enums\CalendarType|string $calendarType = JayeshMepani\PanchangCore\Core\Enums\CalendarType::Amanta): array
- generateTodayPanchang(float $lat, float $lon, string $tz, float $elevation = 0, JayeshMepani\PanchangCore\Core\Enums\CalendarType|string $calendarType = JayeshMepani\PanchangCore\Core\Enums\CalendarType::Amanta): array

## JayeshMepani\PanchangCore\Panchanga\PanchangService
- __construct(SwissEph\FFI\SwissEphFFI $sweph, JayeshMepani\PanchangCore\Astronomy\SunService $sunService, JayeshMepani\PanchangCore\Astronomy\AstronomyService $astronomy, JayeshMepani\PanchangCore\Panchanga\PanchangaEngine $panchanga, JayeshMepani\PanchangCore\Panchanga\MuhurtaService $muhurta, JayeshMepani\PanchangCore\Festivals\FestivalService $festivalService, JayeshMepani\PanchangCore\Festivals\Utils\BhadraEngine $bhadraEngine, mixed $unusedTransitEngine = null, mixed $unusedIntervalTracker = null, JayeshMepani\PanchangCore\Panchanga\Residences\VaasaCalculator|null $vaasaCalculator = null, JayeshMepani\PanchangCore\Panchanga\Residences\ShoolaCalculator|null $shoolaCalculator = null, JayeshMepani\PanchangCore\Panchanga\Yogas\SpecialYogaCalculator|null $specialYogaCalculator = null, JayeshMepani\PanchangCore\Panchanga\Doshas\PanchakCalculator|null $panchakCalculator = null, JayeshMepani\PanchangCore\Panchanga\Doshas\BhadraCalculator|null $bhadraCalculator = null, mixed $unusedVarjyamWindowCalculator = null, JayeshMepani\PanchangCore\Panchanga\Vrata\EkadashiParanaCalculator|null $ekadashiParanaCalculator = null, mixed ...$unusedExtractedCalculators): void
- configure(string $ephePath = ""): void
- getDailyMuhurtaEvaluation(Carbon\CarbonImmutable $date, float $lat, float $lon, string $tz, Carbon\CarbonImmutable $currentAt = null, float $elevation = 0, array $options = []): array
- getDayDetails(Carbon\CarbonImmutable $date, float $lat, float $lon, string $tz, float $elevation = 0, Carbon\CarbonImmutable $calculationAt = null, JayeshMepani\PanchangCore\Core\Enums\CalendarType|string $calendarType = JayeshMepani\PanchangCore\Core\Enums\CalendarType::Amanta, array $options = []): array
- getElectionalSnapshot(Carbon\CarbonImmutable $date, float $lat, float $lon, string $tz, float $elevation = 0, array $options = []): array
- getFestivalSnapshot(Carbon\CarbonImmutable $date, float $lat, float $lon, string $tz, float $elevation = 0, Carbon\CarbonImmutable $calculationAt = null, JayeshMepani\PanchangCore\Core\Enums\CalendarType|string $calendarType = JayeshMepani\PanchangCore\Core\Enums\CalendarType::Amanta): array
- getFestivalYearCalendar(int $year, float $lat, float $lon, string $tz, float $elevation = 0, Carbon\CarbonImmutable $calculationAt = null, JayeshMepani\PanchangCore\Core\Enums\CalendarType|string $calendarType = JayeshMepani\PanchangCore\Core\Enums\CalendarType::Amanta): array
- getMonthCalendar(int $year, int $month, float $lat, float $lon, string $tz, float $elevation = 0, array $options = [], Carbon\CarbonImmutable $calculationAt = null, JayeshMepani\PanchangCore\Core\Enums\CalendarType|string $calendarType = JayeshMepani\PanchangCore\Core\Enums\CalendarType::Amanta): array

## JayeshMepani\PanchangCore\Panchanga\PanchangaEngine
- calculateKundaLagna(float $ascLon): array
- calculatePanchakaRahita(int $tithiNum, int $varaNum, int $nakNum, int $lagnaNum): array
- calculateTithi(float $sunLon, float $moonLon): array
- calculateVara(array $birth, JayeshMepani\PanchangCore\Astronomy\SunService $sunService): array
- calculateYoga(float $sunLon, float $moonLon): array
- getAyana(float $sunLon): string
- getGujaratiSamvat(int $vikramSamvat, int $monthIndex): int
- getHinduMonth(float $sunLon, float $moonLon, string $paksha = "Shukla"): array
- getKaliSamvat(int $vikramSamvat): int
- getKarana(float $sunLon, float $moonLon): array
- getNakshatraInfo(float $longitude): array
- getPanchanga(float $sunLon, float $moonLon, array $birth, JayeshMepani\PanchangCore\Astronomy\SunService $sunService, JayeshMepani\PanchangCore\Astronomy\AstronomyService $astronomy): array
- getRitu(float $sunLon): string
- getSamvat(int $year, int $month): array
- getSamvatsara(int $vikramSamvat): string
- getSamvatsaraNorth(int $vikramSamvat): string
- isVishtiKarana(float $sunLon, float $moonLon): bool

## JayeshMepani\PanchangCore\Traits\CliBootstrap
- init(string $baseDir): void
- makeEclipseService(): JayeshMepani\PanchangCore\Astronomy\EclipseService
- makeOutputGenerator(JayeshMepani\PanchangCore\Panchanga\PanchangService $panchang): JayeshMepani\PanchangCore\Panchanga\OutputGeneratorService
- makePanchangService(): JayeshMepani\PanchangCore\Panchanga\PanchangService

Quick Reference

What to Use When

Method selection guide
I want to… Use this method
Get complete panchanga for a day PanchangService::getDayDetails()
Get only festivals PanchangService::getFestivalSnapshot()
Build a month calendar grid PanchangService::getMonthCalendar()
Get transit-only muhurta evaluation for now PanchangService::getDailyMuhurtaEvaluation()
Get planetary positions AstronomyService::getPlanets()
Get sunrise/sunset SunService::getSunriseSunset()
Calculate Tithi manually PanchangaEngine::calculateTithi()
Get Nakshatra from Moon position PanchangaEngine::getNakshatraInfo()
Get Muhurta times MuhurtaService::calculateMuhurtaTable()
Get auspicious times MuhurtaService::calculateAbhijitMuhurta()
Get Brahma Muhurta MuhurtaService::calculateBrahmaMuhurta()
Get named daily Karmakala windows PanchangService::getDayDetails()Karmakala_Windows
Get Gowri Panchangam MuhurtaService::calculateGowriPanchangam()
Get Kala Vela MuhurtaService::calculateKalaVela()
Get Rahu Kala, Gulika MuhurtaService::calculateBadTimes()
Get resolved festivals for a date PanchangService::getDayDetails() / FestivalService::resolveFestivalsForDate()
Get season (Ritu) PanchangaEngine::getRitu()
Get Samvatsara PanchangaEngine::getSamvatsara()
Use Hindi or Gujarati output Set defaults.locale or PANCHANG_LOCALE
Use Amanta or Purnimanta month names Pass $calendarType or set PANCHANG_CALENDAR_TYPE

Classical Text References

All calculations reference authentic Sanskrit texts and traditions. See docs/TRADITIONAL_TEXT_SOURCES.md for complete source-integrity map with confidence tiers.

  • Sūrya Siddhānta 1.29→ Tithi (30 lunar days, 12° each)
  • Sūrya Siddhānta 8.1→ Nakṣatra (27 lunar mansions, 13°20' each)
  • Sūrya Siddhānta 3.1-3→ Yoga (27 combinations, 13°20' Sun-Moon sum)
  • Muhūrta Chintāmaṇi Chapter 2→ Karana (11 half lunar days, 6° each)
  • Muhūrta Chintāmaṇi→ Muhūrta, Aruṇodaya, Pradoṣa
  • Bṛhat Saṃhitā→ Samvatsara, Ritu, Muhurta rules
  • Nirṇaya Sindhu→ Festival timing, Bhadra rules
  • Aṣṭāṅga Hṛdaya→ Brahma Muhūrta timing
  • Hari Bhakti Vilāsa→ Vaishnava Ekadashi rules