How Zodiux Calculates a Birth Chart

Every step between the three boxes you fill in and the wheel on your screen — with real numbers, and the one constant we hold fixed.

A Zodiux birth chart is three inputs and a short, checkable chain of arithmetic. You give a date, optionally a time, and a city. The city becomes a latitude, a longitude and a time-zone name. The time zone turns your wall clock into a UTC instant. That instant goes to an ephemeris, which returns where ten bodies appeared along the zodiac as seen from the centre of the Earth. Each of those longitudes is divided by 30 to give a sign and a degree. If you gave a birth time, one further step derives the degree climbing over the eastern horizon. That is the whole thing. This page walks it end to end on a real chart, shows the arithmetic at each step, and names what we round, what we approximate, and what we refuse to compute at all.

The whole pipeline, in order

Read this list first. Everything after it is one of these eight steps in detail.

What happens when you press Calculate

  1. You enter a birth date, an optional birth time, and a birth city.
  2. The city resolves to a latitude, a longitude and an IANA time-zone name from a dataset bundled with the page.
  3. Your wall-clock time is converted to a UTC instant through that zone, using your browser's own historical time-zone rules.
  4. That instant becomes an astronomical time object.
  5. Astronomy Engine returns a geocentric vector for each of ten bodies, which is converted to apparent ecliptic longitude.
  6. Each longitude is divided by 30: the whole part is the sign, the remainder is the degree within it.
  7. If a birth time was given, the ascendant is derived from local sidereal time at your birth longitude.
  8. Aspects are measured between the ten bodies, the wheel is drawn from those longitudes, and the written readings for your sun, moon and rising are pulled in.

Steps 3 to 7 — the time-zone conversion, the ephemeris call, the division by 30, the ascendant and the aspects — are pure arithmetic running in the page you are on, with no server involved and no birth detail leaving your device. Two of the eight steps are not that, and it would be sleight of hand to let the sentence cover them: step 2 reads a 35,968-row table of city coordinates and time-zone names, which is not bundled with the page at all — it is a 1.3 MB file fetched the first time you touch the birth-city box, and on a shared or restored chart it is fetched as the calculation's first act, and step 8 pulls fixed written readings from a table indexed by sign. Pressing Calculate also fires a first-party counter to our own server recording that a chart was run — the event name, the page path and the referring domain, never your birth details. Where each dataset came from and how often it changes is a separate question, answered on data sources and update cadence.

What you type, and what each field controls

Three fields. They do very different amounts of work, and they fail in very different ways.

Each input, what it sets, and what breaks if it is wrong
InputWhat it controlsIf it is wrong or missing
Birth dateEvery body's longitude. The slow planets — Jupiter outward — are set almost entirely by the date alone.Everything moves. The Sun can land in the wrong sign, and so can the Moon and every planet. This is the one input with no tolerance at all.
Birth timeThe Moon's exact degree, the ascendant, and how tight your aspects come out.Left blank, the code substitutes 12:00 local and omits the rising sign rather than guessing it. How much a wrong time costs is measured in birth time, time zones and DST.
Birth cityTwo separate things: the latitude and longitude used for the ascendant, and the time-zone name used to reach UTC.A different city in the same zone barely moves anything — see the error budget below. A different zone shifts the whole chart in time, which is the failure that actually bites.
Nothing elseZodiux asks for no name, no email and no account to draw a chart.There is nothing else to get wrong.

Note what is not in that table: your gender, your relationship status, your questions. None of it is collected, and none of it enters the arithmetic. The chart is a function of a moment and a place, and nothing else.

Steps 2 and 3: wall clock to UTC, in two lines of code

Everything before the astronomy is time-zone handling, and the implementation is short enough to state exactly. Zodiux first treats your wall-clock birth time as if it were already UTC, producing a provisional instant. It then asks the browser what offset your birth zone had at that provisional instant, and subtracts it. The offset comes from the browser's own copy of the IANA time-zone rules, reached through the standard date-formatting API — the same rules your operating system uses to decide what time it is right now.

That single pass is worth understanding, because it is what decides the two hours a year that have no clean answer. On a night when clocks go back, one local hour occurs twice; on a night when they go forward, one local hour never occurs. Sampling the offset at the provisional instant resolves both without asking you — silently, and in a fixed direction. Which direction, and what to do about it, is worked out on birth time, time zones and DST. It is the same page that measures how much an hour is worth.

Steps 4 and 5: what the ephemeris is actually asked

For each of ten bodies — Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune and Pluto — Zodiux asks Astronomy Engine for a geocentric vector at the birth instant with the aberration correction enabled, converts that vector to ecliptic coordinates, and keeps exactly one number out of the result: the ecliptic longitude. Everything else the ephemeris returns — distance, latitude, the whole third dimension — is discarded.

Each word in that sentence is doing work. Geocentric means measured from the centre of the Earth, not from your birth city: this is the standard convention in Western astrology, and it is why your latitude does not move a single planet. Apparent means corrected for the time light took to reach us and for the aberration caused by Earth's own motion, so the figure is where the body appeared to be, not where it physically was at that instant. Ecliptic longitude is the angle measured around the plane of Earth's orbit, starting from 0° Aries, the March equinox point. That one angle, somewhere between 0 and 360, is what the entire tropical zodiac is built on.

Two consequences follow immediately and are worth stating before anyone emails us about them. Because the request is geocentric, two people born at the same instant on opposite sides of the planet get identical planetary longitudes and differ only in their ascendant. And because the zodiac is measured from the equinox rather than from the constellations, a Zodiux Sun sign will not agree with where the Sun is against the background stars — that gap is the tropical-versus-sidereal question, not an error.

Retrograde, in one line

Retrograde is not read from a table either. The same body's longitude is requested for twenty-four hours earlier and subtracted; if the value went down, the body is moving backwards against the zodiac and gets marked with ℞. Sun and Moon are hard-coded as never retrograde, because from Earth they never are. What a twenty-four-hour sample costs near a station is measured on data sources.

Step 6: a longitude becomes a sign and a degree

Everything after the ephemeris is division. Take the longitude, divide by 30, and the whole part is the sign index: 0 is Aries, 1 is Taurus, on to 11 for Pisces. The remainder is the degree within that sign. Three real rows from the worked example below:

The sign-and-degree arithmetic, on real values
BodyEcliptic longitudeDivided by 30RemainderDisplayed as
Sun111.6466°3 → Cancer21.6466°Sun in Cancer 21°
Moon7.2469°0 → Aries7.2469°Moon in Aries 7°
Saturn292.0489°9 → Capricorn22.0489°Saturn in Capricorn 22° ℞

Three things about that last column are worth saying plainly. The degree is floored, not rounded — a Sun at 21.65° of Cancer displays as 21°, not 22°. Zodiux prints whole degrees only, never arcminutes, so 21.05° and 21.98° both read as 21°. And the sign boundary is hard: 29.99° of Cancer and 0.01° of Leo are one hundredth of a degree apart and read as two entirely different signs.

That is the real shape of the precision question. Against 30-degree bins, being accurate to a fraction of a degree is enormous overkill — right up until you are on a boundary, at which point no amount of accuracy helps, because by then the uncertainty has moved out of the arithmetic and into your birth certificate.

Step 7: the rising sign, from local sidereal time

The ascendant is the only part of the chart that needs to know where on Earth you were, and the only part omitted when you leave the birth time blank. It is the zodiac degree climbing over the eastern horizon at your birth moment, and it is derived rather than looked up.

The five moves, with the worked example's numbers

  1. Start from the UTC birth instant — 1990-07-14T08:20Z in the example below.
  2. Ask Astronomy Engine for Greenwich apparent sidereal time at that instant: 3.796337 hours.
  3. Multiply by 15 to get degrees (56.945°) and add the birth longitude (−87.65° for Chicago). That gives local sidereal time as an angle, the RAMC: −30.705°.
  4. Feed the RAMC, the birth latitude (41.85°) and the obliquity of the ecliptic, ε, into the standard ascendant formula: atan2( cos RAMC , −( sin RAMC × cos ε + tan φ × sin ε ) ).
  5. Normalise to the range 0–360. Here it comes out at 82.562°, which divided by 30 is sign index 2 — Gemini, at 22°.
Error budget for the rising sign, measured on the worked example
What changesHow far the rising degree moves
Birth time out by one hour13.87° later, 15.89° earlier — roughly half a sign either way
Birth time out by four minutes0.98° — about a degree
Birth place out by one kilometre of longitude0.012°
Birth place out by one kilometre of latitude0.007°
The city list's own two-decimal coordinate roundingup to 0.011°
Our fixed obliquity, against the mean obliquity for 19900.0045°

Latitude enters only through that tan φ term, which is also why the ascendant behaves so differently at different latitudes and why a single degrees-per-hour figure is a poor guide to it.

ε is the one place Zodiux holds a constant where a full ephemeris would use a varying value. It is fixed at 23.4367°. That is a present-era number rather than a 1990 one: the mean obliquity was 23.4367° around 2020 and 23.4358° in 2026, it drifts by about 0.013° per century, and the true value wobbles roughly ±0.003° either side of the mean as the Earth nutates.

The honest question is not whether that is a simplification — it is — but how big it is next to everything else. For the worked example the mean obliquity in July 1990 was 23.4405°, which is 0.0038° away from the constant we hold. Re-running the ascendant with the correct value moves the result by 0.0045°, about a quarter of an arcminute. Here is that figure against the errors you can actually make.

Step 8: which aspects survive, and which get cut

Aspects are angular separations between two bodies. Zodiux compares every pair of the ten — 45 pairs — takes the shorter arc between them, and tests it against five aspects with fixed orbs.

The five aspects Zodiux tests, with their orbs and accepted ranges
AspectExact angleOrbSeparation accepted
Conjunction0°7°0° to 7°
Sextile60°5°55° to 65°
Square90°6°84° to 96°
Trine120°7°113° to 127°
Opposition180°7°173° to 180°

Those five windows cover 50° of the 0–180° range a pair can occupy — about 28% of it — so most pairs in most charts form no aspect at all. The windows do not overlap, which means the first-match rule in the code can never have to break a tie; there is exactly one answer or none.

One orb list, applied to every pair. There is no widening for the Sun and Moon, no narrowing for the outer planets, no separate applying-versus-separating treatment, and no aspect is weighted above another. Astrologers argue about all four of those choices; Zodiux picks the flat version and says so rather than picking one silently.

The chart then sorts the surviving aspects by how far each is from exact and prints the eight tightest. In the worked example 11 of the 45 pairs qualified, so three real aspects — Mars trine Uranus at 5.84°, Uranus conjunct Neptune at 5.94°, Sun trine Pluto at 6.64° — are computed and then not shown. They are inside the orb; they are simply ninth, tenth and eleventh. If you are comparing against a chart service that lists everything, that is where the missing rows went.

A worked example, carried all the way through

Illustrative, not a real person's chart. Birth date 14 July 1990, birth time 03:20, birth city Chicago. The city resolves to 41.85°N, 87.65°W, zone America/Chicago. On that date Chicago was on Central Daylight Time, UTC−5, so 03:20 local becomes 08:20 UTC. Every figure below came out of the shipped code.

1990-07-14, 03:20, Chicago — the full output
PlacementEcliptic longitudeReads as
Ascendant82.562°22° Gemini rising
Sun111.647°Cancer 21°
Moon7.247°Aries 7°
Mercury124.589°Leo 4°
Venus83.029°Gemini 23°
Mars31.168°Taurus 1°
Jupiter112.291°Cancer 22°
Saturn292.049°Capricorn 22°, retrograde
Uranus277.010°Capricorn 7°, retrograde
Neptune282.952°Capricorn 12°, retrograde
Pluto225.007°Scorpio 15°, retrograde

The four tightest aspects in that set are Moon square Uranus at 0.24° from exact, Jupiter opposite Saturn at 0.24°, Sun opposite Saturn at 0.40° and Sun conjunct Jupiter at 0.64°.

Now run the same birth date with the time box left empty. The code substitutes 12:00 local — 17:00 UTC — and the Sun barely notices: 111.99° instead of 111.65°, still Cancer 21°. The Moon moves from 7.25° to 12.22° of Aries: 4.98° in the eight hours and forty minutes between the two instants. It stayed in Aries, but that was luck, not a guarantee — a Moon starting at 27° would have crossed into Taurus. The ascendant is not printed at all, and the rising slot reads add birth time instead, because at roughly a degree every four minutes there is nothing honest to print.

One more thing this example exposes. Venus sits at 83.029° and the ascendant at 82.562° — less than half a degree apart. A traditional reading would call that Venus rising and make a great deal of it. Zodiux will not list it, because aspects are measured between the ten bodies only and never to the ascendant. That is a real gap, and it is better stated than hidden.

How those longitudes become the wheel

The drawing step adds no astronomy. It is the same ten longitudes plus the ascendant, plotted as angles.

The wheel is three concentric rings on a 320-unit square. The outer band is divided into twelve equal 30° sectors — one per sign, never sized to houses, because there are no houses. Planet glyphs sit on a ring inside that at their own longitude. Aspect chords are drawn across the innermost circle between the two bodies they join, coloured one way for squares and oppositions and another for conjunctions, sextiles and trines, and traced in order of tightness.

Rotation is the one thing worth knowing. The wheel is drawn so that your ascendant sits at the nine o'clock position on the left, which is how a traditional chart is oriented and which is why two charts an hour apart look rotated relative to each other. When there is no birth time and therefore no ascendant, 0° Aries takes that spot instead. A separate flat copy of the same wheel is kept in the page purely so the Download chart button can export a self-contained image; the download is generated on your device from the wheel already on screen.

What Zodiux deliberately does not compute

A calculator that quietly picks a side on a contested question and never mentions it is worse than one that refuses. These are the refusals.

Not in the free chart, on purpose

If a page anywhere on Zodiux appears to claim otherwise, that is an error and we want to hear about it: hello@zodiux.io. Editorial standards covers how corrections are handled.

Why the whole pipeline runs in your browser

The free birth chart and the compatibility calculator execute on your device. The privacy consequences of that — what is stored, what a shared link carries, what the offline cache will and will not keep — are set out in full on data, privacy and saved chart links. The two reasons that are not about privacy are worth stating here, because they are why the architecture is like this at all.

One library, two places, no drift. The same ephemeris is bundled for the browser and imported by the static build that generates these pages. A chart computed live and a sky figure baked into a page therefore come from the same implementation, so any disagreement between them can only be a disagreement about when, never about how. A server-side chart service would eventually version-skew against the build, and the two would start quietly diverging with nothing to catch it.

No account, no queue, no cost per chart. The ephemeris is about 116 KB and the city dataset about 1.3 MB, and neither is fetched until it is needed — the city file waits until you first touch the birth-city box. Once they are in the browser's cache, an unlimited number of charts costs nothing to compute and needs no round trip. A repeat visit can run one with the network gone.

The one exception is a paid report, which is rendered on the server and therefore does transmit your birth details; the Reports page states that, and the retention period, before payment.

How this page is made

Method. Every figure on this page was produced by running the code that ships to visitors — the time-zone conversion, longitude, retrograde, ascendant and aspect functions in the site's chart script — against the vendored copy of Astronomy Engine, for the birth moment 1990-07-14T08:20Z at 41.85°N, 87.65°W. The error budget was measured by re-running the ascendant calculation with exactly one input perturbed at a time and recording the difference; the obliquity row compares our fixed constant against the IAU mean-obliquity polynomial evaluated at that same instant. The aspect coverage figure is the summed width of the five orb windows over the 0–180° range. Nothing here is estimated, and nothing is quoted from a third party's description of our own software.

Limits. This page explains how a chart is computed, not what a chart means. It cannot tell you whether your recorded birth time is correct, and that is the dominant source of error in practice — everything downstream inherits it. It describes the free chart only: the Midheaven, aspects to the angles, and bodies beyond the ten listed are outside what Zodiux calculates anywhere, and the free chart draws no house cusps. Houses are the one exception worth naming — the paid report does place every planet in a whole-sign house counted from the rising sign, so a flat "Zodiux does not do houses" would be false. The figures in the error budget are measured on one chart at one latitude and do not transfer unchanged to others. And it makes no claim that an accurate chart is a true statement about a person. Astrology here is for reflection and entertainment, not advice.

Sources.

Written and reviewed by the Zodiux editorial team · Last reviewed · Editorial standards and corrections · Astrology is for reflection and entertainment, not advice.

Run the pipeline on your own birth data

The chart above is illustrative. Yours takes about a second, runs in this browser, and prints the same ten longitudes from the same ephemeris.

Common questions
Which planets does Zodiux calculate?

Ten bodies: the Sun, the Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune and Pluto. Lunar nodes, Chiron, asteroids and the Part of Fortune are not calculated, so they are not displayed.

Does the degree round up or down?

Down. The displayed degree is the whole number of degrees into the sign, floored rather than rounded — a planet at 21.65° of Cancer shows as 21°, not 22°. If you are comparing against another calculator that rounds, expect an off-by-one on roughly half your placements. It is a display convention, not a difference in the underlying position.

Another calculator gives a different degree for the same planet. Which is right?

Check three things before assuming either is wrong. First, whether it rounds where we floor — that alone explains most one-degree gaps. Second, whether it reports apparent position, corrected for light travel and aberration, as we do, or geometric position, which differs by a small fraction of a degree. Third, whether it is tropical or sidereal, which is not a small difference at all. A genuine disagreement bigger than a degree in the tropical, apparent, geocentric frame is a bug, and we want the email.

Does my birth latitude change any planet's position?

No. Every planetary longitude is geocentric — measured from the centre of the Earth — so two people born at the same instant anywhere on the planet get identical placements. Your latitude and longitude enter the arithmetic in exactly one place: the ascendant. That is also why the chart still works without a city-accurate location for everything except the rising sign.

Why does my chart show only eight aspects?

Because the chart sorts every qualifying aspect by how close it is to exact and prints the eight tightest. In the worked example on this page, 11 of the 45 possible pairs fell inside an orb, so three were computed and then not shown. Nothing is filtered by importance — it is purely a cut at eight.

Does the wheel start at Aries or at my ascendant?

At your ascendant, which sits at the nine o'clock position on the left of the wheel, the way a traditional chart is drawn. When there is no birth time and therefore no ascendant, the wheel puts 0° Aries in that spot instead.

Keep reading

All astrology guides How Zodiux works