Marain
← Writing

September 27, 2026 · The systems I build, how they work and where they break

Four skies at once: building a birth chart that reads four traditions

Four Skies computes your chart in Vedic, Western, Chinese and Arabic astrology at once and prints one card with your sign in all four scripts. How it was built in a day, what it's tested against, the CPU bill that moved the card into the browser, and the rule that would shut it down.

Every Indian I know carries two astrologies that contradict each other. There's the kundli a parent had drawn up at birth — sidereal, Lahiri ayanamsa, rashi and nakshatra, the one that turns up in wedding conversations — and there's the sun sign from Instagram and Co-Star, tropical, and about one sign ahead of the kundli most of the time. Nobody reconciles them. It's a joke everyone already tells.

Four Skies computes both, plus the Chinese four pillars and the Arabic lots and lunar mansions, and puts the contradiction on one card. This is how it was built.

What it does

Enter a birth date, a time (or "I don't know") and a birthplace. You get your chart in four traditions on one page, four rooms drawn in each tradition's own almanac style — a South Indian square chart and panchang, a Victorian almanac wheel, a tong shu page of pillars, an astrolabe with the twenty-eight mansions — and a card with your sign in Devanagari, English, hanzi and Arabic, to save or share. There's no account, and nothing about your birth is stored.

The hard part was being right four different ways

Each tradition fails differently, and a chart that disagrees with the kundli from home loses its user on the first screen.

  • Vedic needs the right ayanamsa. Ours is Lahiri, carried from its 1956 definition with the IAU precession, and it matches the Indian Astronomical Ephemeris values quoted in the Swiss Ephemeris documentation to within 2 arcseconds.
  • Chinese year and month pillars turn at solar terms — the year at Li Chun, around 4 February, not on 1 January and not at Lunar New Year. The library we use keeps its solar-term table in Beijing time, so year and month are read from the birth instant in UTC+8, while day and hour follow the birthplace's clock. The tests check the flip against the Sun's own position in four time zones.
  • Every tradition needs the birthplace's historical UTC offset. India ran on +6:30 from 1942 to 1945; most of the world has moved its clocks at some point. Birth times are converted with tzdata's history, and a time that fell in a daylight-saving gap or repeat is flagged, not silently guessed.
  • An unknown birth time gives an honest noon chart: no ascendant, no houses, no lots — and a note if the Moon changed sign that day.

Wrong maths is the only way to lose the people who care, so it's tested against published charts: 26 of them, from Astro-Databank, astro-seek, AstroSage and published BaZi. Western planets land within 3′, angles within 5′, and Vedic signs, lagna, nakshatras and Chinese pillars match exactly. One thing didn't: AstroSage's Saturn for two births before 1920 sits 3–6′ from ours, while astro-seek (Swiss Ephemeris) agrees with us to 0.2′. The test records it as the source's drift rather than hiding it.

The positions come from astronomy-engine (MIT), not Swiss Ephemeris, which is AGPL.

The card, and the CPU bill that moved it

The card has to print Devanagari, Arabic and hanzi correctly on every phone. Server-side image renderers can't shape Devanagari conjuncts or join Arabic letters, so every such string the card can show — 12 rashis, 12 Arabic signs, 28 mansions, 12 animals — is shaped at build time with HarfBuzz and stored as vector outlines.

The first version rendered the card on the server, inside the Cloudflare Worker. It worked, and then production said otherwise: each card cost 470–1,250 ms of CPU and most requests were cut off at the Worker's limit. Paying per card in server CPU is also the wrong bill for the one thing we hope goes viral. So the server now decides what goes on the card, and the browser draws it on a canvas — instant, free, and identical everywhere.

Privacy by not keeping anything

A birth date, time and place is personal data. The chart is computed per request from the URL and never written down. The only thing stored is a daily count — how many charts were completed, how many cards were saved or shared — with no birth details and no identifiers. That's exactly what's needed to judge the kill rule, and nothing more. The card itself shows your signs, never your birth date or place.

What it cost

  • A day: built on 27 September 2026, with coding agents doing the typing.
  • Hosting: a Cloudflare Worker and a Turso database. Because nothing about anyone's birth is stored and the card is drawn in the browser, a chart costs 26–60 ms of server CPU once the Worker is warm (up to about 0.7 s on a cold start).
  • The domain, fourskiesastro.com, is bought at launch, not before.
  • Data: GeoNames (CC BY 4.0) for 34,149 birthplaces; typefaces under the SIL Open Font License.

What would kill it

The kill rule, stated at launch: ≥ 10 completed charts in the 30 days after launch. If Four Skies misses it, it shuts down, and this page will say so.

What's next

Asking the sage a question — a wry answer that says which of your four skies agree, with in-character refusals for health, death, money, the law and whether to marry — and then compatibility, timed for wedding season.

The same argument, elsewhere

Five other pieces make the same argument. The sentence under each is quoted from that piece.

InstrumentsBuild the thing that keeps running, and let machines read while people decide.

MeasurementIf the number you need does not exist, build it, and agree how to judge it first.

All the threads →