"These three plugins are where your app reaches into the user's machine — which makes them exactly where you must be most careful."
fs: Reading and Writing Files
The fs plugin gives the frontend file access — readTextFile, writeTextFile, readDir, and friends — but only within the paths your capability scopes allow (the security track's lesson made flesh). The pattern: scope reads/writes to $APPDATA or a folder the user explicitly picked, never the whole disk. fs is the plugin where a sloppy scope turns into a real vulnerability, so it's the one to scope tightest.
dialog: Native Pickers and Prompts
The dialog plugin shows real OS dialogs: open (file/folder picker), save (save-as), and message-style message/ask/confirm. There's a lovely synergy with fs: let the user pick a file with the dialog, and the returned path is one the user consciously chose — a natural, safe way to grant access beyond your default scope without opening the whole filesystem.
shell: Opening and Executing — Carefully
The shell plugin (and the focused opener plugin) can open a URL or file in the user's default app, and can execute processes. Opening a URL is low-risk; executing arbitrary commands is the single most dangerous power in the toolkit. If you grant shell execution, scope it to specific, fixed commands — never let the frontend pass an arbitrary command string. For just opening links, prefer opener over full shell execution; it's the smaller, safer grant.