Plugin Manifest
Every Ghosty plugin must include a plugin.yaml file at the root of its
project. This manifest declares the plugin's identity, capabilities, required
permissions, and view configuration. The Ghosty runtime reads this file at
install time to determine how the plugin should be loaded and displayed.
Minimal example
The smallest valid manifest looks like this:
name: hello-world
version: 1.0.0
display_name: Hello World
description: A simple greeting plugin.
author: your-username
views:
widget:
entry: src/widget.ts
default_size: smallThis declares a plugin named hello-world that provides a single dashboard
widget rendered from src/widget.ts.
Full reference
Below is the complete list of manifest fields. Required fields are marked with an asterisk (*).
Top-level fields
| Field | Type | Default | Description |
|---|---|---|---|
name * | string | -- | Unique identifier. Lowercase, hyphens only. Must be between 3 and 64 characters. |
version * | string | -- | Semantic version (MAJOR.MINOR.PATCH). Enforced on submission. |
display_name * | string | -- | Human-readable name shown in the plugin store. Max 50 characters. |
description * | string | -- | Short description shown in search results. Max 200 characters. |
author * | string | -- | Your Ghosty developer account username. |
homepage | string | null | URL to the plugin's homepage or repository. |
license | string | MIT | SPDX license identifier. |
icon | string | assets/icon.png | Path to a 512x512 PNG icon. |
min_ghosty_version | string | 1.0.0 | Minimum Ghosty client version required. |
max_ghosty_version | string | null | Maximum Ghosty client version supported (exclusive). |
tags | string[] | [] | Up to 5 tags for store categorisation. |
permissions
The permissions block declares which platform capabilities the plugin needs.
Each permission must be explicitly requested; the user is prompted to grant
access at install time.
permissions:
- storage.read
- storage.write
- notifications.show
- network.fetchSee the Permissions page for the full list of available permissions and their risk levels.
Only request permissions your plugin actually uses. Requesting unused permissions triggers a warning during AI review and may result in rejection.
views
The views block declares the UI surfaces your plugin provides. A plugin can
have a widget view, a fullscreen view, or both.
views.widget
| Field | Type | Default | Description |
|---|---|---|---|
entry * | string | -- | Path to the widget entry file relative to the project root. |
default_size | "small" | "medium" | "large" | "small" | Initial size on the dashboard grid. |
min_size | "small" | "medium" | "large" | "small" | Smallest size the user can resize to. |
max_size | "small" | "medium" | "large" | "large" | Largest size the user can resize to. |
resizable | boolean | true | Whether the user can resize the widget. |
refresh_interval | number | 0 | Auto-refresh interval in seconds. 0 disables auto-refresh. |
views:
widget:
entry: src/widget.ts
default_size: medium
min_size: small
max_size: large
resizable: true
refresh_interval: 300 # refresh every 5 minutesviews.fullscreen
| Field | Type | Default | Description |
|---|---|---|---|
entry * | string | -- | Path to the fullscreen view entry file. |
title | string | display_name | Title shown in the Ghosty navigation bar. |
show_back_button | boolean | true | Whether to display the back button in the nav bar. |
settings_entry | string | null | Path to a settings panel entry file. |
views:
fullscreen:
entry: src/fullscreen.ts
title: My Plugin
show_back_button: true
settings_entry: src/settings.tsai_context
Optional block that provides additional context to the Ghosty AI assistant about what your plugin does. This helps the assistant recommend your plugin to users in natural language conversations.
| Field | Type | Default | Description |
|---|---|---|---|
summary | string | null | One-sentence summary for the AI to use when describing your plugin. |
capabilities | string[] | [] | List of capabilities in natural language (e.g. "Track daily tasks"). |
trigger_phrases | string[] | [] | Phrases a user might say that should trigger your plugin. |
ai_context:
summary: A task manager that helps users organise their daily to-do list.
capabilities:
- Create, edit, and delete tasks
- Set due dates and reminders
- Track completion streaks
trigger_phrases:
- show my tasks
- add a to-do
- what's on my list todayPlugins with a well-written ai_context block are significantly more likely
to be surfaced by the assistant. Spend time crafting clear, natural-language
descriptions of what your plugin does.
sandbox
Advanced configuration for the plugin sandbox. Most plugins do not need to change these defaults.
| Field | Type | Default | Description |
|---|---|---|---|
csp | string | default-src 'self' | Content Security Policy applied to the plugin iframe. |
allow_eval | boolean | false | Whether to permit eval() and new Function(). Strongly discouraged. |
max_memory_mb | number | 64 | Maximum memory allocation for the plugin process. |
timeout_ms | number | 30000 | Maximum time for lifecycle hooks to complete before being killed. |
Enabling allow_eval significantly increases the attack surface of your
plugin and will require additional justification during review. Avoid it
unless absolutely necessary.
Validation
The Playground validates your manifest in real-time as you edit.
Paste or type your plugin.yaml content into the manifest panel and the
Playground will immediately highlight any errors.
Common validation errors:
namecontains invalid characters -- only lowercase letters, numbers, and hyphens are allowed.versionis not semver -- use theMAJOR.MINOR.PATCHformat.- Unknown permission -- check the Permissions page for valid keys.
- Missing
entryin view -- every declared view must have anentryfield pointing to an existing file. - Icon is not 512x512 -- the icon must be exactly 512 by 512 pixels in PNG format.
Complete example
name: weather-widget
version: 2.1.0
display_name: Weather Widget
description: Real-time weather conditions and 5-day forecast for any city.
author: ghosty-team
homepage: https://github.com/ghosty-team/weather-widget
license: MIT
icon: assets/icon.png
min_ghosty_version: 1.2.0
tags:
- weather
- productivity
- dashboard
permissions:
- storage.read
- storage.write
- network.fetch
- notifications.show
views:
widget:
entry: src/widget.ts
default_size: medium
resizable: true
refresh_interval: 600
fullscreen:
entry: src/fullscreen.ts
title: Weather Details
settings_entry: src/settings.ts
ai_context:
summary: Shows current weather and forecasts for the user's saved locations.
capabilities:
- Display current temperature and conditions
- Show a 5-day forecast
- Support multiple saved locations
trigger_phrases:
- what's the weather
- show me the forecast
- is it going to rain