Turn a simple list of games into clean shareable tier-style poster cards. Make one image per category, or a single S/A/B style tier list, each filled with real game cover art and ready to post.
If this is useful to you please give the repo a star and follow me on GitHub. It genuinely helps and means a lot. Thank you! 🙏
Separate mode (one image per category):
Combined mode (a single S/A/B style tier list):
(Sample outputs generated entirely by this tool from a CSV of game titles.)
- 📥 Reads your games from a CSV file (
category,title) - 🖼️ Automatically downloads each game's cover art from SteamGridDB
- 🎨 Builds one horizontal card per category. The game name is baked into every poster
- 🧱 Or builds one combined S/A/B style tier list with all categories in a single image
- 🌈 Color grades categories gold to red in the order you list them (top tier to bottom tier)
- 🖥️ Exports in 4K or 8K, as PNG or JPG
- ⚡ Runs with one command. It installs its own dependencies and fonts on first run
- Python 3.9 or newer. Download here (on Windows tick "Add Python to PATH" during install)
- A free SteamGridDB API key (takes about 1 minute. Steps below)
- An internet connection (to download covers and fonts)
That's it. No coding knowledge required.
Option A. Download (easiest): click the green Code button on GitHub, then Download ZIP, then unzip it.
Option B. Clone:
git clone https://github.com/MMALI3287/game-tier-list-maker.git
cd game-tier-list-maker- Go to steamgriddb.com and log in (you can use your Steam account).
- Open Preferences then API.
- Click Generate API key then copy it.
In the project folder find the file .env.example. Make a copy of it, rename the copy to .env,
then open it in any text editor and paste your key:
STEAMGRIDDB_API_KEY=paste_your_key_here
CSV_FILE=example.csv
RESOLUTION=4k
IMAGE_FORMAT=png
MODE=separateYour
.envis private. It is never uploaded to GitHub (it is listed in.gitignore).
Edit example.csv (or make your own CSV) with two columns. The category and the game title:
category,title
Personal Hall of Fame,The Witcher 3: Wild Hunt
Personal Hall of Fame,Red Dead Redemption 2
Always Down to Play Again,Portal 2
Always Down to Play Again,Rocket League- Each category becomes one image (in separate mode).
- Categories are colored gold to red in the order they first appear. Put your favorites first.
- You can open this file in Excel, Google Sheets, or any text editor.
If you use a different file name set CSV_FILE=yourfile.csv in .env.
Open a terminal in the project folder then run:
python run.pyThe first run installs Pillow then downloads the fonts automatically, then fetches every cover
and builds the cards. When it finishes your images are in the output/ folder. 🎉
Opening a terminal in the folder: • Windows: Shift + Right-click inside the folder, then "Open PowerShell window here" • Mac: right-click the folder in Finder, then Services then New Terminal at Folder • Linux: right-click inside the folder, then Open Terminal
Set MODE in your .env (or pass --mode):
separate: one image per category (default)combined: a single S/A/B style tier list with every category as a colored rowboth: produces the separate images plus the combined tier list
python run.py --mode combined
python run.py --mode bothChange these in your .env (or pass them as flags):
| Setting | Options | What it does |
|---|---|---|
RESOLUTION |
4k / 8k |
Output size (8K is huge and slow) |
IMAGE_FORMAT |
png / jpg |
PNG for best quality, JPG smaller |
MODE |
separate / combined / both |
Layout style |
CSV_FILE |
any filename | Which game list to use |
Command line flags (these override .env):
python run.py --res 8k # render in 8K
python run.py --mode combined # single tier list image
python run.py --csv mylist.csv # use a different list
python run.py --force # re-download every cover
python run.py --fetch-only # only download covers
python run.py --render-only # only rebuild cards from cached coversCovers are cached in covers/. Re-running is fast because only new games are downloaded.
Cover lookup is automatic and usually right. For games with generic names it can pick the wrong title. A few games occasionally have no portrait art. The tool prints a list of any it could not match.
To fix one, add it to overrides.csv with the correct SteamGridDB game id:
title,sgdb_id
Deadlock,5453171Finding the id: search the game on steamgriddb.com, open its page,
then copy the number from the URL. Example: steamgriddb.com/game/5453171 gives the id 5453171.
Then re-run python run.py (add --force to refresh that cover).
run.py -> poster_cards/
config.py reads .env and sets paths
data.py parses your CSV and overrides
covers.py searches SteamGridDB and downloads portrait art
render.py composes the cards with Pillow
- Cover art is fetched from SteamGridDB, a community database.
All game cover images are the copyright of their respective publishers and artists. They are used
here only to illustrate the games. This project does not own or redistribute any of that artwork. It is
downloaded locally when you run the tool (the
covers/folder is git-ignored, not committed). - The sample images in
previews/are shown for demonstration only. They also contain third-party cover art owned by the respective rights holders. - Fonts: Fraunces and Montserrat, both licensed under the SIL Open Font License.
- Built with Pillow.
If you are a rights holder and want a sample image removed please open an issue.
This project's code is released under the MIT License. This license covers the source code only. It does not cover the third-party game cover art or fonts referenced above.
If you made something cool with this I would love to see it. ⭐ star the repo and follow me!


