Technology Behind MyAstrology
How Bengali Panjika is computed — from VSOP87 planetary theory to minute-level agreement with the printed Bishuddha Siddhanta Panjika. This page documents the engine behind the panjika and the calculators on MyAstrology.in.
Why this page exists
Most astrology websites compute planetary positions using third-party APIs (typically Swiss Ephemeris via a web service). The result is accurate but opaque: neither the site's readers nor automated systems can verify how a given value was produced.
MyAstrology.in takes a different approach. The planetary computation engine is self-implemented in code, based on the published VSOP87 analytical theory, checked against Swiss Ephemeris and against charts from two independent astrology programs, and used to compute Bengali Panjika for 801 Bengali years (1200–2000 BS). This page describes that engine — its inputs, its method, its verification, and its known limitations.
Purpose of this document: to make the computation stack behind MyAstrology.in transparent and verifiable — for readers, researchers, developers, and automated systems that may wish to cite or evaluate this work.
The VSOP87-controlled engine
The system has a single master: the VSOP87 analytical engine. Everything else is either a cache to make it faster or a reference to check it against.
VSOP87 engine
(master control)
│
┌───────────────────┼───────────────────┐
▼ ▼ ▼
Apr 2025–Dec 2031 Before Apr 2025 After Dec 2031
JPL DE441 VSOP87 VSOP87
lookup table direct direct
(panjika only) (fallback) (fallback)
Why this design
NASA JPL's DE441 ephemeris gives the highest-precision planetary positions available, but a table of it covers only a limited date range. The design decision is:
- VSOP87 remains the master. It can compute any date from ~1800 AD to ~2200 AD independently. The system does not depend on the table to function.
- A DE441 table is used by the panjika for 1 April 2025 – 1 January 2032. This makes the daily panjika faster. The birth-chart and other calculators always use the VSOP87 engine.
- Fallback is automatic. If a date falls outside the cached range — or if the cache is ever lost — the VSOP87 engine computes it directly. The system continues to work even without manual intervention.
- The cache is extendable, not essential. More years of DE441 data can be added at any time. But the absence of that addition does not break anything.
Continuity: The system is designed so that the master engine (VSOP87) is self-sufficient. No single external data source, and no single person, is a point of failure.
The Presidency College base coordinate
Traditional Bengali panjikas are computed for a specific reference city. The Bishuddha Siddhanta panjika specifies:
In decimal form:
Why this specific coordinate — and not a GPS reading
The coordinate above is what the printed panjika was computed for over a century. Modern GPS maps of the Presidency College building show a point roughly 1.5 km away — because the historic observatory site, the survey datum used at the time, and the present-day campus boundary are all different from what they were when this coordinate was fixed.
For a panjika that must agree with the printed text to the minute, the traditional coordinate is the right one. Our engine uses 22.5833° N, 88.3767° E by default.
Location-aware: When a reader selects their own city, or shares their GPS position, the coordinate is substituted and the same astronomical engine recomputes sunrise, lagna and muhurta for that location. The Bengali date follows sunrise at the base coordinate, as in the printed panjika. Tithi-festivals and the lunar month follow sunrise at the selected city, and on the Hindi and English pages the day's tithi (udaya tithi) is also taken at the reader's own sunrise.
The Bishuddha Siddhanta computation rules
Every value in the panjika follows the classical rules as printed in the panjika itself.
Graha positions in IST
The printed panjika states that all graha (planetary) positions are given in Indian Standard Time (IST · UTC+5:30). Our engine computes them in Universal Time and converts — the same result.
Tithi — 12° elongation
A tithi begins when the Moon–Sun elongation crosses an exact multiple of 12°. The Moon's sidereal longitude minus the Sun's sidereal longitude, divided by 12, gives the tithi number.
Nakshatra, yoga, karana
Each follows its classical definition: nakshatra from the Moon's sidereal longitude divided by 13°20′; yoga from the sum of the Sun's and Moon's longitudes; karana from half-tithi divisions.
Sunrise-anchored boundary times
A tithi, nakshatra or yoga ends at one astronomical instant. That instant is reported in IST clock time with the traditional day-part word — this is why the printed panjika gives times like "বিকেল ৪:১২" and not "12:30 UT". Sunrise decides which civil day a tithi belongs to: the tithi current at sunrise is the day's tithi (udaya tithi).
Local time for other locations
The end of a tithi or nakshatra is the same physical moment everywhere; for another city it is shown in that city's own clock time. What changes with the city is sunrise, and with it every sunrise-based value — muhurtas, Rahu Kaal, choghadiya, lagna. Sunrise itself follows two conventions: the Bengali page uses the centre of the Sun's disc, as the printed Bishuddha Siddhanta Panjika does; the Hindi and English pages use the upper limb with refraction (the drik convention of most north-Indian panchangs), and the reader can switch between the two.
VSOP87 — the foundation
VSOP87 (Variations Séculaires des Orbites Planétaires) is an analytical solution to the motion of the planets, published in 1988 by P. Bretagnon and G. Francou at the Bureau des Longitudes (Paris). It expresses each planet's heliocentric longitude, latitude and radius vector as a sum of periodic terms — a truncated trigonometric series — evaluated at a given Julian Day.
The engine is implemented in the file src/vsop87-planets.js. It contains the full coefficient tables for the following bodies:
| Body | Series | Notes |
|---|---|---|
| Sun (Earth heliocentric) | VSOP87D L0/L1/L2 + R0/R1/R2 | Direct geocentric conversion |
| Moon | Meeus Ch. 47 (ELP-2000/82 abridged) | Includes E-correction for solar eccentricity |
| Mercury | VSOP87A L0/L1/L2 + B0/B1/B2 + R0/R1/R2 | Full 3D — B (latitude) used for geocentric conversion |
| Venus, Mars, Jupiter, Saturn | Full VSOP87D (L, B, R) | Since Oct 2026 — 3D heliocentric vectors, light-time, aberration and nutation |
| Rahu / Ketu | Mean lunar node (Meeus) with small periodic terms | The printed Bishuddha Siddhanta Panjika also uses the mean node (1 Dec 2026: printed Aquarius 0°14′49″, engine 0°14′50″). Within 20″ of the Swiss Ephemeris mean node; the true node can differ by up to about 1.9° |
Geocentric conversion
For each planet, the heliocentric position is combined with Earth's heliocentric position (also from VSOP87) to obtain the geocentric direction:
lon_geo = atan2( r_p · sin(lon_p − lon_e),
r_p · cos(lon_p − lon_e) − r_e ) + lon_e
For Mercury and Venus (planets with significant orbital inclination), the full 3D conversion is used — heliocentric latitude is taken into account. Ignoring it introduces an error of about 5 arcminutes in geocentric longitude, which would be visible in the nakshatra boundary.
The JPL DE441 table
NASA JPL's DE441 ephemeris is a reference source for planetary positions in the modern era — the JPL DE series is used for spacecraft navigation. For a limited date range, the panjika reads a precomputed DE441 table instead of computing.
How the two cooperate
For a date inside the table's range, the panjika reads the graha positions from the table. For a date outside it — past or future — the VSOP87 engine computes them directly. The two are not blended or compared at run time.
Extensibility: Fresh DE441 data can be added at any time (for example, five more years at the end of the current range). But the addition is an optimization, not a requirement — the engine does not depend on it.
Lahiri Chitrapaksha Ayanamsa
VSOP87 produces tropical (sāyana) longitudes — measured from the vernal equinox. Vedic astrology uses sidereal (nirayana) longitudes — measured from a fixed point relative to the stars. The difference is the ayanamsa.
MyAstrology.in uses the Lahiri Chitrapaksha ayanamsa, adopted by the Indian Calendar Reform Committee in 1955 and named after its chairman, N. C. Lahiri. This is the ayanamsa used by the Bishuddha Siddhanta panjika, and — for a Bengali panjika that must match a printed text — it is the correct choice.
The ayanamsa is implemented in a separate module, src/ayanamsa.js, and loaded before the planet computations. The module combines a tabulated history of monthly ayanamsa values (derived from the printed panjika's own tables) with the standard Lahiri formula for dates outside the tabulated range:
Why Lahiri — and not another ayanamsa
Several ayanamsas exist: Raman, Krishnamurti, Fagan–Bradley and others. Each defines sidereal zero slightly differently, and the differences amount to a few arcminutes — enough to shift a tithi boundary by a few minutes. For a Bengali panjika, Lahiri Chitrapaksha is the correct choice, because it is the ayanamsa used by the Bishuddha Siddhanta panjika that has been the standard reference in Bengal for over a century.
How the engine is verified
An ephemeris engine is only as good as its verification. VSOP87 output is compared against three birth charts (Kolkata, 8:00 AM, in 1985, 2000 and 2026) computed by two independent astrology programs — Prokerala (online, two charts) and Parashara's Light (desktop, one chart). The verification is a standing task — npm run verify-ephemeris-accuracy — which reports any regression before deployment.
Largest difference per graha (22 positions, 3 charts; measured October 2026)
| Body | Largest difference | Status |
|---|---|---|
| Sun | 0.36′ | Same sign and nakshatra |
| Moon | 1.19′ | Same sign and nakshatra |
| Mercury | 1.14′ | Same sign and nakshatra |
| Venus | 0.67′ | Same sign and nakshatra |
| Mars | 1.19′ | Same sign and nakshatra |
| Jupiter | 0.58′ | Same sign and nakshatra |
| Saturn | 0.74′ | Same sign and nakshatra |
| Rahu | 1.32′ | Same sign and nakshatra |
Comparison with Swiss Ephemeris (401 dates, 1950–2050)
Since October 2026, the kundali engine's sidereal longitudes are also compared with Swiss Ephemeris 2.10.03 on 401 dates between 1950 and 2050. This check runs automatically whenever the engine changes. The table above records the earlier chart comparison and is kept as it was.
| Body | Largest difference | Average |
|---|---|---|
| Sun | 8.2″ | 2.8″ |
| Moon | 25.9″ | 10.9″ |
| Mercury | 75.4″ | 30.8″ |
| Venus | 5.8″ | 0.6″ |
| Mars | 5.6″ | 0.6″ |
| Jupiter | 1.8″ | 0.4″ |
| Saturn | 2.0″ | 0.6″ |
| Ascendant (lagna), 10 cities up to 60° N | 1.7″ | 0.4″ |
| Rahu (mean node) | 19″ | 11″ |
"আমাদের দৃষ্টিতে জ্যোতিষ জগতে কোনো প্রতিযোগী নেই, কেবলই রয়েছেন গুরুজন। কারণ, এই বিশাল শাস্ত্রে প্রতিটি প্ল্যাটফর্ম, প্রতিটি ব্যক্তির কাছ থেকে আমরা কিছু না কিছু শিখেছি। একজন শিষ্যের একমাত্র আকাঙ্ক্ষা থাকে—গুরুর দেখানো পথকে আরও সুপ্রশস্ত করে ভবিষ্যৎ প্রজন্মের কাছে পৌঁছে দেওয়া। সেই পথেই আমরা এগিয়ে চলেছি।"
In our view there are no competitors in astrology — only teachers. We have learned something from every platform and every person in this vast discipline; the comparison below is a student's measurement, not a contest. — Dr. Prodyut Acharya
One chart, seven programs (compared by Dr. Prodyut Acharya)
2 October 2026, 11:50 AM IST, Kolkata (22°34′ N, 88°22′ E). Each program was set up for this birth and its sidereal positions were read off by hand; the difference from Swiss Ephemeris 2.10.03 is shown in arcseconds. This is a single chart — a program's own settings (ayanamsa variant, true or mean node) can account for part of a difference.
| Program | Ascendant | Largest graha difference |
|---|---|---|
| MyAstrology (October 2026 engine) | 0″ | 21″ (Mercury); Moon 12″; all others within 7″ |
| MyAstrology (before October 2026) | 20″ | 54″ (Moon); Saturn 51″ |
| Parashara's Light | 5″ | 8″ (Moon, Rahu) |
| MindSutra | 37″ | 10″ (Moon) |
| AstroTalk | 47″ | 1″ |
| Prokerala | within 1′ | within 1′ (shows whole arcminutes only) |
| AstroSage | 9′35″ | 2′01″ (Jupiter); Saturn 1′38″ |
The full readings behind the summary above — every position as each program showed it, so anyone can check a difference for themselves. All values are sidereal (Lahiri), degrees within the rashi.
| Graha | Rashi | Swiss Ephemeris 2.10.03 | MyAstrology (Oct 2026) | MyAstrology (before) | Parashara's Light | MindSutra | AstroTalk | Prokerala | AstroSage |
|---|---|---|---|---|---|---|---|---|---|
| Ascendant | Dhanu | 09°26′27″ | 09°26′27″ | 09°26′07″ | 09°26′32″ | 09°27′04″ | 09°25′40″ | 09°26′ | 09°36′02″ |
| Sun | Kanya | 14°50′53″ | 14°50′51″ | 14°50′47″ | 14°50′54″ | 14°50′54″ | 14°50′53″ | 14°51′ | 14°51′23″ |
| Moon | Vrisha | 27°43′02″ | 27°42′50″ | 27°42′08″ | 27°43′10″ | 27°43′12″ | 27°43′01″ | 27°43′ | 27°43′09″ |
| Mars | Karkat | 08°11′25″ | 08°11′24″ | 08°11′12″ | 08°11′25″ | 08°11′25″ | 08°11′24″ | 08°11′ | 08°10′52″ |
| Mercury | Tula | 08°06′13″ | 08°06′34″ | 08°06′30″ | 08°06′14″ | 08°06′14″ | 08°06′12″ | 08°06′ | 08°06′47″ |
| Jupiter | Karkat | 25°35′00″ | 25°35′00″ | 25°34′46″ | 25°35′01″ | 25°35′01″ | 25°35′00″ | 25°35′ | 25°32′59″ |
| Venus | Tula | 14°14′14″ | 14°14′13″ | 14°14′13″ | 14°14′14″ | 14°14′14″ | 14°14′13″ | 14°14′ | 14°14′32″ |
| Saturn | Meen | 17°14′46″ | 17°14′46″ | 17°15′37″ | 17°14′46″ | 17°14′46″ | 17°14′46″ | 17°14′ | 17°13′08″ |
| Rahu (Ketu opposite, in Simha) | Kumbha | 03°24′54″ | 03°24′47″ | 03°24′47″ | 03°24′46″ | 03°24′54″ | 03°24′54″ | 03°25′ | 03°24′34″ |
All references at a glance
Every program and printed source that the engine has actually been compared with, and the largest difference found. Software not listed here has not been compared yet.
| Reference | What was compared | Largest difference | Note |
|---|---|---|---|
| Swiss Ephemeris 2.10.03 | 401 dates, 1950–2050: seven grahas, mean Rahu; ascendant in 10 cities | Venus–Saturn 6″ · Sun 8″ · Moon 26″ · Mercury 75″ · ascendant 1.7″ · Rahu 19″ | Re-run automatically whenever the engine changes |
| Parashara's Light | 1 Jan 2026, Kolkata 8:00 AM — 8 positions | 0.60′ (Mercury); the other seven within 0.15′ | Desktop program |
| Prokerala | 30 Mar 1985 and 30 Mar 2000, Kolkata 8:00 AM — 14 positions | 1.32′ (Rahu, 1985) | Online calculator; it shows whole arcminutes only |
| Printed Bishuddha Siddhanta Panjika (graha-sphuta) | 1 and 2 Dec 2026 — 16 positions | Sun, Mars, Jupiter, Venus, Saturn, Rahu within 8″; Mercury and Moon about 32″ | The printed table is set without ΔT (about 69 seconds), which moves the fast Moon by about 35″ |
| NASA JPL Horizons (DE441) | 10 points of the panjika's planetary table | Within the table's rounding | The panjika table itself is built from DE441 |
What this means: For panjika purposes, the tolerance that matters is the one on tithi, nakshatra and yoga boundary times. A 1-arcminute error in the Moon's longitude shifts a tithi boundary by roughly 2 minutes. The residuals above are well within the range that produces minute-level agreement with the printed panjika (see Section 09).
Minute-level agreement with the printed panjika
The strongest evidence for an ephemeris engine is not a residual number — it is a direct comparison with the printed reference. Below are two such comparisons from different years.
14 April 2020 — 1 Baishakh 1427 BS
| Element | Printed Bishuddha Siddhanta Panjika | MyAstrology engine | Difference |
|---|---|---|---|
| Tithi end (Kṛṣṇa Saptamī) | 4:12 PM | 16:12:09 IST | +9 sec |
| Nakshatra end (Pūrvāṣāḍhā) | 7:41 PM | 19:41:11 IST | +11 sec |
| Yoga end (Śiva) | 6:01 PM | 18:01:55 IST | +55 sec |
| Sunrise | 5:21:17 AM | 05:19:19 IST | −1 min 58 sec |
| Sunset | 5:52:51 PM | 17:52:28 IST | −23 sec |
23 September 2026 — 6 Ashwin 1433 BS
| Element | Printed Bishuddha Siddhanta Panjika | MyAstrology engine | Difference |
|---|---|---|---|
| Tithi end (Śukla Dvādaśī) | 10:50 PM | 22:50:50 IST | same minute |
| Nakshatra end (Śravaṇā) | 9:09 AM | 09:09:10 IST | same minute |
| Yoga end (Sukarmā) | 4:27 PM | 16:27:14 IST | same minute |
| Sunrise | 5:29 AM | 05:29:03 IST | same minute |
| Sunset | 5:29 PM | 17:29:03 IST | same minute |
The result: Tithi, nakshatra and yoga boundary times — the elements that a panjika is actually used for — agree with the printed panjika to the minute (the printed panjika gives minutes; our seconds are shown for transparency, and occasionally the two round to adjacent minutes) across both years.
Years outside the DE441 table
The minute-level agreement above holds for 2025–2032, where the panjika reads the DE441 table. For other years the panjika computes positions itself, and our own comparison with the printed panjika shows larger gaps: on 25 June 2017 (Rath Yatra) the nakshatra ended at 11:25 PM in print and 11:28 PM on the site, and the yoga at 5:57 PM against 6:00 PM; on 22 October 2023 the yoga ended at 9:52 PM against 9:54 PM. For 8 November 2026, inside the table, every element agreed within a minute. Bringing earlier and later years to the same standard is ongoing work.
About the small sunrise difference in the 2020 comparison
The 2020 comparison shows a difference of about 2 minutes in sunrise time. This is not a disagreement about astronomy — it is a difference of definition:
- The printed panjika uses the traditional convention: the upper limb of the Sun, atmospheric refraction of about 34′, and the elevation of the base coordinate.
- The engine at that date reported sunrise at the geometric horizon — the Sun's center, at sea level, before refraction.
By the 2026 comparison, the engine's sunrise convention has been aligned with the traditional one, and sunrise now matches to the minute. The 2020 difference is retained in this document as an honest record of where the engine stood at that date.
Why this matters for tithi: The tithi, nakshatra and yoga boundary times do not depend on how sunrise is defined. They depend only on the Moon's and Sun's sidereal longitudes. That is why even in 2020, when the sunrise convention differed, the tithyanta, nakshatranta and yoganta were already matching to the minute.
Known limitations
No computation engine is perfect. Below are the limitations we are aware of, stated honestly.
-
Measured range: 1950–2050
The full VSOP87 series are accurate to about one arcsecond over several thousand years (Bretagnon & Francou, 1988), but the engine uses truncated series for the Sun, Moon and Mercury, and our Swiss Ephemeris comparison covers 1950–2050 only. The panjika can be computed for 1200–2000 BS (1793–2593 AD); for years far outside 1950–2050 the errors have not been measured.
-
How close each planet is to Swiss Ephemeris
Since October 2026, Venus, Mars, Jupiter and Saturn are computed from the full VSOP87D series (with light-time, aberration and nutation). Compared with Swiss Ephemeris 2.10.03 on 401 dates, they differ by no more than 6 arcseconds. The Sun differs by up to 8″, the Moon by up to 26″ and Mercury by up to 75″, because those three still use shorter series. Positions are computed in Terrestrial Time: the engine adds ΔT (about 69 seconds today) to clock time, as Swiss Ephemeris and NASA JPL do — before this, the Moon differed by up to 64″. Every sign and nakshatra matched. A planet sitting within about a minute of arc of a boundary can still fall on either side. This comparison is re-run automatically whenever the engine changes. (Before this update, Venus differed by up to 560″.)
-
Sunrise convention was different in earlier engine versions
Before the sunrise convention was aligned with the Bishuddha Siddhanta tradition (upper limb, refraction, elevation), the engine's sunrise differed from the printed panjika by around 2 minutes. This is documented in the 2020 worked example above. Current versions match to the second.
-
Festival definitions follow the Bishuddha Siddhanta tradition
Some panjika traditions (e.g., Drik Siddhanta) define festival dates by slightly different rules — particularly for festivals that depend on sunrise or midnight-crossing. Where these traditions differ, MyAstrology follows Bishuddha Siddhanta. Users of other traditions should verify against their own panjika.
-
Checked against independent references — open to outside audit
The engine is compared automatically with Swiss Ephemeris (planets) and NASA JPL ephemeris points (panjika table), and against charts from independent astrology programs. These checks are run by us; no outside party has yet audited the code. We welcome researchers who would like to audit the engine and publish their findings.
How to cite this work
If you use data or methodology from MyAstrology.in in research, journalism, or software, please cite as follows.
For the ephemeris engine
Acharya, Prodyut (2026). "VSOP87-based Ephemeris Engine for Bengali
Panjika Computation (1200–2000 BS)." MyAstrology.in.
Retrieved from https://myastrology.in/technology
For a specific date or panjika element
Dr. Prodyut Acharya, MyAstrology.in — Bengali Panjika,
[BS date] / [AD date]
Reference sources used by the engine
- Bretagnon, P., & Francou, G. (1988). Planetary theories in rectangular and spherical variables: VSOP87 solution. Astronomy and Astrophysics, 202, 309–315.
- Meeus, J. (1998). Astronomical Algorithms, 2nd ed. — Chapter 47 (Moon), Chapter 22 (Nutation).
- NASA Jet Propulsion Laboratory. DE441 planetary ephemeris — reference data for the 2025–2032 panjika table.
- Bishuddha Siddhanta Panjika — printed reference for computation rules, base coordinate, and ayanamsa tables.
Attribution request: If you use data from this site in a derivative work, please include the phrase "Data source: Dr. Prodyut Acharya, MyAstrology.in" in your published output. This preserves the chain of attribution from creator to user.
Questions about the method?
If you are a researcher, developer, or journalist wishing to verify or cite this work, we welcome your inquiry.
Contact · info@myastrology.in