Plugins
A plugin adds commands, panels and keybinds to RIM. This page is for the person using the app: what a plugin can do, the official plugins, and how to install, use, trust and remove one. How the client hosts plugins is in Web plugins and Workspace plugins; the model behind both is rim-server's plugin model.
What a plugin is #
A plugin runs in the client, beside the app, never on the server. It acts for the user: it reaches RIM only through the app, which uses the user's own session, and a plugin that runs on the computer uses the user's own local credentials. There are two kinds, and Settings names each in a few words:
- Sandboxed (
WebSandboxed) runs in a sandboxed frame of the app, in the web app and the desktop app alike. It cannot read files, run programs or use the RIM session. It reaches RIM only through the permissions it was granted, and the network only at the sites its manifest lists, once allowed. - Runs on this computer (
DesktopLocalProcess) is a program the desktop app starts. It runs as the user, with the user's access to files, the network and local credentials such as a kubeconfig. Its permissions govern what the app does for it, not what the program can do on the machine. The web app does not run this kind and lists it as "Needs the desktop app"; the local plugin host describes how the desktop runs it.
A plugin contributes some of these:
- commands, listed in the command palette under the plugin's name, bindable to keys and, when the plugin marks them so and the user agrees, callable by the AI agent;
- panels, shown next to the tool panel or in place of the conversation;
- context actions in a message's context menu;
- keybind suggestions the user can assign.
Without the matching permission the app does not show a plugin's panel, read or post messages for it, or show its notifications, and a sandboxed plugin cannot reach any site. A command the plugin marks dangerous runs only after the user confirms that run: the AI agent can never confirm one, and a plugin's panel cannot confirm one for its own plugin.
The official plugins #
The project publishes four plugins, each in its own repository, all at version 0.0.x. Each README lists the plugin's commands and the ways to install it.
| Plugin | What it does | Kind | Permissions it asks for | Repository |
|---|---|---|---|---|
| Poll | Runs a quick poll in the open conversation; the poll and every vote are messages | Sandboxed | ui.panel, chat.read, chat.write; optionally chat.read.encrypted and chat.write.encrypted |
plugin-poll |
| GitHub Pull Requests | Lists the open pull requests of up to 10 public GitHub repositories | Sandboxed | ui.panel, network.fetch for api.github.com and avatars.githubusercontent.com |
plugin-github-prs |
| Kubernetes Pods | Lists a namespace's pods, shows and follows a container's logs, restarts a pod after you confirm | Runs on this computer | ui.panel, ui.notify |
plugin-k8s-pods |
| Releases | Watches the GitHub releases of up to 10 public repositories and posts them into a conversation when asked | Sandboxed | ui.panel, network.fetch for api.github.com, chat.write |
plugin-releases |
- Poll needs the two encrypted permissions to work in encrypted DMs and groups; without them it works in plaintext channels only. On the web it reads messages only in a browser set up as a linked device.
- GitHub Pull Requests and Releases use no token, so they see public repositories only. GitHub allows 60 requests an hour per IP address without one.
- Kubernetes Pods needs the desktop app, Node.js 22 or newer and
kubectl, which it runs with your own kubeconfig. Four of its commands can be called by the AI agent once approved in Settings → Plugin AI; Pods: Restart pod is dangerous, so it runs only after you confirm, also when the agent asks for it. It suggests Ctrl+Alt+P for Pods: Refresh.
Installing #
Settings → Plugins has three install buttons.
- Install from local folder (desktop) opens a folder picker. The app copies the plugin from the chosen folder into its plugins folder; for a sandboxed plugin it copies only the bundle's files.
- Install from git URL (desktop) takes an
https://,ssh://oruser@host:owner/repoURL, then Install. For a sandboxed plugin the app keeps onlyrim-plugin.json, the entry module andpanels/from the checkout. For a plugin that runs on this computer, apackage.jsonthat declares dependencies or arequirements.txtmeans install steps. Before any of them runs, the Run plugin install scripts? dialog lists each command exactly as it will run (npm install --production,pip install -r requirements.txt --user), with its folder, and warns that it runs the author's code with your privileges, outside the permissions you approve later. Run commands and install continues; Cancel installs nothing. - Install from link (desktop and web) takes a link of the form
https://<host>/<name>.rimbundle#sha256=<hash>, then Install. The bundle is fetched without credentials, must hash to the value after#sha256=and must pass the manifest rules before anything is installed. The bundle's host must allow cross-origin requests, so a link to a GitHub release asset does not install this way. A link to a plugin already installed opens Replace <name>?, which shows the version change and the permissions added or dropped; the permissions are approved again afterwards.
Every install ends in the Plugin Permissions dialog, described under Trust and permissions. Then turn the plugin on with the switch on its row.
Workspace registry #
Each workspace keeps a registry of plugins it recommends or requires, managed by its Owners and Moderators. An entry pins one exact version through a statement its publisher signed with their identity key. Every client verifies that statement against the publisher's key log before it offers the plugin, so the server is not trusted for what the plugin is, and checks a bundle's size and SHA-256 before asking for any consent. An instance can switch the registry off. Workspace plugins has the details.
- The palette's "Workspace plugins" section lists the entries this device has not
installed, as
Install <name>with a line such asRecommended by Acme · signed by Ada (rimp1_txDLbnip). An entry installed at another version shows asUpdate <name>, one installed from another workspace asSwitch <name> to <workspace>'s version, and an unsigned copy of the same plugin asReplace <name> with <workspace>'s signed version. An entry this device cannot install shows the reason, such as "Needs the desktop app" or "Signature does not verify", and cannot be chosen. - Required plugins are offered when the workspace opens, in <workspace> requires plugins, with Review and install for each. Not now hides the dialog until the entry is signed again. Settings → Plugins also lists them under <workspace>'s plugins, with Review.
- The install dialog shows the version, the publisher's badge, the status, the source, the kind of plugin and whether the bundle matches its signature. Install is followed by the permission prompt; a git source's install steps ask for consent as above.
On workspace open, and whenever the registry changes, each plugin installed from it is compared with its entry. A new version installs on its own, with the notice "Updated <name> to <version>", when it keeps the kind and the publisher, asks for no new permission and adds no new command the AI agent can run; the approvals carry over. Anything else waits behind Update <name>?, which lists what is new: another publisher, another kind, new permissions, new commands the AI agent can run, or install steps. Review update opens the install dialog; Later keeps the installed version running. A failed update keeps the old copy.
When an entry leaves the registry, its plugin is stopped and <name> was removed offers Remove, which uninstalls it and deletes its data, or Keep, which leaves it installed, turned off, as a local plugin that no longer gets updates.
Using a plugin #
- Turning it on. The switch on the plugin's row in Settings → Plugins starts it, and the row shows Running, Stopped, Crashed or Timed out. On the desktop a plugin left on starts again with the app. On the web, plugins are turned on per account in that browser: signing out stops them and signing in starts those the account turned on.
- Panels. The side rail's Plugins entry opens a menu with one row per panel of every running plugin, showing the plugin's name and the panel's title. Choosing a row opens the panel; with no running plugin that has a panel, the menu offers Manage plugins. The entry stays marked while a plugin panel is open. A panel opens next to the tool panel or, like the Pods panel, in place of the conversation. Its header shows the panel's title, the plugin's name, its kind and where it came from, and a close button. UI shell describes the menu's keys.
- "Open <panel>" commands. Each panel of a running plugin also has an "Open <panel>" command in the palette, such as "Open Pull requests", which a keybind can run too.
- Commands. The palette lists a plugin's commands under the plugin's name. A command that needs arguments is not listed; its plugin's panel runs it. A dangerous command opens <command>?, which says "<plugin> marks this command as dangerous. It runs only if you confirm.", shows the arguments, and offers Run it or Cancel.
- Context actions. A plugin's context actions appear at the end of a message's context menu. None of the official plugins declares one.
- Keybinds. On the desktop, Settings → Keybinds lists the suggestions of turned-on plugins that are not bound yet under Plugin Suggestions; Assign binds one. A plugin command marked keybind-capable can also be bound like any other command. Bindings to plugin commands stay on this device, marked This device; Keyboard explains the layers.
- The AI agent. On the desktop, Settings → Plugin AI lists the plugins with commands the agent can call. The first approval for a plugin, of one command or with Approve all, asks in Grant AI Access?; the agent then calls an approved command without asking each time. Revoke all on a plugin and Revoke all grants for every plugin take the approvals back.
Trust and permissions #
The Plugin Permissions dialog opens after every install and from Permissions on a plugin's row. It shows the plugin's name, version and author; its description under "From the plugin author:", which is the author's claim, not the app's; and what the kind of plugin means:
- Sandboxed: "Runs sandboxed in this app. It cannot read your files, run programs, or use your RIM session. It reaches RIM only through the permissions below."
- Runs on this computer: "Runs as a program on this computer with your account's access. It is not sandboxed: it can read your files and use the network whatever you approve below. Install it only if you trust its author."
Each permission has a checkbox, checked at first. Unchecking one denies it, and Approve grants the rest. The prompt names them like this:
| Capability | What the prompt says |
|---|---|
ui.panel |
Render UI Panels |
ui.notify |
Show Notifications |
network.fetch |
Connect to listed sites: send and receive data from the sites the plugin lists, named one by one. Anything you show this plugin can be sent to these sites. |
chat.read |
Read your conversations, except those of encrypted DMs and groups |
chat.write |
Post as you, except in encrypted DMs and groups |
chat.read.encrypted |
Read your encrypted DMs and groups: their decrypted text, which the plugin can send anywhere its other permissions allow |
chat.write.encrypted |
Post as you in your encrypted DMs and groups |
events.read, local.process, network, fs.read, fs.write |
Receive Workspace Events, Run Local Processes, Network Access, Read Files, Write Files; no sandboxed plugin can hold them |
An encrypted chat permission needs its plain one: checking it checks the plain one, and unchecking the plain one unchecks it.
Activity on a plugin's row shows what it holds and did:
- Approved permissions, each with Revoke. Revoking a permission stops the plugin, and revoking a plain chat permission takes its encrypted one with it.
- Encrypted messages read, a count per day for the last 14 days.
- Permission history, the latest 20 grants and revocations with their times.
A changed bundle (desktop). The app records a fingerprint of a plugin's folder when it installs it. When the files change afterwards, the row shows "Plugin bundle has changed" and the switch cannot turn the plugin on. Trust new version accepts the new files and keeps the approvals. Dismiss turns the plugin off and hides the warning on this device until the files change again; the Bundle changed badge beside the name stays, and clicking it brings the warning back. The web app hashes a plugin's bundle again at every start instead, and fetches it again from its link when it is missing or damaged.
Signed and unsigned. The row and the panel header say where a plugin came from:
Unsigned · installed from a link (<host>)Unsigned · installed from git (<host>)Unsigned · installed from a folderFrom the workspace registry
The app does not use the word "sideloaded", but that is what the first three are: installed by
hand, with no publisher's signature, and trusted only as far as their source. The link field
says so: "Plugins from links are not signed: install one only if you trust where the link came
from." A registry plugin carries its publisher's signature, which every device verifies. Its
badge reads Signed by Ada · rimp1_txDLbnip when a member of the workspace has the publisher's
principal id; otherwise it quotes the name the publisher chose and adds "(not a member of this
workspace)", since that name proves nothing. Hovering shows the whole id, and a button copies
it. If the publisher later recovers their key, the installed copy keeps running, Settings says
"The publisher recovered their key: ask for a re-signed version", and nothing new installs from
that statement.
Signing and publishing. On a desktop that holds the account's identity key (Settings →
Security shows it), each row has Sign and publish…. It signs the plugin as installed. An
Owner or Moderator of the open workspace then picks Recommended or Required and chooses
Publish; anyone can Export… a .rimsig.json to send to one of them, who adds it in
Workspace settings → Plugins with "Add from files".
Managing and removing #
- Turn it off with the switch. The plugin stops and its commands and panels leave the app; its permissions and data stay.
- A plugin that did not start. A sandboxed plugin whose start was cut short, because the app closed while starting it, is not started again, and Settings says so. Turning it off and on retries.
- Uninstall with the bin icon on the row, then Uninstall in Uninstall <name>?. On the desktop the plugin is removed from this device with the permissions granted to it and the data it stored, and its folder leaves the plugins folder and is deleted. A folder the app did not install itself stays where it is. In the web app the plugin is removed from that browser for your account, with its permissions, data and files. To use it again, install it again.
Where plugins live:
| What | Desktop | Web |
|---|---|---|
| The plugin's files, both kinds | ~/.rim/plugins/<plugin_id>/, or %USERPROFILE%\.rim\plugins\<plugin_id>\ on Windows |
The browser's IndexedDB database rim-plugins |
| Install records, approvals and activity | plugin_state.json in the app data folder |
The same database |
| Data a plugin stores | plugin_storage/<plugin_id>/ in the app data folder |
The same database |
Install lists the app data folder of each operating system.