protondb

Check Steam Deck / Linux game compatibility via ProtonDB. Use when user asks about Steam Deck compatibility, Proton ratings, or Linux gaming support for specific games. Provides summary ratings and detailed user reports.

Requirements

Requires curl, node (for hash computation), and python3. No API key needed.

Install

npx skills add whtsky/skills -s protondb

ProtonDB

Check game compatibility on Steam Deck / Linux via ProtonDB APIs.

Rating Tiers (best → worst)

platinum > gold > silver > bronze > borked

API 1: Official Summary

GET https://www.protondb.com/api/v1/reports/summaries/{appid}.json

Returns: tier, bestReportedTier, trendingTier, score (0-1), confidence, total (report count).

trendingTier reflects recent reports — if it differs from tier, note it as the trend may indicate recent regressions or fixes.

API 2: Community Reports (Detailed)

ProtonDB serves report data as pre-built static JSON with hashed URLs. To access them:

Step 1: Get the token from counts.json

curl -s "https://www.protondb.com/data/counts.json"
# Returns: { "reports": 411787, "timestamp": 1774011569, ... }

Step 2: Compute the hash

The URL hash is computed from appId, reports count, timestamp, and page number:

# Usage: compute_hash <appId> <reports> <timestamp> <page>
node -e "
const R=(e,t,n)=>''+t+'p'+(e*(t%n));
const I=e=>Math.abs((''+e+'m').split('').reduce((a,c)=>(a<<5)-a+c.charCodeAt(0)|0,0));
const D=(e,t,n,r,o)=>I('p'.concat(R(e,t,n),'*vRT').concat(R(r,e,n)).concat(o));
console.log(D(${APPID},'${REPORTS}','${TIMESTAMP}',${PAGE}));
"

Step 3: Fetch reports

GET https://www.protondb.com/data/reports/{device}/app/{hash}.json

Device options: all-devices, steam-deck, pc, chrome-os

Returns paginated results (40 per page):

{
  "page": 1,
  "perPage": 40,
  "reports": [...],
  "total": 1994
}

Each report contains:

Complete Example (Shell)

#!/bin/bash
APPID=1245620  # Elden Ring

# Get token
COUNTS=$(curl -s "https://www.protondb.com/data/counts.json")
REPORTS=$(echo "$COUNTS" | python3 -c "import json,sys; print(json.load(sys.stdin)['reports'])")
TIMESTAMP=$(echo "$COUNTS" | python3 -c "import json,sys; print(json.load(sys.stdin)['timestamp'])")

# Compute hash for page 1
HASH=$(node -e "
const R=(e,t,n)=>''+t+'p'+(e*(t%n));
const I=e=>Math.abs((''+e+'m').split('').reduce((a,c)=>(a<<5)-a+c.charCodeAt(0)|0,0));
const D=(e,t,n,r,o)=>I('p'.concat(R(e,t,n),'*vRT').concat(R(r,e,n)).concat(o));
console.log(D($APPID,'$REPORTS','$TIMESTAMP',1));
")

# Fetch
curl -s "https://www.protondb.com/data/reports/all-devices/app/$HASH.json"

Pagination

To get page N, change the page parameter in the hash computation:

HASH_PAGE2=$(node -e "...D($APPID,'$REPORTS','$TIMESTAMP',2)...")
curl -s "https://www.protondb.com/data/reports/all-devices/app/$HASH_PAGE2.json"

Total pages = ceil(total / perPage).

Usage Guidelines

  1. Always fetch the summary first for a quick overview.
  2. Fetch detailed reports when user needs specifics (what issues exist, workarounds, Steam Deck specific notes).
  3. For Steam Deck queries, use device=steam-deck to filter SD-specific reports.
  4. Report both the overall tier AND the trending tier — they tell different stories.
  5. When summarizing reports, highlight: common issues, working Proton versions, and any required tweaks.
  6. The counts.json token changes periodically (when new reports are processed). Cache it for a few minutes at most.

Finding App IDs

Use the Steam store search:

curl -s "https://store.steampowered.com/api/storesearch/?term=game+name&l=english&cc=us" | python3 -c "
import json, sys
data = json.load(sys.stdin)
for item in data.get('items', []):
    print(f\"{item['id']} — {item['name']}\")
"

Fallback: Bulk Data Dump

If the hash-based API changes or breaks, ProtonDB publishes monthly data dumps under ODbL license: https://github.com/bdefore/protondb-datareports/ directory contains monthly .tar.gz files (latest ~59MB). Download, extract, and grep by appId. Not suitable for per-game queries but useful for bulk analysis.

Link to the game’s ProtonDB page: https://www.protondb.com/app/{appid}

View source on GitHub →