01
Widget named it
- Page
- /home
- Collection
- grade3
- Caller
- load
- Executions
- 5×
- Reads
- 605
Works with your stack
Next.js
Verified
SSR Compatible
Nuxt
Full Support
REST/proxy
Works with Nuxt Hooks
React
Verified
Works with React Hooks
Vite
Verified
Works with Vite Plugins
Angular
Compatible
Installer adds the widget to your HTML entry (e.g. src/index.html).
Vue
Compatible
Most Vue apps: follow our Vite guide. The bundled recordRead composable ships with Nuxt only.
Firestore charges per document read, not per query. A page that looks harmless in development can become expensive once real users start loading it.
Data is taken from a personal project that uses all firebase services.
ReadMeter makes those page-load patterns visible early, before you ship.
Get ReadMeter — $9One-time license · One device · Dev-only · Client + Admin SDK · Updates included
Real results
Stories from developers who caught expensive page-load patterns early. Not a leaderboard — proof that visibility helps you decide what to fix.
| Project | Reads | Change |
|---|---|---|
LWO Primary Education app focusing on practising English as a second language. Teachers relies on daily reports for tracking students' progress so fetch massive up to date data on a daily basis. Verified customer | 5,400 → 800 | ↓ 85% |
The Globals Primary and Secondary Education App. Students & Teacher fetch units, submit assignments and work on reports so repeated actions causes too many reads. Verified customer | 312 → 64 | ↓ 79% |
Vestel Learning Academy Caught unbounded leaderboard and admin dashboard queries during development. Caching and query limits cut session reads by ~80%. Verified customer | 12,000 → 2,500 | ↓ 79% |
Verified customer means we confirmed a valid ReadMeter license. Reviewed story means we manually reviewed the public claim before publishing.
Measured on Learn with Odi
A Grade 3 student reload of /home showed 605 Firestore reads, caller load, collection grade3, 5 executions. The pasteable agent task found two sibling mounts of the same hook — not a missing limit().
01
02
Refactor load() on /home · "Learn with Odi": - Executes 5× and triggers 605 reads on grade3 - Two sibling mounts fetch the same collection - Share one fetch + short TTL cache; do not add a limit()
03
Before
605
After
270
reads on this load
5× → 1 shared fetch
~55% fewer reads on that load
Execution count and caller name mattered more than “add a limit.” The bug was identity of the fetch.
Open the live demo appLocal development reload. Remaining ~270 reads are other /home work, out of scope for this pass.
Trace where reads come from, generate AI-ready fixes, and track local history while you build.
Deep Trace
Pinpoint the hot path fast: route, caller, executions, and the collection that scales your bill.
AI-Fix
Copy a context-rich prompt to Cursor or Claude with offender details and optimization hints.
Refactor load() on /home · "Learn with Odi": - Executes 5× and triggers 605 reads on grade3 - Two sibling mounts fetch the same collection - Share one fetch + short TTL cache; do not add a limit()
Local History
Compare routes over time without external dashboards or production instrumentation.
JSON Export
Save route-level read data as JSON so you or your team can diff, audit, and discuss optimizations with context.
{
"route": "/home",
"totalReads": 605,
"worstOffender": "load()",
"collection": "grade3",
"executions": 5
}The root causes
Most developers only see the total after a bill arrives — not the individual patterns that caused it.
One project: monthly Firestore costs dropped from ~$190 to ~$75 after catching expensive read patterns early.