Four years ago I was writing features. Now I own the whole line — the schema, the payment webhook, the app on the Play Store, the sitemap Google reads, and the revenue it moves.
I run DevPunya’s platform, took Pothi from an empty repo to a paying storefront, and I’m building Chhapa now. Not a contractor waiting for tickets — someone who decides what gets built and then builds it.
Book a puja or chadhawa at a real temple, then watch the video of it actually happening. Web, Android, iOS and the whole back office behind it.
// the hard part A 51-module Node monolith carrying orders, payments, WhatsApp delivery and video fulfilment — plus AI agents that read a devotee’s wish, turn it into a marketing profile, and pick what to offer them next.
·React SPA + React Native app + admin console on one Express/Postgres core
·Razorpay, Interakt/WhatsApp delivery, S3 video pipeline, ECS on AWS
पोथी — the bound manuscript a jyotishi hands across the table, digitised. Consumers buy one report; astrologers buy credits and generate the same books under their own name, photo and shop.
// the hard part Every fact is computed from an astronomical ephemeris on the Lahiri ayanamsha — nothing about a chart is ever guessed. A model only writes the explanation around those facts, and it is fact-checked before printing: an expansion naming a sign its chapter never mentioned is discarded, not shown.
Grounded publishing for teams with no content person
2025 → · 0 → 1 · in progress
छापा — the mark a press leaves on a page. A multi-tenant platform that reads what a company actually sells, writes only what that data supports, and publishes it as pages that are technically correct by construction.
// the hard part Every AI blog tool writes from the model’s head, so the output contradicts what the customer sells and they cancel in month three. Chhapa cuts any claim it cannot trace back to the customer’s own corpus, and derives the publishing layer — sitemap, canonicals, schema, internal links — instead of asking anyone to author it.
·Retrieval over the tenant’s own corpus with pgvector; unsupported claims are dropped
·Static generation to S3 + CDN — no third party ever sits in the crawler’s path
·Pothi and DevPunya onboard as ordinary tenants through the public path
500+ VN video templates sold as one digital item — ₹49 once, lifetime access, no watermark, free samples before you buy. A cold Instagram click lands here, reads it once, and either buys or leaves.
// the hard part The page used to be a route inside the astrology app, so an ad click downloaded 1.1 MB of JavaScript — a storefront, 28 learn articles and a chart-drawing admin panel — before one pixel of a video-templates page could paint. Of the first nine clicks Meta sent, four became a landing-page view. The split now happens at the root, before either app is imported, and neither product carries the other’s weight.
·Root-level bundle split by host — the VN buyer never loads the astrology app
·Razorpay prices the order from the database, so “is this actually paid” has an answer
·A blank field renders the gap rather than inventing copy — an untrue claim in an ad is an offence under the Consumer Protection Act 2019
·PageSpeed 98 on mobile: hydrate rather than re-render, self-hosted fonts, no <video> until tapped
ReactTypeScriptViteNodePostgresRazorpayMeta CAPI
05
Jyotish Engine
LIVE
We stopped renting the maths
2025 · Author
An in-house astrology compute engine that replaced AstroNext, the paid third-party API DevPunya used to call for every dosh and kundli report.
// the hard part The vendor path was: send a birth chart out, get a PDF back, then have a model read the PDF to recover structured data. The in-house engine computes the doshas deterministically and renders the PDF itself — one env flag switches between them, so it could ship behind a rollback the whole way.
·Ephemeris positions, Lahiri ayanamsha, divisional charts, dasha periods
·Found a real bug the vendor hid: the D2 hora chart was computing the wrong thing
·Classical tables locked down by tests so a refactor cannot quietly corrupt them
·Every saved report stamps which engine produced it — no schema migration needed
संवाद — dialogue. A self-hosted WhatsApp CRM running DevPunya’s customer conversations: shared inbox on the official Business API, broadcasts, pipelines and no-code automations.
// the hard part Not my code — this is a fork of the MIT-licensed wacrm project. What is mine is the deployment: Cloud Run in Seoul against Supabase Postgres, with WhatsApp credentials held in the database rather than the environment so a number can be rotated without a redeploy.
·GCP Cloud Run + Supabase Cloud, migrations replayed against real Postgres in CI
·Shared inbox, broadcasts with delivery tracking, visual automation builder
·MCP server on top, so the CRM is drivable from Claude
Next.jsSupabasePostgresGCP Cloud RunDockerMCP
03
man shravan
SHRAVAN(1)
# How I work, as a set of flags that are either set or not — the honest version of a values slide.
Name
shravan — takes a product from an empty repo to paying users
Most of what I do is decide what not to build. The rest is owning the whole line — schema, payment webhook, the app on the store, the sitemap Google reads — because a product that is handed between four people at four boundaries fails at the boundaries.
I write down the reasoning next to the code. Every repo here has a README that explains the trade, not the API, and the comments answer "why is it like this" rather than restating the line below.
Options
--grounded
A claim that cannot be traced back to the customer’s own data gets cut, not softened. Pothi discards a model’s sentence that names a sign its chapter never mentioned; Chhapa drops anything the tenant’s corpus does not support.
--no-silent-fallback
A missing value renders the gap. VN’s buy buttons disable themselves rather than guess a checkout URL — under the Consumer Protection Act an invented claim in an ad is an offence, and a fallback is how you invent one by accident.
--measured
Of the first nine clicks Meta sent to a landing page, four became a view. That number, not an opinion about bundle size, is what moved the code.
--rollbackable
The in-house astrology engine shipped behind one env flag next to the vendor it replaced. Anything that cannot be turned off in one move is not finished.
--own-the-line
I do not hand off at the API boundary. If the thing is slow, wrong or unindexed, it is mine wherever the cause turns out to live.
--boring-where-it-counts
Postgres, Express, one repo per product, no runtime coupling between them. The interesting decisions should be in the product, not in the deployment topology.
Exit status
0
shipped, measured, and someone paid for it
1
shipped and the number did not move — kept, rewritten, or killed
130
interrupted, because it was the wrong thing to build
See also
ventures(7) · stack.service(5) · contact(1)
04
systemctl status
5 units · 35 entries
# Not a word cloud. These are the units that have actually carried production traffic.