Skip to content

Add six Graphite plugins for the Stream Deck + - #309

Open
jonasthim wants to merge 2 commits into
StreamController:mainfrom
jonasthim:add-graphite-plugins
Open

Add six Graphite plugins for the Stream Deck +#309
jonasthim wants to merge 2 commits into
StreamController:mainfrom
jonasthim:add-graphite-plugins

Conversation

@jonasthim

Copy link
Copy Markdown

Six plugins for the Stream Deck +, built as one family in a shared design
language (near-black ground, one accent per plugin, words rather than icons
for anything that has gone wrong):

Plugin id What it does
Volume Deck Plus com_jonasthim_VolumeStreamDeckPlus every app that makes a sound becomes a channel on the dials: turn for volume, press to mute, hold to solo
Spotify Deck com_jonasthim_SpotifyDeck now playing across the touch strip — art, marqueeing title and artist, scrub-then-commit seek, transport keys (MPRIS, no account needed)
Deck Navigation com_jonasthim_DeckNavigation go to a page, walk back, jump home; composes onto other plugins' keys through multi-action stacking
Home Assistant Deck com_jonasthim_HomeAssistantDeck a room fills the dials with its lights and switches; rooms come from HA areas or a curated dashboard tab (websocket API, long-lived token)
Claude Code Deck com_jonasthim_ClaudeCodeDeck which Claude Code session is waiting on you, working, or done; press to raise its terminal (reads local transcripts only)
System Deck com_jonasthim_SystemDeck lock, sleep, log out, restart, shut down — the irreversible ones only fire after a deliberate hold — plus keep-awake and app launchers (logind)

Each has been used on real hardware (Stream Deck +, app 1.5.0-beta.15), carries
manifest.json, attribution.json, a thumbnail, a README and GPL-3.0, and
ships with a deck-free test suite.

One thing worth flagging: the six entries share a repository URL

The plugins live in one repository, and each release is a tag whose commit
tree is that single plugin
manifest.json at the root, the shared design
system vendored in, no symlinks. That works because the store installs a
commit's archive rather than a repository, and the entries differ by hash
while the store keys everything else on the manifest id. Installing was
verified end to end by extracting archive/<sha>.zip into the plugins
directory.

The cost is that scripts/find_outdated.py compares each entry's hash against
the repository's newest default-branch commit, so these six will always look
outdated to it. If you would rather have one repository per plugin, say so and
I will split them and re-open — it is a mechanical change on my side.

Release tags for reference:

  • volume-stream-deck-plus/v1.0.08c5ba37a190e6e2a95b2cde3f41f785c815af914
  • spotify-stream-deck/v1.0.0f143f0c92f748f56143492c2871daf77030cacff
  • navigation-stream-deck/v1.0.0e368e3a7a2cf6077d07272a76f4b1f9a230f4e7b
  • home-assistant-stream-deck/v1.0.0462eb92f4b21e10b9ee0ac0ae333da052c8bff1a
  • claude-code-stream-deck/v1.0.09f1cd58a406d71530bdadcbb7c84ea9a5b2a5570
  • system-stream-deck/v1.0.00427dd382043c8388a4aebab5b3a181cb4d4046f

@Core447

Core447 commented Sep 2, 2026

Copy link
Copy Markdown
Member

Hey,
nice work! Creative solution with the tags. However, I'd prefer if we have one repo per plugin. Also if they are Stream Deck Plus specific, maybe you could put that in all the plugin names? This way users with other decks know, that those plugins don't make sense for them.

@jonasthim

Copy link
Copy Markdown
Author

Thanks — both done.

One repo per plugin. Each plugin now lives in its own repository and the
entries point at those, tagged v1.0.0:

They share a design system, which stays in a monorepo I develop in; a release
build vendors it into each plugin repo as real files. It cannot be a submodule
/archive/<sha>.zip, which is what the store downloads, carries a submodule
as an empty directory, so the plugin would fail on its first import.

On the naming, I'd like to check the premise before renaming, because four
of the six are not Plus-only. The design rule I follow is that the key is the
only surface every deck has, so each plugin is key-first and gains dials as a
bonus:

Plugin Key actions Dial Strip
Deck Navigation 3
System Deck 8
Home Assistant Deck 5 1 1
Spotify Deck 6 1 1
Claude Code Deck 3 1 1
Volume Deck Plus 5 1 1

Navigation and System are keys only — they work on a Pedal. The middle three
carry full key sets (scenes, lights, transport, session status) and add a dial
rack on a Plus. Only Volume is really about its rack, and it already says
"Plus".

So rather than put "Stream Deck +" in every name, I've made each plugin say
exactly which surfaces it uses, in the short description the store shows:

  • Volume Deck Plus — Per-app volume mixer: four dials on the Stream Deck +, keys on any deck
  • Spotify Deck — Spotify keys for any deck; now playing across the Stream Deck + strip
  • Deck Navigation — Page navigation keys — go to page, back, home — for any Stream Deck
  • Home Assistant Deck — Home Assistant keys for any deck; a room fills the Stream Deck +'s dials
  • Claude Code Deck — Claude Code session keys for any deck; a session rack on the Stream Deck +
  • System Deck — Lock, sleep, power and app-launcher keys for any Stream Deck

The long descriptions spell out which half needs a Plus. That tells a Mini or
XL owner what they get instead of warning them off something that works fine
for them — but if you'd still rather have it in the names, say so and I'll
rename them.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants