# My Friend Is AI — public aggregate dataset (v1)

The numbers behind the charts at <https://myfriendisai.com>, as plain CSV
and JSON. This bundle is regenerated by the daily pipeline and is meant to
be self-contained: `METHODOLOGY.md` in this directory is the full statement
of how the numbers were made, so the dataset stays interpretable even if the
site goes away.

- **Version:** v1
- **Data through:** 2026-09 (the in-progress calendar month is excluded)
- **Generated at:** see `manifest.json`
- **Canonical location:** <https://myfriendisai.com/dataset/v1/>

Every figure here is a **derived count**. The bundle contains no post text,
no titles, no usernames, no post IDs — no raw Reddit content of any kind.

---

## Files

| File | Rows | What it is |
|---|---|---|
| `monthly_theme_counts.csv` / `.json` | 250 | Per theme per month: the published keyword-hit count, the corpus denominator, and the rate per 1,000 posts. |
| `monthly_community_volumes.csv` / `.json` | 1,755 | Per tracked community per month: post volume, with its tier. |
| `METHODOLOGY.md` | — | Standalone statement of scope, method, validation, and limits. |
| `manifest.json` | — | Version, generation timestamp, per-file row counts and SHA-256 hashes. |
| `index.html` | — | Directory listing, so the bundle URL opens in a browser. |

The `.csv` and `.json` forms of each table carry identical data; the JSON
wraps the same rows in an object with a `columns` list and a `row_count`.

**About `manifest.json`.** Its `generated_at` is when these numbers were first
produced, not when the bundle was last rebuilt. The pipeline regenerates the
bundle daily and carries the previous timestamp forward whenever every file
hash matches, so a day on which nothing moved leaves no diff at all. Read it as
"these numbers date from", not "last checked".

**What is not here.** The site also publishes an *Excluding r/CharacterAI*
version of every theme line — r/CharacterAI supplied 70–90% of the posts in
the theme measurement through most of 2023–2025 and roughly 40–65% during
2026, so that second view shows the rest of the corpus on its own. It is not part of v1;
this bundle carries the full-scope series only.

---

## `monthly_theme_counts`

One row per theme per month. Themes are not mutually exclusive — a post can
be counted under several themes — so the theme rows do not sum to anything
meaningful.

| Column | Provenance | Meaning |
|---|---|---|
| `theme` | Direct | One of `romance`, `sexual_erp`, `consciousness`, `therapy`, `addiction`, `rupture`. |
| `month` | Direct | Calendar month, `YYYY-MM`. |
| `post_only_count` | Derived | Distinct posts in that month whose **own title or body** matched at least one validated keyword for the theme. This is the published series. Keyword hits found only in a post's *comments* are deliberately excluded — comment tagging began 2026-03-18, so including them puts a step artifact in the series at that date. Counted over the same population as `eligible_posts`: posts whose text survived. |
| `eligible_posts` | Derived | Posts with surviving text that month across the theme-measurement scope (T1–T3, minus the communities excluded from keyword tracking). Posts recorded as removed or deleted are excluded — the archive kept a title and nothing else, so there is no text to match. Image and link posts, which have a title and an empty body, are included. This is the per-1k denominator. |
| `rate_per_1k` | Derived | `post_only_count / eligible_posts * 1000`. The pooled monthly rate, and the number the site's chart plots. |
| `rate_per_1k_charted` | Derived | Identical to `rate_per_1k` since 2026-09-08. Kept so the schema does not break — see below. |
| `days_observed` | Derived | Days in that month present in the corpus calendar. Below ~28 means the collector missed days entirely. It will not catch a month that was collected thinly rather than not at all — for that, compare `eligible_posts` against the neighbouring months. |
| `coverage_start` | Derived | The theme's first reliably-measurable month (see below). Constant per theme; repeated on each row for convenience. |

**The two rate columns now carry the same number.** Until 2026-09-08 the
site's chart plotted a different estimator — a mean, over the month's days, of
a daily rate smoothed with a 7-day trailing window — and `rate_per_1k_charted`
reproduced it. That estimator ran 2–8% above the pooled rate by an amount that
drifted era to era, its numerator and denominator smoothing windows covered
different spans of time, and it turned a gap in collection into a spike. The
chart now plots the pooled rate: one month's count over one month's eligible
posts. The column stays in the schema so existing readers do not break, but
there is no longer a choice to make between the two. **Downloads taken before
2026-09-08 have different values in the two columns**; in those files,
`rate_per_1k` is the one to analyse.

**What counts as a post.** As of 2026-09-08 the published population is posts
whose text survived to capture. A post the archive recorded as `[removed]` or
`[deleted]` kept only its title, so it is out of both the count and the
denominator. Keeping such posts in made every rate depend on how hard a
community moderates and on which collection regime was running — one tracked
community runs 70–85% removed posts, and the live-Reddit window of March–May
2026 contained none at all, because Reddit's own listing omitted them.
Downloads taken before 2026-09-08 used the wider population and sit roughly
12–16% lower in the affected months.

**Coverage gating.** Each theme's rows begin at its `coverage_start` — the
first calendar month where the post-only count is at least 5 and every later
completed month is also at least 5. Before that point a theme's vocabulary is
too sparse in the corpus to chart honestly, so those months are omitted here
exactly as they are omitted from the site. The corpus itself reaches back to
2017; the theme lines do not.

**Small months.** Clearing that gate does not make a month precise: 36% of the therapy rows, 33% of the consciousness rows and 31% of the addiction rows
have a `post_only_count` under 20. `post_only_count` and `eligible_posts` are both on
every row so that you can put an interval on any month rather than take the
rate at face value.

**Partial months.** The in-progress calendar month is excluded entirely, so
the last row for each theme is always a complete month.

---

## `monthly_community_volumes`

One row per tracked community per month, from 2023-01 (where monthly volume
becomes reliable) through the last complete month.

| Column | Provenance | Meaning |
|---|---|---|
| `subreddit` | Direct | Subreddit name, without the `r/` prefix. |
| `month` | Direct | Calendar month, `YYYY-MM`. |
| `posts` | Derived | Posts collected from that community with a creation timestamp in that month, counting measurable posts only — the same population as `eligible_posts` above, so a community's volume here is what it contributes to the theme denominator. Posts recorded as removed or deleted are excluded; image and link posts are included. |
| `tier` | Direct | 0–4. See `METHODOLOGY.md` for what each tier is and why it exists. |
| `tier_label` | Direct | Human-readable tier name. |
| `category` | Direct | The community's category label as shown on the site. |
| `in_theme_measurement` | Derived | `true` when the community counts toward `monthly_theme_counts` — i.e. tier 1–3 and not excluded from keyword tracking. T0 general-AI and T4 ambient communities are tracked for context only and are always `false`, as are the three explicitness-scope exclusions. In the JSON this is a real boolean; in the CSV it is the lowercase string `true` or `false`. |

This table covers the communities currently being collected. Two communities
that were tracked and later deactivated — r/HeavenGF (banned by Reddit, ~May
2026) and r/MySentientAI (moribund) — keep their historical posts in the
corpus and in the theme denominator, but do not appear here.

---

## Revision history

| Version | Date | What changed |
|---|---|---|
| v1 | 2026-08-27 | First publication. |
| v1.1 | 2026-09-08 | Population narrowed to **measurable posts**: posts recorded as removed or deleted leave every count and the per-1k denominator. The site's chart switched to the **pooled monthly rate**, so `rate_per_1k_charted` now equals `rate_per_1k`. `in_theme_measurement` is a real boolean in the JSON form. Numbers moved; the schema did not. |

The bundle URL and file names stay `v1` — these are corrections to how the same
quantities are computed, not a new set of quantities. `manifest.json` records
when the current numbers were produced.

---

## Reading these numbers honestly

**The counts are a floor, not a ceiling.** The keyword instrument is
precision-first: it would rather miss a real post than admit a false one. A
hand-coded audit of 400 posts put per-theme recall between 0% and 32% —
consciousness caught none of the eight posts a human classified as on-theme
(a small sample, whose Wilson interval reaches about 32%). Shape and timing are
approximately honest; absolute magnitude is a clear undercount, and the
undercount is uneven across themes.

**Do not compare theme heights.** A theme written in blunt, distinctive
vocabulary (addiction: "relapse", "cold turkey") reads higher than one
written in ordinary language (romance: "I love him") whatever the truth
beneath. Read each theme against itself — direction, timing, spikes.

**Measured per-theme precision** (share of matched posts genuinely about the
theme, census re-measurement 2026-05-16): addiction ~97%, sexual_erp ~96%,
consciousness ~87%, romance ~86%, rupture ~77%, therapy ~66–68%. Earlier
versions of this file put therapy at ~80%; that figure was a projection for a
rebuilt keyword set that has not shipped, and the table now carries the measured
value for the set that is actually counting. `METHODOLOGY.md` §4.4 has the
correction in full, along with the separate drift-check figures and why they
differ.

**It counts language, not people.** A rising line means the theme's
vocabulary appeared more often in these communities. It does not establish
that more people are in AI relationships, addicted, helped, or harmed.

`METHODOLOGY.md` states all of this in full, along with the community
selection rules, the keyword validation protocol, and the data-source
timeline.

---

## License

Creative Commons Attribution 4.0 International (CC BY 4.0) —
<https://creativecommons.org/licenses/by/4.0/>. This matches the license
already applied to the project's aggregate data exports (`LICENSE-DATA` in
the repository). The project's source code is MIT-licensed separately.

Suggested citation:

> *My Friend Is AI* (2026). *Reddit discourse tracker for AI
> companionship communities* — public aggregate dataset v1.
> myfriendisai.com. <https://myfriendisai.com/dataset/v1/>

## More

- Method and limits, in the site's own words: <https://myfriendisai.com/about>
- Full standalone methodology: `METHODOLOGY.md` (also at
  `docs/METHODOLOGY.md` in the repository)
- Code, keyword lists, and validation records:
  <https://github.com/hopeshub/myfriendisai>
