Build1 distinct publisher3 min readPublished
Rows were virtualized and memory was fine, but element height ran out around 15,950,000 pixels, so BGrid v1.0.3 maps a bounded physical scrollbar onto a logical range and leaves the browser out of the arithmetic.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Follow any of these and your For You feed starts watching them — no settings page required.
build
Proptech AI pilots stall at the read path out of the system of record1 distinct publisher
build
Shipping the five-step agent loop costs between 794 and 1,729 lines1 distinct publisher
build
The stale closure is not React trivia, it is a correctness bug with a five-line fix1 distinct publisher
build
The Escape-key listener you cannot fix with a dependency array1 distinct publisher
A spacer that tall does not raise an exception. The layout engine stops honouring the height, the scroll area stops growing, and every row index derived from scrollTop starts pointing somewhere else. That is the failure the BGrid team reported on dev.to: React did not crash, memory was not exhausted, and the DOM never held 700,000 nodes [2]. It presents as a virtualization bug, because the component that looks broken sits downstream of the one that is.
Hold the constraint this way: the ceiling is priced in pixels and paid in rows. At roughly 29px per row, the budget BGrid was approaching bought 550,000 rows [3]. Put a 48px touch-height row in the same budget and it buys 332,291 [1]. The dataset itself is unchanged. Run the same division on a timeline at one pixel per second and the budget is about 184.6 days of track [2]. A log viewer with wrapped lines is the same sum with a taller unit. The million-row demo the team wanted would have needed 29,000,000px, roughly 1.8 times the height at which the layout was already misbehaving [3].
The v1.0.3 fix is to stop asking. Physical scroll position and dataset position are separated: the browser scrolls a bounded range it can handle, and BGrid maps that position into the logical range, then into a row index, then into rendered rows [5]. The ceiling was a consequence of the dependency, and the author states plainly that row 550,001 marks where that dependency broke down, not an intentional speed limit [9].
What you pay is the scroll contract. Once the physical range is deliberately smaller than the logical one, the ratio between them exceeds one by construction, so a scroll offset now names a set of rows that your mapping function resolves, rather than a single row directly [4]. Position restore, deep links and scroll-to-row, all of which used to work because the browser owned the mapping, now run through your code.
The 10,000,000-row result [7] transfers only under conditions the post half states. Row height has to be constant, because every figure in the writeup is a row count times 29px [3]. The row lookup has to be fast enough to run inside a scroll handler, since the mapping resolves an index and then needs data for it. And the bounded physical range has a value the post does not publish, which is the one number that tells you how coarse a single scrollbar drag becomes. The author says plainly that 10 million database records in browser memory is not the suggestion, and points at server-side processing at that scale [8].
The number worth writing down somewhere is your usable element height divided by your tallest row. That is the row index where the symptoms start and the cause stops being your code.
Ranked by verification strength, evidence, and original report placement.
BGrid (BeautifulGrid) is an open-source React + TypeScript data grid released under the Apache-2.0 license.
BGrid's first public demo handled 550,000 rows; when the team pushed to 600K, 700K and 1 million the layout started breaking, while React did not crash, the browser was not out of memory, and 700,000 DOM nodes were not being rendered.
BGrid rows were approximately 29px high, so 550,000 rows implied 550,000 x 29px = 15,950,000px of scroll height, which the team describes as approaching the practical physical height limit they were seeing in the browser.
The team concluded the virtualized rows were not the problem and the virtualized scrollbar was: they hit practical CSS/layout limits for extremely large element dimensions in their target browsers, and the physical scroll area could no longer grow reliably.
In BGrid v1.0.3 the architecture separates the browser's physical scroll position from the dataset position: the browser scrolls a bounded safe physical range, and BGrid maps that physical position into the larger logical dataset range, then to a logical row position, then to the visible rows it renders.
Once the dependency on full physical scroll height was removed, the 550K ceiling disappeared and 1,000,000 rows became the large-data example in BGrid v1.0.3, without requiring a 1,000,000 x 29px = 29,000,000px physical DOM height.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · September 1, 2026
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 team's account, checkable arithmetic, unverified cause
Split the story in two and the evidence splits with it. The arithmetic side is solid and anyone can redo it: 550,000 rows at 29px really is 15,950,000px, and 1,000,000 rows really would have demanded nearly twice the height that was already failing. The causal side is a single team's debugging story — the browsers are called "our target browsers", no version is given, no documented limit is cited, and no reproduction is linked. The million- and ten-million-row runs are asserted in a sentence each, without a device, a frame time or a memory reading.
A version number, not a user
We can see that v1.0.3 exists and that its demo now shows a million rows. We cannot see a single install, star, dependent, contributor or team running BGrid in an application, and the project is only days old. There is no honest way to score uptake from a release note about itself.
The post argues with its own headline
The title sells a million rows and the body immediately talks the reader down: don't put 10 million records in a browser, this is not a benchmark toy, memory and sorting and serialization are still yours to solve. That self-restraint is why the gap is small rather than large. What keeps it on the positive side is the ten-million-row line, which does a benchmark's rhetorical work without any of a benchmark's furniture — and it is precisely the detail most likely to be repeated without the caveats that surround it.
Maker writing about their own launch week
This is the project team publishing about its own point release on a platform where a round number in the title is the distribution strategy; the piece closes on a feature list. None of that is concealed, and the self-deprecating caveats read as genuine. But there is no adversarial reader anywhere in our coverage — no skeptic, no competing implementer, no browser engineer — so the diagnosis and the record both go unchallenged.
Believable mechanism, unreplicated result
We would bet on the diagnosis: browsers really do stop honouring absurd element heights, the failure signature described fits, and the numbers reconcile. We would not yet bet on the capability figures, which are self-reported once and never reproduced. One independent developer naming a browser and a height at which the spacer stops growing would move this a long way in either direction.