Skip to content

Project layout

Overview of the Rezeptor repository — where things live and which contracts apply.

Top level

rezeptor/
├── core/                 # Shared Bash modules (DRY)
│   └── runtime.lock      # Pinned Proton-GE version + SHA256
├── recipes/
│   ├── <id>/             # Official recipes
│   ├── community/<id>/   # Community (not in manifest)
│   ├── _template*/       # Templates (not in manifest)
│   ├── catalog.json      # GUI catalog + trust
│   ├── manifest.json     # SHA256 integrity
│   └── recipe.schema.json
├── launcher/             # PyQt6 GUI (host PyQt6 for clone/tar.gz; AppImage/Flatpak bundle it)
├── scripts/              # Lint, manifest, new-recipe, builds
├── tests/                # bats + Python
├── docs/{de,en}/         # This site (MkDocs)
├── setup.sh              # Entry → launcher
├── VERSION               # SemVer (release trigger)
└── Makefile              # validate, test, recipe-lint, …

recipes/<id>/ — required files

Every recipe:

File Required Role
recipe.yml yes Metadata, install_steps, hook paths incl. uninstall:
install.sh yes First-time install
repair.sh yes validate → fix only what is missing
validate.sh yes Structured OK: / FAIL: / WARN: output
launch.sh yes Launch
uninstall.sh yes Full removal via purge_recipe_data
kill.sh yes Kill processes (YAML kill:)

Optional: info.de.txt / info.en.txt, assets/, optional/.

Repair is not reinstall

repair.sh runs validate.sh, fixes gaps, validates again — not a full re-install.

core/ — shared core

Do not duplicate new logic in recipes — centralize in core/ first.

Module Responsibility
recipe-hooks.sh Hook entry, profiles, purge_recipe_data
recipe-install-steps.sh Declarative install_steps
recipe-prefix.sh Create/update prefix
recipe-winetricks.sh Winetricks under Proton; retry only exit 139
recipe-win10.sh Windows 10 version (registry, no winecfg)
recipe-validate.sh Reusable checks
wine-runtime.sh Proton-GE, graphics DLLs
recipe-desktop.sh .desktop + icons
paths.sh / env-file.sh / output.sh Paths, state, GUI tags
sharedFuncs.sh Shared helpers; launcher() is LEGACY (see Core API)

Deep reference: Core API. App updates: scripts/rezeptor-update.sh only.

AppRun / PATH exposure

AppDir/AppRun prepends PROJECT_ROOT/core to PATH so legacy helpers resolve by name. Recipe hooks must not rely on ambient PATH: use recipe_hooks::load and CORE_DIR/recipe_hooks::_source instead. Do not add new recipe dependencies on PATH-visible core/ modules.

Runtime: Proton-GE only

  • Pin in core/runtime.lock (PROTON_GE_TAG, URL, SHA256)
  • Recipes set runtime: proton-ge
  • No system Wine fallback in recipe scripts
  • Graphics: wine_runtime::deploy_proton_graphics_dlls()no winetricks dxvk
  • Win10: recipe_win10::ensureno winetricks winecfg

Proton install location: ~/.local/share/wine-software/runtime/proton-ge/<tag>/ (shared; survives uninstall).

launcher/

PyQt6 app: catalog, trust, settings, hook processes, activity log (recipe_discovery.py for listing/trust flags). See GUI launcher and Architecture.

Runtime data locations

Path Role
~/.local/share/wine-software/<id>/ Canonical data_root
$DATA_ROOT/prefix Always the Wine prefix
$DATA_ROOT/recipe.env Persistent state (env_file_*, never source)
$DATA_ROOT/data_root.path GUI override for the chosen data location

CI & quality

make validate    # shellcheck, bash -n, compileall, recipes-check, recipe-lint, manifest-check
make test        # bats
./scripts/recipe-lint.sh
./scripts/recipe-manifest.sh

shellcheck in make validate covers only core/, photoshop, wiso-steuer, launcher/, scripts/ — not every recipe. bash -n checks all recipes/*/*.sh.

Workflows: .github/workflows/ci.yml, docs.yml, release.yml.

Next