RKD local plugins — programs the RKD desktop app pairs with on your own machine (rkd-terminal) and the local-link contract they speak
  • Rust 91.8%
  • Shell 8.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
dozken 32ec83dcbb
All checks were successful
CI / rust (push) Successful in 36s
CI / install-script (push) Successful in 12s
CI / windows-check (push) Successful in 21s
Merge pull request 'feat(activity): install on Windows + Windows release asset (nanoya-biz/rkd#1147)' (#11) from feat/1147-activity-windows-install into main
Reviewed-on: #11
2026-09-28 14:41:57 +02:00
.cargo ci: Windows activity asset (nanoya-biz/rkd#1147) 2026-09-28 13:42:55 +04:00
.forgejo/workflows ci: Windows activity asset (nanoya-biz/rkd#1147) 2026-09-28 13:42:55 +04:00
apps Initial import: plugin kinds, rkd-local-link and rkd-terminal 2026-09-23 19:06:58 +04:00
local feat: activity on Windows (nanoya-biz/rkd#1147) 2026-09-28 13:42:55 +04:00
packs Initial import: plugin kinds, rkd-local-link and rkd-terminal 2026-09-23 19:06:58 +04:00
scripts ci: Windows activity asset (nanoya-biz/rkd#1147) 2026-09-28 13:42:55 +04:00
.gitignore Initial import: plugin kinds, rkd-local-link and rkd-terminal 2026-09-23 19:06:58 +04:00
Cargo.lock feat: activity on Windows (nanoya-biz/rkd#1147) 2026-09-28 13:42:55 +04:00
Cargo.toml chore: release 0.8.0 (nanoya-biz/rkd#1185) 2026-09-27 14:20:07 +04:00
install.sh chore: release 0.8.0 (nanoya-biz/rkd#1185) 2026-09-27 14:20:07 +04:00
README.md feat: activity on Windows (nanoya-biz/rkd#1147) 2026-09-28 13:42:55 +04:00
rust-toolchain.toml Initial import: plugin kinds, rkd-local-link and rkd-terminal 2026-09-23 19:06:58 +04:00

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

  1. 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.
  2. 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.
  3. Keep its tests and CI green here; the monorepo CI runs every plugin.
  4. Release by tagging. Every crate shares the workspace version and one vX.Y.Z tag releases all of them at it (see local/); 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