Will this stay free?
For a normal blog, yes, and not narrowly. The numbers are below so you can check that against your own traffic instead of taking a promise for it.
Charcha runs on Cloudflare’s free tier: a Worker, which is the code, and D1, which is the database. Neither has a bill attached until you choose to add one. What they have instead are daily ceilings.
The three numbers that can stop your site
Section titled “The three numbers that can stop your site”All three are daily, they all apply to your whole site, and they all reset at midnight UTC.
| Limit | Applies to | What stops working when you reach it |
|---|---|---|
| 100,000 Worker requests/day | your whole site | comments stop loading, everywhere |
| 5,000,000 database rows read/day | your whole Cloudflare account | comments stop loading, everywhere |
| 100,000 database rows written/day | your whole account | reading comments is fine, posting stops |
There is a fourth Cloudflare limit you will see quoted, on how many database queries one request may run. It cannot stop your site, and the section near the end of this page explains why it is worth knowing about anyway.
Reading and writing have very different budgets. You get 50 times more reads than writes, which stays abstract until you work out what it would mean if loading a page also wrote to the database. Ordinary traffic would burn through the writing allowance, and then nobody could comment for the rest of the day. Traffic would quietly switch commenting off. So reading comments in Charcha performs no writes at all. That is a deliberate property rather than a happy accident, and it is the single thing keeping a busy day from breaking your comment box.
A worked example
Section titled “A worked example”A blog with 1,000 posts. 5,000 visitors a day reading about three posts each, so roughly 15,000 page views. A well-commented post has 20 comments on it.
| Budget | Used | Of the allowance |
|---|---|---|
| Worker requests | 15,000 | 15% |
| Database rows read | ~300,000 | 6% |
| Database rows written | 0 | 0%, since writes happen only when somebody comments |
| Storage | ~20 MB | ~4% of the 500 MB per-database limit |
That blog is not close to anything. It could grow around 6× before any of this needed thinking about.
Where the ceiling actually is
Section titled “Where the ceiling actually is”Worker requests, at roughly 100,000 comment-thread loads a day. That is the number to watch.
Database reads only become the binding limit first if your pages average more than about 50 comments each, because 5,000,000 reads divided by 100,000 requests is 50 rows per request. Below that average you run out of requests first. So the thing to keep an eye on is your visitor count, not your database.
Two details push the ceiling further out than you would expect.
A page nobody has commented on costs almost nothing. Charcha creates no database row for a page until somebody actually comments on it, so an uncommented page reads as empty without touching stored data. On a 1,000-post blog where 50 posts have conversations, the other 950 are nearly free.
The embed script itself is not a Worker request. Cloudflare serves it as a static asset, and static assets are free and unlimited. Only fetching the comments costs you a request.
What happens when you hit one
Section titled “What happens when you hit one”They fail differently, and which one you hit tells you how urgent your day is.
Worker requests exhausted. The widget can no longer fetch comments. Your posts still load normally, because the comment section is the only part of your page that talks to Charcha at all. Resets at midnight UTC.
Database rows read exhausted. The same symptom, for the same reason. This limit is per Cloudflare account, so it is shared with anything else you run there.
Database rows written exhausted. Reading works fine and posting a comment fails. This is the asymmetric one: your site looks completely healthy to a visitor right up until they try to say something. Because reading performs no writes, it is also the limit you are least likely to reach on traffic alone. Getting here usually means a genuine flood of comments, or an import.
Too many queries in a single page load. Only that page fails, and only your most-commented ones. Charcha uses a fixed, small number of queries to render a page however many comments are on it, precisely so this limit does not creep up on your busiest threads. The next request is unaffected.
The fourth limit, and why it cannot bite you
Section titled “The fourth limit, and why it cannot bite you”Cloudflare caps how many database queries a Worker may run while answering a single request. This one gets quoted a lot and is widely misread, including by an earlier version of this page, so it is worth being exact about the unit.
It is not a limit on rendering, and not a limit per page of your blog. When somebody opens one of your posts, that page comes from your own host and has nothing to do with Charcha. The widget then makes one request to your Charcha Worker asking for that post’s comments. The cap applies inside that one request.
Charcha answers it with one query, on a post with three comments or three hundred. So a request uses one of the fifty it is allowed, and the number does not move as a conversation grows.
That is the whole reason the limit is unreachable, and it is a design decision rather than luck. The obvious way to build a comment reader is to fetch the comments, then fetch each comment’s replies in a loop. Sixty comments becomes sixty-one queries, and the busiest post on your site is the first thing to break, which is the worst possible order to discover it in. Charcha reads a page with a single joined statement instead, and a test asserts it stays exactly one.
So this limit constrains how complicated a request may be, not how many you can serve or how much you can store. You cannot reach it by being popular.
The number itself is disputed
Section titled “The number itself is disputed”Cloudflare’s own documentation disagrees about what the cap is. The D1 limits page says 50 on the free plan. The Workers limits page and a February 2026 changelog say free-plan Workers get 1,000 requests to Cloudflare services, and a database query is one of those. The D1 figure may simply predate the change.
Charcha is built for 50, the lower number and the cheaper mistake. At one query per request the difference is academic, but a documentation page should not hand you a disputed figure as a settled fact.
Everything else here was checked against Cloudflare’s documentation on 2026-07-23. Cloudflare moves its limits from time to time, so treat these as accurate as of that date and go read the source if a number is load-bearing for a decision you are making.
The spam classifier, and what it costs
Section titled “The spam classifier, and what it costs”Charcha’s sixth spam layer learns from your own moderation decisions. It runs on Workers AI, which has its own free allowance, separate from everything above.
You get 10,000 neurons a day, on the free plan and the paid one alike, resetting at midnight UTC. Neurons are Cloudflare’s unit for AI work. Charcha uses @cf/baai/bge-m3, which costs 1,075 neurons per million tokens of text it reads.
That is a strange unit until you turn it into comments. A 400-character comment is roughly 100 tokens, so it costs about a tenth of a neuron.
| What your site does | Neurons per comment | Comments a day before the allowance runs out |
|---|---|---|
| Nothing yet, still cold-starting | 0 | no limit, the layer is not running |
| Classifying incoming comments | ~0.11 | ~93,000 |
| Classifying, and you moderate every one | ~0.22 | ~46,000 |
| A 10,000-character comment, the longest allowed | ~2.7 | ~3,700 |
For scale, the Worker request ceiling further up this page is 100,000 a day, and that counts every comment thread anyone loads. You would run out of Workers before you ran out of neurons, several times over.
It costs nothing at all until it has learned something
Section titled “It costs nothing at all until it has learned something”The layer refuses to guess before it has seen at least 30 comments you approved and 30 you marked spam. That check happens before the comment is sent for embedding, so a new deployment spends zero neurons no matter how much traffic it takes. The bill starts when the layer starts being useful, not when you install it.
While it is cold-starting, the only neurons you spend are on moderation decisions, one per comment you rule on, which is how it builds the training set in the first place.
If you did run out
Section titled “If you did run out”The embedding call fails, and the layer treats a failure the way it treats not knowing: it abstains. Comments carry on arriving and carry on landing in your moderation queue. You lose the extra opinion for the rest of the day, not the comments.
If you are on the paid plan
Section titled “If you are on the paid plan”Usage past the daily 10,000 is $0.011 per 1,000 neurons. At a tenth of a neuron per comment, that is a bit over a dollar per million comments classified. The free allowance is the realistic ceiling for a blog, and the paid rate is there for completeness rather than because you are likely to meet it.
Checked against Cloudflare’s Workers AI pricing on 2026-07-29. Token counts are approximate, because how text divides into tokens depends on the text.
If you outgrow it
Section titled “If you outgrow it”The Workers paid plan starts at a minimum of $5 a month and raises every ceiling on this page by a large multiple. It is a minimum rather than a flat fee: the $5 includes generous allowances, and usage past them is charged per unit. On the database side, the paid plan includes 25 billion rows read and 50 million rows written per month before any per-row charge, which are not figures a blog is going to trouble.
You migrate nothing, change no code and move no data. It is a billing setting on the Cloudflare account that already runs your site.