{
  "schemaVersion": 1,
  "generatedFrom": {
    "capabilities": "packages/murasaki/capabilities.json",
    "config": "packages/mcp/content/config-schema.json"
  },
  "capabilities": {
    "schemaVersion": 1,
    "frameworkVersion": "0.52.0",
    "features": [
      {
        "id": "file-routing",
        "category": "web-framework",
        "status": "partial",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "development-only"
        },
        "limitations": [
          "Page, layout, loading, error, not-found, route-group, and single dynamic segments ship today; catch-all page segments are not implemented.",
          "The router is client-side and does not provide the full Next.js App Router or React Server Components runtime."
        ],
        "apiSymbols": [
          "AppRouter",
          "Link",
          "useRouter",
          "usePathname",
          "useParams"
        ],
        "testEvidence": [],
        "docsSlug": "/docs/guides/routing"
      },
      {
        "id": "server-actions",
        "category": "web-framework",
        "status": "experimental",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "development-only"
        },
        "limitations": [
          "Actions execute in the bundled local Node runtime; they are not Next.js Server Actions and are not a remotely hosted RPC service.",
          "The versioned wire format has explicit value and payload limits and may change before Murasaki 1.0."
        ],
        "apiSymbols": [
          "defineAction",
          "callAction",
          "useAction",
          "ActionState"
        ],
        "testEvidence": [
          "packages/murasaki/test/server-actions-wire.test.mjs",
          "packages/murasaki/test/wire.test.mjs"
        ],
        "docsSlug": "/docs/guides/server-actions"
      },
      {
        "id": "api-routes",
        "category": "web-framework",
        "status": "experimental",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "development-only"
        },
        "limitations": [
          "Routes are served by the app-local Node process and are not intended to expose a public network service.",
          "The API surface follows Web Request and Response primitives but is not the complete Next.js Route Handler runtime."
        ],
        "apiSymbols": [
          "RouteHandler"
        ],
        "testEvidence": [
          "packages/murasaki/test/api-routes.test.mjs",
          "packages/murasaki/test/prod-server-http.test.mjs"
        ],
        "docsSlug": "/docs/guides/api-routes"
      },
      {
        "id": "navigation-middleware",
        "category": "web-framework",
        "status": "partial",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "development-only"
        },
        "limitations": [
          "Middleware runs in the renderer before client navigation and only receives pathname.",
          "Request headers, response headers, cookies, edge execution, and matcher configuration are not available."
        ],
        "apiSymbols": [
          "Middleware",
          "MiddlewareContext",
          "MiddlewareResult"
        ],
        "testEvidence": [],
        "docsSlug": "/docs/guides/middleware"
      },
      {
        "id": "route-metadata",
        "category": "web-framework",
        "status": "partial",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "development-only"
        },
        "limitations": [
          "Document title, description, favicon, and a small Open Graph subset are applied in the renderer.",
          "The metadata shape is not Next.js-compatible in full, and document metadata does not update the native window title."
        ],
        "apiSymbols": [
          "Metadata",
          "GenerateMetadata",
          "applyMetadata"
        ],
        "testEvidence": [],
        "docsSlug": "/docs/guides/metadata"
      },
      {
        "id": "node-main-lifecycle",
        "category": "application-model",
        "status": "experimental",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "development-only"
        },
        "limitations": [
          "The src/main.ts lifecycle covers ready, cancellable beforeQuit, bounded shutdown, second-launch delivery, app paths, an AbortSignal, and typed live events to renderers in development and packaged apps.",
          "Window management is renderer-facing rather than exposed from src/main.ts; crash-restart policy and process supervision APIs are not implemented. On macOS, external Dock Quit and OS logout cannot guarantee cancellable beforeQuit through tao, although host resources and the Node child are cleaned up best-effort."
        ],
        "apiSymbols": [
          "murasaki/main",
          "defineMain",
          "emitMainEvent",
          "murasaki/main-client.subscribeMainEvent",
          "MainContext",
          "MainDefinition"
        ],
        "testEvidence": [
          "packages/murasaki/test/main-runtime.test.mjs",
          "packages/murasaki/test/main-events.test.mjs",
          "packages/murasaki/test/prod-server-http.test.mjs"
        ],
        "docsSlug": "/docs/guides/node-main"
      },
      {
        "id": "native-window",
        "category": "native-integration",
        "status": "partial",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "development-only"
        },
        "limitations": [
          "Primary and secondary windows can be declared, identified, shown, hidden, focused, listed, opened, and explicitly closed; runtime creation and per-window lifecycle subscriptions are not available.",
          "Window vibrancy remains a declared no-op."
        ],
        "apiSymbols": [
          "App",
          "WindowConfig",
          "SecondaryWindowConfig",
          "murasaki/native.appWindow",
          "murasaki/native.windows"
        ],
        "testEvidence": [
          "packages/murasaki/test/native-api.test.mjs",
          "packages/murasaki/test/windows.test.mjs",
          "crates/native/src/window.rs"
        ],
        "docsSlug": "/docs/guides/windows"
      },
      {
        "id": "application-menu",
        "category": "native-integration",
        "status": "partial",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "unsupported"
        },
        "limitations": [
          "Native application menus ship on macOS and Windows; replacement is process-global, restricted to the primary renderer, and requires menu:application plus the capabilities of privileged roles.",
          "Linux has no default or custom application menu implementation. Missing role capabilities reject the whole replacement and keep the current menu."
        ],
        "apiSymbols": [
          "useAppMenu",
          "AppMenu",
          "AppMenuItemSpec"
        ],
        "testEvidence": [
          "crates/native/src/webview.rs",
          "crates/native/src/menu.rs"
        ],
        "docsSlug": "/docs/guides/app-menu"
      },
      {
        "id": "context-menu",
        "category": "native-integration",
        "status": "partial",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "unsupported"
        },
        "limitations": [
          "Native whole-window and scoped context menus ship on macOS and Windows behind menu:context; privileged native roles additionally require their matching capability.",
          "Menu IPC is bounded by payload, item-count, depth, and string limits. Linux has no native context-menu implementation."
        ],
        "apiSymbols": [
          "useContextMenu",
          "ContextMenuTrigger",
          "Action",
          "createActions"
        ],
        "testEvidence": [
          "crates/native/src/webview.rs",
          "crates/native/src/menu.rs"
        ],
        "docsSlug": "/docs/guides/context-menu"
      },
      {
        "id": "native-utilities",
        "category": "native-integration",
        "status": "partial",
        "platforms": {
          "macos": "partial",
          "windows": "partial",
          "linux": "partial"
        },
        "limitations": [
          "Dialogs, clipboard, notifications, shell helpers, and window controls are exposed to trusted renderer code through the same-origin native bridge and a per-window allowlist.",
          "Capabilities are command-level rather than argument/path-scoped, and the native renderer API is not available directly inside src/main.ts."
        ],
        "apiSymbols": [
          "murasaki/native.dialog",
          "murasaki/native.clipboard",
          "murasaki/native.notification",
          "murasaki/native.shell",
          "murasaki/native.appWindow",
          "murasaki/native.app",
          "murasaki/native.windows"
        ],
        "testEvidence": [
          "packages/murasaki/test/native-api.test.mjs",
          ".github/workflows/native-release.yml"
        ],
        "docsSlug": "/docs/guides/native-apis"
      },
      {
        "id": "auto-update",
        "category": "distribution",
        "status": "partial",
        "platforms": {
          "macos": "supported",
          "windows": "partial",
          "linux": "unsupported"
        },
        "limitations": [
          "Signed manifests, bounded downloads, SHA-256 payload verification, staged handoff, and relaunch are implemented for packaged apps.",
          "Linux packaging and updates are unavailable; Windows arm64 update publishing is not supported by the current artifact naming and manifest scan."
        ],
        "apiSymbols": [
          "useUpdate",
          "UpdateButton",
          "UpdaterConfig",
          "UpdateState"
        ],
        "testEvidence": [
          "packages/murasaki/test/updater-hardening.test.mjs",
          ".github/workflows/app-package-win.yml"
        ],
        "docsSlug": "/docs/guides/auto-update"
      },
      {
        "id": "application-packaging",
        "category": "distribution",
        "status": "partial",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "planned"
        },
        "limitations": [
          "macOS .app/.dmg and Windows portable .zip, NSIS .exe, and WiX .msi outputs ship today.",
          "Linux launcher packaging and installers are not implemented. WiX is required for MSI and only runs on Windows."
        ],
        "apiSymbols": [
          "murasaki bundle",
          "murasaki installer"
        ],
        "testEvidence": [
          ".github/workflows/app-package-win.yml"
        ],
        "docsSlug": "/docs/building/distribution"
      },
      {
        "id": "code-signing",
        "category": "distribution",
        "status": "partial",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "planned"
        },
        "limitations": [
          "Developer ID signing and Apple notarization are wired for macOS when the developer supplies credentials.",
          "Windows Authenticode signs and verifies the application executable, portable ZIP payload, NSIS setup, and MSI through a developer-supplied PFX/store certificate or Microsoft Artifact Signing provider. Linux package signing is not implemented; ad-hoc macOS signatures do not establish user trust."
        ],
        "apiSymbols": [
          "MurasakiConfig.sign",
          "WindowsSigningConfig",
          "murasaki bundle --sign",
          "murasaki installer --sign",
          "murasaki installer --notarize"
        ],
        "testEvidence": [
          "packages/murasaki/test/windows-signing.test.mjs"
        ],
        "docsSlug": "/docs/building/distribution"
      },
      {
        "id": "loopback-endpoint-protection",
        "category": "security",
        "status": "partial",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "development-only"
        },
        "limitations": [
          "Development privileged endpoints require an HttpOnly same-site runtime session and validate loopback Host, Origin, and Fetch Metadata.",
          "Renderer native commands have a deny-by-default per-window allowlist, but argument/path/URL-scoped and multi-origin policies are not implemented."
        ],
        "apiSymbols": [],
        "testEvidence": [],
        "docsSlug": "/docs/building/security"
      },
      {
        "id": "content-security-policy",
        "category": "security",
        "status": "partial",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "development-only"
        },
        "limitations": [
          "Murasaki injects environment-specific default CSP into framework and user-owned HTML, supports a complete security.csp override or explicit opt-out, and normalizes a user-owned CSP tag to the beginning of head.",
          "The policy is delivered by meta tag, so header-only directives such as frame-ancestors, sandbox, and reporting are not enforced; CSP does not sanitize HTML or authorize Node functions, and inline styles remain enabled for compatibility."
        ],
        "apiSymbols": [
          "MurasakiConfig.security",
          "security.csp"
        ],
        "testEvidence": [
          "packages/murasaki/test/csp.test.mjs",
          "packages/murasaki/src/vite-plugin/shell.ts"
        ],
        "docsSlug": "/docs/building/security"
      },
      {
        "id": "multi-window",
        "category": "application-model",
        "status": "experimental",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "unsupported"
        },
        "limitations": [
          "Windows must be declared in configuration and are created eagerly; arbitrary runtime creation and recreation after explicit destruction are not implemented.",
          "Secondary OS/self close hides for later reopening, while an explicit parent close destroys the window until restart; the application menu remains process-global and primary-owned."
        ],
        "apiSymbols": [
          "MurasakiConfig.windows",
          "SecondaryWindowConfig",
          "WindowInfo",
          "murasaki/native.appWindow.getLabel",
          "murasaki/native.windows"
        ],
        "testEvidence": [
          "packages/murasaki/test/windows.test.mjs",
          "packages/murasaki/test/native-api.test.mjs",
          "crates/native/src/window.rs",
          "crates/native/src/launcher.rs",
          ".github/workflows/ci.yml"
        ],
        "docsSlug": "/docs/guides/windows"
      },
      {
        "id": "tray-and-global-shortcuts",
        "category": "native-integration",
        "status": "partial",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "planned"
        },
        "limitations": [
          "One process-wide macOS status item / Windows system-tray icon ships with tooltip, click events, native nested menus, menu-item events, and dynamic icon/menu replacement; the latest successful create replaces the previous owner.",
          "Closing or disposing the owning renderer removes the icon. Menu roles are intentionally event-driven instead of privileged implicit actions; global shortcuts and Linux tray support are not implemented yet."
        ],
        "apiSymbols": [
          "murasaki/native.tray",
          "TrayOptions",
          "TrayMenuItem",
          "TrayClickEvent"
        ],
        "testEvidence": [
          "packages/murasaki/test/native-api.test.mjs",
          "crates/native/src/webview.rs"
        ],
        "docsSlug": "/docs/guides/native-apis"
      },
      {
        "id": "system-permissions",
        "category": "native-integration",
        "status": "partial",
        "platforms": {
          "macos": "supported",
          "windows": "partial",
          "linux": "unsupported"
        },
        "limitations": [
          "Packaged macOS apps can declare camera/microphone usage descriptions, request camera, microphone, screen-recording, or accessibility consent at launch, and query/request the same permissions from a capability-gated renderer API.",
          "Windows unpackaged desktop privacy consent is usage-driven rather than an app-scoped launch prompt, so these generic calls report unsupported there; Linux is not implemented. Development requests use the terminal/Node host identity and should be tested with a packaged app."
        ],
        "apiSymbols": [
          "MurasakiConfig.systemPermissions",
          "SystemPermissionsConfig",
          "murasaki/native.systemPermission"
        ],
        "testEvidence": [
          "packages/murasaki/test/system-permissions.test.mjs",
          "crates/native/src/system_permission.rs"
        ],
        "docsSlug": "/docs/guides/native-apis"
      },
      {
        "id": "single-instance-and-deep-links",
        "category": "application-model",
        "status": "partial",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "planned"
        },
        "limitations": [
          "Packaged macOS apps and installed Windows apps register declared URL schemes and file associations, preserve the per-user single-instance lock, and deliver normalized startup, second-instance, and system open requests to src/main.ts.",
          "Windows portable .zip and bare executable distributions do not register protocols or file associations automatically; registration is supplied by the NSIS and MSI installers, while Linux support remains planned."
        ],
        "apiSymbols": [
          "ProtocolConfig",
          "FileAssociationConfig",
          "OpenRequestEvent",
          "OpenTarget",
          "MainDefinition.openRequested",
          "MainDefinition.secondInstance",
          "SecondInstanceEvent"
        ],
        "testEvidence": [
          "packages/murasaki/test/associations.test.mjs",
          "packages/murasaki/test/main-runtime.test.mjs",
          "packages/murasaki/test/prod-server-http.test.mjs",
          "crates/native/src/launcher.rs"
        ],
        "docsSlug": "/docs/guides/deep-links"
      },
      {
        "id": "capability-permissions",
        "category": "security",
        "status": "partial",
        "platforms": {
          "macos": "supported",
          "windows": "supported",
          "linux": "development-only"
        },
        "limitations": [
          "Renderer native commands are deny-by-default and granted through a runtime-validated per-window capability allowlist; sender origin and command names are validated in Rust.",
          "Argument/path scopes and explicit deny overrides are not implemented; secondary windows intentionally inherit no top-level grants, and privileged menu roles require their corresponding command capability."
        ],
        "apiSymbols": [
          "MurasakiConfig.capabilities",
          "WindowConfig.capabilities",
          "NativeCapability"
        ],
        "testEvidence": [
          "crates/native/src/webview.rs",
          "packages/murasaki/test/native-api.test.mjs",
          "packages/murasaki/test/windows.test.mjs"
        ],
        "docsSlug": "/docs/building/security"
      },
      {
        "id": "linux-distribution",
        "category": "distribution",
        "status": "planned",
        "platforms": {
          "macos": "unsupported",
          "windows": "unsupported",
          "linux": "planned"
        },
        "limitations": [
          "Prebuilt Linux native binaries and development support do not constitute an installable Linux application release.",
          "AppImage, deb, rpm, repository metadata, signing, updates, and launcher packaging are not implemented."
        ],
        "apiSymbols": [],
        "testEvidence": [],
        "docsSlug": "/docs/core-concepts/platform-feature-status"
      }
    ]
  },
  "configSchema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "https://murasaki.ichi10.com/schema/murasaki-config.json",
    "title": "MurasakiConfig",
    "description": "Configuration accepted by defineConfig(). Fields marked as planned or no-op remain documented as such.",
    "type": "object",
    "additionalProperties": false,
    "required": [
      "appId",
      "productName"
    ],
    "$defs": {
      "nativeCapability": {
        "enum": [
          "app:quit",
          "dialog:openFile",
          "dialog:openDirectory",
          "dialog:saveFile",
          "clipboard:readText",
          "clipboard:writeText",
          "menu:application",
          "menu:context",
          "notification:show",
          "shell:openExternal",
          "shell:showItemInFolder",
          "systemPermission:status",
          "systemPermission:request",
          "window:setTitle",
          "window:setSize",
          "window:minimize",
          "window:toggleMaximize",
          "window:show",
          "window:hide",
          "window:focus",
          "window:close",
          "window:setAlwaysOnTop",
          "window:isVisible",
          "window:isFocused",
          "window:isMaximized",
          "window:isMinimized",
          "window:getLabel",
          "window:open",
          "window:list",
          "window:manage",
          "tray:create",
          "tray:remove",
          "tray:setTooltip",
          "tray:setIcon",
          "tray:setMenu"
        ]
      },
      "macCapturePermission": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "usageDescription"
        ],
        "properties": {
          "usageDescription": {
            "type": "string",
            "minLength": 1
          },
          "requestOnLaunch": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "macPromptPermission": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "requestOnLaunch": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "windowConfig": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "title": {
            "type": "string"
          },
          "width": {
            "type": "integer",
            "minimum": 1
          },
          "height": {
            "type": "integer",
            "minimum": 1
          },
          "minWidth": {
            "type": "integer",
            "minimum": 1
          },
          "minHeight": {
            "type": "integer",
            "minimum": 1
          },
          "resizable": {
            "type": "boolean"
          },
          "transparent": {
            "type": "boolean"
          },
          "vibrancy": {
            "enum": [
              "hud",
              "sidebar",
              "popover",
              null
            ],
            "description": "Declared but currently a no-op."
          },
          "route": {
            "type": "string",
            "minLength": 1,
            "pattern": "^/(?!/)",
            "not": {
              "pattern": "\\\\"
            },
            "default": "/",
            "description": "Same-origin path. Full URLs, protocol-relative URLs, and backslashes are rejected."
          },
          "visible": {
            "type": "boolean",
            "default": false
          },
          "capabilities": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/nativeCapability"
            },
            "uniqueItems": true,
            "default": [],
            "description": "Per-secondary-window allowlist. It never inherits top-level capabilities."
          }
        }
      }
    },
    "properties": {
      "appId": {
        "type": "string",
        "minLength": 1
      },
      "productName": {
        "type": "string",
        "minLength": 1
      },
      "version": {
        "type": "string"
      },
      "description": {
        "type": "string"
      },
      "copyright": {
        "type": "string"
      },
      "homepage": {
        "type": "string",
        "format": "uri"
      },
      "authors": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "window": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "title": {
            "type": "string"
          },
          "width": {
            "type": "integer",
            "minimum": 1
          },
          "height": {
            "type": "integer",
            "minimum": 1
          },
          "minWidth": {
            "type": "integer",
            "minimum": 1
          },
          "minHeight": {
            "type": "integer",
            "minimum": 1
          },
          "resizable": {
            "type": "boolean"
          },
          "transparent": {
            "type": "boolean"
          },
          "vibrancy": {
            "enum": [
              "hud",
              "sidebar",
              "popover",
              null
            ],
            "description": "Declared but currently a no-op."
          },
          "console": {
            "type": "boolean",
            "description": "Windows backend console visibility."
          },
          "route": {
            "type": "string",
            "minLength": 1,
            "pattern": "^/(?!/)",
            "not": {
              "pattern": "\\\\"
            },
            "default": "/",
            "description": "Same-origin path. Full URLs, protocol-relative URLs, and backslashes are rejected."
          },
          "visible": {
            "type": "boolean",
            "default": true
          },
          "capabilities": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/nativeCapability"
            },
            "uniqueItems": true,
            "description": "Primary-window allowlist. Falls back to top-level capabilities when omitted."
          }
        }
      },
      "windows": {
        "type": "object",
        "description": "Secondary windows keyed by a safe 1-64 character label. `main` is reserved. Secondary windows default to visible=false and capabilities=[]; the primary-only console option is rejected.",
        "propertyNames": {
          "pattern": "^(?![Mm][Aa][Ii][Nn]$)[A-Za-z0-9][A-Za-z0-9._-]{0,63}$"
        },
        "additionalProperties": {
          "$ref": "#/$defs/windowConfig"
        }
      },
      "main": {
        "oneOf": [
          {
            "const": false
          },
          {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "entry": {
                "type": "string",
                "default": "src/main.ts"
              },
              "shutdownTimeoutMs": {
                "type": "integer",
                "minimum": 1,
                "maximum": 300000,
                "default": 10000,
                "description": "End-to-end limit for beforeQuit plus shutdown before native host exit."
              }
            }
          }
        ]
      },
      "capabilities": {
        "type": "array",
        "description": "Legacy primary-window native command allowlist. window.capabilities takes precedence when present; secondary windows never inherit it. The default is deny-all, except that enabling the updater implicitly grants app:quit to the primary window for the verified restart handshake.",
        "items": {
          "enum": [
            "app:quit",
            "dialog:openFile",
            "dialog:openDirectory",
            "dialog:saveFile",
            "clipboard:readText",
            "clipboard:writeText",
            "menu:application",
            "menu:context",
            "notification:show",
            "shell:openExternal",
            "shell:showItemInFolder",
            "systemPermission:status",
            "systemPermission:request",
            "window:setTitle",
            "window:setSize",
            "window:minimize",
            "window:toggleMaximize",
            "window:show",
            "window:hide",
            "window:focus",
            "window:close",
            "window:setAlwaysOnTop",
            "window:isVisible",
            "window:isFocused",
            "window:isMaximized",
            "window:isMinimized",
            "window:getLabel",
            "window:open",
            "window:list",
            "window:manage",
            "tray:create",
            "tray:remove",
            "tray:setTooltip",
            "tray:setIcon",
            "tray:setMenu"
          ]
        },
        "uniqueItems": true
      },
      "systemPermissions": {
        "type": "object",
        "description": "Host-OS consent declarations. macOS purpose strings are embedded into Info.plist; launch prompts apply to packaged apps.",
        "additionalProperties": false,
        "properties": {
          "macOS": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "camera": {
                "$ref": "#/$defs/macCapturePermission"
              },
              "microphone": {
                "$ref": "#/$defs/macCapturePermission"
              },
              "screenRecording": {
                "$ref": "#/$defs/macPromptPermission"
              },
              "accessibility": {
                "$ref": "#/$defs/macPromptPermission"
              }
            }
          }
        }
      },
      "bundle": {
        "type": "object",
        "description": "Production packaging for Node-side dependencies and non-code resources.",
        "additionalProperties": false,
        "properties": {
          "external": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            },
            "uniqueItems": true
          },
          "noExternal": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            },
            "uniqueItems": true
          },
          "resources": {
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "type": "string",
                  "minLength": 1
                },
                {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "from"
                  ],
                  "properties": {
                    "from": {
                      "type": "string",
                      "minLength": 1
                    },
                    "to": {
                      "type": "string",
                      "minLength": 1
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "build": {
        "type": "object",
        "description": "Build prerequisites and renderer-public environment prefixes.",
        "additionalProperties": false,
        "properties": {
          "before": {
            "type": "string",
            "minLength": 1
          },
          "envPrefix": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            },
            "minItems": 1,
            "uniqueItems": true,
            "default": [
              "VITE_",
              "NEXT_PUBLIC_"
            ]
          }
        }
      },
      "security": {
        "type": "object",
        "description": "Renderer HTML Content Security Policy injection. Murasaki moves an existing user-owned CSP meta tag to the beginning of head; otherwise it injects security.csp or the environment-specific default unless injection is explicitly disabled. An existing tag and a security.csp string cannot be combined.",
        "additionalProperties": false,
        "properties": {
          "csp": {
            "description": "Complete, non-empty, single-line Content Security Policy override. Whitespace-only values, control characters, quotes, and angle brackets are rejected. Omit it for Murasaki's environment-specific default, or use false to disable framework injection.",
            "oneOf": [
              {
                "type": "string",
                "minLength": 1,
                "pattern": "^(?=.*\\S)[^\\u0000-\\u001F\\u007F\"<>]+$"
              },
              {
                "const": false
              }
            ]
          }
        }
      },
      "updater": {
        "oneOf": [
          {
            "type": "boolean"
          },
          {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "repo": {
                "type": "string",
                "pattern": "^[^/]+/[^/]+$"
              },
              "endpoint": {
                "type": "string",
                "format": "uri"
              },
              "channel": {
                "type": "string",
                "default": "stable"
              },
              "checkOnStart": {
                "type": "boolean",
                "default": true
              },
              "checkInterval": {
                "oneOf": [
                  {
                    "type": "string"
                  },
                  {
                    "const": false
                  }
                ],
                "default": "6h"
              },
              "publicKey": {
                "type": "string"
              }
            }
          }
        ]
      },
      "locales": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "minItems": 1
      },
      "devPort": {
        "type": "integer",
        "minimum": 1,
        "maximum": 65535,
        "default": 5178
      },
      "targets": {
        "type": "array",
        "items": {
          "enum": [
            "darwin-arm64",
            "darwin-x64",
            "win32-x64",
            "win32-arm64",
            "linux-x64",
            "linux-arm64"
          ]
        },
        "uniqueItems": true
      },
      "icon": {
        "type": "string"
      },
      "protocols": {
        "type": "array",
        "description": "URL schemes registered by packaged macOS apps and installed Windows apps.",
        "items": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "scheme"
          ],
          "properties": {
            "scheme": {
              "type": "string",
              "pattern": "^[A-Za-z][A-Za-z0-9+.-]{0,62}$",
              "description": "RFC 3986 scheme. Reserved and duplicate schemes are rejected during configuration resolution."
            },
            "name": {
              "type": "string",
              "minLength": 1
            }
          }
        },
        "uniqueItems": true
      },
      "fileAssociations": {
        "type": "array",
        "description": "File types registered by packaged macOS apps and installed Windows apps.",
        "items": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "extensions"
          ],
          "properties": {
            "extensions": {
              "type": "array",
              "minItems": 1,
              "uniqueItems": true,
              "items": {
                "type": "string",
                "pattern": "^\\.?[A-Za-z0-9][A-Za-z0-9_-]{0,31}$"
              }
            },
            "name": {
              "type": "string",
              "minLength": 1
            },
            "description": {
              "type": "string",
              "minLength": 1
            },
            "role": {
              "enum": [
                "viewer",
                "editor",
                "shell",
                "none"
              ],
              "default": "viewer"
            },
            "mimeType": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9!#$&^_.+-]*/[A-Za-z0-9][A-Za-z0-9!#$&^_.+-]*$"
            }
          }
        },
        "uniqueItems": true
      },
      "installer": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "background": {
            "type": "string"
          },
          "window": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "width",
              "height"
            ],
            "properties": {
              "width": {
                "type": "integer",
                "minimum": 1
              },
              "height": {
                "type": "integer",
                "minimum": 1
              }
            }
          },
          "iconSize": {
            "type": "integer",
            "minimum": 1
          },
          "windows": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "installMode": {
                "enum": [
                  "perUser",
                  "perMachine"
                ]
              },
              "publisher": {
                "type": "string"
              },
              "upgradeCode": {
                "type": "string"
              },
              "icon": {
                "type": "string"
              },
              "banner": {
                "type": "string"
              },
              "sidebar": {
                "type": "string"
              },
              "license": {
                "type": "string"
              }
            }
          }
        }
      },
      "sign": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "identity": {
            "type": "string"
          },
          "entitlements": {
            "type": "string"
          },
          "windows": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "certificateFile": {
                "type": "string"
              },
              "certificateSubjectName": {
                "type": "string"
              },
              "certificateSha1": {
                "type": "string",
                "pattern": "^(?:[0-9A-Fa-f]\\s*){40}$"
              },
              "certificateStore": {
                "enum": [
                  "currentUser",
                  "localMachine"
                ]
              },
              "timestampUrl": {
                "oneOf": [
                  {
                    "type": "string",
                    "format": "uri",
                    "pattern": "^https?://"
                  },
                  {
                    "const": false
                  }
                ]
              },
              "signToolPath": {
                "type": "string"
              },
              "artifactSigning": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "dlib",
                  "metadata"
                ],
                "properties": {
                  "dlib": {
                    "type": "string"
                  },
                  "metadata": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
