[{"data":1,"prerenderedAt":1307},["ShallowReactive",2],{"navigation_docs_en":3,"-en-developer-extensions-install":445,"-en-developer-extensions-install-surround":1302},[4,30,72,132,260,436],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,15,20,25],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F1.getting-started\u002F3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Use Cases","\u002Fen\u002Fgetting-started\u002Fuse-cases","en\u002F1.getting-started\u002F4.use-cases","i-lucide-layers",{"title":26,"path":27,"stem":28,"icon":29},"Concepts","\u002Fen\u002Fgetting-started\u002Fconcepts","en\u002F1.getting-started\u002F5.concepts","i-lucide-book",{"title":26,"path":31,"stem":32,"children":33,"page":6},"\u002Fen\u002Fconcepts","en\u002F2.concepts",[34,38,43,48,53,58,63,68],{"title":35,"path":36,"stem":37,"icon":14},"Organization","\u002Fen\u002Fconcepts\u002Forganization","en\u002F2.concepts\u002F1.organization",{"title":39,"path":40,"stem":41,"icon":42},"Data Model","\u002Fen\u002Fconcepts\u002Fdata-model","en\u002F2.concepts\u002F2.data-model","i-lucide-database",{"title":44,"path":45,"stem":46,"icon":47},"Access Control","\u002Fen\u002Fconcepts\u002Faccess-permissions","en\u002F2.concepts\u002F3.access-permissions","i-lucide-user-key",{"title":49,"path":50,"stem":51,"icon":52},"Audit Logs","\u002Fen\u002Fconcepts\u002Faudit-logs","en\u002F2.concepts\u002F4.audit-logs","i-lucide-scroll-text",{"title":54,"path":55,"stem":56,"icon":57},"Introspection","\u002Fen\u002Fconcepts\u002Fintrospection","en\u002F2.concepts\u002F6.introspection","i-lucide-database-search",{"title":59,"path":60,"stem":61,"icon":62},"Query Engine","\u002Fen\u002Fconcepts\u002Fquery-engine","en\u002F2.concepts\u002F7.query-engine","i-lucide-workflow",{"title":64,"path":65,"stem":66,"icon":67},"AI","\u002Fen\u002Fconcepts\u002Fai","en\u002F2.concepts\u002F8.ai","i-lucide-sparkles",{"title":69,"path":70,"stem":71,"icon":42},"Caching","\u002Fen\u002Fconcepts\u002Fcaching","en\u002F2.concepts\u002F9.caching",{"title":73,"path":74,"stem":75,"children":76,"page":6},"Guides","\u002Fen\u002Fguides","en\u002F4.guides",[77,82,87,92,97,102,107,112],{"title":78,"path":79,"stem":80,"icon":81},"REST API Quickstart","\u002Fen\u002Fguides\u002Frest-api","en\u002F4.guides\u002F1.rest-api","i-lucide-plug",{"title":83,"path":84,"stem":85,"icon":86},"SDK Quickstart","\u002Fen\u002Fguides\u002Fsdk","en\u002F4.guides\u002F2.sdk","i-lucide-terminal",{"title":88,"path":89,"stem":90,"icon":91},"Configure SSO","\u002Fen\u002Fguides\u002Fconfigure-sso","en\u002F4.guides\u002F3.configure-sso","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"Configure MCP","\u002Fen\u002Fguides\u002Fmcp","en\u002F4.guides\u002F4.mcp","i-lucide-brain-cog",{"title":98,"path":99,"stem":100,"icon":101},"Customize Content Space","\u002Fen\u002Fguides\u002Fcustomize-content-space","en\u002F4.guides\u002F5.customize-content-space","i-lucide-columns-3-cog",{"title":103,"path":104,"stem":105,"icon":106},"Build an Application with AI Assistance","\u002Fen\u002Fguides\u002Fbuild-an-application","en\u002F4.guides\u002F6.build-an-application","i-lucide-route",{"title":108,"path":109,"stem":110,"icon":111},"Horizontal Scaling","\u002Fen\u002Fguides\u002Fhorizontal-scaling","en\u002F4.guides\u002F7.horizontal-scaling","i-lucide-network",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":6},"Data Connectors","i-lucide-cable","\u002Fen\u002Fguides\u002Fdata-connectors","en\u002F4.guides\u002F8.data-connectors",[118,122,127],{"title":16,"path":119,"stem":120,"icon":121},"\u002Fen\u002Fguides\u002Fdata-connectors\u002Fquickstart","en\u002F4.guides\u002F8.data-connectors\u002F1.quickstart","i-lucide-rocket",{"title":123,"path":124,"stem":125,"icon":126},"Build a Stripe Connector","\u002Fen\u002Fguides\u002Fdata-connectors\u002Fstripe","en\u002F4.guides\u002F8.data-connectors\u002F2.stripe","i-lucide-hammer",{"title":128,"path":129,"stem":130,"icon":131},"Build with AI Agents","\u002Fen\u002Fguides\u002Fdata-connectors\u002Fai-agents","en\u002F4.guides\u002F8.data-connectors\u002F3.ai-agents","i-lucide-bot",{"title":133,"path":134,"stem":135,"children":136,"page":6},"Developer","\u002Fen\u002Fdeveloper","en\u002F5.developer",[137,191,215,220],{"title":138,"path":139,"stem":140,"children":141,"page":6},"Data Access","\u002Fen\u002Fdeveloper\u002Fapi","en\u002F5.developer\u002F1.api",[142,147,152,157,162,167,172,177,182,186],{"title":143,"path":144,"stem":145,"icon":146},"Overview","\u002Fen\u002Fdeveloper\u002Fapi\u002Foverview","en\u002F5.developer\u002F1.api\u002F1.overview","i-lucide-globe",{"title":148,"path":149,"stem":150,"icon":151},"Errors","\u002Fen\u002Fdeveloper\u002Fapi\u002Ferrors","en\u002F5.developer\u002F1.api\u002F10.errors","i-lucide-alert-triangle",{"title":153,"path":154,"stem":155,"icon":156},"Authentication","\u002Fen\u002Fdeveloper\u002Fapi\u002Fauthentication","en\u002F5.developer\u002F1.api\u002F2.authentication","i-lucide-lock",{"title":158,"path":159,"stem":160,"icon":161},"Reading Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Freading-data","en\u002F5.developer\u002F1.api\u002F3.reading-data","i-lucide-book-open",{"title":163,"path":164,"stem":165,"icon":166},"Writing Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Fwriting-data","en\u002F5.developer\u002F1.api\u002F4.writing-data","i-lucide-pencil",{"title":168,"path":169,"stem":170,"icon":171},"Filtering","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffiltering","en\u002F5.developer\u002F1.api\u002F5.filtering","i-lucide-filter",{"title":173,"path":174,"stem":175,"icon":176},"Field Selection","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffield-selection","en\u002F5.developer\u002F1.api\u002F6.field-selection","i-lucide-list-checks",{"title":178,"path":179,"stem":180,"icon":181},"Sorting & Pagination","\u002Fen\u002Fdeveloper\u002Fapi\u002Fsorting-pagination","en\u002F5.developer\u002F1.api\u002F7.sorting-pagination","i-lucide-arrow-up-down",{"title":183,"path":184,"stem":185,"icon":111},"Relational Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Frelational-data","en\u002F5.developer\u002F1.api\u002F8.relational-data",{"title":187,"path":188,"stem":189,"icon":190},"Files & Assets","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffiles","en\u002F5.developer\u002F1.api\u002F9.files","i-lucide-file-up",{"title":192,"path":193,"stem":194,"children":195,"page":6},"Client SDK","\u002Fen\u002Fdeveloper\u002Fsdk","en\u002F5.developer\u002F2.sdk",[196,200,205,210],{"title":197,"path":198,"stem":199,"icon":19},"Installation","\u002Fen\u002Fdeveloper\u002Fsdk\u002Finstallation","en\u002F5.developer\u002F2.sdk\u002F1.installation",{"title":201,"path":202,"stem":203,"icon":204},"Client Setup","\u002Fen\u002Fdeveloper\u002Fsdk\u002Fclient-setup","en\u002F5.developer\u002F2.sdk\u002F2.client-setup","i-lucide-settings",{"title":206,"path":207,"stem":208,"icon":209},"Type System","\u002Fen\u002Fdeveloper\u002Fsdk\u002Ftype-system","en\u002F5.developer\u002F2.sdk\u002F3.type-system","i-lucide-braces",{"title":211,"path":212,"stem":213,"icon":214},"Advanced","\u002Fen\u002Fdeveloper\u002Fsdk\u002Fadvanced","en\u002F5.developer\u002F2.sdk\u002F5.advanced","i-lucide-puzzle",{"title":216,"path":217,"stem":218,"icon":219},"Application Users","\u002Fen\u002Fdeveloper\u002Fapplication-users","en\u002F5.developer\u002F3.application-users","i-lucide-users",{"title":221,"path":222,"stem":223,"children":224,"icon":214},"Extensions","\u002Fen\u002Fdeveloper\u002Fextensions","en\u002F5.developer\u002F3.extensions\u002Findex",[225,226,231],{"title":143,"path":222,"stem":223,"icon":214},{"title":227,"path":228,"stem":229,"icon":230},"Install and Manage Extensions","\u002Fen\u002Fdeveloper\u002Fextensions\u002Finstall","en\u002F5.developer\u002F3.extensions\u002F1.install","i-lucide-package-plus",{"title":113,"path":232,"stem":233,"children":234,"icon":114},"\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002Findex",[235,236,241,245,250,255],{"title":143,"path":232,"stem":233,"icon":114},{"title":237,"path":238,"stem":239,"icon":240},"How Data Connectors Run","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fruntime","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F2.runtime","i-lucide-cpu",{"title":242,"path":243,"stem":244,"icon":42},"Data Sources","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-sources","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F3.data-sources",{"title":246,"path":247,"stem":248,"icon":249},"Map an External Data Source","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-source-mapping","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F4.data-source-mapping","i-lucide-map",{"title":251,"path":252,"stem":253,"icon":254},"Handle Errors","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Ferrors","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F5.errors","i-lucide-shield-alert",{"title":256,"path":257,"stem":258,"icon":259},"Test a Data Connector","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Ftesting","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F6.testing","i-lucide-flask-conical",{"title":261,"path":262,"stem":263,"children":264,"page":6},"Reference","\u002Fen\u002Freference","en\u002F6.reference",[265,269,274,279,295,299,304,340,369,374],{"title":266,"path":267,"stem":268,"icon":204},"Configuration","\u002Fen\u002Freference\u002Fenvironment-variables","en\u002F6.reference\u002F1.environment-variables",{"title":270,"path":271,"stem":272,"icon":273},"System Requirements","\u002Fen\u002Freference\u002Fsystem-requirements","en\u002F6.reference\u002F2.system-requirements","i-lucide-server",{"title":275,"path":276,"stem":277,"icon":278},"Licensing","\u002Fen\u002Freference\u002Flicensing","en\u002F6.reference\u002F3.licensing","i-lucide-gem",{"title":280,"path":281,"stem":282,"children":283,"icon":81},"Connectors","\u002Fen\u002Freference\u002Fconnectors","en\u002F6.reference\u002F4.connectors\u002Findex",[284,285,290],{"title":280,"path":281,"stem":282,"icon":81},{"title":286,"path":287,"stem":288,"icon":289},"PostgreSQL and Supabase","\u002Fen\u002Freference\u002Fconnectors\u002Fpostgresql-supabase","en\u002F6.reference\u002F4.connectors\u002F1.postgresql-supabase","i-simple-icons-postgresql",{"title":291,"path":292,"stem":293,"icon":294},"MySQL and MariaDB","\u002Fen\u002Freference\u002Fconnectors\u002Fmysql-mariadb","en\u002F6.reference\u002F4.connectors\u002F2.mysql-mariadb","i-simple-icons-mysql",{"title":296,"path":297,"stem":298,"icon":209},"Data Types Representation","\u002Fen\u002Freference\u002Fdata-types","en\u002F6.reference\u002F5.data-types",{"title":300,"path":301,"stem":302,"icon":303},"Permissions Reference","\u002Fen\u002Freference\u002Fpermissions","en\u002F6.reference\u002F6.permissions","i-lucide-shield",{"title":305,"path":306,"stem":307,"children":308,"page":6},"API Reference","\u002Fen\u002Freference\u002Fapi-reference","en\u002F6.reference\u002F7.api-reference",[309,313,318],{"title":310,"path":311,"stem":312,"icon":273},"System Endpoints","\u002Fen\u002Freference\u002Fapi-reference\u002Fsystem-endpoints","en\u002F6.reference\u002F7.api-reference\u002F1.system-endpoints",{"title":314,"path":315,"stem":316,"icon":317},"OpenAPI Spec","\u002Fen\u002Freference\u002Fapi-reference\u002Fopenapi-spec","en\u002F6.reference\u002F7.api-reference\u002F2.openapi-spec","i-lucide-file-code",{"title":319,"path":320,"stem":321,"children":322,"icon":324},"Schema Migration","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002Findex",[323,325,330,335],{"title":319,"path":320,"stem":321,"icon":324},"i-lucide-database-zap",{"title":326,"path":327,"stem":328,"icon":329},"Apply Migrations","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration\u002Fapply-migrations","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002F1.apply-migrations","i-lucide-upload",{"title":331,"path":332,"stem":333,"icon":334},"Import Changes","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration\u002Fimport-changes","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002F2.import-changes","i-lucide-refresh-cw",{"title":336,"path":337,"stem":338,"icon":339},"Operation Reference","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration\u002Foperation-reference","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002F3.operation-reference","i-lucide-list-tree",{"title":341,"path":342,"stem":343,"children":344,"page":6},"Design Considerations","\u002Fen\u002Freference\u002Fdesign-considerations","en\u002F6.reference\u002F8.design-considerations",[345,349,354,359,364],{"title":143,"path":346,"stem":347,"icon":348},"\u002Fen\u002Freference\u002Fdesign-considerations\u002Foverview","en\u002F6.reference\u002F8.design-considerations\u002F1.overview","i-lucide-compass",{"title":350,"path":351,"stem":352,"icon":353},"Instance Configuration","\u002Fen\u002Freference\u002Fdesign-considerations\u002Finstance-configuration-related-problems","en\u002F6.reference\u002F8.design-considerations\u002F3.instance-configuration-related-problems","i-lucide-wrench",{"title":355,"path":356,"stem":357,"icon":358},"Overly Permissive Public Access","\u002Fen\u002Freference\u002Fdesign-considerations\u002Foverly-permissive","en\u002F6.reference\u002F8.design-considerations\u002F4.overly-permissive","i-lucide-shield-off",{"title":360,"path":361,"stem":362,"icon":363},"No Aggregates","\u002Fen\u002Freference\u002Fdesign-considerations\u002Fno-aggregates","en\u002F6.reference\u002F8.design-considerations\u002F5.no-aggregates","i-lucide-sigma",{"title":365,"path":366,"stem":367,"icon":368},"Cross-Data-Source Referential Integrity","\u002Fen\u002Freference\u002Fdesign-considerations\u002Fcross-data-source-referential-integrity","en\u002F6.reference\u002F8.design-considerations\u002F6.cross-data-source-referential-integrity","i-lucide-unlink",{"title":370,"path":371,"stem":372,"icon":373},"CLI","\u002Fen\u002Freference\u002Fcli","en\u002F6.reference\u002F9.cli","i-lucide-square-terminal",{"title":221,"path":375,"stem":376,"children":377,"page":6},"\u002Fen\u002Freference\u002Fextensions","en\u002F6.reference\u002F9.extensions",[378,383,386,405],{"title":379,"path":380,"stem":381,"icon":382},"Extension Config and Manifest","\u002Fen\u002Freference\u002Fextensions\u002Fmanifest","en\u002F6.reference\u002F9.extensions\u002F1.manifest","i-lucide-file-json",{"title":370,"path":384,"stem":385,"icon":86},"\u002Fen\u002Freference\u002Fextensions\u002Fcli","en\u002F6.reference\u002F9.extensions\u002F2.cli",{"title":387,"path":388,"stem":389,"children":390,"page":6},"Extension Kit","\u002Fen\u002Freference\u002Fextensions\u002Fextension-kit","en\u002F6.reference\u002F9.extensions\u002F3.extension-kit",[391,395,400],{"title":392,"path":393,"stem":394,"icon":81},"Data Connector","\u002Fen\u002Freference\u002Fextensions\u002Fextension-kit\u002Fdata-connector","en\u002F6.reference\u002F9.extensions\u002F3.extension-kit\u002F1.data-connector",{"title":396,"path":397,"stem":398,"icon":399},"Protocol","\u002Fen\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol","en\u002F6.reference\u002F9.extensions\u002F3.extension-kit\u002F2.protocol","i-lucide-arrow-left-right",{"title":401,"path":402,"stem":403,"icon":404},"Schema Helpers","\u002Fen\u002Freference\u002Fextensions\u002Fextension-kit\u002Fexperimental","en\u002F6.reference\u002F9.extensions\u002F3.extension-kit\u002F3.experimental","i-lucide-blocks",{"title":113,"path":406,"stem":407,"children":408,"page":6},"\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors",[409,413,417,421,426,431],{"title":410,"path":411,"stem":412,"icon":81},"Data Connector API","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Fapi","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F1.api",{"title":414,"path":415,"stem":416,"icon":176},"Operations and Operators","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Foperations","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F2.operations",{"title":148,"path":418,"stem":419,"icon":420},"\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Ferrors","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F3.errors","i-lucide-triangle-alert",{"title":422,"path":423,"stem":424,"icon":425},"Runtime Limits","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Flimits","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F4.limits","i-lucide-gauge",{"title":427,"path":428,"stem":429,"icon":430},"Limitations","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Flimitations","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F5.limitations","i-lucide-ban",{"title":432,"path":433,"stem":434,"icon":435},"Network Permissions","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Fpermissions","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F6.permissions","i-lucide-shield-check",{"title":437,"icon":121,"path":438,"stem":439,"children":440,"page":6},"Release Notes","\u002Fen\u002Frelease-notes","en\u002F7.release-notes",[441],{"title":442,"path":443,"stem":444,"icon":121},"Changelog","\u002Fen\u002Frelease-notes\u002Fchangelog","en\u002F7.release-notes\u002F1.changelog",{"id":446,"title":227,"body":447,"description":1295,"extension":1296,"links":1297,"meta":1298,"navigation":1299,"path":228,"seo":1300,"stem":229,"__hash__":1301},"docs_en\u002Fen\u002F5.developer\u002F3.extensions\u002F1.install.md",{"type":448,"value":449,"toc":1281},"minimark",[450,453,457,470,484,488,502,553,564,575,632,639,643,663,670,691,702,709,786,847,857,861,871,882,893,897,904,983,1011,1017,1022,1040,1052,1055,1065,1104,1149,1155,1158,1161,1167,1174,1178,1181,1188,1192,1238,1242,1277],[451,452],"preview",{},[454,455,143],"h2",{"id":456},"overview",[458,459,460,461,465,466,469],"p",{},"Monospace is self-hosted. Installing an ",[462,463,464],"strong",{},"extension"," means placing its built directory in your ",[462,467,468],{},"instance","'s install location, the directory Engine scans for extensions. An instance is a running Monospace deployment. There is no install API, no upload in Studio, and no marketplace.",[458,471,472,473,478,479,483],{},"Installing, reloading, updating, and removing work the same way for every extension, whatever its entry types. Every installed extension is available to every ",[474,475,477],"a",{"href":476},"\u002Fconcepts\u002Forganization#glossary","workspace"," on the instance. What an entry type needs after installation is covered in its own section. For data connector extensions, see ",[474,480,482],{"href":481},"\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-sources","Manage Data Sources",".",[454,485,487],{"id":486},"choose-the-install-location","Choose the Install Location",[458,489,490,491,496,497,501],{},"Engine reads extensions from the directory in ",[492,493],"env-var",{"name":494,"section":495},"extensions__install_location","extensions",". The default is ",[498,499,500],"code",{},".\u002Fextensions",", resolved against Engine's working directory.",[503,504,505,521],"table",{},[506,507,508],"thead",{},[509,510,511,515,518],"tr",{},[512,513,514],"th",{},"Variable",[512,516,517],{},"Default",[512,519,520],{},"Effect",[522,523,524,538],"tbody",{},[509,525,526,531,535],{},[527,528,529],"td",{},[492,530],{"name":494,"section":495},[527,532,533],{},[498,534,500],{},[527,536,537],{},"Directory Engine scans for installed extensions",[509,539,540,545,550],{},[527,541,542],{},[492,543],{"name":544,"section":495},"extensions__auto_reload",[527,546,547],{},[498,548,549],{},"false",[527,551,552],{},"Watches the install location and reloads changed extensions without a restart",[458,554,555,556,559,560,563],{},"Each subdirectory of the install location that contains a ",[498,557,558],{},"manifest.json"," is one installed extension. The CLI names it ",[498,561,562],{},"\u003Cnamespace>__\u003Cname>"," after the extension id, but Engine reads the id from the manifest, not the directory name:",[565,566,573],"pre",{"className":567,"code":569,"filename":570,"language":571,"meta":572},[568],"language-text","extensions\u002F\n└── example__artic\u002F\n    ├── manifest.json\n    └── example\u002F\n        └── artic-connector.js\n","extensions\u002F","text","",[498,574,569],{"__ignoreMap":572},[503,576,577,587],{},[506,578,579],{},[509,580,581,584],{},[512,582,583],{},"Rule",[512,585,586],{},"Behavior",[522,588,589,597,605,613,624],{},[509,590,591,594],{},[527,592,593],{},"Missing or unreadable install location",[527,595,596],{},"Engine starts with no extensions installed and logs that none were loaded",[509,598,599,602],{},[527,600,601],{},"Subdirectory with an invalid manifest",[527,603,604],{},"Skipped with a warning. Other extensions still load",[509,606,607,610],{},[527,608,609],{},"Two subdirectories with the same extension id",[527,611,612],{},"The first in sorted directory order loads; the other is skipped",[509,614,615,618],{},[527,616,617],{},"Two extensions with the same entry id",[527,619,620,621],{},"The entry from the first extension in sorted directory order loads. The later extension loads without that entry, and Engine logs ",[498,622,623],{},"skipping provider declared in installed bundle",[509,625,626,629],{},[527,627,628],{},"Symlinked subdirectory",[527,630,631],{},"Not loaded. Place a real directory in the install location",[458,633,634,635,638],{},"See ",[474,636,379],{"href":637},"\u002Freference\u002Fextensions\u002Fmanifest#install-directory-layout"," for the layout rules.",[454,640,642],{"id":641},"run-monospace-in-docker","Run Monospace in Docker",[458,644,645,646,649,650,653,654,658,659,662],{},"The Monospace image runs Engine from ",[498,647,648],{},"\u002Fmonospace",", so the default install location inside the container is ",[498,651,652],{},"\u002Fmonospace\u002Fextensions",". The ",[474,655,657],{"href":656},"\u002Fgetting-started\u002Finstallation","quick-start compose file"," mounts the named volume ",[498,660,661],{},"extensions_data"," there, which keeps installed extensions across restarts. To install extensions you build on this machine, replace that volume with a bind mount of a host directory.",[458,664,665,666,669],{},"Create the directory next to your ",[498,667,668],{},"docker-compose.yaml"," first:",[565,671,676],{"className":672,"code":673,"filename":674,"language":675,"meta":572,"style":572},"language-bash shiki shiki-themes monospace-light monospace-light monospace-dark","mkdir extensions\n","terminal","bash",[498,677,678],{"__ignoreMap":572},[679,680,683,687],"span",{"class":681,"line":682},"line",1,[679,684,686],{"class":685},"ssBNi","mkdir",[679,688,690],{"class":689},"suKVh"," extensions\n",[458,692,693,694,697,698,701],{},"Creating it yourself makes your user its owner, instead of leaving it to Docker. A CLI run without write access to the install location fails: with ",[498,695,696],{},"extension.install_dir_unusable"," when it can't inspect or create the install directory, and with ",[498,699,700],{},"extension.install_failed"," when copying the build into it fails.",[458,703,704,705,708],{},"In the ",[498,706,707],{},"monospace"," service, swap the named volume for the bind mount the quick-start file lists, and uncomment automatic reloading:",[565,710,714],{"className":711,"code":712,"filename":668,"language":713,"meta":572,"style":572},"language-yaml shiki shiki-themes monospace-light monospace-light monospace-dark","  monospace:\n    volumes:\n      - keys_data:\u002Fkeys:ro\n      - uploads_data:\u002Fmonospace\u002Fuploads\n      # - extensions_data:\u002Fmonospace\u002Fextensions\n      - .\u002Fextensions:\u002Fmonospace\u002Fextensions\n    environment:\n      MONOSPACE_EXTENSIONS__AUTO_RELOAD: \"true\"\n","yaml",[498,715,716,726,734,743,751,758,766,774],{"__ignoreMap":572},[679,717,718,722],{"class":681,"line":682},[679,719,721],{"class":720},"s3wuB","  monospace",[679,723,725],{"class":724},"sTMul",":\n",[679,727,729,732],{"class":681,"line":728},2,[679,730,731],{"class":720},"    volumes",[679,733,725],{"class":724},[679,735,737,740],{"class":681,"line":736},3,[679,738,739],{"class":724},"      - ",[679,741,742],{"class":689},"keys_data:\u002Fkeys:ro\n",[679,744,746,748],{"class":681,"line":745},4,[679,747,739],{"class":724},[679,749,750],{"class":689},"uploads_data:\u002Fmonospace\u002Fuploads\n",[679,752,754],{"class":681,"line":753},5,[679,755,757],{"class":756},"seNfP","      # - extensions_data:\u002Fmonospace\u002Fextensions\n",[679,759,761,763],{"class":681,"line":760},6,[679,762,739],{"class":724},[679,764,765],{"class":689},".\u002Fextensions:\u002Fmonospace\u002Fextensions\n",[679,767,769,772],{"class":681,"line":768},7,[679,770,771],{"class":720},"    environment",[679,773,725],{"class":724},[679,775,777,780,783],{"class":681,"line":776},8,[679,778,779],{"class":720},"      MONOSPACE_EXTENSIONS__AUTO_RELOAD",[679,781,782],{"class":724},": ",[679,784,785],{"class":689},"\"true\"\n",[503,787,788,798],{},[506,789,790],{},[509,791,792,795],{},[512,793,794],{},"Setting",[512,796,797],{},"Why",[522,799,800,817,837],{},[509,801,802,807],{},[527,803,804],{},[498,805,806],{},".\u002Fextensions:\u002Fmonospace\u002Fextensions",[527,808,809,810,813,814,816],{},"Point ",[498,811,812],{},"monospace extension build --install-to"," at ",[498,815,500],{}," on the host, and Engine sees the build in its install location",[509,818,819,822],{},[527,820,821],{},"Readable files",[527,823,824,825,828,829,832,833,836],{},"The container runs as user ",[498,826,827],{},"65532",", so that user must be able to read every file and enter every directory (e.g., ",[498,830,831],{},"644"," files and ",[498,834,835],{},"755"," directories)",[509,838,839,844],{},[527,840,841],{},[498,842,843],{},"MONOSPACE_EXTENSIONS__AUTO_RELOAD",[527,845,846],{},"Loads new and changed extensions without restarting the container",[458,848,849,850,853,854,483],{},"Restart the stack with ",[498,851,852],{},"docker compose up -d"," to apply the change. On macOS, changes made on the host through a bind mount can miss the container. If a new install doesn't load, run ",[498,855,856],{},"docker compose restart monospace",[454,858,860],{"id":859},"reload-extensions-automatically","Reload Extensions Automatically",[458,862,863,864,866,867,870],{},"Engine scans the install location once at startup. With ",[492,865],{"name":544,"section":495}," set to ",[498,868,869],{},"true",", it also watches the location and rescans once changed files have been quiet for 500 ms.",[458,872,873,874,877,878,881],{},"At startup, Engine logs ",[498,875,876],{},"watching installed bundles directory for changes"," when the watcher runs. The install location must exist when Engine starts. If it doesn't, Engine logs ",[498,879,880],{},"failed to watch installed bundles directory; bundle hot reloading is inactive",", and only a restart picks up extensions.",[458,883,884,885,888,889,483],{},"The CLI's install summary ends with ",[498,886,887],{},"Restart the engine to load it, unless it runs with MONOSPACE_EXTENSIONS__AUTO_RELOAD=true."," With automatic reloading on, no restart is needed, except after a data connector build that changes its query capabilities. See ",[474,890,892],{"href":891},"#update-an-extension","Update an Extension",[454,894,896],{"id":895},"install-an-extension","Install an Extension",[458,898,899,900,903],{},"Build the extension and install it in one step with ",[498,901,902],{},"--install-to",", from the extension project's root:",[905,906,908,933,949,965],"code-group",{"sync":907},"pm",[565,909,912],{"className":672,"code":910,"filename":911,"language":675,"meta":572,"style":572},"npm run build -- --install-to ..\u002Fmonospace\u002Fextensions\n","npm",[498,913,914],{"__ignoreMap":572},[679,915,916,918,921,924,927,930],{"class":681,"line":682},[679,917,911],{"class":685},[679,919,920],{"class":689}," run",[679,922,923],{"class":689}," build",[679,925,926],{"class":685}," --",[679,928,929],{"class":685}," --install-to",[679,931,932],{"class":689}," ..\u002Fmonospace\u002Fextensions\n",[565,934,937],{"className":672,"code":935,"filename":936,"language":675,"meta":572,"style":572},"pnpm build --install-to ..\u002Fmonospace\u002Fextensions\n","pnpm",[498,938,939],{"__ignoreMap":572},[679,940,941,943,945,947],{"class":681,"line":682},[679,942,936],{"class":685},[679,944,923],{"class":689},[679,946,929],{"class":685},[679,948,932],{"class":689},[565,950,953],{"className":672,"code":951,"filename":952,"language":675,"meta":572,"style":572},"yarn build --install-to ..\u002Fmonospace\u002Fextensions\n","yarn",[498,954,955],{"__ignoreMap":572},[679,956,957,959,961,963],{"class":681,"line":682},[679,958,952],{"class":685},[679,960,923],{"class":689},[679,962,929],{"class":685},[679,964,932],{"class":689},[565,966,969],{"className":672,"code":967,"filename":968,"language":675,"meta":572,"style":572},"bun run build --install-to ..\u002Fmonospace\u002Fextensions\n","bun",[498,970,971],{"__ignoreMap":572},[679,972,973,975,977,979,981],{"class":681,"line":682},[679,974,968],{"class":685},[679,976,920],{"class":689},[679,978,923],{"class":689},[679,980,929],{"class":685},[679,982,932],{"class":689},[458,984,985,986,989,990,993,994,997,998,1001,1002,1005,1006,1010],{},"The ",[498,987,988],{},"build"," script is the one ",[498,991,992],{},"monospace extension create"," scaffolds; it runs ",[498,995,996],{},"monospace extension build",". ",[498,999,1000],{},"..\u002Fmonospace\u002Fextensions"," is the install location on the host, here the directory mounted into the container. The CLI writes the build to ",[498,1003,1004],{},"\u003Cinstall-to>\u002F\u003Cnamespace>__\u003Cname>\u002F"," and replaces a previous install of the same extension whole. See ",[474,1007,1009],{"href":1008},"\u002Freference\u002Fextensions\u002Fcli#install-a-build","Install a Build"," for the rules.",[458,1012,1013,1014,1016],{},"To install an extension someone else built, copy its directory (the one containing ",[498,1015,558],{},") into the install location.",[1018,1019,1021],"h3",{"id":1020},"check-the-install","Check the Install",[458,1023,873,1024,1027,1028,1031,1032,1035,1036,1039],{},[498,1025,1026],{},"loaded installed bundle"," with the extension id for each extension it loads. With automatic reloading on, it logs ",[498,1029,1030],{},"bundle installed"," when a new extension appears and ",[498,1033,1034],{},"bundle changed; restarting its data sources"," when an installed one changes. It logs ",[498,1037,1038],{},"skipping installed bundle"," with the reason when the manifest is invalid. These logs confirm the manifest and file layout; the extension's code first runs when it's used.",[458,1041,1042,1043,1047,1048,483],{},"For data connectors, check that each entry loaded with ",[474,1044,1046],{"href":1045},"\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-sources#list-installed-data-connectors","List Installed Data Connectors",", or in Studio as described in ",[474,1049,1051],{"href":1050},"#find-extensions-in-studio","Find Extensions in Studio",[454,1053,1051],{"id":1054},"find-extensions-in-studio",[458,1056,1057,1058,1061,1062,1064],{},"Studio lists installed extensions with no setting to turn on. Each list shows an extension's name and id, then each of its entries, such as ",[498,1059,1060],{},"example\u002Fartic-connector"," marked ",[462,1063,392],{},":",[503,1066,1067,1077],{},[506,1068,1069],{},[509,1070,1071,1074],{},[512,1072,1073],{},"Where",[512,1075,1076],{},"What it lists",[522,1078,1079,1092],{},[509,1080,1081,1089],{},[527,1082,1083,1086,1087],{},[462,1084,1085],{},"Workspace Settings"," > ",[462,1088,221],{},[527,1090,1091],{},"The extensions available to the workspace",[509,1093,1094,1101],{},[527,1095,1096,1086,1098,1100],{},[462,1097,35],{},[462,1099,221],{}," in the settings dialog, opened from your avatar",[527,1102,1103],{},"Every extension installed in the organization",[458,1105,1106,1107,1110,1111,1113,1114,1117,1118,1120,1121,1125,1126,1129,1130,1134,1135,1086,1137,1140,1141,1144,1145,483],{},"Both pages are marked ",[462,1108,1109],{},"Preview",", and each requires the ",[498,1112,464],{}," ",[498,1115,1116],{},"read"," entitlement. ",[462,1119,1085],{}," checks the ",[474,1122,1124],{"href":1123},"\u002Freference\u002Fpermissions#workspace-entitlements","workspace entitlement",", which the built-in ",[462,1127,1128],{},"Studio Access"," policy includes. The settings dialog checks the ",[474,1131,1133],{"href":1132},"\u002Freference\u002Fpermissions#organization-entitlements","organization entitlement",". Data connectors also appear when you add a data source: ",[462,1136,39],{},[462,1138,1139],{},"Add Source"," lists each one, marked ",[462,1142,1143],{},"Extension",". See ",[474,1146,1148],{"href":1147},"\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-sources#add-a-data-source-in-studio","Add a Data Source in Studio",[458,1150,1151,1152,483],{},"If a new install is missing from these lists, Engine hasn't loaded it. See ",[474,1153,1021],{"href":1154},"#check-the-install",[454,1156,892],{"id":1157},"update-an-extension",[458,1159,1160],{},"Install the new build over the old one. The CLI replaces the extension's directory whole. When you copy files by hand, replace the directory rather than merging into it.",[458,1162,1163,1164,483],{},"With automatic reloading on, Engine picks up the new build once its files stop changing. Without automatic reloading, restart the instance. If the new build's manifest is invalid, Engine treats the extension as removed; see ",[474,1165,1166],{"href":637},"Install Directory Layout",[458,1168,1169,1170,483],{},"For data connectors, an update can require changes to existing data sources. With automatic reloading on, a build that changes an entry's query capabilities deactivates the entry's existing data sources until a restart or a workspace rebuild. See ",[474,1171,1173],{"href":1172},"\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-sources#update-data-sources-after-an-extension-update","Update Data Sources After an Extension Update",[454,1175,1177],{"id":1176},"remove-an-extension","Remove an Extension",[458,1179,1180],{},"Delete the extension's directory from the install location. Without automatic reloading, restart the instance so Engine drops it from the installed extensions.",[458,1182,1183,1184,483],{},"For data connectors, delete the data sources that use the extension first. See ",[474,1185,1187],{"href":1186},"\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-sources#before-you-remove-an-extension","Before You Remove an Extension",[454,1189,1191],{"id":1190},"limits-of-self-hosted-installs","Limits of Self-Hosted Installs",[503,1193,1194,1204],{},[506,1195,1196],{},[509,1197,1198,1201],{},[512,1199,1200],{},"Not available",[512,1202,1203],{},"Instead",[522,1205,1206,1214,1222,1230],{},[509,1207,1208,1211],{},[527,1209,1210],{},"Install API or Studio upload",[527,1212,1213],{},"Place the built directory in the install location",[509,1215,1216,1219],{},[527,1217,1218],{},"Marketplace or registry",[527,1220,1221],{},"Distribute the built directory yourself",[509,1223,1224,1227],{},[527,1225,1226],{},"Two versions of one extension side by side",[527,1228,1229],{},"One directory per extension id. A second directory with the same id is skipped",[509,1231,1232,1235],{},[527,1233,1234],{},"Per-workspace installs",[527,1236,1237],{},"Every extension in the install location is available to every workspace",[454,1239,1241],{"id":1240},"see-also","See Also",[1243,1244,1245,1253,1258,1270],"ul",{},[1246,1247,1248,1252],"li",{},[474,1249,1251],{"href":1250},"\u002Fguides\u002Fdata-connectors\u002Fquickstart","Data Connector Quickstart",": build, install, and query a first data connector",[1246,1254,1255,1257],{},[474,1256,482],{"href":481},": create, update, and delete the data sources that use a data connector",[1246,1259,1260,782,1263,1265,1266,1269],{},[474,1261,370],{"href":1262},"\u002Freference\u002Fextensions\u002Fcli",[498,1264,902],{},", ",[498,1267,1268],{},"--watch",", and the CLI's error codes",[1246,1271,1272,1276],{},[474,1273,1275],{"href":1274},"\u002Freference\u002Fenvironment-variables#extensions","Environment Variables",": the extensions settings",[1278,1279,1280],"style",{},"html pre.shiki code .ssBNi, html code.shiki .ssBNi{--shiki-light:#1659E9;--shiki-default:#1659E9;--shiki-dark:#94B3F5}html pre.shiki code .suKVh, html code.shiki .suKVh{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#F8FAFC}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s3wuB, html code.shiki .s3wuB{--shiki-light:#22863A;--shiki-default:#22863A;--shiki-dark:#22863A}html pre.shiki code .sTMul, html code.shiki .sTMul{--shiki-light:#1F2937;--shiki-default:#1F2937;--shiki-dark:#94A3B8}html pre.shiki code .seNfP, html code.shiki .seNfP{--shiki-light:#64748B;--shiki-default:#64748B;--shiki-dark:#94A3B8}",{"title":572,"searchDepth":728,"depth":728,"links":1282},[1283,1284,1285,1286,1287,1290,1291,1292,1293,1294],{"id":456,"depth":728,"text":143},{"id":486,"depth":728,"text":487},{"id":641,"depth":728,"text":642},{"id":859,"depth":728,"text":860},{"id":895,"depth":728,"text":896,"children":1288},[1289],{"id":1020,"depth":736,"text":1021},{"id":1054,"depth":728,"text":1051},{"id":1157,"depth":728,"text":892},{"id":1176,"depth":728,"text":1177},{"id":1190,"depth":728,"text":1191},{"id":1240,"depth":728,"text":1241},"Learn where a self-hosted instance loads extensions from, and how to install, reload, update, and remove them.","md",null,{},{"icon":230},{"title":227,"description":1295},"gSOMpp7hRkNZs4AZUeLUpM_Ls4jaD6ydKu542uuhEBc",[1303,1305],{"title":143,"path":222,"stem":223,"description":1304,"icon":214,"children":-1},"Learn what extensions are, what you can build with them today, and how an extension goes from code to a running capability in your instance.",{"title":143,"path":232,"stem":233,"description":1306,"icon":114,"children":-1},"Understand how data connector extensions serve live queries, what their operations contract promises, and whether your external data source fits.",1790840120583]