01
Widget named it
- Page
- /home
- Collection
- grade3
- Caller
- load
- Executions
- 5×
- Reads
- 605
Firestore charges per document read, not per query. A page that looks harmless in development can become expensive once real users start loading it.
Monthly reads from one of my own production apps, which uses every Firebase service.
Re-renders, sibling components and listeners quietly repeat the same query. Firebase shows you the monthly total, not the screen or function behind it.
ReadMeter makes those page-load patterns visible early, before you ship.
Measured on Learn with Odi, one of my apps
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. Local development reload. Remaining ~270 reads are other /home work, out of scope for this pass.
New in 1.3 · readmeter audit
One command loads every route, ranks what to fix across all of them, and writes one prompt for your AI agent. After the fixes, it measures again and shows what actually changed.
readmeter auditEach route is loaded several times with an empty cache. REPORT.md ranks the findings across pages, so a hook that over-reads on six routes is one fix.
FIX_PROMPT.mdFIX_PROMPT.md asks Claude Code, Cursor or any coding agent to show you a plan and wait for your approval before it edits anything.
readmeter audit --afterCOMPARE.md shows before → after per route, which findings are fixed, pages worth a second look, and read budgets to keep in CI.
readmeter add also installs a ReadMeter skill for both. Ask your agent to "audit Firestore reads" and it runs all three steps, and waits for your OK before it edits anything.
| Route | Before | After | % |
|---|---|---|---|
| /leaderboard | 120 | 20 | −83% · fixed |
| /discussions | 80 | 80 | ±0 |
| /quiz-challenges | 45 | 45 | ±0 |
| All 6 pages | 294 | 194 | −34% |
One finding fixed by an agent: the leaderboard now loads 20 rows with a "Show more" button instead of all 120. The other two findings are still open.
Runs on localhost with Playwright. Estimated document reads and writes, not a bill.
Built on real apps
ReadMeter started as a tool for the Firebase apps I build and run. These are reads it caught there during development. Customer stories will appear here once they're submitted and verified.
| Project | Reads | Change |
|---|---|---|
The Globals
Education app with 6,600 daily users. ReadMeter's read sources pointed at a triple class query and a student page loading teacher data; five fixes cut reads per pass 31% for teachers and 25% for students. Maker's project | 314.4M → 236.0M | ↓ 25% $47.04/mo |
Maker's project: an app I build or maintain, measured with ReadMeter in development. Verified customer: a story submitted with a valid ReadMeter license and reviewed before publishing.
Saved per month: for the maker's projects, reads before and after are scaled to the app's real traffic (daily active users from Firebase, one pass through the app per user per day) at $0.06 per 100,000 reads, before the free tier. Customer figures are their own estimates.
Privacy
Reads are counted inside your browser (client SDK) and your local Node process (Admin SDK). Document contents are never sent anywhere.
No service accounts, no Firebase console access, no API keys. ReadMeter only sees what your app already loads on localhost.
The widget stays inactive outside localhost and in production builds, so nothing ships to your users.
What leaves your machine, and when: Before you buy · Privacy Policy
Why not build it yourself?
| What you need | DIY counter | ReadMeter |
|---|---|---|
| Setup | Wrap every read call by hand | One install command |
| Calling function and collection for each read | Manual tags on every call | |
| Execution count (same query running 5×) | ||
| Writes and deletes, counted apart from reads | Wrap every write call too | |
| Ready-to-paste fix prompt for your AI agent | Built in | |
| Whole-app audit with a before/after compare | You build it | readmeter audit |
| Cost | An afternoon, plus upkeep | $9 once |
One duplicate fetch caught before launch is worth more than a surprise bill.
$9 $19 launch price · one-time, no subscription
Launch price for the first 50 buyers: 50 left. Then $19, with every future update still included.
Dev-only: it counts reads while you build. Not a billing calculator, not production monitoring, and not a guarantee of a lower bill.
A runaway query is free to fix on localhost. On one of my own apps, monthly Firestore read costs fell from ~$190 to ~$75 after fixing what ReadMeter surfaced.