HRiggs 79e953bbe7
Build and Publish Container / Publish Linux container (push) Successful in 5m32s
fix: unix user perms
2026-10-05 16:06:24 -04:00
2026-10-02 13:02:06 -04:00
2026-04-14 13:18:27 -04:00
2026-10-05 16:06:24 -04:00
2026-10-05 15:25:09 -04:00
2026-10-05 16:06:24 -04:00
2026-10-05 16:06:24 -04:00
2026-04-14 13:18:27 -04:00
2026-04-14 13:18:27 -04:00
2026-01-24 01:41:54 +00:00
2026-06-12 22:07:38 -04:00
2026-10-02 13:02:06 -04:00
2026-04-14 13:18:27 -04:00
2026-06-12 22:07:38 -04:00
2026-04-14 14:26:10 -04:00
2026-04-14 13:18:27 -04:00
2026-06-12 22:27:56 -04:00
2026-01-24 01:13:19 -05:00

Progression: Loader

This project pulls from the three steam workshop collections of Progression, then it searches through your installed mods, in the workshop folder and matches the steam id to a package id, and Formal name, then it takes those names, package ids and steam ids and creates the modloader modslist, thats a mouth full, and save it to your modslist folder so all you have to do is launch the game. The merge button will take your currently ENABLED mods and merge them with the latest progression pack to give you a new modslist called progresisonhomebrew which you can sort and load.

DLC detection is based on NotOwned_x.png if the user doesnt the same package NAME as the not owned png it doesnt proceed. .envs populate pre loaded data, only change if their is an update to collection url Doesnt sort so the current guidence to autosort from base game mod manager will still apply. Art by ferny

to bump the version

python version_manager.py 1.0.1

build

pyinstaller --clean --onefile --windowed --icon=art/Progression.ico --add-data "art;art" --name ProgressionLoader steam_workshop_gui.py

Web dashboard and backend

The repository now includes a FastAPI backend and responsive dashboard in progression_backend. It resolves the three Workshop collections through Steam's GetCollectionDetails API, downloads missing or updated RimWorld mods with anonymous SteamCMD, reads About/About.xml, and generates the same RimWorld .rml format as the desktop loader.

The backend refreshes once per hour and records each run in SQLite, including:

  • complete refresh time and status
  • requested, successful, and failed downloads
  • Workshop cache size on disk
  • size added during the run and average throughput
  • per-mod size, validation status, timestamps, and SteamCMD batch diagnostics

Run locally

Install SteamCMD, copy .env.example to .env, and set STEAMCMD_PATH plus STEAMCMD_WORKSHOP_DIR to the matching SteamCMD Workshop directory. Then run:

python -m pip install -r requirements-web.txt
python -m progression_backend

Open http://127.0.0.1:8000. API documentation is available at http://127.0.0.1:8000/api/docs.

Use one application process/worker because that process owns the hourly scheduler. For an externally scheduled deployment, set REFRESH_ON_STARTUP=false and call POST /api/refresh once per hour.

Run with Docker

Docker provisions the SteamCMD binary and persists both analytics and downloaded Workshop content:

docker compose up --build

The SteamCMD Linux runtime requires an amd64 host or amd64 emulation. Set PROGRESSION_ADMIN_TOKEN before exposing the manual refresh endpoint publicly.

Published container

Gitea Actions builds and publishes the linux/amd64 image on every push to main and every v* version tag:

git.hudsonriggs.systems/hriggs/progressionmods:latest

Published tags include latest, the branch or semantic version, and sha-<commit>. Before running the workflow, configure REGISTRY_TOKEN as a repository Actions secret containing a Gitea personal access token with write:package permission.

The registry username defaults to HRiggs. An optional REGISTRY_USERNAME secret can override it.

Gitea's built-in Actions token cannot currently publish OCI packages, so the registry token is required even though the workflow requests packages: write.

Mod-list endpoints

  • GET /api/modlists/vanilla?dlc=royalty&dlc=biotech
  • POST /api/modlists/homebrew with a mods_config XML upload
  • GET /api/status, /api/analytics, and /api/mods

Generation fails closed when any current collection item is unavailable. An operator can explicitly request allow_partial=true for diagnostics.

S
Description
No description provided
Readme MIT 4.6 MiB
2026-10-02 16:48:27 +00:00
Languages
Python 87.6%
CSS 5.8%
JavaScript 3.2%
HTML 2.7%
Dockerfile 0.4%
Other 0.3%