Create the package
Add manifest.json and index.html. settings.json and assets are optional.
MYTOOLBOX · DEVELOPER PLATFORM
Build Work Mode cards with HTML, CSS, and JavaScript, then connect to MyToolbox through a host-managed Bridge, on-demand authorization, isolated encryption, and seven-day audits.
Current protocolSchema 12 · Compatible with Schema 1–11
The smallest module is a folder ending in .mytoolbox-workmodule. Its first screen must remain understandable without a network connection, cookies, or granted permissions.
Add manifest.json and index.html. settings.json and assets are optional.
Use a permanent reverse-domain identifier, semantic version, bilingual names, an SF Symbol, and a safe relative entry point.
Show meaningful text, controls, images, SVG, or Canvas within four seconds instead of waiting on authorization.
Use window.mytoolbox.request. Permissions are determined by operation; manifest self-declarations do not grant capabilities.
Handle denial, offline mode, stop, reload, and mytoolbox-plugin-stop while cancelling timers and requests.
Use Plugin Center to verify detected permissions, supported surfaces, audits, encrypted data, and signing identity.
Runtime Cache and Data are created by the host and must not ship in the package. Absolute paths, symbolic links, and .. traversal are rejected.
Example.mytoolbox-workmodule/
├── manifest.json
├── index.html
├── settings.json # optional native settings
└── assets/ # optional bundled assetsThe manifest describes identity, surfaces, entry point, size, presentation, commands, and controlled host capabilities. A third-party permissions claim does not authorize access by itself.
{
"schemaVersion": 12,
"identifier": "dev.example.weather",
"version": "1.0.0",
"runtime": "web",
"names": {"zh-Hans": "城市天气", "en": "City Weather"},
"summaries": {"zh-Hans": "当前天气", "en": "Current weather"},
"symbol": "cloud.sun",
"entryPoint": "index.html",
"preferredHeight": 220,
"supportedSurfaces": ["floatingWindow", "menuBar", "horizontalStrip"],
"cardSizing": {"mode": "content", "minHeight": 120, "maxHeight": 520},
"minimumAppVersion": "0.4.0"
}MyToolbox manages title bars, order, pinning, settings, collapse, close, keyboard focus, and media termination. The real WKWebView does not participate in card-position animation.
Best for vertical information and lightweight tools that stay visible, usually at 330–600pt content width.
Best for short tasks and quick lookups. When not pinned, it closes after an outside click or app focus loss.
Scrolls horizontally above the Dock and may use a dedicated 260–520pt wide, 160–300pt high entry point.
On mytoolbox-plugin-stop, cancel networking, timers, media, and background tasks. Stale results must not refill the UI.
For a known operation, the host checks global policy, per-plugin grants, data lock state, and audits at runtime. Dynamic strings or minified source do not bypass enforcement.
const result = await window.mytoolbox.request(
"currency.snapshot",
{}
);clipboard.recent / writeTextclipboardRead / clipboardWriteRead recent clipboard items or write explicit text
translation.history / executetranslationRead / translationExecuteRead translation history or use the currently selected provider
currency.snapshotcurrencyReadRead the local MyToolbox exchange-rate snapshot
notes.recentnotesReadRead recent notes without arbitrary mutation
favorites.recent / asset.read / importfavoritesRead / favoritesWriteProxy collection content safely through IDs and Base64
vault.index / entriesvaultMetadataRead / vaultSecretReadMetadata and secret fields require separate grants
network.fetchnetworkUse an ephemeral host HTTPS session with no cookies or cache
external.file.readfilePickerReadRead only a user-selected or persistently authorized file
plugin.window.* / appearance.*nativeWindow / appearanceAsk the host to manage windows or constrained appearance tokens
network.relay.* / packet.*networkRelayControl / packetRelayControlUse audited relay or temporary packet-stream capabilities
A user can allow once, always allow, or never allow. After never allow, a plugin may link to authorization management but cannot repeatedly show its own prompt.
Each plugin uses an independent AES-GCM key derived through HKDF from the app master key and permanent plugin ID. JavaScript never receives file keys or real paths.
await window.mytoolbox.request("plugin.cache.write", {
path: "Responses/latest.json",
base64: encoded
});
await window.mytoolbox.request("plugin.data.write", {
path: "Preferences/state.bin",
base64: encoded
});Official, certified, and ordinary third-party developers have different trust levels, but global enablement, permission ceilings, offline mode, and per-plugin authorization always remain active.
Treat every release as a new security-boundary review, not simply a check that the page opens.