indifferentketchup ae408ea437 refactor: data/modpack_rules → data/rules; auto-apply on resort path
The directory was misnamed — these are wsid-triggered sorting-rule
overlays, not modpack-specific. HellDrinx happens to be a modpack but
RV Interior Expansion isn't; both use the same generic mechanism.

Renames:
  data/modpack_rules/        → data/rules/
  _MODPACK_RULES_*           → _RULES_*
  _modpack_rules_for         → _auto_rules_for
  _parse_rules_with_modpacks → _parse_rules_combined
  _emit_modpack_rules_warnings → _emit_rules_applied_warnings
  warning tag "modpack-rules-applied" → "rules-applied"

Bug fix: /api/resort was passing {} rules to sort_mods, silently
dropping every auto-injected rule. The frontend runs an automatic
resort after each /api/sort (driven by localStorage branchSelections),
so the user always saw the resort output — where rv_expansion.txt's
loadAfter chain wasn't taking effect. Now resort goes through
_parse_rules_combined and emits rules-applied warnings the same way
/api/sort does.
2026-05-04 16:31:50 +00:00

sortof

Project Zomboid mod load-order sorter for dedicated servers. Paste workshop IDs or a collection URL; get back the WorkshopItems=, Mods=, and Map= lines for servertest.ini.

Stack

  • FastAPI + asyncpg, Python 3.12.
  • Postgres 16 (Docker).
  • DepotDownloader for fetching mod.info / map.info from each cached workshop item.
  • Vanilla JSX + index.html, no build step (Babel-standalone in-browser).

Setup

docker compose up -d sortof_db

python3.12 -m venv api/.venv
api/.venv/bin/pip install -r api/requirements.txt

python3.12 -m venv worker/.venv
worker/.venv/bin/pip install -r worker/requirements.txt

.env next to docker-compose.yml:

POSTGRES_USER=sortof
POSTGRES_PASSWORD=<random>
POSTGRES_DB=sortof
SORTOF_CORS_ORIGINS=http://127.0.0.1:8801

Set DD_PATH to the DepotDownloader binary, then:

api/.venv/bin/uvicorn app:app --host 127.0.0.1 --port 8801
worker/.venv/bin/python drain.py

Layout

api/      FastAPI service, sort engine, response adapters
worker/   drain worker (DepotDownloader + mod.info parser)
frontend/ index.html + JSX
init/     Postgres bootstrap migrations (run on first boot)
data/     checked-in JSON config (e.g., pz_versions.json)
docs/     specs, plans
Description
No description provided
Readme 1.4 MiB
Languages
Python 58.1%
JavaScript 28%
HTML 12.4%
PLpgSQL 1.5%