- Rust 91.8%
- Shell 8.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .cargo | ||
| .forgejo/workflows | ||
| apps | ||
| local | ||
| packs | ||
| scripts | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| install.sh | ||
| README.md | ||
| rust-toolchain.toml | ||
RKD plugins
Plugins for RKD: bots and integrations, content packs, and programs that run next to the desktop app on your own machine. Every plugin RKD publishes lives here, one directory per plugin, grouped by what kind of plugin it is.
One rule for all of them
Nothing here downloads code into an RKD client. An App sends messages and components the clients already know how to draw, a Pack is values and assets checked against a fixed schema, and a local plugin is a separate program the user installs. The clients only ever run code that shipped in an RKD release. That keeps every plugin reviewable on its own and keeps the mobile apps inside App Store and Play rules.
Kinds
| Kind | Where it runs | How it reaches RKD | Directory | Examples |
|---|---|---|---|---|
| App | off the user's device: a server, CI, a small VM | its own bot user and a scoped App token, over the RKD API and WebSocket | apps/ |
Forgejo bot, GitHub, activity sources (Spotify, Steam) |
| Pack | nowhere; it is data | uploaded to an RKD server, picked by its members | packs/ |
voice presets, sound packs, notification sounds, themes |
| Local plugin | on the user's own computer, as the user | a user-only socket to the RKD desktop app; never the server | local/ |
rkd-terminal, rkd-activity |
Not here: Providers and client features
Providers are server adapters an operator picks in the RKD server's config:
speech-to-text, file storage, sign-in, search, notification and recording sinks.
They ship in the server release, behind its ports/ and adapters/, and are never
installed at runtime, so they live in the RKD server repository, along with any
sidecar service they need (such as the speech-to-text container). Client
features (noise suppression, the voice graph, screen share) are native or WASM
code that ships inside the apps. Neither is a plugin in the sense of this repo: if
it needs a server or app release to change, it belongs there.
Apps
An App is an RKD user of kind app, created by an instance admin, with a token that
carries only the scopes it was granted (messages:read:mentions, messages:write,
webhooks:incoming, presence:write, …). A server's admin installs it and decides
its role there, and the install screen lists its scopes in plain words. Apps are
blockable and reportable like any user.
An App speaks the RKD API; it does not ship UI. What it shows is messages, embeds,
and — once components/v1 lands — buttons, selects and progress blocks that every
client renders natively. Each App keeps its own README with the scopes it needs and
how to run it.
Coding-agent integrations that run on a person's laptop use the same App identity
through an App host. The Claude Code one is distributed as a Claude Code plugin in
rkd/claude-plugins, because
that is the format Claude Code installs from.
Packs
A Pack is one of a fixed set of kinds, each a schema with nothing executable in it: no scripts, no stylesheets, no expressions.
| Pack kind | What it holds |
|---|---|
voice.preset |
parameters for the voice graph (pitch, formant, crush, filter) — a voice changer is a set of these |
audio.source, notification.sound |
sound assets, capped in size and length |
theme |
colour, length and font tokens; no url(), so a theme cannot phone home |
keybinding |
{command: chord} over the app's fixed command list |
notification.rule |
plain keywords, servers and quiet hours; no regex |
emoji.pack |
emoji and stickers |
Every Pack declares the contract version it targets (voice.graph@1), and a client
that does not speak that version hides the Pack rather than misreading it.
Local plugins
A program the user installs and pairs once with the desktop app. It talks to the app
over a socket only that user can reach, makes no network connection of its own, and
has no identity on the RKD server. See local/ for the contract they all
share and the ones that exist.
To install rkd-terminal on macOS (Apple silicon) or Linux (x86_64, aarch64), as
your own user, never with sudo:
curl -fsSL https://git.rkd.nanoya.biz/rkd/plugins/raw/branch/main/install.sh | sh
It puts the binary in ~/.local/bin and runs it as a background service of your
user: on macOS it starts now and at every login, on Linux now and whenever you're
logged in (loginctl enable-linger keeps it running while you are logged out). Then
rkd-terminal pair and enter the code in RKD → Settings → Plugins on this device. What it does, how to undo it and how to build from source instead are in
local/.
rkd-activity, which tells the app which game you are playing, installs the same
way on Linux (x86_64, aarch64) and, from v0.7.0, on
Apple-silicon macOS, with the plugin's name after sh -s --:
curl -fsSL https://git.rkd.nanoya.biz/rkd/plugins/raw/branch/main/install.sh | sh -s -- rkd-activity
Then rkd-activity pair; see local/.
Adding a plugin
- Pick the kind by where the code runs, not by what it does: a GitHub integration is an App, a voice changer is a Pack, a terminal is a local plugin.
- Put it in
<kind>/<name>/with its own README: what it does, what it may access (scopes, capabilities), how to install or run it, and which RKD version it needs. - Keep its tests and CI green here; the monorepo CI runs every plugin.
- Release by tagging. Every crate shares the workspace version and one
vX.Y.Ztag releases all of them at it (seelocal/); the RKD app pins what it depends on by tag, never by branch.
Status
| Plugin | Kind | Status |
|---|---|---|
local/terminal — rkd-terminal |
Local plugin | 0.5, macOS and Linux; one-line install as a user service |
local/activity — rkd-activity |
Local plugin | Steam games on Linux and macOS; prebuilt and one-line install from v0.6.0 (macOS from v0.7.0); Windows build (serves and pairs, no detection yet) experimental, never run |
local/local-link — rkd-local-link |
Contract | 0.5 (terminal protocol 2, still accepts 1; activity protocol 1) |
| Forgejo bot | App | planned |
| GitHub | App | planned |
| Voice presets | Pack | four built-in voices ship in the app; server-uploadable Packs are planned |