BiliTV ships with no analytics SDK, no crash reporter, and no user identifier of any kind. That is a deliberate constraint: it runs on a television in someone's living room, and I would rather not know anything about them.
It also means that for months I had no idea how many people used it. Here is how I got real numbers anyway — without adding a single field of telemetry.
Two counters that were already there
Both numbers come from GitHub's public download counters, which turned out to be surprisingly precise instruments once I looked at what exactly increments them.
Install base. The webOS Homebrew Channel auto-updates apps by pulling the .ipk package — once per device, per version. So the download count of a single release is not a vanity metric; it is close to a census of devices that were online during that release's window. Consecutive releases land within a few percent of each other, which is itself a good sign that the counter measures what I think it measures.
Daily actives. The app checks for updates by fetching a 20-byte version.json release asset, and the client stamps the date in local storage so it fetches at most once per device per day. The daily delta of that asset's download count is therefore a count of distinct devices, not of launches — a true daily active figure, from a counter that ships no identifier at all.
The precision here comes entirely from the "exactly once per device per period" property. A counter that fires per launch would measure sessions and could never be de-duplicated; a counter that fires once per device per day is a unique-device count. If you get to design the event, design it for that.
What two numbers buy you
Daily actives divided by install base gives an engagement rate, and that single ratio unlocks the rest:
- Multiply it by seven and you have how many days a week the average installed device opens the app — a number I found humbling, and much lower than I would have guessed.
- Model the spread between heavy and dormant devices and you get monthly unique devices, which sits well below the install base but far above the daily figure.
- A television is a shared device, so human reach is some multiple of device counts — the household factor is the one number here nobody can measure from a counter.
None of that required knowing anything about an individual user. It required knowing what one event means.
I am deliberately not publishing the absolute figures. The point of this piece is the method; the scale of one small hobby project is not what makes it transferable.
The harder question: share of what?
Absolute numbers are only interesting against a denominator. Mine is genuinely hard: how many jailbroken LG televisions are there in China? Nobody publishes that. It is a textbook hidden population — no registry, no official statistics, no self-disclosure.
I ended up estimating it three independent ways and letting them argue.
Path one — the funnel. Global Homebrew installs (the same ipk-counting trick, applied to the channel's own release) times China's share of LG's installed base, times a multiplier for how much more motivated Chinese owners are to jailbreak. The last factor is a prior, and it dominates.
Path two — inverting my own numbers. If BiliTV is installed on p of all Chinese Homebrew devices, the market is my install base divided by p. Useful, but you cannot then use it to compute my coverage: that returns p unchanged, which is circular. I published that mistake before catching it.
Path three — an allocation key. Global installs are a hard number; only the China share is missing. I measured that share from the geography of ecosystem participants: 834 issue authors across five webOS Homebrew repositories, of whom 206 filled in a location, of whom two were mainland China. That raw 0.97% is provably too low — multiplying it by the global count gives fewer devices than I can already count myself. The bias splits into two parts, and one is measurable: Chinese users fill in the location field at roughly half the rate of the ecosystem at large, which I could check against my own project's stargazers.
The detour that changed the answer
Path one initially leaned on a figure I had reasoned my way to rather than found: LG's annual TV sales in China. Then it was pointed out to me that LG Electronics is a listed company, and listed companies file.
They do. The annual business report on Korea's DART disclosure system runs to a 3 MB PDF, and it is far more useful than any press release:
- TV production for 2025: 17.6 million units, against 24.0 million units of capacity. Manufacturing sites are listed as Korea, Mexico, Poland, Brazil and Indonesia — China does not appear. LG builds monitors there, not televisions.
- Subsidiaries are disclosed individually. LG Electronics (China) Co., Ltd. — the sales company — reported revenue of 211.5 billion won, about USD 147 million, down 6.6% year over year. That is 0.24% of group revenue, and 1.5% of what the US sales subsidiary books.
- The large Chinese subsidiaries are all export manufacturing: the Tianjin appliance plant books twelve times the revenue of the entire China sales company.
Backing out a unit count from that revenue — taking televisions as 10–30% of a multi-category sales company, at wholesale prices for premium OLED — gives 15,000 to 50,000 LG televisions sold through official channels in China per year. That is consistent with the outside view: the four foreign brands that are tracked in China (Samsung, Sony, Sharp, Philips) sell under a million units combined, and LG is not among them.
Substituting real filings for my own reasoning cut path one by more than half — and dropped it almost exactly onto path two. Two estimates with nothing in common, one built from a Korean subsidiary's income statement and one from GitHub download counters, converged to within a few percent of each other. That agreement is worth more than either confidence interval.
Letting the data constrain a number nobody publishes
One term stayed unmeasurable: grey imports. Chinese buyers of LG OLED sets largely bring them in through parallel channels, which appear in no statistic anywhere. I could only guess a multiplier of one to five times official sales.
Except there is a constraint that is true by construction: the market cannot be smaller than the part of it I can already count. Rejecting every simulation that violates it — plain rejection sampling — pushed the grey-import multiplier's posterior from a median of 2.2 up to 2.9. My own download counter, in other words, narrowed an estimate of an unmonitored import channel. That is the only place in the analysis where information flowed backwards, and it is my favourite part.
Where it lands
The Chinese Homebrew population turns out to be small enough to fit in a decent-sized lecture hall, and BiliTV reaches a meaningful minority of it. The full write-up, the Monte Carlo, and the scripts that reproduce every number live in the repository, for anyone who wants to run the method against their own project.
The uncomfortable conclusion is that the ceiling is structural rather than technical. LG's consumer business in China is a quarter of one percent of the company and shrinking; no amount of product work moves that. Knowing this changes what is worth building next — which is the only reason to measure anything.
If you take one thing from this: before adding telemetry, check what your existing infrastructure already counts. Package managers, release assets and CDN logs are often exact where an analytics SDK would only be approximate — and they cost your users nothing.