Advanced Performer Rating

Advanced Performer Rating

A Stash plugin that adds a multi-category rating system for performers. Rate each performer across several criteria (Face, Technique, etc.), grouped into weighted buckets, and Stash’s overall performer rating is calculated and updated automatically.

Everything is configured through a dedicated settings panel — no plugin tasks, no manual tag creation. Rename criteria, add custom ones, tweak weights, and add/remove groups all in one place.

Credits

Inspired by the Advanced Rating System plugin on the Stash community forums, which introduced the concept of using tags for multi-category ratings.

Requirements

  • Stash v0.27+
  • Python 3.x
  • stashapp-tools (bundled in vendor/; auto-installed via pip when available)

Installation

  1. In Stash go to Settings → Plugins → Add Source and enter:
    https://ordureconnoisseur.github.io/plugins/main/index.yml
    
  2. Find Advanced Performer Rating in the plugin browser and click Install.
  3. Open Settings → Plugins → Advanced Performer Rating and click Save in the panel — this seeds the default config and creates the rating tags for you.

Usage

Click the ★+ button on any performer’s page to open the rating modal. The button shows a count badge when the performer has criteria still unrated — yellow if the performer is partially rated (e.g. you’ve added a new criterion since they were last rated), grey when fully unrated. No badge means every criterion is rated.

The modal renders each criterion grouped by its configured group, with a bold header per group. Rate each category using the 1–5 star selectors. Hover over the ⓘ icon next to a category name to see its description. Unrated criteria are highlighted with a small “unrated” pill so you can see at a glance which ones still need a score.

As you click stars, the corresponding category tag (Face ★: 4, etc.) is applied to the performer and Stash’s overall rating is recalculated automatically via the Performer.Update.Post hook.

Click Score breakdown at the bottom of the modal to expand a panel that shows exactly how the rating is being calculated: per-group weighted average, then the final weighted mean across groups, and the rating100 result after precision snapping. The collapsed/expanded state is remembered across sessions.

The rating is visible directly on the performer page alongside the category tags that were assigned.

Configuration

Open Settings → Plugins → Advanced Performer Rating to access the settings panel. The panel replaces Stash’s native plugin-settings UI (which can’t reliably render dropdowns or persist non-boolean values) with a fully interactive React component.

General

  • Rating Star Precision — auto-matched from Stash’s own rating-system setting (Settings → Interface → Editing → Rating System). FULL = 20, HALF = 10, QUARTER = 5, TENTH = 1, DECIMAL = 1. The panel polls every few seconds so the displayed value tracks Stash’s setting without reopening the panel.
  • Allow Destructive Actions — gates the orange “Remove orphaned tags” and red “Delete all rating tags” buttons. Off by default.

Groups

Criteria are bucketed into groups, and the final rating is a weighted mean of each group’s average.

  • Name — display label. Renaming a group doesn’t touch any tags (tags are per-criterion, not per-group).
  • Weight — how much this group counts in the final score relative to others.
  • Reorder / Delete — at least one group must exist. Deleting a group reassigns its criteria to another group.

Defaults seed Physical and Performance with equal weight.

Criteria

Each criterion is a rateable category that produces a tag prefix <Name> ★ with children <Name> ★: 0 
 <Name> ★: 5.

Field Meaning
Toggle Enabled / disabled. Disabled criteria are ignored by the rating math and hidden from the modal.
Name Display name. Used as the tag prefix (a ★ is automatically appended in the tag name).
Group Which group this criterion contributes to. Populated from the configured group list.
Weight How much this criterion counts within its group.
✎ Edit the description shown as a tooltip in the rating modal. Clear it to hide the tooltip; Reset to default restores the bundled wording (only available for the eight default criteria).
↑ ↓ Reorder.
× Remove the criterion from this configuration. Tags stay on disk — use Remove orphaned tags to clean up.

+ Add criterion appends a new custom criterion with a generated slug id.

Actions

  • Save — persists configuration AND automatically creates any missing tags for new criteria AND renames tags for any criterion you renamed. One click handles every workflow.
  • Recalculate all performers — walks every performer in Stash and updates their rating100 based on the current configuration. Useful after changing weights or group settings.
  • Reset to defaults — restores the bundled 2 groups + 8 criteria.
  • Remove orphaned tags — scans Stash for criterion tags whose criterion was renamed or removed and deletes them with their 0–5 children. Requires Allow Destructive Actions.
  • Delete all rating tags — destroys the parent tag plus every configured criterion’s tags. Requires Allow Destructive Actions.

How It Works

Each criterion produces a tag prefix like Face ★, with six child tags Face ★: 0 through Face ★: 5 organised under a single Advanced Performer Rating parent tag.

When a performer is updated, the Performer.Update.Post hook fires the Python script. It:

  1. Reads the plugin’s configuration from Stash’s plugin-config store.
  2. Builds the criteria/groups model.
  3. Scans the performer’s tags for any matching <prefix>: <0–5>.
  4. Computes a weighted average per group, then a weighted mean across groups.
  5. Snaps the result to Stash’s configured rating precision and updates rating100.

Rating Calculation

For each group g with at least one matching tag:

group_avg(g) = Σ(score × criterion_weight) / Σ(criterion_weight)

Final rating:

final_avg = Σ(group_avg(g) × group_weight(g)) / Σ(group_weight(g))   over groups with hits
rating100 = round(final_avg × 20, snapped to precision)
  • One group → flat weighted average across all enabled criteria.
  • Two groups with equal weight → original plugin behaviour: Physical and Performance carry equal weight regardless of how many criteria are in each.
  • Three or more groups → weighted mean of their averages.
  • Groups with no tag matches are skipped; if no groups have any hits, the rating is not updated.

Where settings are saved

Plugin configuration (groups, criteria, weights, descriptions, the destructive-actions toggle) is persisted via Stash’s configurePlugin GraphQL mutation, which writes to Stash’s main config.yml under plugins.advancedPerformerRating.* (~/.stash/config.yml on Linux/Mac, %USERPROFILE%\.stash\config.yml on Windows).

Scenario Plugin config Rating tags Performer ratings
Uninstall + reinstall plugin :white_check_mark: (it’s in config.yml, not the plugin folder) :white_check_mark: (DB) :white_check_mark: (DB)
Database backup / restore :white_check_mark: (not in DB) :white_check_mark: Restored :white_check_mark: Restored
Wipe DB only :white_check_mark: :cross_mark: — re-run Save in the panel :cross_mark:
Restore older config.yml :warning: reverts to that backup :white_check_mark: untouched :white_check_mark: untouched
Stash factory reset :cross_mark: :cross_mark: :cross_mark:

For a backup of just the criteria/group setup, the file to keep is config.yml. Tags live in the DB, so a DB backup plus a config.yml copy together cover both halves.

License

AGPL v3.

3 Likes

This plugin is in violation of a license.

Thanks for flagging. I’ve updated the license to AGPL v3 to comply.

hi its not working for me can you help? when i try to give a rating it tells me that no tags are available and that i need to run the “create tags” task. I did that and it still gives the same error

The issue was most likely that stashapp-tools wasn’t installed on your system. I’ve just pushed an update that fixes this, the plugin will now automatically install it if it’s missing. Just update the plugin in Stash and try running Create Tags again. Let me know if you’re still having issues!

Thank you for the quick update!

The create task now finally starts and takes a long time. after it finishes nothing really changed. still the same message and no created tags

Just pushed another fix and tested it on Windows, Mac, and Linux - it should work now. Please update the plugin in Stash and run Create Tags again. If it’s still not working, could you send me your Stash logs? Go to Settings → Logs immediately after running the task and paste anything related to advancedPerformerRating.

026-04-25 15:34:52Error [Plugin / Advanced Performer Rating] WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by ‘ReadTimeoutError(“HTTPSConnectionPool(host=‘pypi.org’, port=443): Read timed out. (read timeout=15)”)’: /simple/stashapp-tools/

2026-04-25 15:34:36Error [Plugin / Advanced Performer Rating] WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by ‘ReadTimeoutError(“HTTPSConnectionPool(host=‘pypi.org’, port=443): Read timed out. (read timeout=15)”)’: /simple/stashapp-tools/

2026-04-25 15:34:20Error [Plugin / Advanced Performer Rating] WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by ‘ReadTimeoutError(“HTTPSConnectionPool(host=‘pypi.org’, port=443): Read timed out. (read timeout=15)”)’: /simple/stashapp-tools/

WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by ‘ReadTimeoutError(“HTTPSConnectionPool(host=‘pypi.org’, port=443): Read timed out. (read timeout=15)”)’: /simple/stashapp-tools/

i get the same error when i manually run “pip install stashapp-tools” in cmd

The error means your machine can’t reach pypi.org at all to download the package. This a network issue. A few things to try:

  1. Increase the timeout (sometimes pypi.org is just slow):
    pip install stashapp-tools --timeout 60

  2. Try a mirror (pypi.org might be blocked in your region):
    pip install stashapp-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/

  3. Manual install — if pip can’t reach the internet at all, you can install it
    offline:

  • Go to stashapp-tools · PyPI in a browser and download the .whl file
  • Then run: pip install C:\path\to\stashapp_tools-x.x.x-py3-none-any.whl

Are you using a VPN at all? if so maybe try disabling that to install.

Its getting weird. No I’m not using a vpn. pypi doesnt work, the mirror doesnt work. I’ve tried manually downloading the repo and installing it with pip install /path/to/stash-tools and that last option seemed to work until it needed to get dependencies

Your situation is unusual — most systems can reach PyPI fine, but I’ve pushed an update that handles the offline case. The plugin now ships with a bundled fallback copy of the required library, so if pip can’t download it, it automatically uses the bundled version instead. Just update the plugin and it should work without any manual steps.

Okay
 Finally
 It worked lol.

I did “pip install stashapp-tools --timeout 120”
it installed but i needed to manually add the script folder to the PATH.
now your plugin works fine.

in the end it had nothing to do with the plugin, but thanks for the help anyways

Glad it’s sorted, and thanks for reporting back - useful to know it was a PATH issue in the end. Enjoy!

1 Like

I noticed that you also use Ascension plugins in Multiview Plugins image.

Does it affect this plugins of yours?

They can coexist; there’s no collision on tags or custom fields. The only shared resource is Stash’s rating100 field (the star rating).

Ascension writes it from battle outcomes; APR recalculates it from category tags on every performer update. In practice APR tends to “win” on performers where you’ve set category scores, since it fires on save.

I treat this as intentional: the star reflects the explicit category scores you have set, and Ascension still provides value for comparisons, rank/badge context, and battle history in its own custom fields, even if rating100 doesn’t always match the last battle result.

Worth knowing if you use Ascension’s pairing/ordering logic heavily, it’ll be less reliable on performers where APR is active. For me that tradeoff is fine. If you hit a specific bug, happy to look into it.

1 Like

Hello, i don’t understand why it’s not working. Tags are create, i have rate all categories, but nothing appears on the final rate.

This was a bug on my end — now fixed! I recently updated the plugin to add a ★ suffix to all rating tags (e.g. “Face ★”) to avoid conflicts with common tags, but forgot to update one part of the backend to match, so ratings stopped calculating.

To fix it:

  1. Update the plugin to the latest version
  2. Either re-save any performer that has ratings applied, or run the Process All Performers task from the plugin’s task list to recalculate everything at once

Let me know if you still have any issues!

Done it, but not working

Oh no, I mean specific the rating part lol.

I’m guessing you guess is just add star together and divide by #? And Ascension will decrease and increase the star as they win or lose.