gog-cli
gog is a Python CLI for backing up a user's owned DRM-free GOG game library.
It is focused on safe, scriptable workflows:
- list owned games with filtering and fuzzy search
- plan and execute backups to a local directory
- preserve metadata needed to audit and restore backups
- download installers and related files with resumable behavior
- verify downloaded files when checksums are available
It's also comfortable as a quick, interactive tool:
gog list # your purchased library
gog list civilization # fuzzy title search
gog search "baldurs gate" # public catalog, with an "owned" column
gog dl "civilization iv" # download by name or id in the current directory
gog dl 1760534591 --win # unambiguous by id, Windows files only
gog help dl # contextual help for any command
Install
Requires Python 3.12 or newer.
pip install gog-cli
To install the latest development version directly from GitHub:
pip install git+https://github.com/aleksandarristic/gog-cli.git
Development
python3 -m venv .venv
. .venv/bin/activate
python -m pip install -e ".[dev]"
python -m pytest
Run the CLI locally:
gog --help
gog list
gog plan --all --summary
gog dl --games-from games.txt --dry-run
Roadmap
See docs/TODO.md for planned features and improvements.
Reference
Basic Workflow
gog auth login
gog refresh
gog list
gog plan --destination /path/to/backups --all --storage --check-free-space
gog backup --destination /path/to/backups --all --yes
gog list --backup --destination /path/to/backups
gog sync --destination /path/to/backups --all --yes
gog refresh updates the local purchased-library and download-metadata caches.
It does not download game installers. Run it before browsing or filtering newly
added library metadata.
--destination is optional everywhere above — it defaults to the current
directory, so cd into a backup folder and drop it from every command.
Browsing Purchased Games
gog list reads the local cache written by gog refresh; it does not contact
GOG. Human output includes ID, title, release year, genre/category, and
platforms when those fields are available. JSON output also includes scriptable
metadata such as owned, release_date, genres, and is_installable.
gog list alone lists everything; gog list TEXT fuzzy-searches by title.
Neither purchased nor backup is a reserved word — a game actually titled
either one is never shadowed. gog list --backup/--back lists games
recorded in a backup manifest instead.
Examples:
gog list
gog list --format json
gog list witcher
gog list "baldurs gate"
gog list --platform windows
gog list ftl --platform linux
gog list --year 1998..2005
gog list --year 2010..2020 --include-unknown-year
gog list --genre strategy
gog list --genre arcade,rts
gog list --genre strategy --include-unknown-genre
gog list "baldurs gate" --platform linux --format json
Use gog search TEXT to search the public GOG catalog instead of your local
library — results include an owned column/field so you can see at a glance
whether you already have a game.
Year filters omit games with unknown years by default; use
--include-unknown-year to keep them. Genre filters similarly omit unknown
genres by default; use --include-unknown-genre to keep those rows.
Planning Backups
gog plan shows the same dry-run plan as gog backup --dry-run without
downloading files or creating backup directories. Use it before long backup runs
to estimate size, inspect filters, and check destination free space.
Examples:
gog plan --destination /path/to/backups --all
gog plan --destination /path/to/backups --all --summary
gog plan --destination /path/to/backups --all --storage
gog plan --destination /path/to/backups --all --check-free-space
gog plan --destination /path/to/backups --all --format json
gog plan --destination /path/to/backups cyberpunk_2077
Platform and language filters can reduce backup size:
gog plan --destination /path/to/backups --all --platform linux --storage
gog plan --destination /path/to/backups --all --platform windows --language en --storage
Selecting Games
The simplest way to select a game is a bare positional argument — a product ID, slug, or title. Titles don't need to be exact: if there's no exact id/slug/title match, the selector falls back to fuzzy title matching.
gog dl "civilization iv" # fuzzy title match
gog dl 1760534591 # exact id, never ambiguous
gog backup witcher_3 --yes
If a fuzzy selector matches more than one game, gog prompts you to pick one
at an interactive terminal, or exits with an error listing the candidates
otherwise (scripts, --no-interactive, or CI). Use an exact id or slug to
sidestep ambiguity entirely.
--game/-g behaves the same but only ever matches exactly (product id,
slug, or exact title) — no fuzzy fallback — which is what you want for
scripts and games.txt files where the match must be deterministic. It's
repeatable:
gog plan --destination /path/to/backups --game witcher_3 --game cyberpunk_2077
gog backup --destination /path/to/backups --game 123456789 --yes
Platform and role filters have shortcut flags on top of the general
--platform/--role options:
gog dl "civilization iv" --win # shortcut for --platform windows
gog dl "baldurs gate 3" --mac --lin # --mac / --lin (or --linux)
gog dl "civilization iv" --extras # shortcut for --role extra
For larger curated lists, put selectors in a UTF-8 text file and pass
--games-from. Blank lines and lines whose first non-whitespace character is
# are ignored.
Example games.txt:
# first NAS batch
witcher_3
cyberpunk_2077
123456789
Use the selector file in plan, backup, or sync workflows:
gog plan --destination /path/to/backups --games-from games.txt --storage
gog backup --destination /path/to/backups --games-from games.txt --downloader aria2c --yes
gog sync --destination /path/to/backups --games-from games.txt --dry-run
--games-from is repeatable and combines with repeated --game flags. Do not
combine explicit game selectors with --all.
Downloading
gog backup/gog download/gog dl are the same command. If aria2c is
installed and on PATH, it's used automatically; otherwise the built-in
direct downloader is used. Pass --downloader explicitly to override either
way:
gog dl --games-from games.txt --yes # aria2c if present, else direct
gog dl --games-from games.txt --downloader direct --yes # force the built-in downloader
When file size metadata is available, gog chooses aria2c connection settings
by size: very small files use one connection, mid-size files use two or four,
and multi-GB installers use eight or sixteen. Configure
aria2c_policy = "conservative" or aria2c_policy = "aggressive" to tune this
behavior.
Without --yes, backup and sync commands print a dry-run plan and exit without
downloading or modifying backup files.
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 gog_cli-1.0.1.tar.gz.
File metadata
- Download URL: gog_cli-1.0.1.tar.gz
- Upload date:
- Size: 76.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
597a48b40cc8c6e3c2e26e86882a6065d96dfd04f48b05eaa2a5facb0df97203
|
|
| MD5 |
995f208f2a4862fdebc64693e0cbfdaf
|
|
| BLAKE2b-256 |
510d69b9ff76b6768eaf21f0671ac746b22b75f9bf44e54f20fe951a8983c7e7
|
Provenance
The following attestation bundles were made for gog_cli-1.0.1.tar.gz:
Publisher:
release.yml on aleksandarristic/gog-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gog_cli-1.0.1.tar.gz -
Subject digest:
597a48b40cc8c6e3c2e26e86882a6065d96dfd04f48b05eaa2a5facb0df97203 - Sigstore transparency entry: 2323610758
- Sigstore integration time:
-
Permalink:
aleksandarristic/gog-cli@80e030b4b7894092e139ca9722e91f6b5c6830f1 -
Branch / Tag:
refs/tags/v1.0.1 - Owner: https://github.com/aleksandarristic
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@80e030b4b7894092e139ca9722e91f6b5c6830f1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file gog_cli-1.0.1-py3-none-any.whl.
File metadata
- Download URL: gog_cli-1.0.1-py3-none-any.whl
- Upload date:
- Size: 52.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
abaf183296b4874d2e57113e4c6dbd755dcd32c964e59e56579d9ccbfbf17ee3
|
|
| MD5 |
54958c72202f6d9c0b4485376c9ac055
|
|
| BLAKE2b-256 |
5c24396b690eb335640fb8121c969fa73815b5efc597eb5a939feb5dd798d2d5
|
Provenance
The following attestation bundles were made for gog_cli-1.0.1-py3-none-any.whl:
Publisher:
release.yml on aleksandarristic/gog-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gog_cli-1.0.1-py3-none-any.whl -
Subject digest:
abaf183296b4874d2e57113e4c6dbd755dcd32c964e59e56579d9ccbfbf17ee3 - Sigstore transparency entry: 2323610853
- Sigstore integration time:
-
Permalink:
aleksandarristic/gog-cli@80e030b4b7894092e139ca9722e91f6b5c6830f1 -
Branch / Tag:
refs/tags/v1.0.1 - Owner: https://github.com/aleksandarristic
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@80e030b4b7894092e139ca9722e91f6b5c6830f1 -
Trigger Event:
push
-
Statement type: