metadata.json declared MIT while no LICENSE file existed, so the repository had no effective licence at all. It is now GPL-3.0-or-later:
the full FSF text in LICENSE
the identifier in metadata.json
REUSE-style SPDX-FileCopyrightText and SPDX-License-Identifier headers on all 33 source files, which is the convention KDE itself uses
One factual note, recorded so the choice is not mistaken for a constraint: nothing in the dependency graph requires GPL here.linkctl is MIT and is invoked as a subprocess rather than linked, and the KDE QML modules the applet imports are LGPL. GPL-3.0-or-later is a deliberate preference.
The header insertion is the risky part of this change, because two files are order-sensitive: .pragma library in logic.js must precede any code, and qmldir module definitions are parsed positionally. The full suite passing afterwards confirms neither was disturbed.
Removed from the tree
tests/lint_qml.py had an absolute sandbox path, /tmp/pyside/PySide6/qmllint, baked into its search list. It now looks for Qt's qmllint and PySide6's pyside6-qmllint on PATH, honours a QMLLINT override, and explains how to install one when it finds nothing. Verified both that it still runs with the override and that it skips cleanly with exit 0 when no linter is present, so a contributor without Qt tooling is not blocked.
contrib/linkctl-gamepad.service carried a Documentation= URL pointing at a host that does not exist, and its ExecStart silently assumed a particular checkout directory. The URL is gone and the path is now an obvious PATH/TO/CHECKOUT placeholder sitting next to the comment that tells you to edit it.
Credits
Added a section naming the work this is built on, because the project is mostly glue:
illegalstudio/linkctl does the actual camera control
schlarpc/insta360-link-firmware-re documents the UVC extension-unit protocol from a firmware teardown
vrwallace/Insta360-Link-1-and-2-Controller-for-Linux established that the Link 2 rejects single-axis pan/tilt writes and needs both axes in one VIDIOC_S_EXT_CTRLS call, which is the detail the whole thing depends on
Audit result
Clean, with one item that cannot be fixed in a commit:
Checked
Result
Credentials, tokens, API keys
none, in files or anywhere in history
Private hostnames in tracked files
none
IP addresses
none
Absolute home paths
none
Sandbox-specific paths
one found, removed
Placeholder or TODO text
none (only legitimate QML placeholderText)
SPDX coverage
all 33 applicable files
Accepted, not changed: three merge commits carry Reviewed-on: and Reviewed-by: trailers naming the forge and a maintainer email, added by the forge itself at merge time. The repository owner has reviewed these and is keeping them: the forge is reachable over the public internet and those details are already published elsewhere, so there is nothing to conceal. No history rewrite is being performed, and the commit history stays intact.
For the record, the rewrite was validated on a throwaway clone before that decision, in case it is ever wanted. Targeting main specifically rather than --all matters: with --all on a clone, filter-branch cannot rewrite remote-tracking refs and leaves the original objects reachable, so the trailers appear to survive.
trailers on main: 6 -> 0
commits on main: 11 -> 11 (unchanged)
tree hash: identical (no content touched)
Testing
169 checks across seven suites plus the QML linter, all passing. shellcheck clean. bin/linkctl-gamepad still compiles.
**Summary generated by LLM agent**
## Licensing
`metadata.json` declared MIT while no LICENSE file existed, so the repository had no effective licence at all. It is now **GPL-3.0-or-later**:
- the full FSF text in `LICENSE`
- the identifier in `metadata.json`
- REUSE-style `SPDX-FileCopyrightText` and `SPDX-License-Identifier` headers on all 33 source files, which is the convention KDE itself uses
One factual note, recorded so the choice is not mistaken for a constraint: **nothing in the dependency graph requires GPL here.** `linkctl` is MIT and is invoked as a subprocess rather than linked, and the KDE QML modules the applet imports are LGPL. GPL-3.0-or-later is a deliberate preference.
The header insertion is the risky part of this change, because two files are order-sensitive: `.pragma library` in `logic.js` must precede any code, and `qmldir` module definitions are parsed positionally. The full suite passing afterwards confirms neither was disturbed.
## Removed from the tree
`tests/lint_qml.py` had an absolute sandbox path, `/tmp/pyside/PySide6/qmllint`, baked into its search list. It now looks for Qt's `qmllint` and PySide6's `pyside6-qmllint` on `PATH`, honours a `QMLLINT` override, and explains how to install one when it finds nothing. Verified both that it still runs with the override and that it skips cleanly with exit 0 when no linter is present, so a contributor without Qt tooling is not blocked.
`contrib/linkctl-gamepad.service` carried a `Documentation=` URL pointing at a host that does not exist, and its `ExecStart` silently assumed a particular checkout directory. The URL is gone and the path is now an obvious `PATH/TO/CHECKOUT` placeholder sitting next to the comment that tells you to edit it.
## Credits
Added a section naming the work this is built on, because the project is mostly glue:
- `illegalstudio/linkctl` does the actual camera control
- `schlarpc/insta360-link-firmware-re` documents the UVC extension-unit protocol from a firmware teardown
- `vrwallace/Insta360-Link-1-and-2-Controller-for-Linux` established that the Link 2 rejects single-axis pan/tilt writes and needs both axes in one `VIDIOC_S_EXT_CTRLS` call, which is the detail the whole thing depends on
## Audit result
Clean, with one item that cannot be fixed in a commit:
| Checked | Result |
|---|---|
| Credentials, tokens, API keys | none, in files or anywhere in history |
| Private hostnames in tracked files | none |
| IP addresses | none |
| Absolute home paths | none |
| Sandbox-specific paths | one found, removed |
| Placeholder or TODO text | none (only legitimate QML `placeholderText`) |
| SPDX coverage | all 33 applicable files |
**Accepted, not changed:** three merge commits carry `Reviewed-on:` and `Reviewed-by:` trailers naming the forge and a maintainer email, added by the forge itself at merge time. The repository owner has reviewed these and is keeping them: the forge is reachable over the public internet and those details are already published elsewhere, so there is nothing to conceal. No history rewrite is being performed, and the commit history stays intact.
For the record, the rewrite was validated on a throwaway clone before that decision, in case it is ever wanted. Targeting `main` specifically rather than `--all` matters: with `--all` on a clone, filter-branch cannot rewrite remote-tracking refs and leaves the original objects reachable, so the trailers appear to survive.
```
trailers on main: 6 -> 0
commits on main: 11 -> 11 (unchanged)
tree hash: identical (no content touched)
```
## Testing
169 checks across seven suites plus the QML linter, all passing. `shellcheck` clean. `bin/linkctl-gamepad` still compiles.
metadata.json claimed MIT while no LICENSE file existed, so the repository
had no effective licence at all. It is now GPL-3.0-or-later: the full FSF
text in LICENSE, the identifier in metadata.json, and REUSE-style
SPDX-FileCopyrightText and SPDX-License-Identifier headers on all 33 source
files, which is the convention KDE itself uses.
Worth recording that GPL-3.0 is a preference here rather than an obligation.
Nothing in the dependency graph forces it: linkctl is MIT and is invoked as a
subprocess rather than linked, and the KDE QML modules the applet imports are
LGPL.
Removed two things that should not ship in a public repository. tests's QML
linter had an absolute sandbox path, /tmp/pyside/PySide6/qmllint, baked into
its search list; it now looks for Qt's qmllint and PySide6's pyside6-qmllint
on PATH and honours a QMLLINT override, and says how to install one when it
finds nothing. The systemd unit carried a Documentation= URL pointing at a
host that does not exist, and its ExecStart silently assumed a particular
checkout directory; the URL is gone and the path is now an obvious
PATH/TO/CHECKOUT placeholder next to the comment telling you to edit it.
Added a Credits section naming the work this is built on, since the project
is mostly glue: linkctl does the camera control, schlarpc's firmware teardown
documents the extension-unit protocol, and vrwallace's controller established
that the Link 2 needs both pan and tilt axes in a single VIDIOC_S_EXT_CTRLS
call, which is the detail the whole thing depends on.
Also made the two Python tests executable, matching the other scripts.
Audited for operator-specific detail: no credentials, tokens, private
hostnames, IP addresses or absolute home paths in any tracked file or
anywhere in the history's diffs. Three merge commits do carry Reviewed-on and
Reviewed-by trailers naming a private forge, added by the forge at merge
time; those are commit metadata rather than file content and are handled
separately.
Tested: 169 checks across seven suites plus the QML linter, all passing after
the header insertion, which confirms it did not disturb the order-sensitive
`.pragma library` line in logic.js or the qmldir module definitions.
shellcheck clean.
branderson
approved these changes 2026-10-16 14:55:34 -07:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary generated by LLM agent
Licensing
metadata.jsondeclared MIT while no LICENSE file existed, so the repository had no effective licence at all. It is now GPL-3.0-or-later:LICENSEmetadata.jsonSPDX-FileCopyrightTextandSPDX-License-Identifierheaders on all 33 source files, which is the convention KDE itself usesOne factual note, recorded so the choice is not mistaken for a constraint: nothing in the dependency graph requires GPL here.
linkctlis MIT and is invoked as a subprocess rather than linked, and the KDE QML modules the applet imports are LGPL. GPL-3.0-or-later is a deliberate preference.The header insertion is the risky part of this change, because two files are order-sensitive:
.pragma libraryinlogic.jsmust precede any code, andqmldirmodule definitions are parsed positionally. The full suite passing afterwards confirms neither was disturbed.Removed from the tree
tests/lint_qml.pyhad an absolute sandbox path,/tmp/pyside/PySide6/qmllint, baked into its search list. It now looks for Qt'sqmllintand PySide6'spyside6-qmllintonPATH, honours aQMLLINToverride, and explains how to install one when it finds nothing. Verified both that it still runs with the override and that it skips cleanly with exit 0 when no linter is present, so a contributor without Qt tooling is not blocked.contrib/linkctl-gamepad.servicecarried aDocumentation=URL pointing at a host that does not exist, and itsExecStartsilently assumed a particular checkout directory. The URL is gone and the path is now an obviousPATH/TO/CHECKOUTplaceholder sitting next to the comment that tells you to edit it.Credits
Added a section naming the work this is built on, because the project is mostly glue:
illegalstudio/linkctldoes the actual camera controlschlarpc/insta360-link-firmware-redocuments the UVC extension-unit protocol from a firmware teardownvrwallace/Insta360-Link-1-and-2-Controller-for-Linuxestablished that the Link 2 rejects single-axis pan/tilt writes and needs both axes in oneVIDIOC_S_EXT_CTRLScall, which is the detail the whole thing depends onAudit result
Clean, with one item that cannot be fixed in a commit:
placeholderText)Accepted, not changed: three merge commits carry
Reviewed-on:andReviewed-by:trailers naming the forge and a maintainer email, added by the forge itself at merge time. The repository owner has reviewed these and is keeping them: the forge is reachable over the public internet and those details are already published elsewhere, so there is nothing to conceal. No history rewrite is being performed, and the commit history stays intact.For the record, the rewrite was validated on a throwaway clone before that decision, in case it is ever wanted. Targeting
mainspecifically rather than--allmatters: with--allon a clone, filter-branch cannot rewrite remote-tracking refs and leaves the original objects reachable, so the trailers appear to survive.Testing
169 checks across seven suites plus the QML linter, all passing.
shellcheckclean.bin/linkctl-gamepadstill compiles.