Docs Integrations
Plugins and the Marketplace
One place for the widgets Dispatch runs and the files it writes into other programs, each listing what it is allowed to touch, in words, before you install it.
On this page7
All pages12
The Marketplace chip sits at the right-hand end of the top bar. It is one list for two kinds of thing, and the question before installing either is the same: what will this reach, and where will it write?
- A widget
- Code Dispatch runs: a small panel in the top bar or the sidebar foot, written in Luau.
- An integration
- A file Dispatch writes into somebody else’s program so the two can talk: Claude Code’s MCP entry and hooks, the Roblox Studio plugin.
Same card, same permission list, same accent Install button. Once installed, each grows a live status button in the sidebar footer, and the card keeps the Remove.
A row of category chips sits above the list (All, General, AI tools, Roblox, Media), each with a count. A shelf with nothing on it gets no chip, so a filter never comes back empty. Press Roblox and you get the Studio integration and the Roblox stats widget together.
The five that ship
Three work out of the box. Two start switched off until you give them the one setting they need.
- Clock
- The time, in the top bar. About forty lines.
- Claude usage
- Tokens and estimated cost for Claude Code on this machine. See below.
- Now Playing
- Transport controls for whatever this machine is playing, reading the same Windows session the volume overlay draws.
- Spotify
- Previous / play / next / volume through Spotify’s own API. Off until it has a client ID.
- Roblox stats
- Live players, visits and rating for your own experiences, with today’s peak and a notification when a place empties. Off until it has a universe ID.
Claude usage and Now Playing each go either in the sidebar foot or on one line in the top bar, yours to choose.
What a plugin is allowed to do
A plugin runs in a sandbox: a separate Lune process
where its entire world is one dispatch object. There is no require, no io, no
os.execute. A capability its manifest did not ask for is not a name it can reach.
The Marketplace card lists what it did ask for, in plain words (“Can reach api.spotify.com over the network”), and hostnames are always written out in full, never summarised as a count. The same words appear before you install as after.
A plugin that fails shows its Luau traceback on the card, naming its own file and line, and the Marketplace chip turns red so you know to look.
Running plugins costs one Lune process, and only once at least one enabled plugin has been found. An install with none costs nothing.
Installing, updating, removing
Under the installed list is Available: everything in the catalogue you do not have, plus any integration you have not set up. A plugin whose catalogue version is higher than yours grows an Update to v1.2.0 button.
Nothing updates itself. The manager checks when you open it and offers; it never changes plugin code because you launched the app.
Plugins are not tied to app releases: a fix reaches anyone who opens the manager after it, without waiting for an app update. The copy bundled in the executable is the floor, what a fresh, offline install has, and a downloaded copy shadows it. So Remove download is an undo rather than a deletion, and the bundled version comes back.
Your own plugins go in %APPDATA%\dispatch\plugins\<id>\, a folder with a plugin.json and
a Luau entry script, and a folder of yours shadows a built-in of the same id.
A build made without a catalogue token (a checkout, a local packaging run) says the store is off and carries on with the bundled plugins rather than failing.
Claude usage, and what its numbers are worth
Nothing to set up. Claude Code writes a transcript per session under ~/.claude/projects/,
and every assistant turn in one carries the tokens that turn cost.
Subagent transcripts are counted with the rest. A lead session that fans six of them out
looks cheap on its own, and the six are where the tokens went. Claude Code writes each to
<session>/subagents/agent-<id>.jsonl, and a total that skipped them would be wrong in the
direction that flatters you.
The widget never sees a transcript itself. Plugins cannot read files, so the claude
capability is a question answered on Dispatch’s side of the sandbox, and what crosses back is
arithmetic. Prompts, replies and paths are not read at all.
Three things worth knowing before acting on a number:
- The five-hour window is inferred, not reported. It is the rate-limit block Claude Code runs on, reconstructed from timestamps: five hours from the first request of the run, a new one after a five-hour gap. Nothing in the transcripts states the real window, so this is a reading of the evidence rather than a readout.
- There is no limit to draw a bar against. The figures that would know live on API response headers, which Claude Code does not write down. Put your own ceiling in Window budget and you get a bar; leave it at 0 and you get the count without one.
- Cost is an estimate, and says so. These are subscription sessions; the figure is what
the same tokens would have cost at API rates, from a price table inside Dispatch, and it is
prefixed
~everywhere it appears. A model Dispatch has no published price for still has its tokens counted: the widget names it and holds the dollars back rather than reporting a plausible, wrong number.
The first read after a launch parses whatever Claude Code appended while Dispatch was closed,
which can be tens of megabytes; the widget says still counting… while it catches up. After
that an index remembers where each file was left, so a poll costs a stat per transcript and
a parse of only what is new.
Setting up Spotify
Create an app at
developer.spotify.com/dashboard and add
http://127.0.0.1:8888/callback as a redirect URI: the literal IP, not localhost, which
Spotify rejects, and that exact port. Then open the Marketplace, switch Spotify on, paste the
client ID into its field, and click Connect Spotify in the sidebar.
Dispatch ships no client ID of its own and each person needs their own. Not for secrecy (a PKCE client ID is public by design) but because Spotify apps start in Development mode, where only users you add by hand in the dashboard can sign in at all.
Tokens are held by Windows’ DPAPI, tied to your user account, and never touch
dispatch-settings.json. On a system with no keyring the plugin says so instead of storing
them in the clear.
Setting up Roblox stats
One field: the universe IDs, comma-separated, up to four. Take each from the Creator
Dashboard URL for that experience: the number after /creations/experiences/.
Not the place ID, which is a different number in an overlapping range, so a place ID there gets you a row that says it found nothing rather than an error.
Nothing signs in. games.roblox.com answers about any public experience without a cookie,
which is why the plugin asks for one hostname and no secrets at all: it can read what
anybody with the URL can read, and that is the whole of its reach.
From the console
For scripting, and for when something is too broken to click:
DispatchPlugins.list() // what is installed, and why anything failed
DispatchPlugins.enable('spotify', false)
DispatchPlugins.settings('spotify', { clientId: '…' })
DispatchPlugins.reload() // re-read from disk; also clears a quarantine
DispatchPlugins.catalog(true) // what the catalogue is offering, skipping the cache
DispatchPlugins.install('clock') // install or update, same call
DispatchPlugins.uninstall('clock') // drop the download, back to the bundled copy
Plugins are for the things Dispatch does not own. For the things it does (the colours, the keys, the buttons and the shape of the window) see Customizing.