Project Layout

This page describes the directory structure your project must follow for scaldys-project to work correctly, and documents where all build output is written. For how scaldys-project locates the project root at runtime, see CLI Reference.

Project name and version

scaldys-project reads the project name and version from pyproject.toml:

[project]
name = "myapp"
version = "1.2.3"

These values are used:

  • As the base name for PyInstaller artefacts (myapp.exe) in pyinstaller mode.

  • As the base name when searching for packaging files in script_dir (myapp.iss, myapp.ico).

  • As the version injected into the Inno Setup script (/DMyAppVersion=1.2.3).

Build output layout

scaldys-project writes all output under three top-level directories in the project root. All three are safe to delete (use build clean).

build/ — intermediate artefacts

build/
    compiled/               ← staged source tree for Cython
    <name>/                 ← one directory per docs/ subdirectory
        html/               ← multi-page HTML
        singlehtml/         ← single-page HTML
    pyinstaller/            ← PyInstaller work directory (pyinstaller mode only)

dist/ — distribution wheel

dist/ contains only the .whl file, following the PyPI convention (twine upload dist/*, uv publish).

dist/
    myapp-1.2.3-cp313-cp313-win_amd64.whl

artifacts/ — all other build outputs

artifacts/ holds every non-wheel output. Its contents depend on the active deployment_mode.

Mode 1: ``pyinstaller``

artifacts/
    portable/
        bin/                ← executable + libraries (from PyInstaller)
            myapp.exe
            python313.dll
            _internal/
            myapp_commandline.bat
            myapp_powershell.ps1
        documentation/
            <name>/         ← one per entry in public_doc_dirs
        examples/           ← example files (if examples/ exists)
    documentation/
        <name>/             ← standalone docs copy, one per public_doc_dirs
    installer/
        setup.exe           ← Windows installer (from Inno Setup)

Mode 2: ``pyruntime``

artifacts/
    portable/
        bin/
            myapp_commandline.bat
            myapp_powershell.ps1
            setup_pyruntime.ps1
            uv.exe
            .python-version
        wheels/
            myapp-1.2.3-cp313-cp313-win_amd64.whl
        documentation/
            <name>/
        examples/
    documentation/
        <name>/
    pyruntime/              ← pre-built venv (offline mode only, bundle_pyruntime=true)
    installer/
        setup.exe

Mode 3: ``wheel_only``

artifacts/
    documentation/
        <name>/             ← only present if public_doc_dirs is non-empty

Relationship between stages

The build steps consume each other’s output:

[build docs]  →  build/<name>/html/   (for each docs/ subdirectory)
                          ↓
[build windows]  →  Cython compilation → build/compiled/
                 →  wheel → dist/
                 →  Mode 1: PyInstaller → artifacts/portable/bin/
                 →  Mode 1/2: stages launchers, docs, examples into artifacts/portable/
                 →  Mode 1/2: Inno Setup → artifacts/installer/setup.exe

Running build all executes documentation and Windows distribution in the correct sequence automatically. Use build windows when the documentation is already built and you only need to refresh the Windows distribution artefacts.