Session Foundation's scheduled jobs and webhooks, and the scripts the platform repos
share for translations. One package, session_ops, deployed to one self-hosted box:
deploy/README.md installs it.
| Job | What it does | Doc |
|---|---|---|
zendesk-digest |
Weekday Discord digest of the Zendesk tickets awaiting a reply, after closing positive app-store reviews | zendesk-digest |
zendesk-relay |
Drafts and sends Zendesk replies from claude: private notes |
zendesk-relay |
github-prs-digest |
Weekday Discord digest of open pull requests from outside contributors | github-prs-digest |
crowdin-duplicates |
Crowdin string slots holding more than one translation, as they open and close | crowdin-duplicates |
crowdin-sync |
Weekly: Crowdin translations into pull requests on iOS, Android and the localization module | crowdin-sync |
snode-list |
Daily: the fallback service node list into session-ios | snode-list |
release-stats |
On demand: download counts of the latest releases | release-stats |
session-ops-silence |
Discord alerts for a job that failed, or stopped running | session-ops-silence |
Run by hand, not scheduled: sogs-ban for community bans, and
sogs-perms for a room's per-account permissions.
Every job is a console script declared in pyproject.toml, and one lockfile pins what all of them run.
uv sync # .venv with every dependency
uv run python -m unittest discover -s tests -t . # every suite
uv run ruff check .tests/sogs skips itself unless session_util is importable; see
its dependencies for why it is not on PyPI.
tests/goldens pins the systemd drop-ins generated from jobs.toml.