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.
Release files for steam-ach-upload 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| steam_ach_upload-0.1.0.tar.gz | 30.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| steam_ach_upload-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 44.9 kB
Release files / steam_ach_upload-0.1.0.tar.gz
| Download URL | steam_ach_upload-0.1.0.tar.gz |
|---|---|
| Size | 30.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
324658fc08e75e37004817141d8a488e7671c35792935efea0c7c796512c81fa
|
|
BLAKE2b-256 checksum How to use checksums |
ee37637f62af46b0ca857de7a1cadb083cad00d2ce3db911069e7676f5d988e7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 28, 2026.
Transparency logRelease files / steam_ach_upload-0.1.0-py3-none-any.whl
| Download URL | steam_ach_upload-0.1.0-py3-none-any.whl |
|---|---|
| Size | 14.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
58ae91a62e6729054b77a55a3e2d050121fabea1d5e998bb1d67d8defc8ffbac
|
|
BLAKE2b-256 checksum How to use checksums |
77809fdcabde774b79e22515463488494997b01157212476f36ea7a803052bd1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 28, 2026.
Transparency log