defineLibraryPlugin has taken a launchers() hook since kit 0.3.0 — entries that open the launcher rather than a title (design D4) — and nothing implemented it. The host has resolved launcher_ui valued "heroic" since the same release. The whole path existed end to end with no producer at either end.
One entry, config-toggled (launcher, default on): installing, updating and logging in are exactly the things you cannot do from a game tile.
launcher_ui is valued by store id, never a command. The host resolves "heroic" to the native binary or the Flatpak, minus the --no-gui and the URI that game entries carry, so the window itself opens (D1). That is also the only shape available to a plugin, since the 2026-08-05 review made launch.kind = "command" operator-only: a plugin publishing one has its entire reconcile refused.
Caveat, carried in the code: Heroic is a single-instance Electron app, so if a window is already open the spawned process forwards to it and exits. The host documents the same caveat for game launches; keeping a session alive across it is a host-side question (the launcher-tile lease), not this plugin's.
Deliberately art-less — same reasoning as the lutris plugin: a square app icon cover-cropped into a 2:3 tile looks broken, and every client renders an art-less launcher entry as "opens Heroic" on purpose.
Requires a host carrying the M2 wire (role + launcher_ui) — on main via punktfunk#59, with the client-side rendering in punktfunk#70. On an older host the entry is refused with a 400 rather than silently becoming a dead tile.
Not in this PR: publishing to the registry or the index pin.
`defineLibraryPlugin` has taken a `launchers()` hook since kit 0.3.0 — entries that open the **launcher** rather than a title (design D4) — and nothing implemented it. The host has resolved `launcher_ui` valued `"heroic"` since the same release. The whole path existed end to end with no producer at either end.
One entry, config-toggled (`launcher`, default on): installing, updating and logging in are exactly the things you cannot do from a game tile.
**`launcher_ui` is valued by store id, never a command.** The host resolves `"heroic"` to the native binary or the Flatpak, minus the `--no-gui` and the URI that game entries carry, so the window itself opens (D1). That is also the *only* shape available to a plugin, since the 2026-08-05 review made `launch.kind = "command"` operator-only: a plugin publishing one has its entire reconcile refused.
**Caveat, carried in the code:** Heroic is a single-instance Electron app, so if a window is *already* open the spawned process forwards to it and exits. The host documents the same caveat for game launches; keeping a session alive across it is a host-side question (the launcher-tile lease), not this plugin's.
**Deliberately art-less** — same reasoning as the lutris plugin: a square app icon cover-cropped into a 2:3 tile looks broken, and every client renders an art-less launcher entry as "opens Heroic" on purpose.
**Gates:** `tsc --noEmit` clean, **7 tests pass** (2 new), biome clean.
**Requires** a host carrying the M2 wire (`role` + `launcher_ui`) — on `main` via punktfunk#59, with the client-side rendering in punktfunk#70. On an older host the entry is refused with a 400 rather than silently becoming a dead tile.
Not in this PR: publishing to the registry or the index pin.
`defineLibraryPlugin` has taken a `launchers()` hook since kit 0.3.0 — entries that
open the LAUNCHER rather than a title (design D4) — and nothing implemented it. The
host has resolved `launcher_ui` valued `"heroic"` since the same release. So the
whole path existed end to end with no producer at either end.
One entry, config-toggled and on by default: installing, updating or logging in are
exactly the things you cannot do from a game tile.
`launcher_ui` is valued by STORE ID, never a command: the host resolves "heroic" to
the native binary or the Flatpak, minus the `--no-gui` and the URI that game entries
carry, so the window itself opens (D1). That is also the only shape available to a
plugin at all — the 2026-08-05 review made `launch.kind = "command"` operator-only,
so a plugin publishing one has its entire reconcile refused.
CAVEAT carried in the code: Heroic is a single-instance Electron app, so if a window
is ALREADY open the spawned process forwards to it and exits. The host documents the
same caveat for game launches; keeping the session alive across it is a host-side
question (the launcher-tile lease), not this plugin's.
Deliberately art-less — see the lutris plugin: a square app icon cover-cropped into a
2:3 tile looks broken, and every client renders an art-less launcher entry as "opens
Heroic" on purpose.
Gates: tsc --noEmit clean, 7 tests pass (2 new), biome clean.
Needs a host carrying the M2 wire (`role` + `launcher_ui`), which is on main.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
defineLibraryPluginhas taken alaunchers()hook since kit 0.3.0 — entries that open the launcher rather than a title (design D4) — and nothing implemented it. The host has resolvedlauncher_uivalued"heroic"since the same release. The whole path existed end to end with no producer at either end.One entry, config-toggled (
launcher, default on): installing, updating and logging in are exactly the things you cannot do from a game tile.launcher_uiis valued by store id, never a command. The host resolves"heroic"to the native binary or the Flatpak, minus the--no-guiand the URI that game entries carry, so the window itself opens (D1). That is also the only shape available to a plugin, since the 2026-08-05 review madelaunch.kind = "command"operator-only: a plugin publishing one has its entire reconcile refused.Caveat, carried in the code: Heroic is a single-instance Electron app, so if a window is already open the spawned process forwards to it and exits. The host documents the same caveat for game launches; keeping a session alive across it is a host-side question (the launcher-tile lease), not this plugin's.
Deliberately art-less — same reasoning as the lutris plugin: a square app icon cover-cropped into a 2:3 tile looks broken, and every client renders an art-less launcher entry as "opens Heroic" on purpose.
Gates:
tsc --noEmitclean, 7 tests pass (2 new), biome clean.Requires a host carrying the M2 wire (
role+launcher_ui) — onmainvia punktfunk#59, with the client-side rendering in punktfunk#70. On an older host the entry is refused with a 400 rather than silently becoming a dead tile.Not in this PR: publishing to the registry or the index pin.