CHECKS OF PYTHON TO MAC APP krueng.ai/python_to_mac_app.html The page says how big each Mac app is, how long it takes to build and to open, what is inside it, what macOS thinks of it, and what a packed Agno agent prints. None of that was typed in from memory. Each part was printed by a script in this folder, and each script's output is saved beside it as a *_output.txt file. The page shows those files. Run the scripts again on your own Mac and compare. WHAT YOU NEED 1. A Mac. Every script here uses programs that only macOS has. 2. The page's files in one folder: hello.py and package.py. Every code block on the page has a Download button. For the last check you also need cashier.py from krueng.ai/agno_agents.html, and Ollama with the model qwen2.5:3b (1.9 GB). 3. These scripts, in a folder named "checks" inside that folder: your folder/ hello.py package.py venv/ venv_checks/ checks/ README.txt mac.py builds.py ... What the scripts build goes into checks/made/, so nothing is left beside your own files. Delete that folder when you are done. 4. Two Pythons, kept apart on purpose: - "venv" builds the apps: python3 -m venv venv venv/bin/python -m pip install pyinstaller - "venv_checks" runs the scripts that need to see a window. It has one library, which lets Python ask macOS which windows are open: python3 -m venv venv_checks venv_checks/bin/python -m pip install pyobjc-framework-Quartz It is a second Python so that this library cannot end up inside an app. Run every script from the checks folder. Windows open and close by themselves while they run. Close every "hello" window of your own first: two of the scripts find the app by its name, and they would stop your window too. THE SCRIPTS, IN THE ORDER WE RAN THEM mac.py run by nothing What the others share: start a program with only macOS's own folders in its PATH, find its window, read its memory, stop it. builds.py needs venv_checks, and venv Starts hello.py with plain Python, then builds it four ways: one folder, --windowed, --onefile, and both. For each build: the seconds it took, what PyInstaller left in dist, the size, the seconds from the start to the window (the first start, then the middle of three later starts), the memory with the window open for 5 seconds, and the size of a zip. A .app is also started with macOS's "open" command, as a double-click does. About 2 minutes. -> builds_output.txt build_log.py needs any Python, and venv Runs the page's command for the app and prints every line PyInstaller wrote. -> build_log_output.txt inside.py needs any Python The folders of a .app with their sizes, the ten biggest things, the links, and the app's Info.plist. -> inside_output.txt unpack.py needs venv_checks Starts the one-file hello and looks in the temporary folder for the folder it unpacked itself into, while it runs and after it has stopped. -> unpack_output.txt gatekeeper.py needs venv_checks Runs file, codesign, spctl and xattr on the app. Then opens the app as it was built, and a copy that carries the label a browser puts on a download, and says for each whether the app's window came. On your Mac the copy leaves a message box open: close it yourself. -> gatekeeper_output.txt package_check.py needs venv_checks, and venv Builds hello.app, runs package.py, and tries each file it made: unzips the zip, opens the disk image, installs the installer and removes the app again, and checks the fingerprints. THE INSTALL USES sudo, so on your Mac it asks for your password, and it puts hello.app in /Applications for a moment. -> package_output.txt flags.py needs venv Every option the PyInstaller in venv takes, in its own help text, then how many there are and their names. The cheat sheet at the end of the page was written from it. Run it with venv/bin/python. -> flags_output.txt agno_app.py needs venv_checks, venv with agno, and Ollama First: venv/bin/python -m pip install agno==3.1.2 ollama openai brew install ollama, and pull qwen2.5:3b. Then stop Ollama: the script starts its own, and stops it at the end. Builds cashier.py with --onefile. Starts the program once while Ollama is not running, then with Ollama: one order twice, and an order the shop cannot add up. Then the first order with plain Python, to compare. The first answer after Ollama starts is the slow one. -> agno_app_output.txt WHAT WE RAN, AND WHERE We do not own a Mac. Everything was run on 10 October 2026 on a Mac hosted by GitHub (GitHub Actions, the machine named macos-15): macOS 15.7.9 on a virtual Apple M1 with 3 cores and 7 GB of memory, Python 3.12.10 with Tk 8.6.16, and PyInstaller 6.22.3. run_output.txt is that Mac's own account of itself, with what was installed in each Python. The file that tells GitHub what to run is on the page, and beside this folder as mac-app-checks.yml. Nobody sat at that Mac. So nothing here says what a window or a message looked like: only that a window came, and to which program it belonged. THINGS TO KNOW - Your numbers will differ. Sizes should be close to ours. Times depend on your Mac, and ours changed from one run to the next. - A Mac with an Intel chip builds an app for Intel chips. Ours built for Apple chips. - An app is "stopped with code 1" in builds_output.txt because the script stops it with a signal. Nobody was there to click its Close button.