Warning
Qyro CLI is currently in alpha. Commands, flags, templates, packaging behavior, and configuration formats may change between releases.
Supported workflows currently focus on desktop applications. Mobile packaging is experimental and is not part of the supported production workflow.
The official developer CLI and project orchestrator for the Qyro desktop and mobile application ecosystem.
Warning
Mobile support is experimental. Buildozer packaging, the [mobile]
extra, Android/iOS targets, and Kivy mobile workflows are incomplete and may
change without notice.
The currently supported Qyro CLI workflow is desktop-only on Windows, macOS, and Linux.
- β‘ Unified Multi-Framework Support: Scaffold projects for PySide6, PyQt6, PyQt5, PySide2, Kivy, or Tkinter.
- π Smart Template Resolution: Uses template providers with fallback support for robust initialization workflows.
- βοΈ Packaging & Freezing Ready: Native desktop freezing with PyInstaller.
- π¦ Distribution Bundling: Platform-aware bundling for DMG, NSIS, and Linux package formats.
- π Code Signing & Notarization: Windows Authenticode and macOS signing with optional notarization and stapling.
- β
Release Preflight Checks: Validate dependencies and
release.jsonpaths and options before packaging. - π§Ή Artifact Cleanup: Clean build outputs and optional release outputs with one command.
The table below reports validation results for the complete desktop workflow:
init β start β build β bundle
Table last validated: 2026-10-02
CI run: #37052349565
| Framework | Platform | Python 3.10 | Python 3.11 | Python 3.12 | Python 3.13 | Python 3.14 | Notes |
|---|---|---|---|---|---|---|---|
| PySide6 | Windows | β | β | β | β | β | Full pass |
| PySide6 | macOS | β | β | β | β | β | Full pass |
| PySide6 | Linux | β | β | β | β | β | Full pass |
| PySide2 | Linux | β | β | β | β | β | No CI coverage |
| PySide2 | Windows | β | β | β | β | β | No CI coverage |
| PySide2 | macOS | β | β | β | β | β | No CI coverage |
| PyQt6 | Windows | β | β | β | β | β | Full pass |
| PyQt6 | macOS | β | β | β | β | β | Full pass |
| PyQt6 | Linux | β | β | β | β | β | Full pass |
| PyQt5 | Windows | β | β | β | β | β | Full pass |
| PyQt5 | macOS | β | β | β | β | β | Full pass |
| PyQt5 | Linux | β | β | β | β | β | Full pass |
| Kivy | Windows | β | β | β | β | β | Python 3.14 failed at install |
| Kivy | macOS | β | β | β | β | β | Full pass |
| Kivy | Linux | β | β | β | β | β | Full pass |
| Tkinter | Windows | β | β | β | β | β | Full pass |
| Tkinter | macOS | β | β | β | β | β | Full pass |
| Tkinter | Linux | β | β | β | β | β | Full pass |
Legend:
- β
FULL PASS: all four workflow stages completed. - β
FAIL: validation was attempted and failed. - β
NOT TESTED: no validation result is available.
Known failure:
- Kivy Β· Python 3.14 Β· Windows: failed during
install.
Compatibility results are specific to the operating system, Python version, framework, dependency state, and CI environment used during testing.
# Using pip
pip install "qyro-cli[desktop]"
# Using Poetry
poetry add qyro-cli -E desktopThe core package can also be installed without the desktop extra:
# Using pip
pip install qyro-cli
# Using Poetry
poetry add qyro-cliWarning
Mobile packaging is experimental and is not part of the supported production workflow. Install this extra only if you are testing the Buildozer integration.
# Using pip
pip install "qyro-cli[mobile]"
# Using Poetry
poetry add qyro-cli -E mobileThe [all] extra includes experimental mobile dependencies and is not
recommended for production use:
# Using pip
pip install "qyro-cli[all]"
# Using Poetry
poetry add qyro-cli -E allThe Qyro Settings Builder provides a visual interface for preparing application, platform-specific, and release configuration files used by Qyro projects.
It helps simplify:
- Application settings.
- Platform-specific settings.
- Release and packaging options.
- Distribution metadata.
Open the builder:
Generated files can be placed in the project's settings/ directory and
reviewed before running Qyro CLI commands.
Note
The Settings Builder is an auxiliary tool. Always review generated files before building or releasing an application.
Qyro CLI provides the following desktop workflow:
- Initialize a project from a framework template.
- Run the application from source.
- Freeze the application into executable artifacts.
- Bundle the artifacts for distribution.
- Optionally sign and notarize the release.
qyro init --name my-appYou can preselect a binding and template version:
qyro init \
--name my-app \
--binding PySide6 \
--template-version 1.0.xFor non-interactive initialization:
qyro init \
--name my-app \
--target-platform desktop \
--binding PySide6 \
--app-name "My App" \
--version 1.0.0 \
--author "Your Name" \
--addon pydux \
--addon requests \
--yesSupported initialization options:
--target-platform:desktop,x86_64,apple-silicon,iphone, orandroid.--app-name: Application display name.--version: Semantic application version.--author: Author name.--addon: Optional dependency add-on. Repeatable. Supported values:hotrl,pydux,sentry-sdk, andrequests.--bundle-id: Bundle identifier for iPhone or Apple Silicon templates.-y, --yes: Skip the confirmation prompt.
Notes:
desktopmaps to the desktop template target.- If these flags are omitted,
qyro inituses the interactive wizard. - Mobile targets are experimental and are not part of the supported desktop workflow.
Supported bindings:
PySide6PyQt6PyQt5PySide2KivyTkinter
Note
Kivy desktop support is reflected in the compatibility matrix. Kivy mobile builds are not currently supported.
Run this command from the generated project directory:
cd my-app
qyro startqyro start currently runs the application from source without release flag
variants.
Run these commands from a Qyro project directory:
# Default desktop target with the release profile
qyro build
# Single executable
qyro build --onefile
# Equivalent mode syntax
qyro build --mode onefile
# Platform target override
qyro build --target mac
qyro build --target windows
qyro build --target linux
# Additional controls
qyro build --debug --console --uac --clean --interactiveNote
Available --target values are desktop platforms only: mac, windows,
and linux.
Run these commands from a Qyro project directory:
# Select the default format for the host operating system
qyro bundle
# Explicit platform and format
qyro bundle --platform mac --format dmg
qyro bundle --platform windows --format nsis
qyro bundle --platform linux --format tar.gz
qyro bundle --platform linux --format deb
qyro bundle --platform linux --format rpm
qyro bundle --platform linux --format arch
# Include an additional ZIP and use a custom output directory
qyro bundle --zip --release-dir releaseqyro bundle --checkThis validates dependencies and release settings, such as DMG backgrounds
and extra files, without generating artifacts.
When packaging with:
qyro bundle --platform windows --format nsisyou can customize installer behavior using bundle.nsis in
settings/release.json.
Supported options:
bundle.nsis.icons.install: Installer icon path (.ico).bundle.nsis.icons.uninstall: Uninstaller icon path (.ico).bundle.nsis.welcome_bitmap: Welcome/finish bitmap path.bundle.nsis.install_location:programfiles64,programfiles32, orappdata.bundle.nsis.execution_level:highest,admin, oruser.
Defaults:
install_location:programfiles64execution_level:highesticons.install:resources/base/icons/install.icoif the file exists.icons.uninstall:resources/base/icons/uninstall.icoif the file exists.welcome_bitmap: not set by default.
Example:
{
"bundle": {
"nsis": {
"icons": {
"install": "resources/base/icons/install.ico",
"uninstall": "resources/base/icons/uninstall.ico"
},
"welcome_bitmap": "resources/base/welcome.bmp",
"install_location": "programfiles64",
"execution_level": "highest"
}
}
}Validate NSIS options before generating the installer:
qyro bundle --check --platform windows --format nsisRun these commands from a Qyro project directory:
# Clean the freeze directory
qyro clean
# Also clean the release directory
qyro clean --releaseRun these commands from a Qyro project directory:
# Preflight validation only
qyro sign --check --platform windows
qyro sign --check --platform mac
# Sign frozen binaries or application bundles
qyro sign --platform windows
qyro sign --platform mac
# macOS notarization flow
qyro sign \
--platform mac \
--notarize \
--staple \
--keychain-profile "QYRO-NOTARY"
# Skip Gatekeeper assessment if required
qyro sign \
--platform mac \
--notarize \
--staple \
--no-assessUse settings/release.json to configure signing.
Requirements:
- Windows host with
signtoolavailable inPATH. - Code-signing certificate file, such as
.pfx. - Certificate password supplied through
settings/secrets.json.
Example settings/release.json:
{
"sign": {
"windows": {
"certificate": "src/sign/windows/certificate.pfx",
"timestamp_server": "https://timestamp.digicert.com",
"description": "MyApp",
"url": "https://example.com"
}
}
}Do not commit passwords, tokens, certificates, or private keys.
Recommended flow:
# 1. Build artifacts
qyro build --target windows
# 2. Validate signing prerequisites
qyro sign --check --platform windows
# 3. Sign supported binaries in build/
qyro sign --platform windowsBy default, Qyro signs supported binary types in the freeze output, such as
.exe, .dll, .msi, and .cab.
Requirements:
- macOS host with Xcode Command Line Tools:
codesign,xcrun,notarytool,stapler, andspctl. - Apple Developer membership.
- Valid
Developer ID Applicationcertificate in Keychain. - Entitlements file for Python runtime behavior, recommended for GUI applications.
Example:
{
"sign": {
"mac": {
"identity": "Developer ID Application: Your Name (TEAMID)",
"entitlements": "src/sign/mac/entitlements.plist",
"target_architecture": "universal2",
"notary": {
"enabled": true,
"staple": true,
"assess_gatekeeper": true,
"keychain_profile": "QYRO-NOTARY"
}
}
}
}Do not commit Apple credentials, API keys, passwords, private keys, or
credential-bearing configuration to the repository. Use
settings/secrets.json for local secret overrides.
Recommended flow:
# 1. Build the macOS application bundle
qyro build --target mac
# 2. Validate signing and notarization prerequisites
qyro sign --check --platform mac
# 3. Sign the application
qyro sign --platform mac
# 4. Sign, notarize, and staple
qyro sign \
--platform mac \
--notarize \
--staple \
--keychain-profile "QYRO-NOTARY"Supported notarization authentication options:
keychain_profilekey_path+key_id+ optionalissuerapple_id+team_id+app_password
When sign.mac.identity and sign.mac.entitlements are configured, Qyro
also forwards them to PyInstaller through --codesign-identity and
--osx-entitlements-file during macOS builds.
Qyro supports a local-only secrets file:
settings/secrets.json.
Qyro loads base and profile settings first, then applies secrets.json as the
highest-precedence override.
Example settings/secrets.json:
{
"sign": {
"windows": {
"password": "<local-secret>"
},
"mac": {
"notary": {
"keychain_profile": "QYRO-NOTARY-LOCAL",
"app_password": "<local-secret>"
}
}
}
}Repository safety:
- Never commit
settings/secrets.json. - The repository
.gitignoreincludes this path by default.
The following areas are still under active development:
- Some optional CLI flags may change or require further validation.
- Mobile targets and Buildozer integration are experimental.
- Code signing and notarization require platform-specific tools and credentials.
- Compatibility depends on the framework, operating system, Python version, dependency versions, and test environment.
The compatibility matrix distinguishes successful, failed, and not-yet-tested combinations. It does not guarantee compatibility with every dependency revision or operating-system update.
Commands marked as requiring a project must be run from a generated Qyro project directory.
| Command | Project required | Flags / Args | Description |
|---|---|---|---|
qyro init |
No | -n, --name, -b, --binding, --template-version |
Initialize a new project. |
qyro start |
Yes | None | Run the application from source. |
qyro build |
Yes | -m, --mode, --onefile, --debug, --console, --uac, -p, --profile, -c, --clean, -i, --interactive, --target, --init-spec |
Freeze/build artifacts. |
qyro bundle |
Yes | --release-dir, --no-resources, --zip, --platform, --format, --check |
Create distributable packages or run preflight checks. |
qyro sign |
Yes | --platform, --check, --notarize, --staple, --no-assess, --keychain-profile |
Sign compiled artifacts and optionally notarize/staple macOS apps. |
qyro clean |
Yes | --release |
Remove generated build artifacts. |
qyro version |
No | None | Show version information. |
Projects can configure bundle behavior in:
settings/release.jsonβ current layout.
Example:
{
"release": true,
"environment": "development",
"bundle": {
"dmg": {
"window": {
"x": 200,
"y": 120
},
"window_size": {
"width": 660,
"height": 420
},
"icon_size": 120,
"app_position": {
"x": 180,
"y": 180
},
"applications_position": {
"x": 480,
"y": 180
},
"background": "assets/dmg-background.jpg"
},
"extra_files": [
"README.md",
{
"source": "docs/RELEASE_NOTES.md",
"destination": "docs/RELEASE_NOTES.md"
}
]
}
}Supported forms:
- String path: copied to the bundle root.
- Object with
sourceanddestination: copied to a relative destination inside the bundle.
Validation rules:
sourcemust exist.destinationmust be relative.- Absolute destinations are not allowed.
destinationmust not escape the output directory.
When DMG customization is configured, create-dmg is required.
Without custom DMG options, bundling can fall back to native hdiutil on macOS.
| Format | Requirement |
|---|---|
| DMG with customization | create-dmg |
| DMG without customization | hdiutil on macOS |
| NSIS | makensis |
| DEB, RPM, or Arch | fpm |
Install create-dmg on macOS with one of:
brew install create-dmgor:
npm install -g create-dmgqyro-cli generates applications that integrate with Qyro adapters:
| Binding | Adapter | Best For |
|---|---|---|
| PySide6 | PySide6Adapter |
Modern Qt 6 desktop applications. |
| PyQt6 | PyQt6Adapter |
Feature-complete Qt 6 desktop applications. |
| PyQt5 | PyQt5Adapter |
Legacy Qt 5 desktop applications. |
| PySide2 | PySide2Adapter |
Qt 5 environments; not included in the current matrix. |
| Kivy | KivyAdapter |
Cross-platform desktop interfaces; mobile support is experimental. |
| Tkinter | TkinterAdapter |
Desktop utilities built on the Python standard library. |
Warning
All adapters are currently supported on desktop only. Mobile deployment is experimental and is not part of the supported production workflow.
Projects can be configured with modular add-ons:
hotrlβ Hot Reloading: Iterative development with live code reload.pyduxβ Predictable State: Redux-inspired state container patterns.sentry-sdkβ Telemetry: Exception and crash reporting integration.requestsβ HTTP Client: Optional HTTP client dependency.
qyro bundle --checkis the fastest way to validate release readiness in CI.qyro clean --releaseis useful before reproducible release builds.- If a bundle step fails, inspect the exact command output and step-specific logs.
- Compatibility results should be refreshed when supported Python versions, dependency constraints, or packaging logic change.
Contributions to qyro-cli and the Qyro ecosystem are welcome.
-
Fork the repository on GitHub.
-
Create a feature branch:
git checkout -b feature/amazing-feature
-
Run the test suite:
poetry run pytest
-
Commit your changes:
git commit -m "feat: add amazing feature" -
Push your branch:
git push origin feature/amazing-feature
-
Open a pull request.
MIT. See LICENSE.
- Organization: Neuri
- Lead Maintainer: Luis Alfredo De Los Reyes (luisalfredoreyes98@gmail.com)
- Ecosystem: Qyro β’ Qyro CLI β’ Boilerplates