Choose device service operations, a voice frontend, or both. Declare shared daemon dependencies in the package and give each role its own access and lifecycle policy.A service-only configuration can keep voice disabled. A combined configuration binds device operations and live interaction to the same domain service while retaining their distinct permissions.
Physical-control and safety-monotone operations need their domain contracts. A host lacking the selected safety contract cannot relabel movement as an ordinary write. Tool arguments do not establish device ownership, a current control lease, emergency-stop state or a safe operating area.Authentication, installation and a local simulator run do not establish physical completion. The domain owner defines permitted validation and produces the actual device observations.
A configured voice frontend opens a live session only after an interaction is admitted. Media state stays with the canonical live owner. Image results remain associated with the original job and socket; an HTTP 200 alone cannot prove the runtime accepted the image into that session.A lost socket does not authorize routing images into a replacement session. Reconnection, cancellation and uncertain acceptance need their actual owner recovery path.
The package describes shared dependencies and state migrations. Pause the frontend according to its admission/live policy; revoke device access through its grant/domain owner. Stop the shared daemon only when its remaining dependants permit it. Preserve durable state required for recovery.This example should remain implementable in another host. Keep the device domain behavior in its adapter and application while reusing Connect packaging, delivery and transport pieces and the existing Meerkat/Meta runtime.
⌘I
{"docsConfig":{"theme":"maple","$schema":"https://mintlify.com/docs.json","name":"Meerkat","description":"An open-source, provider-agnostic agent platform for CLI automation, application embedding and ongoing operations","colors":{"primary":"#A46921","light":"#E8A84C","dark":"#B5711E"},"logo":{"light":"https://mintcdn.com/none-40224a08/mRxQaZOhWmJkta-4/logo.png?fit=max\u0026auto=format\u0026n=mRxQaZOhWmJkta-4\u0026q=85\u0026s=85d370082fbfd4e65bbf1f8f1416df28","dark":"https://mintcdn.com/none-40224a08/mRxQaZOhWmJkta-4/logo.png?fit=max\u0026auto=format\u0026n=mRxQaZOhWmJkta-4\u0026q=85\u0026s=85d370082fbfd4e65bbf1f8f1416df28"},"navbar":{"links":[{"href":"https://github.com/lukacf/meerkat","label":"Meerkat GitHub"},{"href":"https://github.com/lukacf/meerkat-meta","label":"Meta GitHub"}]},"footer":{"socials":{"github":"https://github.com/lukacf/meerkat"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"none-40224a08","hasAudioNarration":false,"actualSubdomain":"none-40224a08","customDomains":["docs.rkat.ai"],"gitSource":{"type":"github","owner":"lukacf","repo":"meerkat","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aea8c2a1696a7da7a030962","collectionId":"a5f77f79-1c44-47dd-b828-abbc37c22377","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aea8c2a1696a7da7a030962"},"entitlements":{},"buildId":"6aeac0143e8ec017bccc5cf3","clientVersion":"0.0.4054","searchFilterCounts":[{"language":"default","tag":"Documentation","count":122},{"language":"default","tag":"Meerkat","count":96},{"language":"default","tag":"Reference","count":63},{"language":"default","tag":"Connect","count":50},{"language":"default","tag":"Recall","count":45},{"language":"default","tag":"Meta","count":36},{"language":"default","tag":"Concepts","count":20},{"language":"default","tag":"Core concepts","count":20},{"language":"default","tag":"Architecture","count":17},{"language":"default","tag":"Guides","count":14}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"connect/examples/device-extension","slug":"/connect/examples/device-extension","pageMetadata":{"title":"A custom device extension","description":"Model device operations, a voice frontend and shared services without embedding another agent runtime.","icon":"robot","href":"/connect/examples/device-extension"},"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: \"Model device operations, a voice frontend and shared services without embedding another agent runtime.\"\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={p:`p`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{Heading,Mermaid,Table}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Table)_missingMdxReference(`Table`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`A device integration can expose both device operations and a voice frontend while sharing one daemon and domain service.`}),`\n`,_jsx(Mermaid,{chart:`flowchart TB\n PKG[\"Selected device package\"] --> DEVICE[\"Device service export\"]\n PKG --> VOICE[\"Voice frontend export\"]\n DEVICE --> DOMAIN[\"Device domain owner\"]\n VOICE --> LIVE[\"Admission, conversation and live owner\"]\n DOMAIN --> DAEMON[\"Shared device daemon\"]\n LIVE --> DAEMON\n LIVE --> AGENT[\"Existing Meerkat agent\"]`}),`\n`,_jsx(Heading,{level:`2`,id:`declare-the-components`,children:`Declare the components`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Component`}),_jsx(_components.th,{children:`Required contract`}),_jsx(_components.th,{children:`Readiness evidence`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Device daemon`}),_jsx(_components.td,{children:`Exact artifact/configuration, lifecycle, state and health`}),_jsx(_components.td,{children:`Current device/domain handshake`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Device service export`}),_jsx(_components.td,{children:`Explicit operations, resource identity and domain policy`}),_jsx(_components.td,{children:`Authorized operations bound to the intended consumer`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Voice frontend export`}),_jsx(_components.td,{children:`Participant admission, conversation, output and live media`}),_jsx(_components.td,{children:`Exposure acknowledgment plus live/playback acknowledgment for an admitted session`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Camera/image path`}),_jsx(_components.td,{children:`Job identity, socket association and bounded transport`}),_jsx(_components.td,{children:`Canonical image acceptance for the original job`})]})]})]}),`\n`,_jsx(_components.p,{children:`Supporting process health is necessary where declared, but it cannot replace any role acknowledgment.`}),`\n`,_jsx(Heading,{level:`2`,id:`select-the-role`,children:`Select the role`}),`\n`,_jsx(_components.p,{children:`Choose device service operations, a voice frontend, or both. Declare shared daemon dependencies in the package and give each role its own access and lifecycle policy.`}),`\n`,_jsx(_components.p,{children:`A service-only configuration can keep voice disabled. A combined configuration binds device operations and live interaction to the same domain service while retaining their distinct permissions.`}),`\n`,_jsx(Heading,{level:`2`,id:`preserve-physical-authority`,children:`Preserve physical authority`}),`\n`,_jsx(_components.p,{children:`Physical-control and safety-monotone operations need their domain contracts. A host lacking the selected safety contract cannot relabel movement as an ordinary write. Tool arguments do not establish device ownership, a current control lease, emergency-stop state or a safe operating area.`}),`\n`,_jsx(_components.p,{children:`Authentication, installation and a local simulator run do not establish physical completion. The domain owner defines permitted validation and produces the actual device observations.`}),`\n`,_jsx(Heading,{level:`2`,id:`keep-live-interaction-bound`,children:`Keep live interaction bound`}),`\n`,_jsx(_components.p,{children:`A configured voice frontend opens a live session only after an interaction is admitted. Media state stays with the canonical live owner. Image results remain associated with the original job and socket; an HTTP 200 alone cannot prove the runtime accepted the image into that session.`}),`\n`,_jsx(_components.p,{children:`A lost socket does not authorize routing images into a replacement session. Reconnection, cancellation and uncertain acceptance need their actual owner recovery path.`}),`\n`,_jsx(Heading,{level:`2`,id:`upgrade-and-remove-safely`,children:`Upgrade and remove safely`}),`\n`,_jsx(_components.p,{children:`The package describes shared dependencies and state migrations. Pause the frontend according to its admission/live policy; revoke device access through its grant/domain owner. Stop the shared daemon only when its remaining dependants permit it. Preserve durable state required for recovery.`}),`\n`,_jsx(_components.p,{children:`This example should remain implementable in another host. Keep the device domain behavior in its adapter and application while reusing Connect packaging, delivery and transport pieces and the existing Meerkat/Meta runtime.`})]})}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":"A custom device extension","description":"Model device operations, a voice frontend and shared services without embedding another agent runtime.","icon":"robot","href":"/connect/examples/device-extension"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Declare the components","slug":"declare-the-components","depth":2,"children":[]},{"title":"Select the role","slug":"select-the-role","depth":2,"children":[]},{"title":"Preserve physical authority","slug":"preserve-physical-authority","depth":2,"children":[]},{"title":"Keep live interaction bound","slug":"keep-live-interaction-bound","depth":2,"children":[]},{"title":"Upgrade and remove safely","slug":"upgrade-and-remove-safely","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"none-40224a08","siteName":"Meerkat","title":"A custom device extension - Meerkat","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-03T07:12:16.422Z","originalFileLocation":"connect/examples/device-extension.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=\"Model device operations, a voice frontend and shared services without embedding another agent runtime.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Meerkat\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/none-40224a08/_generated/favicon/apple-touch-icon.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/none-40224a08/_generated/favicon/favicon-32x32.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/none-40224a08/_generated/favicon/favicon-16x16.png?v=3\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/none-40224a08/_generated/favicon/favicon.ico?v=3\">\u003cmeta data-mint-head property=\"og:title\" content=\"A custom device extension - Meerkat\">\u003cmeta data-mint-head property=\"og:description\" content=\"Model device operations, a voice frontend and shared services without embedding another agent runtime.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Meerkat\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.rkat.ai/connect/examples/device-extension\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://none-40224a08.mintlify.app/_mintlify/api/og/v2?division=Examples\u0026amp;title=A+custom+device+extension\u0026amp;description=Model+device+operations%2C+a+voice+frontend+and+shared+services+without+embedding+another+agent+runtime.\u0026amp;theme=d4a4c0a93c570a2e21737b05\u0026amp;signature=cd4ff443bd00fd17b925e8408c2b546ee2e4d802fce83d333b9e6cde9a94206a\">\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=\"A custom device extension - Meerkat\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Model device operations, a voice frontend and shared services without embedding another agent runtime.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://none-40224a08.mintlify.app/_mintlify/api/og/v2?division=Examples\u0026amp;title=A+custom+device+extension\u0026amp;description=Model+device+operations%2C+a+voice+frontend+and+shared+services+without+embedding+another+agent+runtime.\u0026amp;theme=d4a4c0a93c570a2e21737b05\u0026amp;signature=cd4ff443bd00fd17b925e8408c2b546ee2e4d802fce83d333b9e6cde9a94206a\">\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=\"https://mintlify.s3.us-west-1.amazonaws.com/none-40224a08/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Meerkat\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#A46921\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.rkat.ai/connect/examples/device-extension\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/connect/examples/device-extension.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.rkat.ai/#organization\",\"name\":\"Meerkat\",\"url\":\"https://docs.rkat.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/none-40224a08/mRxQaZOhWmJkta-4/logo.png?fit=max\u0026auto=format\u0026n=mRxQaZOhWmJkta-4\u0026q=85\u0026s=85d370082fbfd4e65bbf1f8f1416df28\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.rkat.ai#website\",\"name\":\"Meerkat\",\"url\":\"https://docs.rkat.ai\",\"publisher\":{\"@id\":\"https://docs.rkat.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.rkat.ai/connect/examples/device-extension#webpage\",\"url\":\"https://docs.rkat.ai/connect/examples/device-extension\",\"name\":\"A custom device extension\",\"description\":\"Model device operations, a voice frontend and shared services without embedding another agent runtime.\",\"dateModified\":\"2026-11-03T07:12:16.422Z\",\"isPartOf\":{\"@id\":\"https://docs.rkat.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.rkat.ai/connect/examples/device-extension#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.rkat.ai/connect/examples/device-extension#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Examples\",\"item\":\"https://docs.rkat.ai/connect/examples/remembered-tool\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A custom device extension\",\"item\":\"https://docs.rkat.ai/connect/examples/device-extension\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.rkat.ai/connect/examples/device-extension#article\",\"headline\":\"A custom device extension\",\"name\":\"A custom device extension\",\"description\":\"Model device operations, a voice frontend and shared services without embedding another agent runtime.\",\"url\":\"https://docs.rkat.ai/connect/examples/device-extension\",\"mainEntityOfPage\":{\"@id\":\"https://docs.rkat.ai/connect/examples/device-extension#webpage\"},\"dateModified\":\"2026-11-03T07:12:16.422Z\",\"publisher\":{\"@id\":\"https://docs.rkat.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.rkat.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Meerkat\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Meerkat","nav":{"global":null,"products":[{"product":"Meerkat","icon":"https://mintlify.s3.us-west-1.amazonaws.com/none-40224a08/logo.png","description":"Agent runtime, CLI, SDKs and APIs","pages":[{"title":"Meerkat","href":"/introduction"}]},{"product":"Meta","icon":"https://mintlify.s3.us-west-1.amazonaws.com/none-40224a08/meta/logo.png","description":"Application and orchestration layer for Meerkat","pages":[{"title":"Meta","href":"/meta/introduction"}]},{"product":"Connect","icon":"plug","description":"Agent-led integration discovery and setup","tabs":[{"tab":"Documentation","groups":[{"group":"Getting started","pages":[{"title":"Meerkat Connect","icon":"toolbox","href":"/connect/introduction"},{"title":"Platforms and installation options","icon":"circle-info","href":"/connect/availability"},{"title":"Install and use Connect","icon":"rocket","href":"/connect/quickstart"},{"title":"Integration workflow","icon":"route","href":"/connect/roadmap"}]},{"group":"Integration library","pages":[{"title":"Integration library","icon":"boxes-stacked","href":"/connect/library/adoption"},{"title":"Slack and Gmail over MCP","icon":"envelope","href":"/connect/library/slack-gmail"},{"title":"Choose an integration","icon":"compass","href":"/connect/library/candidates"},{"title":"Browser automation","icon":"globe","href":"/connect/library/playwright"},{"title":"GitHub MCP","icon":"github","href":"/connect/library/github"}]},{"group":"Concepts","pages":[{"title":"Ownership","icon":"diagram-project","href":"/connect/concepts/ownership"},{"title":"Connectors and frontends","icon":"arrows-left-right","href":"/connect/concepts/roles"},{"title":"Agent-led discovery and installation","icon":"compass","href":"/connect/concepts/acquisition"},{"title":"Authentication and credentials","icon":"key","href":"/connect/concepts/authentication"},{"title":"Connection lifecycle","icon":"circle-check","href":"/connect/concepts/readiness"}]},{"group":"Using integrations","pages":[{"title":"Ask for an integration","icon":"comment","href":"/connect/guides/request-an-integration"},{"title":"Manage connections and frontends","icon":"sliders","href":"/connect/guides/manage-connections"}]},{"group":"Host integration","pages":[{"title":"Install the integration library","icon":"download","href":"/connect/library/local-install"},{"title":"Prepare a package outside the library","icon":"box-open","href":"/connect/acquisition/local-install"},{"title":"Use installed tools in Meerkat","icon":"plug","href":"/connect/guides/native-mcp"},{"title":"Compose Connect in a host","icon":"cubes","href":"/connect/guides/host-composition"},{"title":"Set up an agent frontend","icon":"comments","href":"/connect/guides/setup-a-frontend"}]},{"group":"Building integrations","pages":[{"title":"Author a service connector","icon":"plug","href":"/connect/guides/service-connectors"},{"title":"Author an agent frontend","icon":"comments","href":"/connect/guides/agent-frontends"},{"title":"Port and reuse an integration","icon":"recycle","href":"/connect/guides/port-an-integration"}]},{"group":"Examples","pages":[{"title":"From a remembered tool to setup","icon":"magnifying-glass","href":"/connect/examples/remembered-tool"},{"title":"Slack summary and a Slack frontend","description":"Use explicit read operations for a business task, and distinguish them from publishing an assistant interface.","icon":"slack","href":"/connect/examples/slack-summary"},{"title":"A custom device extension","icon":"robot","href":"/connect/examples/device-extension"},{"title":"An organizational host","description":"Use deployment identities, administrator rollout and explicit audiences in a GitOps application.","icon":"building","href":"/connect/examples/organizational-host"}]}]},{"tab":"SDKs and APIs","pages":[{"title":"SDKs and APIs","href":"/connect/sdks/rust"}]},{"tab":"Reference","pages":[{"title":"Reference","href":"/connect/reference/packages"}]}]},{"product":"Recall","icon":"brain","description":"Shared, evidence-backed knowledge for applications and agents through HTTP and MCP.","pages":[{"title":"Recall","href":"/recall/introduction"}]}]},"basePath":"","title":"A custom device extension - Meerkat","buildId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","deploymentId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","dynamics":[],"chunks":[]}