§ Vedic · Updated

Your Vedic chart and Vimshottari dasha, computed.

Sidereal positions for the classical Navagraha and the lagna, your Moon’s nakshatra and pada, and the full 120-year Vimshottari dasha timeline with the current sub-period. Lahiri ayanamsa by default; approximate Raman-style and KP-style variants selectable. Free, no account.

Compare a Dasha date mismatch

Location data © OpenStreetMap contributors
Free · instant · no account required
§ Method · tropical minus ayanamsa

One sky, two zodiacs.

For the Sun, Moon, Mars, Mercury, Jupiter, Venus, and Saturn, a Vedic chart uses the same geocentric ecliptic longitudes as a Western chart — here computed from VSOP87 planetary theory and a Meeus lunar solution — measured from a different zero point. Western astrology anchors 0° Aries to the March equinox (the tropical zodiac); Jyotish anchors it to the fixed stars (the sidereal zodiac), with the star Spica defining 0° Libra under the Lahiri convention.

Rahu and Ketu are mathematical points, not physical planets. This calculator uses the mean lunar-node convention: Rahu is the Moon’s mean ascending node, and Ketu is fixed exactly 180° away. They are exact antipodes and move retrograde through the zodiac together.

Because the equinox drifts backwards against the stars by about 50.3″ a year, the two zodiacs separate slowly. That separation is the ayanamsa. On 2026-09-29 the Lahiri ayanamsa is 24.226° (0.267 Julian centuries past J2000), so every sidereal longitude on this page is the tropical longitude minus that value. A tropical Sun at 5° Leo becomes a sidereal Sun at roughly 11° Cancer in 2026.

The calculator uses the same timezone resolution as the tropical cast: the birthplace is geocoded, its IANA zone resolved, and the local birth time converted to a true UTC instant before anything is computed. Read the methodology and the accuracy test set for what that pipeline is checked against.

This calculator is a sidereal birth cast: Lahiri ayanamsa, natal Moon nakshatra, and Vimshottari dashas. Tropical daily horoscope columns are one-sign letters from today's sky, not a birth instant. Sky now is live tropical weather for this UTC instant — not a sidereal recast of a birth. Moon today is the transit Moon's sign, phase, and lunation right now, not the natal Moon or nakshatra in this Vedic chart.

This calculator is a sidereal birth cast: Lahiri ayanamsa, natal Moon nakshatra, and Vimshottari dashas. The 2026 Mercury retrograde calendar is dated station and shadow windows on the tropical sky, not a sidereal recast of a birth.

A generic birth form is not a public AA-rated chart. Einstein's birth chart in Hellenistic, Vedic, and BaZi is one 1879 natal read three ways — including that Lahiri ayanamsa and Vimshottari dashas — not this calculator's inputs.

A Vimshottari birth is not a tropical-sign catalog. The Moon sign catalog lists tropical Moon meanings — not this natal Moon's nakshatra or dasha lord. The zodiac sign encyclopedia is standing tropical personality, not a Lahiri recast of a birth instant.

§ Reference · the 27 nakshatras

Lunar mansions, 13°20′ each.

Arcs are sidereal. Lords repeat in the Vimshottari order every nine mansions.

#NakshatraSidereal arcLordDeitySymbol
1Ashwini0°00′ Aries – 13°20′ AriesKetuAshwini KumarasHorse's head
2Bharani13°20′ Aries – 26°40′ AriesVenusYamaYoni
3Krittika26°40′ Aries – 10°00′ TaurusSunAgniRazor, flame
4Rohini10°00′ Taurus – 23°20′ TaurusMoonBrahma (Prajapati)Ox-cart
5Mrigashira23°20′ Taurus – 6°40′ GeminiMarsSomaDeer's head
6Ardra6°40′ Gemini – 20°00′ GeminiRahuRudraTeardrop
7Punarvasu20°00′ Gemini – 3°20′ CancerJupiterAditiBow and quiver
8Pushya3°20′ Cancer – 16°40′ CancerSaturnBrihaspatiCow's udder, lotus
9Ashlesha16°40′ Cancer – 30°00′ CancerMercuryThe NagasCoiled serpent
10Magha0°00′ Leo – 13°20′ LeoKetuThe PitrisThrone
11Purva Phalguni13°20′ Leo – 26°40′ LeoVenusBhagaFront legs of a bed
12Uttara Phalguni26°40′ Leo – 10°00′ VirgoSunAryamanBack legs of a bed
13Hasta10°00′ Virgo – 23°20′ VirgoMoonSavitarHand
14Chitra23°20′ Virgo – 6°40′ LibraMarsTvashtarBright jewel
15Swati6°40′ Libra – 20°00′ LibraRahuVayuYoung sprout in the wind
16Vishakha20°00′ Libra – 3°20′ ScorpioJupiterIndra and AgniTriumphal archway
17Anuradha3°20′ Scorpio – 16°40′ ScorpioSaturnMitraLotus
18Jyeshtha16°40′ Scorpio – 30°00′ ScorpioMercuryIndraCircular amulet
19Mula0°00′ Sagittarius – 13°20′ SagittariusKetuNirritiBundle of roots
20Purva Ashadha13°20′ Sagittarius – 26°40′ SagittariusVenusApasWinnowing fan
21Uttara Ashadha26°40′ Sagittarius – 10°00′ CapricornSunThe VishvadevasElephant tusk
22Shravana10°00′ Capricorn – 23°20′ CapricornMoonVishnuEar, three footprints
23Dhanishta23°20′ Capricorn – 6°40′ AquariusMarsThe eight VasusDrum
24Shatabhisha6°40′ Aquarius – 20°00′ AquariusRahuVarunaEmpty circle
25Purva Bhadra20°00′ Aquarius – 3°20′ PiscesJupiterAja EkapadaSword
26Uttara Bhadra3°20′ Pisces – 16°40′ PiscesSaturnAhir BudhnyaTwins, back legs of a funeral cot
27Revati16°40′ Pisces – 30°00′ PiscesMercuryPushanFish, drum
§ Reference · Vimshottari dasha

Nine lords, 120 years.

Vimshottari (“one hundred and twenty”) is the timing system almost every Jyotish reading leans on. Life is divided into nine planetary periods (mahadashas) that always run in the same order and always sum to 120 years. Which period you are born into depends only on your Moon’s nakshatra: its lord opens the sequence, and the fraction of the nakshatra the Moon had not yet crossed is the fraction of that lord’s period still to run.

Mahadasha and antardasha

A Mahadasha is the major planetary period: the broad timing chapter. An antardasha (bhukti) is a sub-period inside that chapter. Each Mahadasha is divided in the same nine-lord order, with each antardasha taking its lord’s share of the full 120-year cycle. After you cast a chart, the result shows the full birth-to-age-120 Mahadasha table and the antardashas inside the period active now.

Balance at birth

The starting balance is calculated as (13°20′ − degrees already traversed in the Moon’s nakshatra) ÷ 13°20′. Multiplying that remaining fraction by the nakshatra lord’s full Mahadasha length gives the years left at birth.

Worked example: a Moon at 20° Taurus is 10° into Rohini, leaving 3°20′ of its 13°20′ arc, or one quarter. Rohini is ruled by the Moon, whose full period is 10 years, so the balance at birth is 2.5 years.

Why a lord can appear twice

The reference table below is the canonical cycle: nine complete periods, one for each lord, totalling 120 years. A personal result is instead a birth-to-age-120 window. It begins with the unelapsed tail of the period active at birth and may end with the head of that same lord’s next period. That final partial repeat closes the 120-year window; it is not a tenth lord in the canonical cycle.

How the current period is selected

The calculator compares the age at evaluation with each period’s half-open interval: the start belongs to a row, while its end belongs to the next row. The highlighted current row therefore changes at the computed end instant; the interface displays that boundary as a UTC date. Result dates are produced from the existing calendar conversion of one fractional year to 365.2425 days.

What this calculator can and cannot tell you

A Dasha timeline is timing structure, not a personalized verdict. This calculator identifies the sequence and boundaries; houses and interpretation remain in the paid reading. The birth-chart accuracy research documents the calculation inputs and tests selected astronomical positions against linked reference targets. It does not validate the astrological meaning of Dasha periods.

OrderLordYearsOpens the cycle when the Moon is in
1Ketu7Ashwini, Magha, Mula
2Venus20Bharani, Purva Phalguni, Purva Ashadha
3Sun6Krittika, Uttara Phalguni, Uttara Ashadha
4Moon10Rohini, Hasta, Shravana
5Mars7Mrigashira, Chitra, Dhanishta
6Rahu18Ardra, Swati, Shatabhisha
7Jupiter16Punarvasu, Vishakha, Purva Bhadra
8Saturn19Pushya, Anuradha, Uttara Bhadra
9Mercury17Ashlesha, Jyeshtha, Revati
§ Diagnostic lab · method fingerprints

Why do Vimshottari dasha dates differ?

Put two displayed Moon positions and one disputed first boundary on the same workbench. The lab changes one input at a time, so a date mismatch becomes an inspectable Moon-position contribution and calendar-conversion contribution instead of a guess.

Two calculators can use the same nine lords and still print different dates. First, a different UTC birth instant, ephemeris, ayanamsa, or degree-rounding rule can move the sidereal Moon. That changes the fraction of its nakshatra left at birth and therefore the opening balance. Near a nakshatra boundary, a small position change can select a different opening lord and a structurally different sequence.

Second, software must turn fractional Dasha years into calendar instants. Charting Stars declares a 365.2425-day mean-Gregorian conversion. The lab also shows a 365.25-day Julian-year comparison, a 365-day comparison, and a 360-day arithmetic comparison. Changing days per year preserves every fractional age, nakshatra, and lord; it changes only the printed calendar boundaries.

Same sequence, shifted dates. That points to calendar conversion or display rules after the Moon-based balance agrees. Nakshatra boundary crossed; opening lord changed. That is not a like-for-like date shift: the two timelines start from different structural inputs.

Load a worked case
Explain a first Mahadasha boundary mismatch

Enter each calculator’s displayed sidereal Moon sign and degree within that sign. The lab derives the shortest signed difference after each tool’s astronomy and ayanamsa steps; the two positions must be within 5°. The baseline’s opening balance is engine-derived (2.500000 years in the loaded Rohini example), not copied from a rounded result table.

Same opening sequence; the boundary date shifted. The comparison’s first boundary is 13.106 days earlier than the charting stars baseline.

Charting Stars baseline

Rohini · Moon

Sidereal Moon
50.000000°
Progress in nakshatra
10.000000°
Balance at birth
2.500000000 years
Calendar conversion
365.2425 days/year
First boundary
2002-07-02 02:33 UTC
Comparison

Rohini · Moon

Sidereal Moon
50.000000°
Progress in nakshatra
10.000000°
Balance at birth
2.500000000 years
Calendar conversion
360 days/year
First boundary
2002-06-19 00:00 UTC
Moon-position contribution0.000 daysShift the Moon; hold 365.2425 days/year.
Year-convention contribution−13.106 daysHold the comparison Moon; change only days/year.
Total first-boundary difference−13.106 daysThe two contributions sum at full precision.

Closest tested conversion to 2002-06-19: Arithmetic year (360 days), whose displayed UTC date is 0 calendar days away. This ranks four declared conversions; it does not identify another calculator’s private method.

First five rows in each birth-to-age-120 window. When the opening lord changes, row numbers are structurally different rather than like-for-like periods.
RowCharting Stars baselineComparisonEnd-instant delta
1Moon · 2002-07-02 02:33 UTCMoon · 2002-06-19 00:00 UTC−13.106 days
2Mars · 2009-07-01 19:17 UTCMars · 2009-05-13 00:00 UTC−49.804 days
3Rahu · 2027-07-02 04:03 UTCRahu · 2027-02-08 00:00 UTC−144.169 days
4Jupiter · 2043-07-02 01:10 UTCJupiter · 2042-11-16 00:00 UTC−228.049 days
5Saturn · 2062-07-01 15:45 UTCSaturn · 2061-08-08 00:00 UTC−327.656 days

Privacy: the comparison link encodes the birth instant and both Moon positions in a URL fragment. The fragment stays in your browser unless you copy and share it; this button does not alter the current address bar.

What the lab can isolate

The Moon-position contribution holds Charting Stars’ 365.2425-day conversion fixed while applying the shortest signed longitude difference between the two Moon positions you enter. The year-convention contribution then holds that comparison Moon fixed while changing only the conversion. Entering another displayed boundary ranks the four tested conversions by civil UTC date; it does not reverse-engineer a private algorithm.

Check the birth instant before the arithmetic. Historical timezone or daylight-saving assumptions can turn the same local birth record into a different UTC instant. UTC versus local display and date rounding can also make equal instants look one civil day apart. Alternative starting-point traditions can change the opening lord and remain outside this Moon-based comparison.

The balance formula and Moon-based convention follow Sanjay Rath’s worked method. The Swiss Ephemeris documentation explains why named ayanamsas and precession models must be compared explicitly. This lab accepts two numeric Moon positions and derives their shortest signed difference instead of claiming that an unverified named profile reproduces another tool.

This is same-engine arithmetic and method-conformance evidence, not independent astronomical validation. It offers no predictive validation of Dasha meanings or life events and does not certify another calculator. For reusable test vectors, inspect the open 81-record Vimshottari conformance set.

§ Open data · release conformance

Open Vimshottari Dasha Conformance Set.

A versioned, deterministic set of all 27 nakshatras sampled at the start, midpoint, and near-end: 81 cases generated by the same Dasha functions used by the calculator. Sample positions are start = 0, midpoint = 0.5, and near-end = 1 − 1e−9 of each nakshatra span.

Release vimshottari-conformance-2026-09-04-v1 records the sidereal Moon longitude, starting lord, remaining nakshatra fraction, opening balance, period count, final lord, sequence continuity, Antardasha continuity and parent-window sum, and exact [0, 120) closure. Period dates use the documented 365.2425-day year convention.

These are method-conformance vectors. They are not independent astronomical validation and provide no predictive validation of Dasha interpretations or life events.

The record-set SHA-256 is 297fb4ccff0cf62202b71d7108a5805679813bcbf02288529164abffef0d1bd6. The 81 records are available under the CC BY 4.0 license. Permanent JSON, CSV, and manifest URLs for this release are linked below.

Suggested citation
Charting Stars. "Open Vimshottari Dasha Conformance Set." Release vimshottari-conformance-2026-09-04-v1, 2026-09-04. https://chartingstars.com/vedic-chart#vimshottari-conformance-set. CC BY 4.0.

Run all 81 cases in JavaScript or Python

Download the permanent JSON release to a local file: https://chartingstars.com/vedic-chart/conformance/vimshottari-conformance-2026-09-04-v1.json. Before parsing, each zero-dependency harness verifies the raw artifact SHA-256: f37e8f3b3514d160fde235857b2b2838de6107fb4f613c590ec2d5afbbef108a.

Evidence boundary: these examples test Dasha arithmetic from each supplied, already-sidereal Moon longitude. They do not compute or validate an ephemeris, ayanamsa, astronomical position, predictive result, or civil date.

JavaScript · CommonJS · save as adopt-vimshottari.cjs
"use strict";

// This harness uses CommonJS. Save it as adopt-vimshottari.cjs so it also runs
// inside Node.js projects whose package.json declares "type": "module".
// Download this immutable release once, then run the harness against the local file:
// https://chartingstars.com/vedic-chart/conformance/vimshottari-conformance-2026-09-04-v1.json
// Scope: supplied, already-sidereal Moon longitudes and Dasha arithmetic only.
// This does not compute or validate an ephemeris, ayanamsa, astronomical position,
// predictive result, or civil date.

const { createHash } = require("node:crypto");
const { readFileSync } = require("node:fs");

const RELEASE_ID = "vimshottari-conformance-2026-09-04-v1";
const RELEASE_URL =
  "https://chartingstars.com/vedic-chart/conformance/vimshottari-conformance-2026-09-04-v1.json";
const DEFAULT_RELEASE_PATH = "./vimshottari-conformance-2026-09-04-v1.json";
const ARTIFACT_SHA256 =
  "f37e8f3b3514d160fde235857b2b2838de6107fb4f613c590ec2d5afbbef108a";
const RECORD_SET_SHA256 =
  "297fb4ccff0cf62202b71d7108a5805679813bcbf02288529164abffef0d1bd6";
const SCHEMA_VERSION = 1;
const RECORD_COUNT = 81;
const ABSOLUTE_TOLERANCE = 1e-9;

const EXACT_FIELDS = [
  "nakshatraIndex",
  "nakshatra",
  "startingLord",
  "periodCount",
  "finalLord",
  "sequenceContiguous",
  "antardashasContiguous",
  "antardashasSumToParents",
  "closesAtAge120",
];

const TOLERANCE_FIELDS = [
  "remainingFraction",
  "openingBalanceYears",
  "startAge",
  "endAge",
];

function sha256(value) {
  return createHash("sha256").update(value).digest("hex");
}

function requireCondition(condition, message) {
  if (!condition) {
    throw new Error(message);
  }
}

function requireExact(actual, expected, label) {
  requireCondition(
    Object.is(actual, expected),
    label + ": expected " + String(expected) + ", received " + String(actual),
  );
}

function loadConformanceSet(releasePath = DEFAULT_RELEASE_PATH) {
  const rawArtifact = readFileSync(releasePath);
  requireExact(
    sha256(rawArtifact),
    ARTIFACT_SHA256,
    "raw JSON artifact SHA-256",
  );

  let dataset;
  try {
    dataset = JSON.parse(rawArtifact.toString("utf8"));
  } catch (error) {
    throw new Error("release is not valid UTF-8 JSON", { cause: error });
  }

  requireCondition(
    dataset !== null && typeof dataset === "object" && !Array.isArray(dataset),
    "release root must be an object",
  );
  requireExact(dataset.schemaVersion, SCHEMA_VERSION, "schemaVersion");
  requireExact(dataset.releaseId, RELEASE_ID, "releaseId");
  requireExact(dataset.recordCount, RECORD_COUNT, "recordCount");
  requireCondition(Array.isArray(dataset.records), "records must be an array");
  requireExact(dataset.records.length, RECORD_COUNT, "records.length");

  const ids = new Set();
  dataset.records.forEach((record, index) => {
    requireCondition(
      record !== null && typeof record === "object" && !Array.isArray(record),
      "record " + index + " must be an object",
    );
    requireCondition(
      typeof record.id === "string" && record.id.length > 0,
      "record " + index + " must have a non-empty string id",
    );
    ids.add(record.id);
  });
  requireExact(ids.size, RECORD_COUNT, "unique record IDs");

  // JSON.parse preserves the published property order, so this compact digest
  // can additionally pin the record projection in JavaScript.
  requireExact(
    sha256(Buffer.from(JSON.stringify(dataset.records), "utf8")),
    RECORD_SET_SHA256,
    "record-set SHA-256",
  );

  return dataset.records;
}

function assertImplementation(computeCase, records) {
  requireCondition(typeof computeCase === "function", "computeCase must be a function");
  requireCondition(Array.isArray(records), "records must be an array");
  requireExact(records.length, RECORD_COUNT, "records.length");

  records.forEach((expected) => {
    const actual = computeCase(expected.siderealMoonLongitude);
    requireCondition(
      actual !== null && typeof actual === "object" && !Array.isArray(actual),
      expected.id + ": computeCase must return an object",
    );

    EXACT_FIELDS.forEach((field) => {
      requireCondition(
        Object.prototype.hasOwnProperty.call(actual, field),
        expected.id + ": missing " + field,
      );
      requireExact(actual[field], expected[field], expected.id + ": " + field);
    });

    TOLERANCE_FIELDS.forEach((field) => {
      requireCondition(
        Object.prototype.hasOwnProperty.call(actual, field),
        expected.id + ": missing " + field,
      );
      requireCondition(
        typeof actual[field] === "number" && Number.isFinite(actual[field]),
        expected.id + ": " + field + " must be a finite number",
      );
      const difference = Math.abs(actual[field] - expected[field]);
      requireCondition(
        difference <= ABSOLUTE_TOLERANCE,
        expected.id + ": " + field + " differs by " + difference,
      );
    });
  });

  return records.length;
}

module.exports = Object.freeze({
  RELEASE_ID,
  RELEASE_URL,
  ARTIFACT_SHA256,
  loadConformanceSet,
  assertImplementation,
});

// Adapter shape:
// const records = loadConformanceSet();
// assertImplementation((siderealMoonLongitude) => {
//   return yourDashaEngine.computeConformanceCase(siderealMoonLongitude);
// }, records);
Python · standard library
"""Offline harness for the immutable Open Vimshottari conformance release.

Download this release once, then run the harness against the local file:
https://chartingstars.com/vedic-chart/conformance/vimshottari-conformance-2026-09-04-v1.json

Scope: supplied, already-sidereal Moon longitudes and Dasha arithmetic only.
This does not compute or validate an ephemeris, ayanamsa, astronomical position,
predictive result, or civil date.
"""

from collections.abc import Mapping
from hashlib import sha256
from math import isfinite
from pathlib import Path

import json


RELEASE_ID = "vimshottari-conformance-2026-09-04-v1"
RELEASE_URL = (
    "https://chartingstars.com/vedic-chart/conformance/"
    "vimshottari-conformance-2026-09-04-v1.json"
)
DEFAULT_RELEASE_PATH = Path("./vimshottari-conformance-2026-09-04-v1.json")
ARTIFACT_SHA256 = (
    "f37e8f3b3514d160fde235857b2b2838de6107fb4f613c590ec2d5afbbef108a"
)
SCHEMA_VERSION = 1
RECORD_COUNT = 81
ABSOLUTE_TOLERANCE = 1e-9

EXACT_FIELDS = (
    "nakshatraIndex",
    "nakshatra",
    "startingLord",
    "periodCount",
    "finalLord",
    "sequenceContiguous",
    "antardashasContiguous",
    "antardashasSumToParents",
    "closesAtAge120",
)

TOLERANCE_FIELDS = (
    "remainingFraction",
    "openingBalanceYears",
    "startAge",
    "endAge",
)


def _require(condition, message):
    if not condition:
        raise AssertionError(message)


def _require_exact(actual, expected, label):
    _require(
        type(actual) is type(expected) and actual == expected,
        f"{label}: expected {expected!r}, received {actual!r}",
    )


def load_conformance_set(release_path=DEFAULT_RELEASE_PATH):
    """Verify the raw local artifact before returning its 81 records."""
    raw_artifact = Path(release_path).read_bytes()
    _require_exact(
        sha256(raw_artifact).hexdigest(),
        ARTIFACT_SHA256,
        "raw JSON artifact SHA-256",
    )

    dataset = json.loads(raw_artifact)
    _require(type(dataset) is dict, "release root must be an object")
    _require_exact(dataset.get("schemaVersion"), SCHEMA_VERSION, "schemaVersion")
    _require_exact(dataset.get("releaseId"), RELEASE_ID, "releaseId")
    _require_exact(dataset.get("recordCount"), RECORD_COUNT, "recordCount")

    records = dataset.get("records")
    _require(type(records) is list, "records must be an array")
    _require_exact(len(records), RECORD_COUNT, "records length")

    ids = set()
    for index, record in enumerate(records):
        _require(type(record) is dict, f"record {index} must be an object")
        record_id = record.get("id")
        _require(
            type(record_id) is str and len(record_id) > 0,
            f"record {index} must have a non-empty string id",
        )
        ids.add(record_id)
    _require_exact(len(ids), RECORD_COUNT, "unique record IDs")

    # The raw artifact hash above is the cross-language byte contract. Do not
    # recreate the JavaScript record digest with json.dumps: Python's number
    # serialization is not the published JSON.stringify serialization.
    return records


def assert_implementation(compute_case, records):
    """Run compute_case(longitude) against every published Dasha vector."""
    _require(callable(compute_case), "compute_case must be callable")
    _require(type(records) is list, "records must be an array")
    _require_exact(len(records), RECORD_COUNT, "records length")

    for expected in records:
        actual = compute_case(expected["siderealMoonLongitude"])
        _require(
            isinstance(actual, Mapping),
            f"{expected['id']}: compute_case must return a mapping",
        )

        for field in EXACT_FIELDS:
            _require(field in actual, f"{expected['id']}: missing {field}")
            _require_exact(
                actual[field],
                expected[field],
                f"{expected['id']}: {field}",
            )

        for field in TOLERANCE_FIELDS:
            _require(field in actual, f"{expected['id']}: missing {field}")
            value = actual[field]
            _require(
                not isinstance(value, bool)
                and isinstance(value, (int, float))
                and isfinite(value),
                f"{expected['id']}: {field} must be a finite number",
            )
            difference = abs(value - expected[field])
            _require(
                difference <= ABSOLUTE_TOLERANCE,
                f"{expected['id']}: {field} differs by {difference}",
            )

    return len(records)


# Adapter shape:
# records = load_conformance_set()
# assert_implementation(
#     lambda sidereal_moon_longitude: your_dasha_engine.compute_conformance_case(
#         sidereal_moon_longitude
#     ),
#     records,
# )

Method sources and coordinate context

The cycle, nakshatra-lord order, period lengths, and balance method are described in Sanjay Rath’s Vimshottari Dasa guide and the Brihat Parashara Hora Shastra (BPHS). The Swiss Ephemeris documentation provides sidereal-coordinate and Lahiri context; it is not being used here as an independent result oracle.

Reproducing a published balance example

Public input: 1934-11-12 18:20 IST at 20°30′ N, 85°50′ E. That civil time is 1934-11-12T12:50:00Z for the calculation.

The source reports Uttara Ashadha, Sun as the opening lord, a remaining factor of 0.31098, and a balance of 1.865875 years. At its published decimal precision, that factor implies 9.187° traversed within the nakshatra.

The source prints the Moon as 305°51′13″ and the nakshatra start as 296°40′ while labeling the Moon Uttara Ashadha. Those printed longitudes are 30° inconsistent with the standard Uttara Ashadha arc. Because the same offset appears in both printed values, the common 30° offset cancels in M−N.

The production-equivalent UTC → tropical chart → Lahiri sidereal chart chain returns a Moon at 275.853°, Uttara Ashadha, with 9.186° traversed. Its opening lord is Sun, remaining factor 0.3110169, and balance 1.866101 years. Remaining-factor delta: 0.0000369 (absolute). Balance delta in years: 0.0002263 (absolute).

The traversed-arc difference is 0.0005° — about 2 arcseconds. The arc difference is arithmetic from rounded source figures and is not an astronomical accuracy result or end-to-end validation. For unit context, the balance difference is 1.984 hours under Charting Stars’ 365.2425-day convention. The source’s 360-day worked decomposition uses a different conversion, so the convention-neutral factor and balance in years are the primary comparison.

We compare only the within-nakshatra interval M−N, remaining factor, and opening balance, not the absolute longitudes.

Sanjay Rath also describes alternative starting-point traditions. Those rules can select a different reference and therefore another opening lord. For human charts his guidance is to prefer the Moon when in doubt; this reproduction exercises that common Moon-nakshatra convention without treating the alternatives as errors.

81 deterministic conformance vectors: every nakshatra at start, midpoint, and near-end.
Case IDNakshatraSampleMoon longitudeStarting lordRemaining fractionOpening balancePeriodsFinal lordSequenceAntardashasBounds
01-ashwini-startAshwinistart0.000000000°Ketu1.0000000007.000000000 years9MercuryContiguousContiguous; parent sum exact[0, 120) exact
01-ashwini-midpointAshwinimidpoint6.666666667°Ketu0.5000000003.500000000 years10KetuContiguousContiguous; parent sum exact[0, 120) exact
01-ashwini-near-endAshwininear-end13.333333320°Ketu0.0000000010.000000007 years10KetuContiguousContiguous; parent sum exact[0, 120) exact
02-bharani-startBharanistart13.333333333°Venus1.00000000020.000000000 years9KetuContiguousContiguous; parent sum exact[0, 120) exact
02-bharani-midpointBharanimidpoint20.000000000°Venus0.50000000010.000000000 years10VenusContiguousContiguous; parent sum exact[0, 120) exact
02-bharani-near-endBharaninear-end26.666666653°Venus0.0000000010.000000020 years10VenusContiguousContiguous; parent sum exact[0, 120) exact
03-krittika-startKrittikastart26.666666667°Sun1.0000000006.000000000 years9VenusContiguousContiguous; parent sum exact[0, 120) exact
03-krittika-midpointKrittikamidpoint33.333333333°Sun0.5000000003.000000000 years10SunContiguousContiguous; parent sum exact[0, 120) exact
03-krittika-near-endKrittikanear-end39.999999987°Sun0.0000000010.000000006 years10SunContiguousContiguous; parent sum exact[0, 120) exact
04-rohini-startRohinistart40.000000000°Moon1.00000000010.000000000 years9SunContiguousContiguous; parent sum exact[0, 120) exact
04-rohini-midpointRohinimidpoint46.666666667°Moon0.5000000005.000000000 years10MoonContiguousContiguous; parent sum exact[0, 120) exact
04-rohini-near-endRohininear-end53.333333320°Moon0.0000000010.000000010 years10MoonContiguousContiguous; parent sum exact[0, 120) exact
05-mrigashira-startMrigashirastart53.333333333°Mars1.0000000007.000000000 years9MoonContiguousContiguous; parent sum exact[0, 120) exact
05-mrigashira-midpointMrigashiramidpoint60.000000000°Mars0.5000000003.500000000 years10MarsContiguousContiguous; parent sum exact[0, 120) exact
05-mrigashira-near-endMrigashiranear-end66.666666653°Mars0.0000000010.000000007 years10MarsContiguousContiguous; parent sum exact[0, 120) exact
06-ardra-startArdrastart66.666666667°Rahu1.00000000018.000000000 years9MarsContiguousContiguous; parent sum exact[0, 120) exact
06-ardra-midpointArdramidpoint73.333333333°Rahu0.5000000009.000000000 years10RahuContiguousContiguous; parent sum exact[0, 120) exact
06-ardra-near-endArdranear-end79.999999987°Rahu0.0000000010.000000018 years10RahuContiguousContiguous; parent sum exact[0, 120) exact
07-punarvasu-startPunarvasustart80.000000000°Jupiter1.00000000016.000000000 years9RahuContiguousContiguous; parent sum exact[0, 120) exact
07-punarvasu-midpointPunarvasumidpoint86.666666667°Jupiter0.5000000008.000000000 years10JupiterContiguousContiguous; parent sum exact[0, 120) exact
07-punarvasu-near-endPunarvasunear-end93.333333320°Jupiter0.0000000010.000000016 years10JupiterContiguousContiguous; parent sum exact[0, 120) exact
08-pushya-startPushyastart93.333333333°Saturn1.00000000019.000000000 years9JupiterContiguousContiguous; parent sum exact[0, 120) exact
08-pushya-midpointPushyamidpoint100.000000000°Saturn0.5000000009.500000000 years10SaturnContiguousContiguous; parent sum exact[0, 120) exact
08-pushya-near-endPushyanear-end106.666666653°Saturn0.0000000010.000000019 years10SaturnContiguousContiguous; parent sum exact[0, 120) exact
09-ashlesha-startAshleshastart106.666666667°Mercury1.00000000017.000000000 years9SaturnContiguousContiguous; parent sum exact[0, 120) exact
09-ashlesha-midpointAshleshamidpoint113.333333333°Mercury0.5000000008.500000000 years10MercuryContiguousContiguous; parent sum exact[0, 120) exact
09-ashlesha-near-endAshleshanear-end119.999999987°Mercury0.0000000010.000000017 years10MercuryContiguousContiguous; parent sum exact[0, 120) exact
10-magha-startMaghastart120.000000000°Ketu1.0000000007.000000000 years9MercuryContiguousContiguous; parent sum exact[0, 120) exact
10-magha-midpointMaghamidpoint126.666666667°Ketu0.5000000003.500000000 years10KetuContiguousContiguous; parent sum exact[0, 120) exact
10-magha-near-endMaghanear-end133.333333320°Ketu0.0000000010.000000007 years10KetuContiguousContiguous; parent sum exact[0, 120) exact
11-purva-phalguni-startPurva Phalgunistart133.333333333°Venus1.00000000020.000000000 years9KetuContiguousContiguous; parent sum exact[0, 120) exact
11-purva-phalguni-midpointPurva Phalgunimidpoint140.000000000°Venus0.50000000010.000000000 years10VenusContiguousContiguous; parent sum exact[0, 120) exact
11-purva-phalguni-near-endPurva Phalguninear-end146.666666653°Venus0.0000000010.000000020 years10VenusContiguousContiguous; parent sum exact[0, 120) exact
12-uttara-phalguni-startUttara Phalgunistart146.666666667°Sun1.0000000006.000000000 years9VenusContiguousContiguous; parent sum exact[0, 120) exact
12-uttara-phalguni-midpointUttara Phalgunimidpoint153.333333333°Sun0.5000000003.000000000 years10SunContiguousContiguous; parent sum exact[0, 120) exact
12-uttara-phalguni-near-endUttara Phalguninear-end159.999999987°Sun0.0000000010.000000006 years10SunContiguousContiguous; parent sum exact[0, 120) exact
13-hasta-startHastastart160.000000000°Moon1.00000000010.000000000 years9SunContiguousContiguous; parent sum exact[0, 120) exact
13-hasta-midpointHastamidpoint166.666666667°Moon0.5000000005.000000000 years10MoonContiguousContiguous; parent sum exact[0, 120) exact
13-hasta-near-endHastanear-end173.333333320°Moon0.0000000010.000000010 years10MoonContiguousContiguous; parent sum exact[0, 120) exact
14-chitra-startChitrastart173.333333333°Mars1.0000000007.000000000 years9MoonContiguousContiguous; parent sum exact[0, 120) exact
14-chitra-midpointChitramidpoint180.000000000°Mars0.5000000003.500000000 years10MarsContiguousContiguous; parent sum exact[0, 120) exact
14-chitra-near-endChitranear-end186.666666653°Mars0.0000000010.000000007 years10MarsContiguousContiguous; parent sum exact[0, 120) exact
15-swati-startSwatistart186.666666667°Rahu1.00000000018.000000000 years9MarsContiguousContiguous; parent sum exact[0, 120) exact
15-swati-midpointSwatimidpoint193.333333333°Rahu0.5000000009.000000000 years10RahuContiguousContiguous; parent sum exact[0, 120) exact
15-swati-near-endSwatinear-end199.999999987°Rahu0.0000000010.000000018 years10RahuContiguousContiguous; parent sum exact[0, 120) exact
16-vishakha-startVishakhastart200.000000000°Jupiter1.00000000016.000000000 years9RahuContiguousContiguous; parent sum exact[0, 120) exact
16-vishakha-midpointVishakhamidpoint206.666666667°Jupiter0.5000000008.000000000 years10JupiterContiguousContiguous; parent sum exact[0, 120) exact
16-vishakha-near-endVishakhanear-end213.333333320°Jupiter0.0000000010.000000016 years10JupiterContiguousContiguous; parent sum exact[0, 120) exact
17-anuradha-startAnuradhastart213.333333333°Saturn1.00000000019.000000000 years9JupiterContiguousContiguous; parent sum exact[0, 120) exact
17-anuradha-midpointAnuradhamidpoint220.000000000°Saturn0.5000000009.500000000 years10SaturnContiguousContiguous; parent sum exact[0, 120) exact
17-anuradha-near-endAnuradhanear-end226.666666653°Saturn0.0000000010.000000019 years10SaturnContiguousContiguous; parent sum exact[0, 120) exact
18-jyeshtha-startJyeshthastart226.666666667°Mercury1.00000000017.000000000 years9SaturnContiguousContiguous; parent sum exact[0, 120) exact
18-jyeshtha-midpointJyeshthamidpoint233.333333333°Mercury0.5000000008.500000000 years10MercuryContiguousContiguous; parent sum exact[0, 120) exact
18-jyeshtha-near-endJyeshthanear-end239.999999987°Mercury0.0000000010.000000017 years10MercuryContiguousContiguous; parent sum exact[0, 120) exact
19-mula-startMulastart240.000000000°Ketu1.0000000007.000000000 years9MercuryContiguousContiguous; parent sum exact[0, 120) exact
19-mula-midpointMulamidpoint246.666666667°Ketu0.5000000003.500000000 years10KetuContiguousContiguous; parent sum exact[0, 120) exact
19-mula-near-endMulanear-end253.333333320°Ketu0.0000000010.000000007 years10KetuContiguousContiguous; parent sum exact[0, 120) exact
20-purva-ashadha-startPurva Ashadhastart253.333333333°Venus1.00000000020.000000000 years9KetuContiguousContiguous; parent sum exact[0, 120) exact
20-purva-ashadha-midpointPurva Ashadhamidpoint260.000000000°Venus0.50000000010.000000000 years10VenusContiguousContiguous; parent sum exact[0, 120) exact
20-purva-ashadha-near-endPurva Ashadhanear-end266.666666653°Venus0.0000000010.000000020 years10VenusContiguousContiguous; parent sum exact[0, 120) exact
21-uttara-ashadha-startUttara Ashadhastart266.666666667°Sun1.0000000006.000000000 years9VenusContiguousContiguous; parent sum exact[0, 120) exact
21-uttara-ashadha-midpointUttara Ashadhamidpoint273.333333333°Sun0.5000000003.000000000 years10SunContiguousContiguous; parent sum exact[0, 120) exact
21-uttara-ashadha-near-endUttara Ashadhanear-end279.999999987°Sun0.0000000010.000000006 years10SunContiguousContiguous; parent sum exact[0, 120) exact
22-shravana-startShravanastart280.000000000°Moon1.00000000010.000000000 years9SunContiguousContiguous; parent sum exact[0, 120) exact
22-shravana-midpointShravanamidpoint286.666666667°Moon0.5000000005.000000000 years10MoonContiguousContiguous; parent sum exact[0, 120) exact
22-shravana-near-endShravananear-end293.333333320°Moon0.0000000010.000000010 years10MoonContiguousContiguous; parent sum exact[0, 120) exact
23-dhanishta-startDhanishtastart293.333333333°Mars1.0000000007.000000000 years9MoonContiguousContiguous; parent sum exact[0, 120) exact
23-dhanishta-midpointDhanishtamidpoint300.000000000°Mars0.5000000003.500000000 years10MarsContiguousContiguous; parent sum exact[0, 120) exact
23-dhanishta-near-endDhanishtanear-end306.666666653°Mars0.0000000010.000000007 years10MarsContiguousContiguous; parent sum exact[0, 120) exact
24-shatabhisha-startShatabhishastart306.666666667°Rahu1.00000000018.000000000 years9MarsContiguousContiguous; parent sum exact[0, 120) exact
24-shatabhisha-midpointShatabhishamidpoint313.333333333°Rahu0.5000000009.000000000 years10RahuContiguousContiguous; parent sum exact[0, 120) exact
24-shatabhisha-near-endShatabhishanear-end319.999999987°Rahu0.0000000010.000000018 years10RahuContiguousContiguous; parent sum exact[0, 120) exact
25-purva-bhadra-startPurva Bhadrastart320.000000000°Jupiter1.00000000016.000000000 years9RahuContiguousContiguous; parent sum exact[0, 120) exact
25-purva-bhadra-midpointPurva Bhadramidpoint326.666666667°Jupiter0.5000000008.000000000 years10JupiterContiguousContiguous; parent sum exact[0, 120) exact
25-purva-bhadra-near-endPurva Bhadranear-end333.333333320°Jupiter0.0000000010.000000016 years10JupiterContiguousContiguous; parent sum exact[0, 120) exact
26-uttara-bhadra-startUttara Bhadrastart333.333333333°Saturn1.00000000019.000000000 years9JupiterContiguousContiguous; parent sum exact[0, 120) exact
26-uttara-bhadra-midpointUttara Bhadramidpoint340.000000000°Saturn0.5000000009.500000000 years10SaturnContiguousContiguous; parent sum exact[0, 120) exact
26-uttara-bhadra-near-endUttara Bhadranear-end346.666666653°Saturn0.0000000010.000000019 years10SaturnContiguousContiguous; parent sum exact[0, 120) exact
27-revati-startRevatistart346.666666667°Mercury1.00000000017.000000000 years9SaturnContiguousContiguous; parent sum exact[0, 120) exact
27-revati-midpointRevatimidpoint353.333333333°Mercury0.5000000008.500000000 years10MercuryContiguousContiguous; parent sum exact[0, 120) exact
27-revati-near-endRevatinear-end359.999999987°Mercury0.0000000010.000000017 years10MercuryContiguousContiguous; parent sum exact[0, 120) exact
§ FAQ · Vedic chart

Common questions.

01

What is the difference between a Vedic chart and a Western birth chart?

Both start from the same sky. A Western (tropical) chart measures the zodiac from the March equinox; a Vedic (sidereal) chart measures it from a fixed star reference, currently about 24 degrees behind. Subtracting that offset — the ayanamsa — shifts most placements back by most of a sign, which is why a tropical Leo Sun is often a sidereal Cancer Sun.

02

Which ayanamsa does this calculator use?

Lahiri (Chitra Paksha) by default — the ayanamsa used by the Indian government's ephemeris and most Jyotish software. It is the only option in this engine checked against referenced Lahiri values. Raman and Krishnamurti (KP) remain selectable as approximate variants, not independently validated reproductions of those named definitions; verify boundary-sensitive work against a reference implementation.

03

What is a nakshatra and a pada?

The sidereal zodiac is divided into 27 nakshatras (lunar mansions) of 13°20′ each, every one with a ruling planet and a deity. Each nakshatra splits into four padas of 3°20′. The Moon's nakshatra at birth (janma nakshatra) sets the starting point of the Vimshottari dasha sequence.

04

How is the Vimshottari dasha calculated?

Vimshottari assigns nine graha periods totalling 120 years in a fixed order: Ketu 7, Venus 20, Sun 6, Moon 10, Mars 7, Rahu 18, Jupiter 16, Saturn 19, Mercury 17. The first period is the lord of the Moon's birth nakshatra, shortened in proportion to how far the Moon had already travelled through that nakshatra. Sub-periods (antardashas) divide each mahadasha in the same proportions.

05

Why do Vimshottari dasha dates differ between calculators?

A different UTC birth instant, ephemeris, ayanamsa, or rounding rule can move the sidereal Moon and change the balance left in its nakshatra. A Moon that crosses a nakshatra boundary can even change the opening lord and sequence. If the Moon and sequence agree, different days-per-year or civil-date display conventions can still shift printed boundaries. Alternative starting-point traditions are another separate cause. The comparison lab isolates a Moon-position shift from the calendar conversion without claiming to identify or certify another calculator's method.

06

How accurate are the positions?

The seven physical grahas use VSOP87 planetary theory and a Meeus lunar solution. Regression-tested across seven Rodden-rated fixtures with a 0.05° drift guard; selected positions are independently compared with published and JPL references. Rahu and Ketu use the Meeus mean-node polynomial. The Lahiri ayanamsa approximation matches the Swiss Ephemeris value to about 0.02° across 1900–2100.