{"id":36974823,"url":"https://github.com/fusionstrings/panchangam","last_synced_at":"2026-01-25T12:09:55.325Z","repository":{"id":331557055,"uuid":"1128513255","full_name":"fusionstrings/panchangam","owner":"fusionstrings","description":null,"archived":false,"fork":false,"pushed_at":"2026-01-10T09:47:40.000Z","size":9901,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"creation","last_synced_at":"2026-01-11T00:54:04.751Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fusionstrings.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-05T18:45:30.000Z","updated_at":"2026-01-10T09:47:44.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/fusionstrings/panchangam","commit_stats":null,"previous_names":["fusionstrings/panchangam"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/fusionstrings/panchangam","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fusionstrings%2Fpanchangam","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fusionstrings%2Fpanchangam/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fusionstrings%2Fpanchangam/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fusionstrings%2Fpanchangam/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fusionstrings","download_url":"https://codeload.github.com/fusionstrings/panchangam/tar.gz/refs/heads/creation","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fusionstrings%2Fpanchangam/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28400503,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-13T14:36:09.778Z","status":"ssl_error","status_checked_at":"2026-01-13T14:35:19.697Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-13T22:02:18.859Z","updated_at":"2026-01-23T00:47:44.982Z","avatar_url":"https://github.com/fusionstrings.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Panchangam (Wasm)\n\n[![JSR](https://jsr.io/badges/@fusionstrings/panchangam)](https://jsr.io/@fusionstrings/panchangam)\n[![NPM](https://img.shields.io/npm/v/@fusionstrings/panchangam)](https://www.npmjs.com/package/@fusionstrings/panchangam)\n[![Crates.io](https://img.shields.io/crates/v/panchangam)](https://crates.io/crates/panchangam)\n\n\u003e **High-Precision Vedic Astrology \u0026 Calendar Library**\n\u003e\n\u003e _Powered by Swiss Ephemeris | Compiled to WebAssembly | Built for the Edge_\n\n## 🌟 Why Panchangam?\n\nMost Vedic astrology libraries rely on static lookup tables or simplified\nalgorithms that trade accuracy for speed. **Panchangam** bridges the gap between\nancient Vedic requirements and modern astronomical precision.\n\n1. **Astronomical Precision (\"Drik Ganita\")**: We wrap the industry-standard\n   **Swiss Ephemeris** (used by NASA/JPL) to calculate planetary positions to\n   millisecond precision. No approximations.\n2. **The \"Udaya Tithi\" Standard**: In Vedic traditions, the day doesn't start at\n   midnight; it starts at **Sunrise**. We calculate exact local sunrise times\n   (taking atmospheric refraction and altitude into account) to determine the\n   correct Tithi, Nakshatra, and Yoga for any location on Earth.\n3. **Wasm-First Performance**: Written in **Rust** and compiled to\n   **WebAssembly**, this library runs with near-native performance in\n   **Node.js**, **Deno**, and **Cloudflare Workers**. It's designed for\n   serverless scalability.\n\n## ✨ Features\n\n- **Swiss Ephemeris v2.10.03**: The gold standard for planetary calculations.\n- **Vedic Calendar (Panchang)**:\n  - **Tithi**: Lunar day (1-30) with precise **start and end times**.\n  - **Nakshatra**: 27 Lunar mansions with **start and end times**.\n  - **Yoga**: 27 Luni-solar combinations.\n  - **Karana**: 11 Half-Tithis.\n  - **Vara**: Weekday based on sunrise-to-sunrise logic.\n- **Advanced Astronomy**:\n  - **True Ayanamsa**: Support for **Lahiri (Chitrapaksha)**, Raman,\n    Krishnamurti, True Chitrapaksha, and more.\n  - **Planetary Dignity**: Automatic calculation of Exalted, Debilitated, Own\n    Sign, Friend/Enemy status.\n  - **Planetary War (Graha Yuddha)**: Detects when planets are dangerously close\n    (\u003c 1°).\n  - **Extended Muhurat**: Real-time calculation of:\n    - **Rahu Kalam, Yamaganda, Gulika** (8-part day division)\n    - **Brahma Muhurta** (Pre-dawn spiritual window)\n    - **Abhijit Muhurta** (Mid-day victory period)\n\n## 🚀 Usage\n\n### Installation\n\nThis project is currently distributed as a source crate. Verify and build the\nWasm bindings locally.\n\n**Prerequisites:**\n\n- [Rust](https://www.rust-lang.org/) (stable)\n- [Deno](https://deno.land/) (v1.37+)\n\n**One-Step Build:**\n\n```bash\ndeno task build\n```\n\nThis generates:\n\n- `./lib/panchangam.js`: The ESM entry point.\n- `./lib/panchangam.wasm`: The compiled Wasm binary.\n- `./lib/panchangam.d.ts`: Fully typed TypeScript definitions.\n\n### Quick Start: Daily Panchang\n\nCalculate comprehensive Panchang data including precise end times.\n\n```typescript\nimport { calculate_daily_panchang, Location } from \"./lib/panchangam.js\";\n\n// 1. Define Location: New Delhi (28.61 N, 77.20 E, 225m)\nconst delhi = new Location(28.6139, 77.2090, 225.0);\n\n// 2. Calculate for January 1, 2024\n// params: (year, month, day, location, ayanamsha_mode)\n// mode 1 = Lahiri (Standard)\nconst result = calculate_daily_panchang(2024, 1, 1, delhi, 1);\n\n// 3. Output Results\nconsole.log(`Sunrise: ${new Date(result.sunrise).toLocaleTimeString()}`);\nconsole.log(`Tithi: ${result.tithi_name}`);\nconsole.log(`  - Ends at: ${new Date(result.tithi_end_time).toLocaleString()}`);\nconsole.log(`Nakshatra: ${result.nakshatra_name}`);\nconsole.log(\n  `  - Ends at: ${new Date(result.nakshatra_end_time).toLocaleString()}`,\n);\n```\n\n### Advanced: Planetary Positions \u0026 Dignity\n\nGet precise sidereal positions and dignity status for all planets.\n\n```typescript\nimport { calculate_planets, swe_julday } from \"./lib/panchangam.js\";\n\n// Julian Day for calculation\nconst jd = swe_julday(2024, 1, 1, 12.0, 1); // Noon UT\n\n// Calculate Sidereal positions (Mode 1 = Lahiri)\nconst planets = calculate_planets(jd, 1);\n\nplanets.forEach((p) =\u003e {\n  console.log(`${p.name}: ${p.longitude.toFixed(2)}°`);\n  console.log(`  Dignity: ${p.dignity}`); // Exalted, Own Sign, Friend, etc.\n  console.log(`  Speed: ${p.speed.toFixed(4)}/day`);\n  if (p.is_retrograde) console.log(\"  [Retrograde]\");\n});\n```\n\n### Muhurat Calculation\n\nDetermine auspicious and inauspicious time windows.\n\n```typescript\n// Accessed via the daily panchang result\nconst muhurats = result.muhurats;\n\nconsole.log(\"--- Inauspicious Periods ---\");\nconsole.log(\n  `Rahu Kalam: ${new Date(muhurats.rahu_kalam.start).toLocaleTimeString()} - ${\n    new Date(muhurats.rahu_kalam.end).toLocaleTimeString()\n  }`,\n);\nconsole.log(\n  `Yamaganda: ${new Date(muhurats.yamaganda.start).toLocaleTimeString()} - ${\n    new Date(muhurats.yamaganda.end).toLocaleTimeString()\n  }`,\n);\n\nconsole.log(\"--- Auspicious Periods ---\");\nconsole.log(\n  `Brahma Muhurta: ${\n    new Date(muhurats.brahma_muhurta.start).toLocaleTimeString()\n  }`,\n);\nconsole.log(\n  `Abhijit Muhurta: ${\n    new Date(muhurats.abhijit_muhurta.start).toLocaleTimeString()\n  }`,\n);\n```\n\n### Planetary War (Graha Yuddha)\n\nDetect planetary wars where planets are within 1° of each other.\n\n```typescript\nimport { check_graha_yuddha, swe_julday } from \"./lib/panchangam.js\";\n\nconst jd = swe_julday(2024, 1, 1, 12.0, 1);\nconst wars = check_graha_yuddha(jd, 1); // Mode 1 = Lahiri\n\nif (wars.length \u003e 0) {\n  console.log(\"Planetary War Detected!\");\n  wars.forEach((war) =\u003e {\n    console.log(\n      `${war.planet1_name} vs ${war.planet2_name} (Diff: ${\n        war.longitude_diff.toFixed(\n          4,\n        )\n      }°)`,\n    );\n    console.log(`Winner: Planet ID ${war.winner_id} (Brighter)`);\n  });\n} else {\n  console.log(\"No planetary wars currently.\");\n}\n```\n\n### Vimshottari Dasha\n\nCalculate the current ruling planetary periods.\n\n```typescript\nimport { calculate_vimshottari } from \"./lib/panchangam.js\";\n\n// Birth details\nconst birth_moon_long = 45.5; // Example longitude\nconst birth_time_ms = new Date(\"1990-01-01\").getTime();\nconst current_time_ms = Date.now();\n\nconst dasha = calculate_vimshottari(\n  birth_moon_long,\n  birth_time_ms,\n  current_time_ms,\n);\n\nconsole.log(`Current Mahadasha: ${dasha.mahadasha}`);\nconsole.log(`Current Antardasha: ${dasha.antardasha}`);\nconsole.log(`Current Pratyantardasha: ${dasha.pratyantardasha}`);\nconsole.log(\n  `Ends: ${new Date(dasha.pratyantardasha_end_date).toLocaleDateString()}`,\n);\n```\n\n### House Calculation\n\nCalculate Ascendant and House Cusps for various systems (Placidus, Whole Sign,\netc.).\n\n```typescript\nimport { calculate_houses, Location } from \"./lib/panchangam.js\";\n\nconst jd = swe_julday(2024, 1, 1, 12.0, 1);\nconst loc = new Location(28.6139, 77.2090, 0.0);\n\n// 'P' = Placidus, 'W' = Whole Sign, 'E' = Equal\n// Mode 1 = Lahiri Ayanamsha (Sidereal)\nconst houses = calculate_houses(jd, loc.latitude, loc.longitude, \"P\", 1);\n\nconsole.log(`Ascendant: ${houses.ascendant.toFixed(2)}°`);\nhouses.cusps.forEach((cusp, i) =\u003e {\n  console.log(`House ${i + 1}: ${cusp.toFixed(2)}°`);\n});\n```\n\n## 🛠️ Development\n\n### Project Structure\n\n- **`src/lib.rs`**: Wasm entry point.\n- **`src/vedic/`**: Core algorithms (Tithi, Nakshatra, Dignity, Muhurat).\n- **`src/astronomy/`**: Swiss Ephemeris wrappers and solvers.\n- **`scripts/build_npm.ts`**: Build script.\n\n### Testing\n\nRun the verification suite:\n\n```bash\ndeno test --allow-read --allow-env\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffusionstrings%2Fpanchangam","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffusionstrings%2Fpanchangam","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffusionstrings%2Fpanchangam/lists"}