Skip to main content

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 N lets you resume mid-way after a failure
  • --dry-run prints 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:

  1. Fill in the API name, display name, and description → Save
  2. 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.

Steam

Itcho.io

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)

Source distribution for steam-ach-upload 0.1.0
File Size Uploaded
steam_ach_upload-0.1.0.tar.gz 30.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for steam-ach-upload 0.1.0
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page