# Chess improvement services, scored on public criteria — open dataset

147 chess improvement services (platforms, apps, engines, coach directories, institutions) scored on 56 criteria grouped into 11 categories, plus a separate survey of what 83 of them allow **without paying**. Every score cites the public page it came from.

- **Version:** 2026-09 · surveyed August–September 2026
- **License:** [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) — reuse freely, including commercially, with attribution to ChessPivot and a link to the comparison page.
- **Home:** https://www.chesspivot.com/en/best-chess-improvement-apps
- **Method:** https://www.chesspivot.com/en/best-chess-improvement-apps/method
- **Corrections log:** https://www.chesspivot.com/en/best-chess-improvement-apps/corrections

## Disclosure

ChessPivot publishes this comparison **and is scored in it**, by the same grid, from public pages only. That is exactly why the raw scores, the grid, the weights and the evidence URLs are all in this dataset: you can recompute the entire ranking with your own weights, without taking our word for anything. On the default weighting ChessPivot ranks first; on equal weights it does not lead every category, and in the free-only view it is second.

## Files

| File | Rows | What it is |
|---|---|---|
| `chesspivot-chess-services-2026-09.json` | — | Everything below in one nested document: metadata, grid, services, scores, evidence URLs, free-access survey. |
| `services.csv` | 147 | One row per service: identity, overall score, the eleven category scores, free-only score. |
| `scores.csv` | 8 232 | One row per (service × criterion): the raw 0–3 score, the level it matched, and the page that establishes it. |
| `criteria.csv` | 56 | The grid: every criterion, its category, its weight, and the four level definitions. |
| `free-access.csv` | 4 648 | One row per (service × criterion) for the 83 services with a free mode: what the free tier allows, quota quoted verbatim. |

CSV files are UTF-8 with a byte-order mark (so Excel opens them correctly), comma-separated, `"` doubled inside quoted fields, LF line endings.

## How scoring works

- Each of the 56 criteria has **four levels (0–3) written before any service was looked at**. A score is the level the service matched — not an opinion on a scale.
- A **category score** is the mean of its criteria, rescaled to 0–10.
- The **overall score** is the weighted mean of the eleven category scores; the weights are published in `criteria.csv` (`category_weight`) and sum to 100. `services.csv` also carries `unweighted_score`, the plain mean of the eleven categories, so you can see how much the weighting moves anything.
- Only services of `kind = platform` receive an overall score (`scored_overall = true`). An engine, a coach directory or an institution does not answer every category; scoring them overall would rank them last for not pretending to be something they are not. They are still scored category by category.
- Everything was read from **public pages**. When a fact is not documented publicly, the criterion scores 0: not documented, not credited.

### The free-only score

The same grid is re-applied with the paywall masked. The rule was fixed before the survey, and applies identically to every service:

| `status` | Effect on the score |
|---|---|
| `unlimited` | full score kept |
| `quota-real` | one level down (floor 0) |
| `quota-symbolic` | capped at 1 |
| `paid` | 0 |
| `undocumented` | 0 — the free status is not stated publicly, so nothing is credited |
| `na` | not applicable (the criterion was already scored 0) |

`quota-symbolic` means a quota so small the feature cannot be used as a habit — the published boundary of criterion D1 (fewer than 5 exercises a day, or one analysis a day).

## Columns

### `services.csv`

| Column | Meaning |
|---|---|
| `slug` | Stable identifier, used as the join key in every other file. |
| `name`, `url` | Service name and home page. |
| `kind` | `platform`, `engine`, `coaches`, `institution`. |
| `type_en`, `price_en` | One-line description and headline price, as read on the public pricing page. `price_en` keeps the justification in parentheses. |
| `languages` | Number of interface languages, when stated publicly; empty otherwise. |
| `read_at` | Date the public pages were read (YYYY-MM-DD). |
| `scored_overall` | `true` if the service receives an overall score (see above). |
| `overall_score` | 0–10, weighted. Empty when `scored_overall = false`. |
| `unweighted_score` | 0–10, plain mean of the eleven categories. |
| `free_overall_score` | 0–10 under the free mask. Empty when no free mode was surveyed. |
| `score_A_…` … `score_K_…` | The eleven category scores, 0–10. |
| `review_url` | The published review page, when one exists (64 of 147). |

### `scores.csv`

| Column | Meaning |
|---|---|
| `service_slug`, `service_name` | Join key and readable name. |
| `category_code`, `criterion_code` | `A`–`K` and `A1`–`K3`; join to `criteria.csv`. |
| `criterion_label_en` | What the criterion measures. |
| `score` | 0–3, the level matched. |
| `level_label_en` | The definition of that level — what the score literally means. |
| `evidence_url` | The public page the score was read from. Empty when the service has no published review page yet, or when the evidence carries no URL. |

### `criteria.csv`

`criterion_code`, `category_code`, `category_name_en`, `category_name_fr`, `category_weight` (sums to 100 across the eleven categories), `criterion_label_en`, `criterion_label_fr`, `evidence_expected_en` (the kind of page that settles this criterion), `level_0_en` … `level_3_en` (the four definitions).

### `free-access.csv`

| Column | Meaning |
|---|---|
| `service_slug`, `criterion_code` | Join keys. |
| `status` | One of the six values in the table above. |
| `quota_verbatim` | The quota **as written on the service's own page**, in that page's language — quoted, never paraphrased. Empty when the status carries no quota. |
| `source_url` | The page the status was read from. |
| `note_fr` | The surveyor's note, in French (the survey was conducted in French). Context only; it changes nothing in the score. |
| `score` | The raw 0–3 score, repeated for convenience. |
| `free_score` | The score after the mask — recompute it from `status` and `score` to check the rule. |
| `read_at` | Date the free-mode pages were read. |

## Honest limits

- **It is a snapshot.** Prices and features move. Every row carries its `read_at`; corrections are published with a date in the corrections log.
- **Public pages only.** A feature that exists but is documented nowhere public scores 0. That is a deliberate choice — it is the only rule that can be applied identically to 147 services — but it does mean the dataset measures *what a service demonstrates*, not everything it does.
- **The weighting is a judgment call.** The eleven weights are ours; they are published, adjustable on the site, and `unweighted_score` lets you drop them entirely.
- **`evidence_url` is not complete.** 64 of the 147 services have a published review page carrying the evidence for each score; for the others the score stands but the per-criterion URL is not yet published in this file.
- **The free survey covers 83 services** — those with a free mode worth measuring. The other 64 have no free tier, or none that reaches the D1 threshold.

## Corrections

If a score is wrong, the fix is a URL: the service, the criterion, the public page that establishes the fact, and the date you read it. Send it to contact@chesspivot.com. Every proposal is examined and its outcome published, dated, in the corrections log — whether the score changes or not.

## Citation

> ChessPivot (2026). *Chess improvement services, scored on public criteria* (version 2026-09) [Data set]. https://www.chesspivot.com/en/best-chess-improvement-apps/data
