Use the preserved protocol-v1 notes example without assuming native scheduling support.
Project Notes is an established protocol-v1 reference extension. Its signed 0.1.0-alpha.2 release and immutable assets remain preserved. It uses top-level kind: "extension" fields and the retained TypeScript SDK.
The example keeps project-scoped notes with optimistic document revisions and idempotent write receipts. Its legacy authoring fixture also demonstrates BullMQ reminders that mark notes due in the panel; it sends no email. This is historical fixture behavior, not a promise of interval scheduling in the native host.The UI uses a sandboxed frame and host-owned message channel. Runtime tokens, provider keys and database credentials stay outside the frame. Host admission controls project access and capabilities.
The reference supports up to 100 notes, 100 characters per title and 5,000 characters per body within a 24 KiB total document. Reminder dates in the legacy fixture are limited to seven days ahead. Editing or deleting a note invalidates its previous reminder version.Document reads return value and revision. Writes compare the expected revision and retain an operation receipt. Keep the same key when retrying unchanged input; changed input with a reused key or a stale revision fails instead of overwriting another edit.
Follow the independent repository’s README and pinned dependencies for that v1 release. Retained local fixtures do not establish production installation, customer activation or native runtime compatibility. Current native jobs reject interval scheduling; see background jobs.For a new native extension, start from cloud-plugin-echo-demo and the native SDK. Preserve Project Notes’ existing signed bytes; changing protocol numbers is not a migration. See independent releases.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Spitzli Cloud","description":"Guides for your Spitzli Cloud workspace, provider connections, applications, websites and developer integrations.","colors":{"primary":"#6515D5","light":"#C6A3FF","dark":"#6515D5"},"logo":{"light":"https://mintcdn.com/spitzli/zdlOJ049JJBpjLAl/logo/light.svg?fit=max\u0026auto=format\u0026n=zdlOJ049JJBpjLAl\u0026q=85\u0026s=b031247c7e05cf0f819d75a4f9aa44a1","dark":"https://mintcdn.com/spitzli/zdlOJ049JJBpjLAl/logo/dark.svg?fit=max\u0026auto=format\u0026n=zdlOJ049JJBpjLAl\u0026q=85\u0026s=3f9b9789c1fc8cbb194763587ef8254b","href":"/"},"favicon":"https://mintcdn.com/spitzli/zdlOJ049JJBpjLAl/favicon.svg?fit=max\u0026auto=format\u0026n=zdlOJ049JJBpjLAl\u0026q=85\u0026s=24b246a67f526727743a1fd2bd340009","api":{"playground":{"display":"none"},"examples":{"languages":["curl","javascript","python"]}},"navbar":{"links":[{"href":"https://spitzli.cloud","label":"Website"},{"href":"https://github.com/spitzli/cloud","label":"GitHub"}],"primary":{"type":"button","label":"Open Console","href":"https://console.spitzli.cloud"}},"footer":{"socials":{"github":"https://github.com/spitzli/cloud"}},"contextual":{"options":["copy","view","chatgpt","claude","mcp"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"spitzli","hasAudioNarration":false,"actualSubdomain":"spitzli","customDomains":["docs.spitzli.cloud"],"gitSource":{"type":"github","owner":"spitzli","repo":"cloud","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":"","_id":"6ae70c9be026cb42f70116be"},"chroma":{"latestBuiltDeploymentHistoryId":"6aeb9e69a36134452f52585a","collectionId":"aa4bff5a-b23e-4dfe-99ee-88539aad2d15","liveDeploymentHistoryId":"6aeb9e69a36134452f52585a","schemaVersion":"v3"},"entitlements":{},"buildId":"6aeb9e69a36134452f52585a","clientVersion":"0.0.4074","searchFilterCounts":[{"language":"default","tag":"Mail contract reference","count":29},{"language":"default","tag":"Mail API","count":29},{"language":"default","tag":"Developers","count":25},{"language":"default","tag":"Guides","count":19},{"language":"default","tag":"Plugins","count":9},{"language":"default","tag":"Products","count":9},{"language":"default","tag":"Webhooks","count":8},{"language":"default","tag":"Integrations","count":6},{"language":"default","tag":"Emails","count":6},{"language":"default","tag":"Self-hosting","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"developers/project-notes","slug":"/developers/project-notes","pageMetadata":{"title":"Project Notes reference extension","description":"Use the preserved protocol-v1 notes example without assuming native scheduling support.","href":"/developers/project-notes"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Use the preserved protocol-v1 notes example without assuming native scheduling support.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,..._provideComponents(),...props.components},{Heading}=_components;if(!Heading)_missingMdxReference(`Heading`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[_jsx(_components.a,{href:`https://github.com/spitzli/webdock-extension-project-notes`,children:`Project Notes`}),` is an established protocol-v1 reference extension. Its signed `,_jsx(_components.code,{children:`0.1.0-alpha.2`}),` release and immutable assets remain preserved. It uses top-level `,_jsx(_components.code,{children:`kind: \"extension\"`}),` fields and the retained TypeScript SDK.`]}),`\n`,_jsx(Heading,{level:`2`,id:`reference-behavior`,children:`Reference behavior`}),`\n`,_jsx(_components.p,{children:`The example keeps project-scoped notes with optimistic document revisions and idempotent write receipts. Its legacy authoring fixture also demonstrates BullMQ reminders that mark notes due in the panel; it sends no email. This is historical fixture behavior, not a promise of interval scheduling in the native host.`}),`\n`,_jsx(_components.p,{children:`The UI uses a sandboxed frame and host-owned message channel. Runtime tokens, provider keys and database credentials stay outside the frame. Host admission controls project access and capabilities.`}),`\n`,_jsx(Heading,{level:`2`,id:`data-limits`,children:`Data limits`}),`\n`,_jsx(_components.p,{children:`The reference supports up to 100 notes, 100 characters per title and 5,000 characters per body within a 24 KiB total document. Reminder dates in the legacy fixture are limited to seven days ahead. Editing or deleting a note invalidates its previous reminder version.`}),`\n`,_jsx(_components.p,{children:`Document reads return value and revision. Writes compare the expected revision and retain an operation receipt. Keep the same key when retrying unchanged input; changed input with a reused key or a stale revision fails instead of overwriting another edit.`}),`\n`,_jsx(Heading,{level:`2`,id:`develop-or-migrate`,children:`Develop or migrate`}),`\n`,_jsxs(_components.p,{children:[`Follow the independent repository’s README and pinned dependencies for that v1 release. Retained local fixtures do not establish production installation, customer activation or native runtime compatibility. Current native jobs reject interval scheduling; see `,_jsx(_components.a,{href:`/developers/plugin-jobs`,children:`background jobs`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`For a new native extension, start from `,_jsx(_components.a,{href:`https://github.com/spitzli/cloud-plugin-echo-demo`,children:`cloud-plugin-echo-demo`}),` and the `,_jsx(_components.a,{href:`https://github.com/spitzli/cloud-plugin-sdk`,children:`native SDK`}),`. Preserve Project Notes’ existing signed bytes; changing protocol numbers is not a migration. See `,_jsx(_components.a,{href:`/developers/plugin-releases`,children:`independent releases`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Project Notes reference extension","description":"Use the preserved protocol-v1 notes example without assuming native scheduling support.","href":"/developers/project-notes"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Reference behavior","slug":"reference-behavior","depth":2,"children":[]},{"title":"Data limits","slug":"data-limits","depth":2,"children":[]},{"title":"Develop or migrate","slug":"develop-or-migrate","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"spitzli","siteName":"Spitzli Cloud","title":"Project Notes reference extension - Spitzli Cloud","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-02T13:43:26.067Z","originalFileLocation":"developers/project-notes.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Use the preserved protocol-v1 notes example without assuming native scheduling support.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Spitzli Cloud\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/spitzli/8LUuoWUmzGApZstg/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/spitzli/8LUuoWUmzGApZstg/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/spitzli/8LUuoWUmzGApZstg/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/spitzli/8LUuoWUmzGApZstg/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/spitzli/8LUuoWUmzGApZstg/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/spitzli/8LUuoWUmzGApZstg/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/spitzli/8LUuoWUmzGApZstg/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/spitzli/8LUuoWUmzGApZstg/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/spitzli/8LUuoWUmzGApZstg/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Project Notes reference extension - Spitzli Cloud\">\u003cmeta data-mint-head property=\"og:description\" content=\"Use the preserved protocol-v1 notes example without assuming native scheduling support.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Spitzli Cloud\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.spitzli.cloud/developers/project-notes\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://spitzli.mintlify.site/_mintlify/api/og/v2?division=Plugins\u0026amp;title=Project+Notes+reference+extension\u0026amp;description=Use+the+preserved+protocol-v1+notes+example+without+assuming+native+scheduling+support.\u0026amp;theme=bc7231f1e6614739888b8ee3\u0026amp;signature=a7d2ff7da454e5327910bd5169b272ae08f3fd7e4733c2af05a88989a750ba5d\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Project Notes reference extension - Spitzli Cloud\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Use the preserved protocol-v1 notes example without assuming native scheduling support.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://spitzli.mintlify.site/_mintlify/api/og/v2?division=Plugins\u0026amp;title=Project+Notes+reference+extension\u0026amp;description=Use+the+preserved+protocol-v1+notes+example+without+assuming+native+scheduling+support.\u0026amp;theme=bc7231f1e6614739888b8ee3\u0026amp;signature=a7d2ff7da454e5327910bd5169b272ae08f3fd7e4733c2af05a88989a750ba5d\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/spitzli/8LUuoWUmzGApZstg/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Spitzli Cloud\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#6515D5\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.spitzli.cloud/developers/project-notes\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/developers/project-notes.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.spitzli.cloud/#organization\",\"name\":\"Spitzli Cloud\",\"url\":\"https://docs.spitzli.cloud\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/spitzli/zdlOJ049JJBpjLAl/logo/light.svg?fit=max\u0026auto=format\u0026n=zdlOJ049JJBpjLAl\u0026q=85\u0026s=b031247c7e05cf0f819d75a4f9aa44a1\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.spitzli.cloud#website\",\"name\":\"Spitzli Cloud\",\"url\":\"https://docs.spitzli.cloud\",\"publisher\":{\"@id\":\"https://docs.spitzli.cloud/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.spitzli.cloud/developers/project-notes#webpage\",\"url\":\"https://docs.spitzli.cloud/developers/project-notes\",\"name\":\"Project Notes reference extension\",\"description\":\"Use the preserved protocol-v1 notes example without assuming native scheduling support.\",\"dateModified\":\"2026-11-02T13:43:26.067Z\",\"isPartOf\":{\"@id\":\"https://docs.spitzli.cloud#website\"},\"breadcrumb\":{\"@id\":\"https://docs.spitzli.cloud/developers/project-notes#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.spitzli.cloud/developers/project-notes#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Plugins\",\"item\":\"https://docs.spitzli.cloud/developers/plugins\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Project Notes reference extension\",\"item\":\"https://docs.spitzli.cloud/developers/project-notes\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.spitzli.cloud/developers/project-notes#article\",\"headline\":\"Project Notes reference extension\",\"name\":\"Project Notes reference extension\",\"description\":\"Use the preserved protocol-v1 notes example without assuming native scheduling support.\",\"url\":\"https://docs.spitzli.cloud/developers/project-notes\",\"mainEntityOfPage\":{\"@id\":\"https://docs.spitzli.cloud/developers/project-notes#webpage\"},\"dateModified\":\"2026-11-02T13:43:26.067Z\",\"publisher\":{\"@id\":\"https://docs.spitzli.cloud/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.spitzli.cloud#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Spitzli Cloud\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Spitzli Cloud","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":""}]},{"tab":"Developers","groups":[{"group":"Integrations","pages":[{"title":"Developer overview","href":"/developers/overview"},{"title":"Authentication","href":"/developers/authentication"},{"title":"MCP integration","href":"/developers/mcp"},{"title":"BYOK integration boundaries","href":"/developers/byok"},{"title":"Registry REST API","href":"/developers/registry"},{"title":"Website integration","href":"/developers/website-integration"}]},{"group":"Mail","pages":[{"title":"Send your first message","href":"/developers/mail-quickstart"},{"title":"Mail API behavior","href":"/developers/mail-api"},{"title":"Mail webhooks","href":"/developers/mail-webhooks"}]},{"group":"Plugins","pages":[{"title":"Develop a Spitzli Cloud plugin","href":"/developers/plugins"},{"title":"Independent plugin releases","href":"/developers/plugin-releases"},{"title":"Managed Apps","href":"/developers/managed-apps"},{"title":"Managed Analytics","description":"Use an external ElysiaJS plugin for managed website analytics with Umami.","href":"/developers/managed-analytics"},{"title":"Project Notes reference extension","href":"/developers/project-notes"},{"title":"Plugin manifest reference","description":"Choose the correct protocol and validate exact runtime release descriptors.","href":"/developers/plugin-manifest"},{"title":"Workspace API and plugin MCP tools","href":"/developers/plugin-api-mcp"},{"title":"Plugin background jobs","href":"/developers/plugin-jobs"},{"title":"Tabularium as a managed app","href":"/developers/managed-registry"}]},{"group":"Self-hosting","pages":[{"title":"Operate a Core installation","href":"/developers/self-hosting"},{"title":"Core distribution","href":"/developers/core-distribution"},{"title":"Initial operator setup","href":"/developers/initial-setup"},{"title":"Configure Core features","href":"/developers/modules"},{"title":"Identity and authentication providers","href":"/developers/auth-adapters"}]},{"group":"Contribute","pages":[{"title":"Local development","href":"/developers/local-development"},{"title":"Maintain these docs","href":"/developers/documentation"}]}]},{"tab":"Mail contract reference","pages":[{"title":"Mail contract reference","href":"/api-reference/emails/list-emails"}]}]},"basePath":"","title":"Project Notes reference extension - Spitzli Cloud","buildId":"dpl_BLQvU86QFwq3AhPofSTw6q8dGWKm","deploymentId":"dpl_BLQvU86QFwq3AhPofSTw6q8dGWKm","dynamics":[],"chunks":[]}