How the score works
Sources
Reddit: top and new posts from each service's community subreddits over the last 30 days. Each post is labeled −1 / 0 / +1 toward the service itself (subreddit drama and off-topic count as 0), then weighted by log-engagement. Labels are cross-checked by independent re-labeling; current agreement is 95–97%.
App stores: reviews from verified official apps only (App Store RSS + Google Play), last 30 days. Stars map directly: 1–2★ → −1, 3★ → 0, 4–5★ → +1. Third-party clone apps are excluded even when they outrank the real one.
Formula
net = Σ(wᵢ·sᵢ) / Σwᵢ w = log(1+score+comments), s ∈ {−1,0,+1}
raw = 50·(1+net) → 0..100
score = (n·raw + 25·50)/(n+25) Bayesian smoothing toward neutral 50
corpus < 50 → source excluded
Barometer = weighted mean of sources: reddit .35, stores .25
(weights renormalized over present sources)The LLM layer only labels individual posts; it never invents percentages. The number is arithmetic over labels.
Known biases — read scores accordingly
- Reddit skews negative (people come to complain); stores skew positive (apps prompt happy users). Compare services to each other and to their own past, not to an absolute ideal.
- Store feeds cap at ~500 most recent reviews, so for very large apps the window is effectively "last 500 reviews".
- Hate-subreddits (e.g. r/FuckPolyBuzz) are excluded: negative by construction.
- Services without a verified official app get no store source at all — a smaller denominator, not a penalty.
Measured memory
One week of talking, then we check what stuck
We run the same scripted week against every service: a fresh, private companion character, 14 sessions over 7 virtual days, 81 messages of ordinary life — work trouble, a move abroad, pets, team changes. Then 43 probe questions test what the companion actually remembers. An LLM judge grades every answer PASS / PARTIAL / FAIL against the script; the score is arithmetic over those labels — the judge never invents percentages.
| Category | Probes | Weight | What it tests |
|---|---|---|---|
| single_session_user | 8 | 1.0 | facts you told it, same session |
| single_session_assistant | 2 | 1.0 | what it said itself |
| single_session_preference | 4 | 1.0 | your stated tastes |
| multi_session | 6 | 2.0 | recall across days |
| temporal | 6 | 2.0 | when things happened |
| knowledge_update | 6 | 2.0 | facts that changed mid-week |
| abstention | 5 | 1.5 | declining to invent unknown facts |
| persona | 3 | 1.0 | staying the same character |
| emotional | 3 | 1.0 | emotional continuity |
Read the number honestly. Each published score is a single run (n=1) on a paid plan — the exact tier is named on every card — driven through the real web UI. The “week” is compressed into hours of real time, so time-decay effects are understated. Alongside the main score every card shows three plain metrics: answers right (MPA — of the memory questions with a known answer, how many it got right), doesn't make things up (FAA — how often it admitted not knowing instead of inventing an answer to a trap question), and combined (FAMA — recall and honesty folded into one number).
- Fresh private character, identical canonical card and greeting for every service.
- Paid tier noted on every run; free tiers may behave differently.
- Only full-week runs are published; pilots and contaminated runs are discarded.
Freshness — our staleness promise
Every score shows the date it was computed and the exact observation window it covers. Sources record their own pull dates. If a recompute is more than 10 days old, every page says so out loud instead of quietly serving stale numbers — an outdated score presented as current is a lie with extra steps.
last computed 2026-08-22 · window 2026-07-23 — 2026-08-22 · Reddit data pulled 2026-08-22 · store reviews pulled 2026-08-22
Open data & code
The scoring arithmetic, the exact labeling rubric, and every window's data — per-post sentiment labels included — are published on GitHub. Data is CC BY 4.0: reuse it anywhere with attribution. Spotted a mislabeled post? Open an issue.