šŸ•‰ ą“Ŗą“žąµą“šą“¾ą“‚ą“—ą“‚ą“¹ąµˆą“Øąµą“¦ą“µ ą“Ŗą“žąµą“šą“¾ą“‚ą“—ą“‚
Charon Universe
Almanac of Moons & Meridians
ą“øąµ‡ą“µąµ ą“šąµ†ą“Æąµą“¤ą“µ
ą“‡ą“Ŗąµą“Ŗąµ‹ąµ¾ ą“Ŗąµą“°ą“¾ą“¦ąµ‡ą“¶ą“æą“•ą“‚ Asia/Kolkata
--:--:-- —
ą“µąµ†ą“³ąµą“³ą“æĀ·ą“µąµˆą“¶ą“¾ą“–ą“‚ ą“¶ąµą“•ąµą“²ą“Ŗą“•ąµą“·ą“‚ ą“Ŗąµą“°ą“¤ą“æą“Ŗą“¦Ā·ą“øą“‚ą“µą“¤ąµ 2083 2026 ą“®ąµ‡ą“Æąµ 8, ą“µąµ†ą“³ąµą“³ą“æ Ā· ą“Žą“±ą“£ą“¾ą“•ąµą“³ą“‚
ą“¶ąµą“•ąµą“²ą“Ŗą“•ąµą“·ą“‚ ą“‰ą“¤ąµą“¤ą“°ą“¾ą“Æą“Øą“‚ ą“—ąµą“°ąµ€ą“·ąµą“®ą“‚ ą“‹ą“¤ąµ

ą“Ŗą“•ą“²ąµą“‚ ą“°ą“¾ą“¤ąµą“°ą“æą“Æąµą“‚ Ernakulam Ā· UTC+5:30

šŸŒ… šŸŒ‡ ā˜€ šŸŒ– šŸŒ’
šŸŒ…
ą“‰ą“¦ą“Æą“‚
06:13
šŸŒ‡
ą“…ą“øąµą“¤ą“®ą“Æą“‚
19:10
šŸŒ–
ą“šą“Øąµą“¦ąµą“°ąµ‹ą“¦ą“Æą“‚
07:02
šŸŒ’
ą“šą“Øąµą“¦ąµą“°ą“¾ą“øąµą“¤ą“®ą“Æą“‚
19:48

ą“Ŗą“žąµą“šą“¾ą“‚ą“—ą“™ąµą“™ąµ¾ ą“…ą“žąµą“šąµ ą“…ą“‚ą“—ą“™ąµą“™ąµ¾

ą“¤ą“æą“„ą“æą“šą“¾ą“Øąµą“¦ąµą“°ą“¦ą“æą“Øą“‚
Pratipada —
ą“Øą“•ąµą“·ą“¤ąµą“°ą“‚ą“¤ą“¾ą“°ą“¾ą“—ą“£ą“‚
Krittika Ā· Pada 3 —
ą“Æąµ‹ą“—ą“‚ą“øąµ‚ą“°ąµą“Æ-ą“šą“Øąµą“¦ąµą“°
Siddha —
ą“•ą“°ą“£ą“‚ą“…ąµ¼ą“§-ą“¤ą“æą“„ą“æ
Bava —
ą“µą“¾ą“°ą“‚ą“†ą““ąµą“š
Shukravara —
ą“Ŗą“•ąµą“·ą“‚ą“šą“¾ą“Øąµą“¦ąµą“°ą“Ŗą“•ąµą“·ą“‚
Shukla —

ą“°ą“¾ą“¶ą“æ ą“šą“æą“¹ąµą“Øą“™ąµą“™ąµ¾

ą“šą“Øąµą“¦ąµą“°ą“°ą“¾ą“¶ą“æVrishabha ♉
ą“øąµ‚ą“°ąµą“Æą“°ą“¾ą“¶ą“æMesha ā™ˆ
ą“Øą“•ąµą“·ą“¤ąµą“°ą“¾ą“§ą“æą“Ŗąµ»Sun
šŸŒ’
Waxing Crescent
3% illuminated

ą“®ąµą“¹ąµ‚ąµ¼ą“¤ąµą“¤ą“™ąµą“™ąµ¾ ą“¶ąµą“­-ą“…ą“¶ąµą“­ ą“øą“®ą“Æą“™ąµą“™ąµ¾

ą“²ąµ‹ą“”ąµ ą“šąµ†ą“Æąµą“Æąµą“Øąµą“Øąµā€¦
—

ą“—ąµą“°ą“¹ą“™ąµą“™ąµ¾ ą“—ąµą“°ą“¹ą“øąµą“„ą“¾ą“Øą“™ąµą“™ąµ¾ Ā· ą“Øą“æą“°ą“Æą“Ø

ą“‡ą“Øąµą“Øą“¤ąµą“¤ąµ† ą“µą“æą“¶ąµ‡ą“· ą“Æąµ‹ą“—ą“™ąµą“™ąµ¾ ą“¶ąµą“­ ą“Æąµ‹ą“—ą“øą“‚ą“Æąµ‹ą“—ą“™ąµą“™ąµ¾

ą“²ąµ‹ą“”ąµ ą“šąµ†ą“Æąµą“Æąµą“Øąµą“Øąµā€¦

ą“²ą“—ąµą“Ø ą“šą“•ąµą“°ą“‚ ą“‰ą“¤ąµą“¤ą“°ąµ‡ą“Øąµą“¤ąµą“Æąµ» Ā· ą“”ą“Æą“®ą“£ąµą“Ÿąµ ą“¶ąµˆą“²ą“æ

1 2 3 4 5 6 7 8 9 10 11 12 ą“²ą“—ąµą“Øą“‚ Karka 14°22′ Ch Su Ve Meā„ž Ma Ju Sa Ra Ke
ą“µąµ†ą“³ąµą“³ą“æ Ā· 2026 ą“®ąµ‡ą“Æąµ 8 Ā· 06:13 Ā· ą“øą“æą“‚ą“—ą“Ŗąµą“Ŗąµ‚ąµ¼ (1°17′N, 103°51′E)

ą“—ąµą“°ą“¹ą“øąµą“„ą“¾ą“Øą“™ąµą“™ąµ¾ ą“Øą“æą“°ą“Æą“Ø Ā· ą“²ą“¾ą“¹ą“æą“°ą“æ ą“…ą“Æą“Øą“¾ą“‚ą“¶ą“‚

ą“—ąµą“°ą“¹ą“‚ą“°ą“¾ą“¶ą“æą“”ą“æą“—ąµą“°ą“æą“…ą“µą“øąµą“„
ą“—ąµą“°ą“¹ą“øąµą“„ą“¾ą“Øą“™ąµą“™ąµ¾ ą“²ąµ‹ą“”ąµ ą“šąµ†ą“Æąµą“Æąµą“Øąµą“Øąµā€¦

ą“øą“œąµ€ą“µ ą“Æąµ‹ą“—ą“™ąµą“™ąµ¾

ą“—ą“œą“•ąµ‡ą“øą“°ą“æ ą“¬ąµą“§ą“¾ą“¦ą“æą“¤ąµą“Æ ą“®ą“¾ą“³ą“µąµą“Æ ą“¶ą“¶
2026 ą“®ąµ‡ą“Æąµ Ā· ą“µąµˆą“¶ą“¾ą“–ą“‚
ą“‰ą“¤ąµą“øą“µą“‚ ą“ą“•ą“¾ą“¦ą“¶ą“æ / ą“µąµą“°ą“¤ą“‚ ą“‡ą“Øąµą“Øąµ

ą“‡ą“Ŗąµą“Ŗąµ‹ą““ą“¤ąµą“¤ąµ† ą“˜ą“Ÿą“æą“•ą“Æąµą“‚ ą“µą“æą“Øą“¾ą““ą“æą“•ą“Æąµą“‚ ą“‰ą“¦ą“Æą“‚ ą“®ąµą“¤ąµ½ ą“¤ą“¤ąµą“øą“®ą“Æą“‚

34 ą“˜ 22 ą“µą“æ
1 ą“˜ą“Ÿą“æą“• ā‰ˆ 24 ą“®ą“æą“Øą“æą“±ąµą“±ąµĀ·1 ą“µą“æą“Øą“¾ą““ą“æą“• ā‰ˆ 24 ą“øąµ†ą“•ąµą“•ąµ»ą“”ąµ
ą“¤ą“¤ąµą“øą“®ą“Æą“‚

ą“µąµˆą“¦ą“æą“• ą“•ą“²ą“£ąµą“Ÿąµ¼ ą“Øą“æą“²ą“µą“æą“²ąµ† ą“šą“•ąµą“°ą“‚

ą“øą“‚ą“µą“¤ąµą“øą“°ą“‚60-ą“µąµ¼ą“· ą“šą“•ąµą“°ą“‚ā€”
ą“…ą“Æą“Øą“‚ą“øąµ—ą“° ą“…ąµ¼ą“§ą“µąµ¼ą“·ą“‚ā€”
ą“‹ą“¤ąµą“•ą“¾ą“²ą“‚ā€”
ą“®ą“¾ą“øą“‚ą“šą“¾ą“Øąµą“¦ąµą“°ą“®ą“¾ą“øą“‚ā€”
ą“Ŗą“•ąµą“·ą“‚ą“Ŗą“•ąµą“·ą“‚ā€”
ą“µą“æą“•ąµą“°ą“® ą“øą“‚ą“µą“¤ąµą“¶ą“•ą“‚2083
ą“¶ą“• ą“øą“‚ą“µą“¤ąµą“¶ą“•ą“‚1948

ą“—ąµą“°ą“æą“—ąµ‹ą“±ą“æą“Æąµ» ↔ ą“µąµˆą“¦ą“æą“• ą“Ŗą“°ą“æą“µąµ¼ą“¤ąµą“¤ą“Øą“‚ ą“¤ąµ€ą“Æą“¤ą“æ ą“Ŗą“°ą“æą“µąµ¼ą“¤ąµą“¤ą“Øą“‚

→
—

ą“‰ą“¦ą“Æą“¾ą“§ą“æą“·ąµą“ ą“æą“¤ ą“…ą“®ą“¾ą“Øąµą“¤ ą“øą“®ąµą“Ŗąµą“°ą“¦ą“¾ą“Æą“®ą“¾ą“£ąµ ą“Ŗą“°ą“æą“µąµ¼ą“¤ąµą“¤ą“Øą“¤ąµą“¤ą“æą“Øąµ ą“‰ą“Ŗą“Æąµ‹ą“—ą“æą“•ąµą“•ąµą“Øąµą“Øą“¤ąµ. ą“¤ą“æą“°ą“žąµą“žąµ†ą“Ÿąµą“¤ąµą“¤ ą“¤ąµ€ą“Æą“¤ą“æą“Æą“æą“²ąµ† ą“‰ą“¦ą“Æą“¤ąµą“¤ą“æą“²ąµ† ą“¤ą“æą“„ą“æ.

ą“¤ą“æą“„ą“æ ą“Ŗąµą“°ąµ‹ą“—ą“¤ą“æ —

62% ą“Ŗą“æą“Øąµą“Øą“æą“Ÿąµą“Ÿąµ
— —

ą“øąµ‚ą“°ąµą“Æą“Øąµ† ą“…ą“Ŗąµ‡ą“•ąµą“·ą“æą“šąµą“šąµą“³ąµą“³ ą“šą“Øąµą“¦ąµą“°ą“Øąµą“±ąµ† ą“¤ą“¾ą“¤ąµą“•ą“¾ą“²ą“æą“• ą“•ąµ‹ą“£ąµ€ą“Æ ą“µąµ‡ą“—ą“¤ąµą“¤ą“æą“Øą“Øąµą“øą“°ą“æą“šąµą“šąµ ą“¤ą“æą“„ą“æą“Æąµą“Ÿąµ† ą“¦ąµˆąµ¼ą“˜ąµą“Æą“‚ ą“®ą“¾ą“±ąµą“Øąµą“Øąµ — ā‰ˆ20 ą“®ąµą“¤ąµ½ 27 ą“®ą“£ą“æą“•ąµą“•ąµ‚ąµ¼ ą“µą“°ąµ†. ą“Ŗąµą“°ą“¾ą“¦ąµ‡ą“¶ą“æą“• ą“øąµ‚ą“°ąµą“Æąµ‹ą“¦ą“Æą“¤ąµą“¤ą“æąµ½ ą“Øą“æą“Øąµą“Øąµ ą“…ą“³ą“•ąµą“•ąµą“Øąµą“Øąµ.

System Architecture

End-to-end view of how a date + lat/lon request flows from the user, through the API gateway and compute layer, down to public-domain ephemeris sources, and back as a Panchang JSON document.

Request & Data FlowUser → Frontend → API → Compute → Sources

CLIENT Web App / PWA React Ā· SW cache EDGE API Gateway REST Ā· CDN Ā· Auth COMPUTE Panchang Engine Tithi Ā· Nakshatra Ā· Yoga EPHEMERIS Swiss Ephemeris Sun / Moon Ī» GET /panchang date,lat,lon JD, Ī»_sun, Ī»_moon CACHE Redis Ā· 24h TTL check miss → compute PUBLIC-DOMAIN DATA SOURCES NASA JPL Horizons Planet positions Ā· cross-check USNO Sunrise / Sunset SPA algorithm Meeus Algorithms JD, Ī”T, Ayanamsa Festival Rules JSON Regional Ā· public-domain STORE PostgreSQL SEARCH Tantivy / OpenSearch DAILY CRON Ā· 00:30 UTC Pre-warm next 30 days

Tech StackLayer by layer

Frontend
React 18 TypeScript Vite Service Worker
API
Node Ā· Fastify OpenAPI 3.1 JWT Rate-limit
Compute
Python Ā· FastAPI pyswisseph astropy NumPy
Storage
PostgreSQL 16 PostGIS Redis 7 S3 (ephemeris bins)
Search
OpenSearch Devanagari analyzer
Infra
Docker k8s / Fly.io GitHub Actions Cloudflare CDN

Component Treesrc/

apps/web/
ā”œā”€ā”€ routes/
│   ā”œā”€ā”€ Today.tsx          # Panchang dashboard
│   ā”œā”€ā”€ Detail.tsx         # Tithi / Nakshatra detail
│   ā”œā”€ā”€ Calendar.tsx       # Monthly festivals
│   ā”œā”€ā”€ Kundali.tsx        # Lagna chart
│   └── Search.tsx
ā”œā”€ā”€ components/
│   ā”œā”€ā”€ PanchaAngas.tsx     # 5-limbs card
│   ā”œā”€ā”€ DayArc.tsx          # Sun/moon arc SVG
│   ā”œā”€ā”€ MuhurtaGrid.tsx
│   ā”œā”€ā”€ PlanetStrip.tsx
│   ā”œā”€ā”€ NorthChart.tsx      # Diamond SVG
│   └── FestivalCard.tsx
ā”œā”€ā”€ lib/
│   ā”œā”€ā”€ api.ts             # typed client
│   ā”œā”€ā”€ geo.ts             # geolocation + tz
│   └── i18n.ts            # sa/hi/en/ta/te/ml
└── main.tsx

services/compute/
ā”œā”€ā”€ engine.py          # orchestrator
ā”œā”€ā”€ panchang/
│   ā”œā”€ā”€ tithi.py
│   ā”œā”€ā”€ nakshatra.py
│   ā”œā”€ā”€ yoga.py
│   ā”œā”€ā”€ karana.py
│   └── muhurta.py
ā”œā”€ā”€ astro/
│   ā”œā”€ā”€ swisseph_wrapper.py
│   ā”œā”€ā”€ sunrise.py       # USNO SPA
│   └── ayanamsa.py      # Lahiri default
└── festivals/
    ā”œā”€ā”€ rules.json
    └── resolver.py

Data Pipeline & Computation

Every value rendered in the Panchang tab is computed at request time from four open sources. No commercial almanac text is ingested — only longitudes, sunrise times, and public-domain rules.

Swiss Ephemeris
astro.com/swisseph Ā· v2.10
Role
Primary source for Sun & Moon ecliptic longitudes, planetary positions, ayanamsa.
License
AGPL / Open-source mode
Access
pyswisseph binding Ā· binary .se1 files on local disk
Cadence
Sub-millisecond at request time
Output
λ_sun, λ_moon (sidereal, Lahiri), planet longitudes & speeds
NASA JPL Horizons
ssd.jpl.nasa.gov/horizons
Role
Cross-validation of planetary positions; high-precision DE441 ephemeris reference.
License
U.S. Govt Ā· Public domain
Access
REST API Ā· batched nightly for next 30 days
Cadence
Nightly cron Ā· cached
Output
RA/Dec → ecliptic Ī»/β Ā· used to flag SE drift > 0.01°
USNO Sunrise/Sunset
aa.usno.navy.mil Ā· SPA algorithm
Role
Local sunrise, sunset, twilight times — anchor for tithi/nakshatra at sunrise.
License
U.S. Govt Ā· Public domain
Access
Re-implemented from published SPA paper (Reda & Andreas, NREL)
Cadence
Computed per request from lat/lon/date
Output
Sunrise, sunset, solar noon, civil twilight
Meeus Algorithms
Astronomical Algorithms Ā· 1998
Role
Julian Date conversion, ΔT, Lahiri ayanamsa, lunar phase calculation.
License
Public-domain formulas
Access
Implemented inline in astro/meeus.py
Cadence
Inline at request time
Output
JD ↔ Gregorian, Ī”T correction, ayanamsa offset

Computation RulesStandard open formulas

Tithi
⌊ (Ī»_moon āˆ’ Ī»_sun) mod 360 / 12 āŒ‹ + 1
1…30 Ā· 1–15 Shukla, 16–30 Krishna
Nakshatra
⌊ Ī»_moon / 13.3333 āŒ‹ + 1
27 asterisms Ā· pada = (Ī» mod 13.333) / 3.333
Yoga
⌊ (Ī»_sun + Ī»_moon) mod 360 / 13.3333 āŒ‹ + 1
27 yogas Ā· sum-based solar–lunar
Karana
tithi Ɨ 2 āˆ’ {0 if first half else 1}
60 half-tithi segments Ā· 11 names cycled
Paksha
tithi ≤ 15 ? Shukla : Krishna
Waxing or waning fortnight
Rahu Kalam
day_length / 8 Ā· weekday_offset
Standard weekday table Ā· 7 fixed slots
Abhijit
solar_noon ± 24 min
~48-min window centred on local noon
Amrit Kalam
f(nakshatra_pada, weekday)
From Vedic Nakshatra lookup table

engine.py Ā· main loopPseudocode

def compute_panchang(date, lat, lon, tz): jd = meeus.jd_from_date(date, tz) sunrise = spa.sunrise(jd, lat, lon) # USNO SPA # Anchor: tithi at sunrise (Indian convention) jd_anchor = meeus.jd_from_datetime(sunrise) ayan = meeus.lahiri_ayanamsa(jd_anchor) # Swiss Ephemeris — sidereal longitudes lam_sun = swe.calc_ut(jd_anchor, swe.SUN)[0] - ayan lam_moon = swe.calc_ut(jd_anchor, swe.MOON)[0] - ayan tithi = int(((lam_moon - lam_sun) % 360) / 12) + 1 naksh = int(lam_moon / 13.3333) + 1 yoga = int(((lam_sun + lam_moon) % 360) / 13.3333) + 1 karana = karana_from_tithi(tithi, half=half_of_tithi(lam_sun, lam_moon)) # Festivals — pure rule resolver, no copyrighted text fests = festivals.resolve(tithi, naksh, masa, paksha, region) return PanchangDay(...)

Ingestion & CronDaily 00:30 UTC pre-warm

1
Trigger
k8s CronJob fires
00:30 UTC daily
→
2
Fetch JPL
Pull next 30 days planetary positions
~12s Ā· 9 bodies
→
3
Compute
SE + Meeus run for top-50 cities
~90s parallel
→
4
Validate
SE vs JPL diff < 0.01° gate
< 1s Ā· alert on fail
5
Cache warm
Write to Redis Ā· 24h TTL keyed by date+lat+lon bucket
~5s
→
6
Index
OpenSearch festivals + tithi/nakshatra fields refreshed
~3s
→
7
Notify
Push Ekadashi / festival reminders to subscribed users
batched

Database Schema

PostgreSQL 16 — normalised reference tables for tithi/nakshatra/yoga/karana, a wide panchang_day fact table for fast dashboard reads, and a rules-based festival_rules resolver. PostGIS for location.

API & Sample Responses

REST Ā· OpenAPI 3.1 Ā· all timestamps ISO-8601 in UTC with local-offset preserved. Click any endpoint to expand its parameter table and a sample JSON response.

Style Guide

Traditional Panchangam palette grounded in saffron, maroon, and gold — softened on a parchment background. Cormorant Garamond for headings, DM Sans for UI, JetBrains Mono for numerals, Tiro Devanagari for vernacular text.

Color TokensBrand & semantic

Saffron
primary#FF9933
Maroon
heading#800000
Gold
accent#FFD700
Indigo
planet#4B0082
Emerald
auspicious#228B22
Orange
today#FF6600
Parchment
canvas#FFF8F0
Cream
surface#FBEFE0
Ink
text#2A1A0A
Rule
border#E8D8BF

TypographyRoles & usage

Display Ā· Cormorant Garamond
Shukravara Ā· Vaishakha Shukla Pratipada
Cormorant Garamond Ā· 600 Ā· 38px Ā· letter-spacing 0.2px
Heading Ā· Cormorant Garamond
Pancha Angas Ā· Five Limbs
Krittika Ā· Pada 3 Ā· upto 22:18
22px display Ā· 17px subhead Ā· 14px body
Body Ā· DM Sans
Akshaya Tritiya brings unexpected gains. Begin new ventures before noon. Donate yellow rice and turmeric at a Vishnu shrine.
DM Sans Ā· 400/500 Ā· 14px Ā· line-height 1.55
Numerals Ā· JetBrains Mono
06:13 Ā· 19:10 Ā· 11:48
JetBrains Mono Ā· 500 Ā· tabular numerals for time
Vernacular Ā· Tiro Devanagari Hindi
ą¤¶ą„ą¤•ą„ą¤°ą¤µą¤¾ą¤° Ā· ą¤µą„ˆą¤¶ą¤¾ą¤– ą¤¶ą„ą¤•ą„ą¤² ą¤Ŗą„ą¤°ą¤¤ą¤æą¤Ŗą¤¦ą¤¾
Tiro Devanagari Hindi Ā· for Sanskrit / Hindi text
Caption Ā· DM Sans uppercase
Shukla Paksha Ā· Uttarayana Ā· Grishma Ritu
DM Sans Ā· 600 Ā· 11px Ā· tracking 1.2px

ComponentsCore building blocks

Badges
Shukla Paksha Uttarayana Grishma Ritu
Pills
Yoga chips
Sarvartha Siddhi Amrit Siddhi Gajakesari
Status dots
Auspicious Inauspicious
Toggle
Spacing
4 8 12 16 24 32
Radius
4 8 10 pill
šŸ•‰ ą“øąµ¼ą“µąµ‡ ą“­ą“µą“Øąµą“¤ąµ ą“øąµą“–ą“æą“Øą“ƒ Ā· ą“Žą“²ąµą“²ą“¾ą“µą“°ąµą“‚ ą“øą“Øąµą“¤ąµą“·ąµą“Ÿą“°ą“¾ą“•ą“Ÿąµą“Ÿąµ†