Bulk-upload Steam achievements to the Steamworks partner portal via browser automation
Project description
steam-ach-upload
Bulk-upload Steam achievements to the Steamworks partner portal using browser automation (Playwright). Reads a CSV file of achievements and uploads each one — including icons — without you having to click through the portal manually.
Features
- Uploads name, description, achieved icon, and unachieved icon for every achievement in one run
- Browser opens visibly so you can monitor progress and intervene if needed
- Login session is persisted, so you only authenticate once
--start Nlets you resume mid-way after a failure--dry-runprints the upload plan without touching the browser
Requirements
- Python 3.10+
- uv (recommended) or pip
Installation
From source (recommended for development)
git clone https://github.com/rhedak/steam_achievement_bulk_upload
cd steam-ach-upload
uv sync
uv run playwright install chromium
From PyPI (once published)
pip install steam-ach-upload
playwright install chromium
CSV format
Create a CSV file with the following columns (see sample/achievements.csv for an example):
| Column | Description |
|---|---|
API Name |
Steam internal achievement identifier (e.g. ACH_FIRST_STEPS) |
Display Name (EN) |
Name shown to players |
Description (EN) |
Description shown to players |
Achieved Icon |
Path to unlocked icon, relative to the CSV file |
Unachieved Icon |
Path to locked icon, relative to the CSV file |
Icon paths are resolved relative to the CSV file's directory, so you can keep icons in a subfolder next to the CSV (e.g. icons/my_ach_done.png).
Usage
# Upload all achievements
steam-ach-upload 1234567 path/to/achievements.csv
# Preview what would be uploaded (no browser)
steam-ach-upload 1234567 path/to/achievements.csv --dry-run
# Resume from row 15 after a failure
steam-ach-upload 1234567 path/to/achievements.csv --start 15
# Use a custom directory for the browser session
steam-ach-upload 1234567 path/to/achievements.csv --profile-dir ~/.steam_browser_session
# Debug: open browser, click New Achievement once, print page HTML, then exit
steam-ach-upload 1234567 path/to/achievements.csv --debug
Replace 1234567 with your actual Steam App ID, found in the Steamworks dashboard URL:
https://partner.steamgames.com/apps/achievements/YOUR_APP_ID
First run / login
On first run the browser will open to the achievements page. Log in with your Steamworks account, then the upload will start automatically. Subsequent runs reuse the saved session.
Running with uv (no install)
uv run --with steam-ach-upload steam-ach-upload 1234567 achievements.csv
Or from a local clone:
uv run python -m steam_ach_upload 1234567 achievements.csv
Running tests
uv run pytest
How it works
The portal requires achievements to be saved before icons can be attached. The tool therefore uploads each achievement in two passes:
- Fill in the API name, display name, and description → Save
- Re-open the saved row via Edit → upload achieved icon → upload unachieved icon → Save
If a row fails, the error is printed with the --start N command to retry from that point.
License
See LICENSE.
Disclaimer
Built with support by Claude Code.
Self-Promotion
If this package has been at all helpful to you consider checking out my game.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file steam_ach_upload-0.1.0.tar.gz.
File metadata
- Download URL: steam_ach_upload-0.1.0.tar.gz
- Upload date:
- Size: 30.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
324658fc08e75e37004817141d8a488e7671c35792935efea0c7c796512c81fa
|
|
| MD5 |
05cabc68a63797f6f8d9251ab4e3f637
|
|
| BLAKE2b-256 |
ee37637f62af46b0ca857de7a1cadb083cad00d2ce3db911069e7676f5d988e7
|
Provenance
The following attestation bundles were made for steam_ach_upload-0.1.0.tar.gz:
Publisher:
publish.yml on rhedak/steam_achievement_bulk_upload
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
steam_ach_upload-0.1.0.tar.gz -
Subject digest:
324658fc08e75e37004817141d8a488e7671c35792935efea0c7c796512c81fa - Sigstore transparency entry: 1650981703
- Sigstore integration time:
-
Permalink:
rhedak/steam_achievement_bulk_upload@32718c59b4e60befe4d493659a29351a80137cd2 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/rhedak
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@32718c59b4e60befe4d493659a29351a80137cd2 -
Trigger Event:
release
-
Statement type:
File details
Details for the file steam_ach_upload-0.1.0-py3-none-any.whl.
File metadata
- Download URL: steam_ach_upload-0.1.0-py3-none-any.whl
- Upload date:
- Size: 14.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
58ae91a62e6729054b77a55a3e2d050121fabea1d5e998bb1d67d8defc8ffbac
|
|
| MD5 |
55778aebab9db61fee765e4231718955
|
|
| BLAKE2b-256 |
77809fdcabde774b79e22515463488494997b01157212476f36ea7a803052bd1
|
Provenance
The following attestation bundles were made for steam_ach_upload-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on rhedak/steam_achievement_bulk_upload
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
steam_ach_upload-0.1.0-py3-none-any.whl -
Subject digest:
58ae91a62e6729054b77a55a3e2d050121fabea1d5e998bb1d67d8defc8ffbac - Sigstore transparency entry: 1650981776
- Sigstore integration time:
-
Permalink:
rhedak/steam_achievement_bulk_upload@32718c59b4e60befe4d493659a29351a80137cd2 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/rhedak
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@32718c59b4e60befe4d493659a29351a80137cd2 -
Trigger Event:
release
-
Statement type: