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
- Open Plugins → Mine and choose Create a plugin with AI.
- Describe what the plugin should do. The agent builds it in its own workspace, with the full project chat, Undo and model picker.
- 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.jsonThe manifest names the plugin and what it adds:
{
"$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:
---
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
- Open Plugins → Add plugin… → This computer and choose your folder.
- 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:
bun run plugin:check path/to/your-pluginNext, see the manifest reference for every field, and Publish a plugin to share it.