ClickNick 0.23.1 trust report

Generated 2026-09-09 18:24 UTC from uv.lock at commit ffab841018b9. This file is self-contained: no scripts, no external resources. Latest reports and the explanation of this format: pyrung.com/clicknick/security.

All release checks passed.

For IT / security review

ClickNick is a Windows desktop tool for the CLICK PLC programming software. It is written in Python, installed with uv tool install clicknick (or pip) from PyPI, and runs as the signed-in user with no elevation. ClickNick was written with security in mind: keep dependencies limited, prefer pure Python where practical, run without administrator rights, and make the software's behavior easy to inspect.

Software characteristics

What ClickNick does

This section is handwritten and kept stable across releases. Everything below is generated by devtools/trust_report.py at release time from the lock file, the built wheel and the source tree, and the source checks are exactly that: release checks, not a formal security audit.

Release summary

ReleaseClickNick 0.23.1
Python>=3.11,<4.0
Runtime distributions11
First-party4
Third-party7
Known vulnerabilities0 (10 dependencies audited against the advisory database; ClickNick itself is the package being built)
Non-PyPI third-party dependencies0
Unresolved licenses0
SBOM SHA256 (clicknick-sbom-0.23.1.cyclonedx.json)08512cd236794e5d2150a7352339709a1c10c88b41887e48544e8d9dae1dbd6d
Wheel SHA256 (clicknick-0.23.1-py3-none-any.whl)6d365e6c33bdfb58d554297cc069c546a17876070ea0f1e3a5cfdbb77cb67671
PowerShell worker SHA256 (clicknick/resources/jet_sidecar.ps1)75512e4fe2674f0f4838ee23e900377cbd84501077ac7040cad8e37072b91da9
Generated fromuv.lock, exported as CycloneDX 1.5 by uv 0.12.1
Source commitffab841018b904258ec3f96a4906f444f397269e

Release checks

Runtime dependencies

Every distribution that uv tool install clicknick==0.23.1 installs. ClickNick pins its whole runtime tree exactly (the "Pin" column), so a fresh install matches this table and the SBOM; a release check below confirms the pins match uv.lock. "Used by" names the package that needs it. "First-party" means written by the ClickNick author. "Native code" reflects the Windows x64 wheels installed in the build environment.

PackageVersionPinSourceLicenseUsed byNative codePurpose
clicknick0.23.1This releaseAGPL-3.0noApplication
executing2.2.1==2.2.1PyPIMITpyrungnoPython source introspection (used by pyrung)
laddercodec0.2.1==0.2.1First-partyMPL-2.0ClickNicknoLadder diagram codec (read/write CLICK ladder)
pyclickplc0.4.0==0.4.0First-partyMITClickNick, pyrungnoCLICK project formats, address model, Modbus access
pymodbus3.12.1==3.12.1PyPIBSD-3-ClausepyclickplcnoModbus TCP protocol (used by pyclickplc)
pyodbc5.3.0==5.3.0PyPIMITClickNickyes (1 .pyd)ODBC access to the CLICK project database
pyrsistent0.20.0==0.20.0PyPIMITpyrungyes (1 .pyd)Immutable data structures (used by pyrung)
pyrung0.15.0==0.15.0First-partyMPL-2.0ClickNicknoPLC program model: offline run and static checks
pywin32311==311PyPIPSFClickNickyes (6 .dll, 2 .exe, 49 .pyd)Windows API (window detection, overlay placement)
tksheet7.6.0==7.6.0PyPIMITClickNicknoSpreadsheet widget for the Address Editor
tomlkit0.15.1==0.15.1PyPIMITpyrungnoTOML editing that preserves formatting for check settings (used by pyrung)

Dependency tree

clicknick 0.23.1
  executing 2.2.1
  laddercodec 0.2.1
  pyclickplc 0.4.0
    pymodbus 3.12.1
  pymodbus 3.12.1
  pyodbc 5.3.0
  pyrsistent 0.20.0
  pyrung 0.15.0
    executing 2.2.1
    pyclickplc 0.4.0
    pyrsistent 0.20.0
    tomlkit 0.15.1
  pywin32 311
  tksheet 7.6.0
  tomlkit 0.15.1

Source transparency

Evidence behind the release checks, listed so a reviewer can look at the exact lines.

URLs in runtime source

Every URL found in a string literal of the runtime code (comments and docstrings excluded). All of these are opened in the user's browser on click or shown as help text. None is contacted by ClickNick.

FileURL
src/clicknick/app.py:1713https://github.com/ssweber/clicknick
src/clicknick/app.py:1717https://github.com/ssweber/clicknick/issues
src/clicknick/views/dialogs.py:192https://github.com/ssweber/clicknick
src/clicknick/views/dialogs.py:199https://github.com/ssweber/clicknick/issues
src/clicknick/views/dialogs.py:397https://pyrung.com/clicknick/help/#database-connection
src/clicknick/views/dialogs.py:208https://pyrung.com/clicknick/help/#database-connection
src/clicknick/views/dialogs.py:272https://pyrung.com/clicknick/help/#database-connection

Subprocess launch sites

LocationProgram
src/clicknick/live/rung_commands.py:815sys.executable
src/clicknick/services/dap_service.py:375sys.executable
src/clicknick/services/program_check.py:89sys.executable
src/clicknick/utils/jet_sidecar.py:137str(powershell_path())

Dynamic code execution

Every exec or eval call in runtime code. Each one runs Python that ClickNick generated from the user's own ladder project, or files from the user's project workspace. Nothing downloaded, nothing decoded.

LocationCall
src/clicknick/live/tag_commands.py:318exec(compile(tags_source, 'src/plc/tags.py', 'exec'), ns)
src/clicknick/services/analysis_service.py:271exec(compile(code, '<analysis>', 'exec'), namespace)

Verify it yourself

From a checkout of the tagged release. Wheel builds are reproducible: the same source bytes give the same wheel, so a rebuild from the tag gives the SHA256 above and the one PyPI shows. The release is built on Windows with Git's default line-ending conversion, so use a Windows checkout with default Git settings; a Linux or macOS checkout produces LF line endings and therefore a different hash.

git clone https://github.com/ssweber/clicknick
cd clicknick
git checkout v0.23.1
uv export --frozen --no-dev --format cyclonedx1.5      # the dependency list in this report
uv audit --frozen --no-dev --no-group docs             # the vulnerability check
uv build
certutil -hashfile dist\clicknick-0.23.1-py3-none-any.whl SHA256
uv run python devtools/trust_report.py                 # regenerate this page into dist/trust/

To check the copy that was installed: uv tool dir shows the install folder; the wheel's files are unpacked there, and pip download clicknick==0.23.1 --no-deps fetches the exact wheel from PyPI for hashing. To install this exact version rather than the latest: uv tool install clicknick==0.23.1.