# MLX Score

The MLX Score rates a listing from 1 to 5 using only public data (App Store ratings, Homebrew installs, GitHub stars, Hugging Face downloads, npm and PyPI downloads), ranked against the other listings in its category. It is never a user rating and never paid for.

The code is `lib/store/score.ts` (`scoreAll`); the signals are read by `lib/store/signals.ts`. Every listing page shows the score's parts: each signal, its value and when it was read. The method in words is on [apps.mlx.app/score](https://apps.mlx.app/score).

## The signals

A listing names where its signals live (`signals` in its entry). Each one becomes a single number, bigger is better:

| Signal | Source | The number | Weight |
| --- | --- | --- | --- |
| Rating | App Store and Mac App Store, as Apple reports them | The average rating, shrunk toward 3.5 as if there were 50 more ratings of 3.5: `(avg × n + 3.5 × 50) / (n + 50)`. Ten ratings say less than ten thousand. | 0.35 |
| Homebrew | formulae.brew.sh install counts | log₁₀(1 + installs in the last 90 days) | 0.20 |
| GitHub | the repository | log₁₀(1 + stars), with stars counted at half when the repository has had no push for a year | 0.20 |
| Hugging Face | the model or organisation | log₁₀(1 + downloads) + ½ · log₁₀(1 + likes) | 0.15 |
| Packages | npm and PyPI | log₁₀(1 + monthly downloads of both) | 0.10 |

A signal a listing doesn't have, or that reads zero, is left out. It is never guessed.

## From signals to a score

:::steps
### Rank each signal
Each of the listing's numbers is ranked against the same signal of the other listings in its category, as a percentile from 0 to 1 (ties count half). When fewer than four listings in the category have that signal, it is ranked against every listing in the store that has it.
### Weigh them
The percentiles are averaged with the weights above, over the signals the listing actually has. A listing with only GitHub stars is scored on its stars alone.
### Map to 1–5
Score = 1 + 4 × the weighted percentile, rounded to one decimal. A listing with no signal at all has no score.
:::

Because the score is a rank within a category, it says how a listing compares with the alternatives next to it, not how good it is in absolute terms. A 4.5 among coding agents and a 4.5 among voice apps are each near the top of their own shelf.

## What never goes into it

- No paid placement and no paid ratings. If paid placement ever exists, it will be labelled "Sponsored" and will not change the score or the rankings.
- No affiliate links.
- No user ratings, no reviews written by us or by an AI, no "estimated users", and no rating count we didn't read.

## Freshness

The produce cron reads the oldest signals first, four listings every five minutes, and a signal older than six hours is due again; a view of a store page can also queue a refresh. The [catalogue API](/store/catalog) carries the current scores.
