Build1 distinct publisher3 min readPublished
A writeup of GrahaAPI says the classical math held up and the infrastructure did not: a C ephemeris keeping zodiac mode per thread returned dasha periods years off, under a clean HTTP 200 with no exception raised.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
The 24 degrees is what makes the thread bug expensive instead of obvious. Nakshatra segments are 13 degrees 20 minutes wide [6], so divide: 24 / 13.333 = 1.8 [24]. A chart computed on a cold thread lands 1.8 segments over, inside a real nakshatra with a real ruling planet, and that seeds a full 120-year dasha cycle [7][9]. Nothing raises [8]. Every number in the response agrees with every other number in the response.
That is why the fixture list carries more weight than it first appears. Look at which of those tests would actually have caught thread B. The sum-to-120-years invariant [12] would not: a cycle seeded from the wrong nakshatra still sums to 120 years. The Ashtakavarga check would [15], because it compares a computed total against a value published outside the codebase. That is the difference between a self-consistency test and an oracle, and only the second kind detects a constant offset applied to every longitude.
The 28/36 fixture is the neatest of the set [13]. Two identical charts share a nadi, which is a dosha, so a perfect compatibility score is a defect rather than a nice result. The developer offers it as an interview question for astrology-app devs [13], and it is a fair one.
The sunrise formatter broke the same way, two orders of magnitude smaller. 07:59:34 rendered as 07:00, because 59.57 seconds rounded to 60 without carrying into the hour [17]. The displayed value is off by 59 minutes and 34 seconds [25], and it still looks like a sunrise.
The 429 is a middleware ordering problem with an unusually wide blast radius. The site's API key had exceeded its monthly quota, and the quota middleware was registered outside the CORS middleware, so its short-circuited response never passed through the layer that attaches Access-Control-Allow-Origin [20]. To a browser, a response missing that header is indistinguishable from a CORS violation [21], which is why the console named CORS and the CORS config had not been touched [18][19]. The 429 body itself was informative, with reset dates, in both languages, and no client ever saw it [21]. The fix is to attach the headers on each early-return path in the outer layer [22].
Two of these lessons transfer without argument. Grepping C bindings for a mode setter and assuming thread-local until proven otherwise [11] costs nothing and applies to any sync endpoint sitting on a threadpool [3]; re-asserting the mode inside every function that touches the library [10] is the same kind of cheap. The third one has a precondition. The standing rule that a failing accuracy test means the code is wrong and never the test [16] holds here because the spec was frozen centuries before the software, and because the user's grandmother has a printed panchang on the wall and will check it [27]. Where the spec is a ticket from last quarter, that rule mostly freezes your bugs into fixtures.
Ranked by verification strength, evidence, and original report placement.
GrahaAPI comprises 237 REST endpoints across 23 modules of Vedic astrology, with Hindi and English in every response.
The ephemeris core is a C library with Python bindings that holds which zodiac mode is active as global state, per thread.
The first request warmed thread A with sidereal mode set and correct positions; a request landing on a freshly spawned thread B silently defaulted to tropical mode, and every longitude came back about 24 degrees off.
Vedic astrology runs on the sidereal zodiac, offset from the tropical zodiac by about 24 degrees (the ayanamsa); GrahaAPI uses Lahiri, the Indian government standard.
A nakshatra is which of 27 equal 13 degrees 20 minutes segments of the ecliptic the Moon occupies.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 30, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
Force the tool call, then hand Lightsail a long-lived key1 distinct publisher
build
Your 90% Cache Hit Ratio Is a Lagging Indicator. Alert on Cold Misses Per Key1 distinct publisher
build
Shared memory in Java: the mmap is the easy half, the descriptor handoff is the work1 distinct publisher
build
JetBrains asked 15,000 developers how much code agents write. The answers add up to 112 percent1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One interested witness
The wrong nakshatra, the 429 wearing a CORS costume, the 237 endpoints — all of it comes from the man who wrote the code, published on dev.to, with no repository, no trace, no log excerpt and no second account. What saves it from being unverifiable is that the mechanisms are general: FastAPI's threadpool handling of sync endpoints is documented, browsers really do treat a missing Access-Control-Allow-Origin as a CORS block, and the classical fixtures the tests cite can be looked up in print. The incidents cannot be looked up anywhere.
One caller, and it is his own site
The only usage in evidence is internal: the consumer site exhausted its own monthly key, which is how the outage started. Endpoint counts, module counts and a tiered throttling policy describe what exists to be called, not who calls it. No customer, integration, download figure or third-party deployment appears in the reporting, so there is nothing here that would let anyone read demand off this story.
Undersells its own useful part
This is the rare product post whose loudest sentence is 'we shipped years-off answers under HTTP 200'. The one inflated note — Indian astrology apps as a quietly huge market — arrives without a figure and is never leaned on again. If anything the framing is too modest: a native library holding mode in per-thread globals behind a threadpool has nothing to do with astrology, and burying that under a Vedic-astrology headline hides the part most engineers could use.
Vendor authoring his own postmortem
GrahaAPI's builder is selling GrahaAPI, and the piece closes on a curl command with free test keys and a paid tier that throttles rather than blocks. A candid bug story is the most effective marketing a developer API has, and dev.to publishes what it is handed — nobody in this chain has an interest in the account being wrong. The shape of the candour is telling too: the mechanism of the worst bug is explained in detail, while how long it ran and who got the bad charts goes unmentioned.
Mechanisms credible, scale unchecked
Both failure stories are specific in the ways invented ones rarely are. A response short-circuited before the header layer genuinely is indistinguishable from a CORS rejection, and 24 degrees genuinely is about 1.8 nakshatra widths — which is exactly why the wrong Moon position looked reasonable instead of absurd. That internal coherence buys real credence for the diagnoses. It buys none for the product claims wrapped around them: 23 modules, bilingual everywhere, Ashtakavarga matching the classical value point for point, all resting on one interested author's word.