There are two ways to make a plugin. You can describe it and let the agent build it, or you can write the files yourself. Both produce the same kind of package.

With AI: the Plugin Builder

  1. Open Plugins → Mine and choose Create a plugin with AI.
  2. Describe what the plugin should do. The agent builds it in its own workspace, with the full project chat, Undo and model picker.
  3. Review the draft and choose Install.

A plugin you make this way is installed as personal/<name>. To share it, open its page and choose Export as a package…. This writes a folder with a package.json, a README and a GitHub Actions workflow that publishes it.

By hand

A plugin is an npm package with a manifest at .ohmygame-plugin/plugin.json. The smallest useful plugin adds one Skill:

level-ideas/
├── .ohmygame-plugin/
│   └── plugin.json
├── assets/
│   └── icon.svg
├── locales/
│   ├── en.json
│   └── zh-CN.json
├── skills/
│   └── level-ideas/
│       └── SKILL.md
└── package.json

The manifest names the plugin and what it adds:

.ohmygame-plugin/plugin.json
{
  "$schema": "https://ohmygame.dev/schema/plugin-2.json",
  "id": "example/level-ideas",
  "version": "0.1.0",
  "engines": { "ohmygame-api": "^2.3.0" },
  "displayName": "%plugin.name%",
  "description": "%plugin.description%",
  "icon": "./assets/icon.svg",
  "contributes": { "skills": "./skills/" }
}

Text written as %key% is read from locales/en.json and locales/zh-CN.json, so one manifest serves both languages. Each Skill is a folder with a SKILL.md. Its frontmatter description tells the agent when to use it:

skills/level-ideas/SKILL.md
---
name: level-ideas
description: Suggests level layouts for the game being made. Use it when they ask for level ideas, a new stage, or more variety in levels.
---

# Level ideas

1. Read the project's design notes and its existing levels first.
2. Offer three to five levels, each with the one new idea it teaches.
3. Ask which to build before changing any files.

Start from an example

The OhMyGame repository has a working example for each kind of part, in packages/plugin-examples. Copy the one closest to what you’re making:

Example Adds
level-ideas A Skill
project-panel A panel, and a command that opens it
hello-tools Native code: a tool for the agent and a command
echo-server A local MCP server
canvas-game A project type with a template

The examples use the publisher example. Before you publish, rename it to your own npm scope in both package.json and plugin.json.

Develop it live

  1. Open Plugins → Add plugin… → This computer and choose your folder.
  2. Turn on Develop.

OhMyGame then watches the folder and reloads the plugin shortly after each change, using what npm would publish from it. Native code restarts, panels reload, and Skills and MCP servers are read again. If a change breaks the manifest, the last working copy stays, and the error shows on the plugin’s page until you fix it.

Check it

From a clone of the OhMyGame repository, this checks a folder the same way the app does when the plugin is added:

bash
bun run plugin:check path/to/your-plugin

Next, see the manifest reference for every field, and Publish a plugin to share it.