← back to work
Case study · Date Panchang · DPDS

Digitizing a 110-year-old astrology business

From print-only panchang to 218K monthly users across 5 platforms — built the calc engine, B2B/B2C apps, payment pipeline, and self-hosted infra from scratch.

Role
CTO at Date Panchang · Partner at DPDS
Period
2019 → now
Stack
Flutter · SvelteKit · React…
218K
monthly users
5
platforms shipped
5
entities billed
110 yr
legacy modernized

The problem

Date Panchang Digital Solutions (DPDS) is a 110-year-old family astrology business. When I joined in 2019, the entire operation was print — annual almanacs, walk-in jyotish consultations, daily panchang notices. There was a static HTML page and no SaaS surface, no mobile presence, no calculation engine outside the ones running on the staff's local machines.

The audience problem was bigger than "build a website". Hindu astrology practice depends on panchang calculations — five astronomical quantities (tithi, vara, nakshatra, yoga, karana) derived from precise lunar and solar positions for a specific time and place. Existing software either gave inaccurate ephemeris-based approximations or shipped only as Windows desktop. None had a way to push thousands of customized panchangs (a per-user astrology report) at scale.

The business needed to be both a calculation engine (the source of truth for jyotish practitioners) and a consumer product (panchang lookup, muhurta selection, paid patrika generation).

The approach

I architected the stack in three layers, each independently versioned and deployable:

1. Panchaanga Yantra — the canonical calc engine + staff SPA

A .NET 10 minimal API wraps the family's PanchangCodeLib (calc engine), NiyamaLib (Shaastraartha rules), and PanchaangaData (curated location set with traditional gaava / jilhaa / raajya hierarchy). Both backend and a React + Vite + TypeScript SPA ship as one Docker image to yantra.datepanchang.in, behind Cloudflare Tunnel + Cloudflare Access + Nginx Proxy Manager. Staff use it to author panchang content, render dinadarshika pages, and drive the InDesign UXP export pipeline. Audited by Baba (our senior astrologer) over hundreds of iterations against the printed annual panchang. xUnit unit tests, Playwright E2E. GitHub Actions → rsync → docker-compose redeploy.

2. Multi-platform Flutter clients

A single Flutter codebase delivers the consumer app — Maharashtra's famous Date Panchang — across iOS, Android, and the web, with B2B coverage on Sanhita (Riverpod 3, Auto-route, Freezed, 2680+ passing tests). Offline support, deep links, Firebase Auth + Analytics + Crashlytics + Remote Config, Retrofit-generated API clients, 9 globally-supported cities. The SvelteKit marketing site (datepanchang.com, static adapter) currently does ~2.1M requests / ~218K unique visitors per month.

3. PrushthAzureAPI — orchestrator on Azure Functions

.NET 8 + ASP.NET Core on Azure Functions. Five sub-projects — AzureBizAPI, AzureBizFunctions (event-driven), AzureSupportFunctions, AzureTenantFunctions, ServiceBot — orchestrate users, Adhikar (subscription quotas), payments, sevas, and orders. Data sits across multiple Azure Table Storage partitions keyed by Duid (Date Panchang's own UID, independent of Firebase). Payment integrations: RazorPay, Cashfree, PayU, Apple In-App, Google Play. Five-language seva surface: Marathi, Hindi, English, Kannada, Gujarati. Prushth never calculates anything — it dispatches to seva-api (formerly ganit-api, .NET 10 + Azure EventGrid + PuppeteerSharp / SkiaSharp for PDF) over EventGrid blob triggers.

The hard parts

Astronomy precision. Off-by-one tithi errors are unacceptable in this domain. The calc engine ships VSOP87-derived ephemeris with 714 KB of pre-computed coefficients and 70+ muhurta rule families. Every release runs through a regression harness validated against decades of print panchangs.

Distribution + multi-entity billing. DPDS revenue is distributed across two family groups on a rotating basis, across five legal entities. Built entity-routed payment + accounting into the financial layer so a single order lands in the correct entity's books automatically — no manual reconciliation, no per-cycle rerouting.

Self-hosting migration. Came up on Azure + a Hetzner CapRover stack. Stripped CapRover (2026-05) when ops overhead exceeded value. Standardized on plain Docker Compose + Nginx Proxy Manager + Cloudflare Tunnels across two Hetzner boxes — dp-server (157.180.28.22) for in-house tooling + dev/stg, the older box (135.181.42.75) for customer-facing prod. Vaultwarden, n8n, the WhatsApp ↔ Slack bridge (4k+ daily msgs via Gupshup), grahak-admin-bot (Slack support tool, 24 slash commands), and Panchaanga Yantra all live there. Restic backups, Prometheus + Grafana + n8n alerting. Production target migrating to an on-prem ASUS PN41 mini PC with Azure failover via a Cloudflare Worker circuit breaker.

Azure resilience plan (Sankatmochan). An Azure APIM outage took the whole customer-facing stack down once. Started Sankatmochan — a self-hosted Azure replacement (Kong/Tyk-class gateway, MinIO blob, NATS / Redis Streams for events) — so a Microsoft-side outage doesn't equal a Date Panchang outage.

The outcome

I joined as CTO at Date Panchang in 2019, then took an equity Partner role at Date Panchang Digital Solutions (DPDS) — the digital arm — in 2024, with day-to-day engineering still in my hands. The system has been running in production continuously since 2020 and has carried the business through the full digital transition.

Full stack

FlutterSvelteKitReactC# / .NET 8 + 10PythonAzure FunctionsPostgreSQLFirebaseDockerNginx Proxy ManagerCloudflare TunnelsHetznern8nPrometheus + GrafanaresticAzure DevOpsGitHub Actions

Want one of these for your business?

Book a 20-min intro →
Available June 2026 Book intro →