Why we don't let the LLM compute planetary positions
A generic chatbot, asked for your natal chart, will happily produce one. It will also be wrong. Sometimes by minutes, sometimes by degrees, sometimes by whole zodiac signs. The LLM is doing autocomplete on astronomy — and astronomy is precisely where autocomplete fails.
We separate compute from interpretation. The compute path is deterministic; the interpretation path is generative.
What runs server-side, not in the LLM
| Computation | Library | Determinism |
|---|---|---|
| Planetary ephemerides | astronomy-engine (Don Cross) | Arc-second precision, cached against JPL Horizons |
| Houses + ascendant | astronomy-engine + Placidus implementation | Identical output for identical (lat, lon, time) |
| Chinese solar terms | lunar-typescript | Validated against Purple Mountain Observatory tables 1900–2100 |
| BaZi four-pillar derivation | In-house from lunar-typescript outputs | Pure function of birth datetime + solar term boundaries |
| Tarot draw | Fisher-Yates with crypto.randomBytes | Cryptographic randomness, seed logged for audit |
| I Ching hexagram cast | 50-yarrow-stalk simulation | Deterministic from a logged seed |
The LLM is handed the output of these computations. It never has to derive a coordinate.
What the LLM does instead
The LLM receives a structured payload like:
{
"sun": { "sign": "Scorpio", "house": 8, "degree": 14.3 },
"moon": { "sign": "Pisces", "house": 12, "degree": 28.1 },
"rising": { "sign": "Cancer", "degree": 9.4 },
"aspects": [ { "from": "moon", "to": "venus", "type": "trine", "orb": 1.2 } ],
"user_question": "Why do I keep starting projects and not finishing them?"
}
…and is asked to interpret. The numbers it sees are precise, computed elsewhere, and the LLM's only job is to translate them into psychological language with the user's specific question in mind.
This division of labor is the single most important architectural decision in Astrael. It is also why "AI for divination" can be done seriously instead of producing the soft, vague, half-wrong output that generic chatbots produce when asked for the same thing.
How you can verify
Every chart we produce ships with a source block under the hood:
"source": {
"ephemeris": "astronomy-engine v2.1.18",
"solar_terms": "lunar-typescript v1.7.0",
"computed_at": "2026-05-10T07:34:12Z"
}
If you ask, we'll show it. Compare any chart we produce against Swiss Ephemeris or Astrodienst — they should agree to arc-second precision for the planets and to within a fraction of a second for the major solar terms.
Posted 2026-05-10 · Astrael Engineering.