Skip to content
Agentmart
Submit a tool

sws2-menus

Build SwiftlyS2 player menus with the component-based Core.Menu system (beta), including centre-HTML and chat menus, custom renderers, component renderers…

Skill by btnrv

IndexedGPL-3.0★ 3
Write a review

Chalk Labs

Need help deploying sws2-menus?

Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.

Book a call

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/btnrv-sws2-menus

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Build SwiftlyS2 player menus with the component-based Core.Menu system (beta), including centre-HTML and chat menus, custom renderers, component renderers, custom components, key binds and menus.jsonc; also covers the deprecated Core.MenusAPI for existing code and migration. Use whenever a SwiftlyS2 plugin needs a menu, settings screen, shop, vote, picker, submenu or any interactive per-player selection, even if the user does not say "menu".

Use cases: frontend

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 26, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/sws2-menus

What's inside

Skill name
sws2-menus
Description
Build SwiftlyS2 player menus with the component-based Core.Menu system (beta), including centre-HTML and chat menus, custom renderers, component renderers, custom components, key binds and menus.jsonc; also covers the deprecated Core.MenusAPI for existing code and migration. Use whenever a SwiftlyS2 plugin needs a menu, settings screen, shop, vote, picker, submenu or any interactive per-player selection, even if the user does not say "menu".
License
GPL-3.0
Instructions
42 lines in SKILL.md · view on GitHub

Files (7)

  • SKILL.md
  • built-in.md · references/legacy/
  • custom-rendering.md · references/legacy/
  • menus-api.md · references/legacy/
  • menu-system.md · references/
  • migration.md · references/
  • renderers.md · references/

SKILL.md (first lines)

# SwiftlyS2 menus

SwiftlyS2 has two menu systems:

| System | Entry point | Status |
|---|---|---|
| Menu system | `Core.Menu` (`IMenuService`), namespaces `SwiftlyS2.Shared.Menu` and `SwiftlyS2.Shared.Menu.Components` | Current. Beta branch only. |
| Classic menus | `Core.MenusAPI` (`IMenuManagerAPI`), namespaces `SwiftlyS2.Shared.Menus` and `SwiftlyS2.Core.Menus.OptionsBase` | `[Obsolete]` on beta and scheduled for removal |

Build new menus with `Core.Menu`. It separates what a menu contains (components) from how it is drawn (renderers), so the same menu works as centre-screen HTML, as chat lines, or through a renderer the plugin registers. Server owners can also change key binds and renderers in `configs/menus/menus.jsonc` without a rebuild.

## Choose the API

1. Read the project's SwiftlyS2 package version and the server's runtime version. Look up `IMenuService` with `apidocs_lookup` on the `beta` branch, then compare against the package the project actually compiles against.
2. If the project is on beta, use `Core.Menu`. When the project already uses `Core.MenusAPI`, say that it is deprecated and offer to migrate. Port only the menus the task touches unless the user asks for the whole plugin.
3. If the project is on stable, `Core.Menu` does not exist there yet. Tell the user the new system needs the beta package and runtime, and recommend it for new menu work. Use the classic API only if they stay on stable, and write it so the later port is mechanical: one builder method per menu, with callbacks kept apart from layout.
4. When the user asks for the classic API by name, use it, and mention the deprecation once.

Confirm every signature through the SwiftlyS2 MCP on the branch you chose ([sws2-api-mcp](../sws2-api-mcp/SKILL.md)). The beta API is still moving. If the docs and the package disagree, the package wins.

## Where to read next

- Building menus with `Core.Menu`: components, per-player values, submenus, actions and key binds, input methods, sessions, `menus.jsonc` and threading. Read [menu system](references/menu-system.md).
- Changing how menus look: the built-in `centerhtml` and `chat` renderers, a custom `IMenuRenderer`, `IComponentRenderer`, custom components, or a Panorama HUD renderer. Read [renderers and custom components](references/renderers.md).
- Porting `Core.MenusAPI` code to `Core.Menu`. Read [migration](references/migration.md).
- Maintaining classic `Core.MenusAPI` code. Read [legacy/menus-api.md](references/legacy/menus-api.md) for the API reference, [legacy/built-in.md](references/legacy/built-in.md) for `core.jsonc` and callback threading, and [legacy/custom-rendering.md](references/legacy/custom-rendering.md) for `IMenuAPI` adapters.
- Panorama XML, CSS, assets and HUD clicks. Use [sws2-panorama-authoring](../sws2-panorama-authoring/SKILL.md).
- Menu text, colours and translations. Use [sws2-text-styling](../sws2-text-styling/SKILL.md).

## Ground rules for `Core.Menu`

- Start with one menu, one working component and an open call, then add components.
- Give every menu a unique id namespaced with the plugin, such as `"myplugin.shop"`. The id is the configuration scope for key binds, renderer and input method in `menus.jsonc`, so a shared id lets one menu's binds leak into another.
- One component instance serves every player. Keep per-player data in the session (value components, `GetState<T>`, `TextProvider`, `VisibleWhen`), never in fields on the component. Persist values in `OnChanged` and load them with `DefaultValueProvider`, because session values are lost when the menu closes.
- Take menu text from translations and pass the player's localized strings, or use `TextProvider` for per-player text in a shared menu.
- After changing something a player sees from outside a component, call `session.Invalidate()`. Frames are only sent on invalidation. `Add`, `Insert` and `Remove` invalidate for you.
- Threading: key presses and chat input reach components on the game thread. Code after an `await` that really suspends is not guaranteed to be back on it. `IMenuRenderer.Render` always runs on the menu render thread. The details are in each reference.
- Registrations made through `Core.Menu` (renderers, component renderers, actions) and the plugin's open menus are released when the plugin unloads. Dispose a menu or registration earlier only if the plugin is done with it before then.

Docs: [Menu System](https://swiftlys2.net/docs/development/menu-system), [Menus (Deprecated)](https://swiftlys2.net/docs/development/menus).

From btnrv/SwiftlyS2-Skills, GPL-3.0.

More from btnrv/SwiftlyS2-Skills

Signals

Stars
3
Forks
0
Open issues
0
Last commit (this folder)
Oct 14, 2026 (16 days ago)

From GitHub (fetched Oct 24, 2026).

Details

License
GPL-3.0
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from btnrv

Done for you

Rather not set it up yourself?

Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.

See how we build AI agents →Read the case studies

Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.

launches shipped
50+
launches shipped
media placements
500+
media placements
founders on every account
2
founders on every account

Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block

Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.

Get sws2-menus running in your business

Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.

Goes to the Chalk Labs founders, not the newsletter. Privacy

Need help deploying sws2-menus?

CallGet help
Cite this page

sws2-menus skill. Agent Mart. https://agentmart.dev/skills/btnrv-sws2-menus (last updated 2026-10-24)