I built Ebitta, a free daily stock screener for NSE and BSE, and this is how its pages get served.
Everything starts after each market close. A Python batch job runs inside a Cloudflare container and computes the day's screens: fresh and near breakouts on daily and weekly timeframes, new-listing breakouts, momentum leaders over one week to one year, 52-week highs, delivery-percentage accumulation, and Confluence, which lists stocks that appear in more than one screen.
The batch writes one snapshot into R2 object storage. A Cloudflare Worker then server-renders every page from that snapshot: a page per stock, sector pages, and a page per screen.
After each publish, the site pings IndexNow to notify search engines about the updated URLs.
You can see the result here: https://ebitta.com/confluence?utm_source=devto&utm_medium=community&utm_campaign=launch
Not investment advice; I'm not SEBI-registered.
Top comments (1)
Computing all NSE and BSE breakouts in a single post-close container batch and dumping one unified snapshot into R2 keeps the Cloudflare Worker layer completely stateless during market hours. Serving every stock and sector page from that precomputed object eliminates database connection bottlenecks under traffic spikes. How large does that daily R2 snapshot get, and do you cache parsed slices in Worker memory or KV to avoid reading the full blob on each request?