Problem
The current release flow publishes a Windows standalone ZIP, but there is no official signed Windows installer story yet.
That leaves a few gaps:
- Windows Defender SmartScreen and "unknown publisher" friction for end users
- no first-class install/update/uninstall path
- no documented certificate/signing pipeline
- a weaker foundation for deeper Windows integration work around accessibility/UI automation and related platform APIs
Why this matters
Axidev OSK is already targeting Windows as a supported desktop platform. An official installer and code-signing story would make the project feel like a real Windows application instead of a loose archive download.
It should also improve the path toward Windows-specific accessibility and UI-facing APIs where proper packaging, signing, and trust matter in practice, while reducing SmartScreen friction for normal installs.
Scope
Define and implement the official Windows distribution approach, including installer format, signing approach, release automation, and user-facing install documentation.
This issue should cover the story at the product/release level, not just "generate a different artifact".
Packaging and runtime architecture context
Axidev OSK is currently shipped as a Python desktop application with a native input stack underneath it, not as a single self-contained native codebase.
Relevant packaging/runtime facts for this story:
- the top-level app package is
axidev-osk, a Python package with the CLI entrypoint axidev-osk = axidev_osk.app:main
- the UI/runtime is primarily Python plus
PySide6
- keyboard/input integration is not pure Python: the app depends on the vendored
axidev-io-python package, which wraps native axidev-io C sources
- on Windows, that native layer uses normal Python extension tooling and Win32 libraries
- on Linux, the native layer depends on system
libinput, libudev, and xkbcommon, and those are intentionally expected to remain dynamically linked from the host system
- Linux input features also depend on host permissions such as
/dev/uinput access and relevant /dev/input/event* access
- current standalone release artifacts are built with
scripts/build_standalone.py, which uses PyInstaller to bundle the Python runtime, the app package, and the Python/native dependency stack into a ZIP archive
- the current release flow publishes standalone ZIP artifacts for Windows and Linux, not a native installer/repository format for each platform yet
- licensing/compliance files for the vendored native stack are already carried into the standalone bundle and need to stay accounted for in any new packaging path
This issue should evaluate trade-offs against that runtime architecture explicitly so someone can reason about the packaging design without first reading the build scripts or code.## Acceptance criteria
- document the current packaging/runtime architecture, including Python runtime, native dependency stack, and artifact shape, so trade-offs can be reviewed without reading the code first
- choose and document the official Windows installer format and distribution approach
- choose and document the signing model for both the app binary and installer artifact
- integrate signing and installer production into the release pipeline
- publish a signed Windows installer as a release artifact
- document install, update, uninstall, and upgrade behavior
- document SmartScreen expectations and any remaining reputation caveats
- document how this packaging story affects or enables future accessibility/UI-automation/API integration work on Windows
Notes
Implementation could end up using MSI, MSIX, WiX, Inno Setup, NSIS, or another Windows-native path, but the issue should not assume the answer before the tradeoffs are evaluated.
Problem
The current release flow publishes a Windows standalone ZIP, but there is no official signed Windows installer story yet.
That leaves a few gaps:
Why this matters
Axidev OSK is already targeting Windows as a supported desktop platform. An official installer and code-signing story would make the project feel like a real Windows application instead of a loose archive download.
It should also improve the path toward Windows-specific accessibility and UI-facing APIs where proper packaging, signing, and trust matter in practice, while reducing SmartScreen friction for normal installs.
Scope
Define and implement the official Windows distribution approach, including installer format, signing approach, release automation, and user-facing install documentation.
This issue should cover the story at the product/release level, not just "generate a different artifact".
Packaging and runtime architecture context
Axidev OSK is currently shipped as a Python desktop application with a native input stack underneath it, not as a single self-contained native codebase.
Relevant packaging/runtime facts for this story:
axidev-osk, a Python package with the CLI entrypointaxidev-osk = axidev_osk.app:mainPySide6axidev-io-pythonpackage, which wraps nativeaxidev-ioC sourceslibinput,libudev, andxkbcommon, and those are intentionally expected to remain dynamically linked from the host system/dev/uinputaccess and relevant/dev/input/event*accessscripts/build_standalone.py, which uses PyInstaller to bundle the Python runtime, the app package, and the Python/native dependency stack into a ZIP archiveThis issue should evaluate trade-offs against that runtime architecture explicitly so someone can reason about the packaging design without first reading the build scripts or code.## Acceptance criteria
Notes
Implementation could end up using MSI, MSIX, WiX, Inno Setup, NSIS, or another Windows-native path, but the issue should not assume the answer before the tradeoffs are evaluated.