Role
Full-stack implementation
Case Study
Separating recent-block summary data from full block responses to improve list-view performance while preserving complete block data for detail pages and richer consumers.
Summary
Role
Full-stack implementation
Scope
Recent blocks list, block detail API, backend endpoint design, database query path, frontend list rendering
Focus
Payload size, API/UI contract alignment, list/detail data boundaries
Outcome
Reduced list responses from roughly 3–5 MB to 5–10 KB
TL;DR
I split the explorer list and detail data paths, reducing recent-block responses from roughly 3–5 MB to 5–10 KB while preserving full detail views.
The blockchain explorer needed to support a fast, scannable recent blocks list while block detail pages and richer consumers still required complete block data.
Each recent-block row only needed summary data such as block height, timestamp, and transaction count. The full block endpoint remained necessary for complete block information, including richer block data and transaction details, but that payload should not have been fetched for every row in the list view.
The recent-block list was using a full-detail response even though the UI only needed height, timestamp, and transaction count.
Full block objects on the list path
Compact summary rows for scanning
The optimization came from matching the response shape to the UI consumption pattern: compact summaries for scanning, complete block data for detail views.
This was a full-stack project. I implemented the frontend changes, backend API changes, and related database work myself.
I identified the mismatch between the recent-block list UI and the full block response shape, split the list and detail consumption paths, and aligned the frontend around a lightweight summary response backed by a more appropriate database query path.
About a week after launching the blockchain explorer, the recent blocks page became noticeably slow. I inspected the network responses and found that the list page was fetching full block objects, including transaction details, even though the UI only needed compact row data.
I implemented a lightweight summary endpoint for recent-block list views and kept the full block endpoint for detail pages and consumers that needed complete block data.
Kept the complete block endpoint available for detail pages and richer consumers while the list moved to compact summary data.
Before
3-5 MBAfter
5-10 KBBoundary
List / detail splitCompatibility
Full detail preservedImproved recent-block page performance and scanability
Kept full block data available for detail pages and richer consumers
Made list payload size independent from the number of transactions inside each block
The main lesson was that frontend performance is often a contract problem, not just a rendering problem — and when you own the full stack, you can fix the contract at the right layer.