ClickNick 0.23.3 trust report

Generated 2026-09-10 14:42 UTC from uv.lock at commit 5e2ad90cd68f. 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

The narrative below comes from docs/security/index.md in this report's source checkout. It describes intended behavior; the generated checks below provide release-specific evidence, not a formal security audit.

ClickNick is a Windows desktop tool that reads and edits CLICK projects and adds nickname autocomplete to CLICK Programming Software.

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.

This page describes its file access, network connections, code execution, and installation for IT and security review. ClickNick is open source (AGPL-3.0), written and maintained by one author.

Each release includes a trust report and dependency inventory, generated from the release source, built package, and dependency lock file. These are release checks, not a formal security audit. A static scan shows what the code contains; it cannot prove what it never does.

Software characteristics

ClickNick installs no Windows services, drivers, or scheduled tasks. It has no telemetry, analytics, or automatic update agent. Updates are initiated by the user.

ClickNick's own package is readable Python source, with no obfuscated or encrypted modules, packed executables, or compiled code. Its installation also includes a Python interpreter and dependencies with native binaries, identified in the release report. Source code for every dependency is publicly available.

The default uv installation stays under the user's profile. Project exports and durable workspaces are written to the folders the user chooses.

Runtime behavior

ClickNick has no background internet connection for telemetry or updates. Installation downloads are described below; workspace scripts can perform whatever file or network operations their code requests.

What endpoint monitoring will see

The paths below describe the default uv installation.

Event Cause
Unsigned clicknick.exe in %USERPROFILE%\.local\bin starts Python from %APPDATA%\uv\tools\clicknick\ Normal launch. uv generates the small entry-point launcher; ClickNick runs as python.exe or pythonw.exe.
Python starts SysWOW64\...\powershell.exe -EncodedCommand ... The Jet database worker, on machines without a 64-bit Access driver. The full command and script identity are below.
Python listening on 127.0.0.1:<random port> The editor command listener for clicknick-cli; the offline console uses a separate pyrung live connection for simulation.
Python starts a child Python process Check Program, applying a proposal, or the offline console running the user's workspace.
Python connects to <PLC address>:502 Dataview editor, after the user asks to go live.
Native .pyd, .dll, and .exe files appear under %APPDATA%\uv\ The Python interpreter and dependencies such as pywin32 and pyodbc. pywin32 includes Pythonwin.exe and pythonservice.exe; ClickNick does not run them.
HKCU\Environment PATH changed The uv installer adds its executable directory to the user's PATH.

The database worker's command line is:

%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -NoLogo -NoProfile -NonInteractive -EncodedCommand <base64>

The payload is the text of the shipped clicknick/resources/jet_sidecar.ps1 script, with line endings normalized to LF, encoded as UTF-16LE and then Base64. Each release report includes the shipped file's SHA256 for review. Project paths and values travel separately as JSON on standard input; they are not inserted into PowerShell source.

The encoded invocation keeps the worker usable under Windows PowerShell's Restricted execution policy, which permits commands but blocks script files invoked with -File. It does not change execution policy or relax application-control rules. Endpoint tools may flag the invocation; any exception depends on the controls in use. To use Access ODBC without falling back to PowerShell, start clicknick --db-backend odbc. The --db-backend none option uses CSV mode without either database backend.

Installation and updates

uv is an open-source Python package manager from Astral. For ClickNick, it downloads the package and dependencies from PyPI, installs them in an isolated environment, and creates the launcher. It also downloads a Python interpreter if needed. ClickNick does not call uv at runtime.

Installation and upgrades use these hosts:

Purpose Hosts
uv installer astral.sh
Python builds from python-build-standalone github.com, objects.githubusercontent.com
ClickNick and Python dependencies pypi.org, files.pythonhosted.org

uv checks package files against hashes published by PyPI and Python downloads against hashes built into uv. Installing ClickNick's wheel unpacks files; the wheel has no install-time scripts.

If a script piped into PowerShell is against policy, install uv with winget install --id astral-sh.uv. If your policy prefers pip, install ClickNick into a virtual environment using Python 3.11 or newer. See Install.

To update: uv tool upgrade clicknick.

ClickNick pins its whole dependency tree to exact versions, so installing a given ClickNick version installs exactly the dependency versions in that release's report. Dependency updates, including security fixes, arrive only through a new ClickNick release, and every release runs uv audit before it ships.

Where things live on disk

Default locations for an installation through uv:

Item Location
uv itself %USERPROFILE%\.local\bin\uv.exe
Python interpreter downloaded by uv %APPDATA%\uv\python\
ClickNick and its dependencies %APPDATA%\uv\tools\clicknick\
Launcher stub %USERPROFILE%\.local\bin\clicknick.exe
uv download cache %LOCALAPPDATA%\uv\cache\
Live-session files The CLICK temp folder for the open project, or %LOCALAPPDATA%\ClickNick\live\. CLICK does not read these files.
Generated engineering workspace %TEMP%\clicknick_* while running, or the folder the user chooses for a durable workspace
Project data it edits SC_.mdb in %LOCALAPPDATA%\Temp\CLICK (...)\. CLICK writes it back into the .ckp on save.

Uninstall

uv tool uninstall clicknick

This removes ClickNick's tool environment and launchers. User-saved workspaces and exports remain in their chosen folders.

uv, its downloaded Python interpreters, and its cache remain available for other tools. Removing %APPDATA%\uv\ also removes other uv tool environments and shared Python builds. Remove those shared directories only if you are retiring uv and all tools that use them; the same applies to removing %USERPROFILE%\.local\bin from PATH, since other commands may live there.

Reporting a problem

Report security issues through the repository's private vulnerability reporting form. For other problems, open an issue. Include the release version and its trust report.

Release summary

ReleaseClickNick 0.23.3
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.3.cyclonedx.json)aa9175917d9ef50c9eceebd42f14041509c0d82dea9ed58dca1c6de914240596
Wheel SHA256 (clicknick-0.23.3-py3-none-any.whl)d7f0ef16e2ccb449e4953f835ca607b93d7b3f4f275f5d23c4a3bf1c47f76e7c
PowerShell worker SHA256 (clicknick/resources/jet_sidecar.ps1)763e4e76efbd6dd7631411e3f819d9511ffc1011285f80332c0db7530d209347
Generated fromuv.lock, exported as CycloneDX 1.5 by uv 0.12.1
Source commit5e2ad90cd68fbd3361736cf49b3e0683f793bc7a

Release checks

Runtime dependencies

Every distribution that uv tool install clicknick==0.23.3 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.3This releaseAGPL-3.0noApplication
executing2.2.1==2.2.1PyPIMITpyrungnoPython source introspection (used by pyrung)
laddercodec0.2.2==0.2.2First-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.1==0.15.1First-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.3
  executing 2.2.1
  laddercodec 0.2.2
  pyclickplc 0.4.0
    pymodbus 3.12.1
  pymodbus 3.12.1
  pyodbc 5.3.0
  pyrsistent 0.20.0
  pyrung 0.15.1
    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

Rebuild from a clean checkout of the tagged release using its own build recipe. Build dependencies are pinned in pyproject.toml; Hatch supplies stable timestamps when SOURCE_DATE_EPOCH is unset, and Git attributes select LF checkout line endings. Compare the rebuilt wheel's SHA256 with this report to verify that its bytes match. Older release tags retain their original settings.

git clone https://github.com/ssweber/clicknick
cd clicknick
git checkout v0.23.3
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.3-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.3 --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.3.