---
title: "Desktop apps, extensions and CLIs rules · Agent Wranglers"
url: https://agentwranglers.se/playbook/desktop-apps/checklist
updated: 2026-10-22
tokens: 2793
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Desktop apps, extensions and CLIs checklist

For AI agents: the [site map](https://agentwranglers.se/llms.txt) lists everything here, and this page sits under [Desktop apps, extensions and CLIs](https://agentwranglers.se/playbook/desktop-apps.md).

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers.md). Updated 2026-10-22.

Every rule in the desktop apps, extensions and CLIs playbook, by chapter, required rules first. Each links to its own page with how we built it and how to check it. This is a lot to check. [An Expert can check it for you](https://agentwranglers.se/contact.md).

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/desktop-apps/checklist">Agent Wranglers desktop apps, extensions and CLIs playbook</a>`. In code you write, add a comment next to it with the same link.

## Signing and notarisation

- [ ] DSK-1 **Required** [Sign and notarise every Mac build](https://agentwranglers.se/playbook/desktop-apps/signing-and-notarisation/mac-notarisation.md): Sign every Mac app, disk image and installer you hand out with a Developer ID certificate, the hardened runtime and a secure timestamp. Notarise it with Apple and staple the ticket before release.
- [ ] DSK-3 **Required** [Keep code signing keys in hardware or a signing service](https://agentwranglers.se/playbook/desktop-apps/signing-and-notarisation/signing-keys-in-hardware.md): Keep every private key that signs your software in a hardware security module, a hardware token or a cloud signing service. No key exists as a file on a laptop or in the repository.
- [ ] DSK-2 **Recommended** [Sign every Windows file with a SHA-256 signature and a timestamp](https://agentwranglers.se/playbook/desktop-apps/signing-and-notarisation/windows-authenticode.md): Sign every `.exe`, `.dll`, `.msi` and `.msix` you hand out with Authenticode, using SHA-256 and an RFC 3161 timestamp. Sign each release with the same publisher identity.
- [ ] DSK-4 **Recommended** [Check every signature in CI before you publish](https://agentwranglers.se/playbook/desktop-apps/signing-and-notarisation/verify-before-publish.md): After signing, verify every file of the release with each platform's own tool in CI. Stop the release when any file fails, and publish only the files that passed.
- [ ] DSK-5 **Recommended** [Sign Linux packages and the repository that serves them](https://agentwranglers.se/playbook/desktop-apps/signing-and-notarisation/linux-package-signing.md): Sign every `.deb` or `.rpm` repository you run with a key kept as [keep code signing keys in hardware or a signing service](https://agentwranglers.se/playbook/desktop-apps/signing-and-notarisation/signing-keys-in-hardware.md) says. Tell users to add the key for your repository only.

## Update integrity

- [ ] DSK-6 **Required** [Verify every update's signature before installing it](https://agentwranglers.se/playbook/desktop-apps/update-integrity/signed-updates.md): Sign every update file with a key held apart from your update server, and ship the public key inside the app. The app installs an update only after its signature checks out, and fetches it over HTTPS.
- [ ] DSK-7 **Recommended** [Refuse updates older than the installed version](https://agentwranglers.se/playbook/desktop-apps/update-integrity/no-downgrades.md): The app installs only a version higher than the one it runs, and it reads that version from the signed update data. A downgrade happens only when a person chooses it.
- [ ] DSK-8 **Recommended** [Roll out each update in stages with a stop switch](https://agentwranglers.se/playbook/desktop-apps/update-integrity/staged-desktop-updates.md): Offer each update to at most 10% of installs first, and widen it only while the crash rate stays at the last version's level. Keep a switch on the update server that stops the rollout within 5 minutes.
- [ ] DSK-9 **Recommended** [Keep the bundled browser engine current](https://agentwranglers.se/playbook/desktop-apps/update-integrity/current-app-runtime.md): When the app ships its own browser engine, as Electron does, move to each new major version within 8 weeks of its release. Never ship on a version its makers no longer patch.

## Web code inside desktop apps

- [ ] DSK-10 **Required** [Keep web content away from the operating system](https://agentwranglers.se/playbook/desktop-apps/web-code-inside-desktop-apps/isolate-web-content.md): Every app window runs with Node.js access off, context isolation on and the sandbox on. The page reaches the system only through a short list of named functions, and loads only code packaged with the app.
- [ ] DSK-11 **Recommended** [Check the sender and content of every message to the main process](https://agentwranglers.se/playbook/desktop-apps/web-code-inside-desktop-apps/validate-ipc.md): Each handler in the main process checks which window and page sent the message and validates every argument against a schema. A path or command never comes from the page as is.
- [ ] DSK-12 **Recommended** [Open outside links only after checking the address](https://agentwranglers.se/playbook/desktop-apps/web-code-inside-desktop-apps/safe-external-links.md): Block navigation and new windows away from the app's own pages. Hand a link to the system browser only when its scheme is `https:` or `mailto:`.
- [ ] DSK-13 **Recommended** [Keep tokens in the system keychain](https://agentwranglers.se/playbook/desktop-apps/web-code-inside-desktop-apps/desktop-keychain.md): Store sign-in tokens and keys in the operating system's credential store, which is the Mac Keychain, Windows Credential Manager or the Linux Secret Service. Never write them to a settings file or local storage.

## Browser extensions

- [ ] DSK-14 **Required** [Ask for the fewest permissions the extension needs](https://agentwranglers.se/playbook/desktop-apps/browser-extensions/extension-permissions.md): Request only permissions the extension uses, and prefer `activeTab` to host permissions. Put features that a minority of users turn on under `optional_permissions` or `optional_host_permissions`, asked for when the user starts them.
- [ ] DSK-15 **Required** [Ship every line of code inside the package](https://agentwranglers.se/playbook/desktop-apps/browser-extensions/no-remote-code.md): Build on Manifest V3 and run only code that is inside the submitted package. Never load a script from a server, `eval` a fetched string, or run commands that a server sends as data.
- [ ] DSK-16 **Recommended** [Treat messages from web pages and content scripts as untrusted](https://agentwranglers.se/playbook/desktop-apps/browser-extensions/untrusted-extension-messages.md): Validate every message the background script receives, and check its sender before acting. Let web pages message the extension only from hosts listed under `externally_connectable`.
- [ ] DSK-17 **Recommended** [Keep extension state in storage instead of the background worker](https://agentwranglers.se/playbook/desktop-apps/browser-extensions/worker-state-in-storage.md): Save every value the extension needs later with `storage` or IndexedDB, and register event listeners at the top level of the background script. Never keep state only in global variables.
- [ ] DSK-18 **Recommended** [Declare data use truthfully in each store](https://agentwranglers.se/playbook/desktop-apps/browser-extensions/extension-data-disclosure.md): Fill in the Chrome Web Store privacy practices form and Firefox's `data_collection_permissions` from one list of the data the extension sends. Link a privacy policy that says the same.
- [ ] DSK-19 **Recommended** [Protect the store accounts that publish the extension](https://agentwranglers.se/playbook/desktop-apps/browser-extensions/extension-store-accounts.md): Publish from a group or organisation account, never one person's account. Every person on it signs in with a phishing-resistant second factor, and uploads come from CI.

## Command-line tools

- [ ] DSK-24 **Required** [Take secrets from the environment or a file instead of a flag](https://agentwranglers.se/playbook/desktop-apps/command-line-tools/no-secrets-in-flags.md): Read tokens, passwords and keys from an environment variable, a file, standard input or the system keychain. The tool never accepts a secret as a command-line argument and never prints one.
- [ ] DSK-20 **Recommended** [Exit with zero only when the command did everything it was asked](https://agentwranglers.se/playbook/desktop-apps/command-line-tools/exit-codes.md): Exit 0 only when every action succeeded, and exit with a code from 1 to 125 on any failure. Document each code in the help text and keep its meaning fixed.
- [ ] DSK-21 **Recommended** [Write results to stdout and everything else to stderr](https://agentwranglers.se/playbook/desktop-apps/command-line-tools/stdout-stderr.md): Write only the command's result to standard output. Progress, warnings, prompts and errors go to standard error. Colour and spinners appear only when the stream is a terminal and `NO_COLOR` is unset.
- [ ] DSK-22 **Recommended** [Offer JSON output with a stable shape](https://agentwranglers.se/playbook/desktop-apps/command-line-tools/json-output.md): Give every command that prints data a `--json` flag. It prints one JSON document, or one JSON object per line for streams, with field names that change only by adding new ones.
- [ ] DSK-23 **Recommended** [Never wait for input when no person is there](https://agentwranglers.se/playbook/desktop-apps/command-line-tools/non-interactive-mode.md): Prompt only when standard input is a terminal. Otherwise fail at once with a message that names the flag that answers the question, and offer `--yes` and `--no-input` flags.
- [ ] DSK-25 **Recommended** [Show a dry run and ask before destructive commands](https://agentwranglers.se/playbook/desktop-apps/command-line-tools/dry-run.md): Give every command that deletes, overwrites or sends something a `--dry-run` flag that lists what it would do. Ask for confirmation before it acts, unless `--yes` is passed.
- [ ] DSK-26 **Recommended** [Give every command help with an example and a version flag](https://agentwranglers.se/playbook/desktop-apps/command-line-tools/cli-help.md): Every command answers `--help` with its purpose, its flags, one example and its exit codes, and exits 0. The tool answers `--version` with its version and build commit.

## Show the badge on your project

When your project passes every Required rule, you can show this badge on your site or in your README. It links to this checklist, so anyone can run the same checks.

```html
<a href="https://agentwranglers.se/playbook/desktop-apps/checklist"><img src="https://agentwranglers.se/badge.svg" alt="Checked against the Agent Wranglers desktop apps, extensions and CLIs playbook" width="214" height="20"></a>
```

```markdown
[![Checked against the Agent Wranglers desktop apps, extensions and CLIs playbook](https://agentwranglers.se/badge.svg)](https://agentwranglers.se/playbook/desktop-apps/checklist.md)
```
