[{"data":1,"prerenderedAt":558},["ShallowReactive",2],{"navigation_docs_en":3,"-en-developer-application-users":324,"-en-developer-application-users-surround":553},[4,30,72,112,200,314],{"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],{"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,"path":114,"stem":115,"children":116,"page":6},"Developer","\u002Fen\u002Fdeveloper","en\u002F5.developer",[117,171,195],{"title":118,"path":119,"stem":120,"children":121,"page":6},"Data Access","\u002Fen\u002Fdeveloper\u002Fapi","en\u002F5.developer\u002F1.api",[122,127,132,137,142,147,152,157,162,166],{"title":123,"path":124,"stem":125,"icon":126},"Overview","\u002Fen\u002Fdeveloper\u002Fapi\u002Foverview","en\u002F5.developer\u002F1.api\u002F1.overview","i-lucide-globe",{"title":128,"path":129,"stem":130,"icon":131},"Errors","\u002Fen\u002Fdeveloper\u002Fapi\u002Ferrors","en\u002F5.developer\u002F1.api\u002F10.errors","i-lucide-alert-triangle",{"title":133,"path":134,"stem":135,"icon":136},"Authentication","\u002Fen\u002Fdeveloper\u002Fapi\u002Fauthentication","en\u002F5.developer\u002F1.api\u002F2.authentication","i-lucide-lock",{"title":138,"path":139,"stem":140,"icon":141},"Reading Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Freading-data","en\u002F5.developer\u002F1.api\u002F3.reading-data","i-lucide-book-open",{"title":143,"path":144,"stem":145,"icon":146},"Writing Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Fwriting-data","en\u002F5.developer\u002F1.api\u002F4.writing-data","i-lucide-pencil",{"title":148,"path":149,"stem":150,"icon":151},"Filtering","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffiltering","en\u002F5.developer\u002F1.api\u002F5.filtering","i-lucide-filter",{"title":153,"path":154,"stem":155,"icon":156},"Field Selection","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffield-selection","en\u002F5.developer\u002F1.api\u002F6.field-selection","i-lucide-list-checks",{"title":158,"path":159,"stem":160,"icon":161},"Sorting & Pagination","\u002Fen\u002Fdeveloper\u002Fapi\u002Fsorting-pagination","en\u002F5.developer\u002F1.api\u002F7.sorting-pagination","i-lucide-arrow-up-down",{"title":163,"path":164,"stem":165,"icon":111},"Relational Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Frelational-data","en\u002F5.developer\u002F1.api\u002F8.relational-data",{"title":167,"path":168,"stem":169,"icon":170},"Files & Assets","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffiles","en\u002F5.developer\u002F1.api\u002F9.files","i-lucide-file-up",{"title":172,"path":173,"stem":174,"children":175,"page":6},"Client SDK","\u002Fen\u002Fdeveloper\u002Fsdk","en\u002F5.developer\u002F2.sdk",[176,180,185,190],{"title":177,"path":178,"stem":179,"icon":19},"Installation","\u002Fen\u002Fdeveloper\u002Fsdk\u002Finstallation","en\u002F5.developer\u002F2.sdk\u002F1.installation",{"title":181,"path":182,"stem":183,"icon":184},"Client Setup","\u002Fen\u002Fdeveloper\u002Fsdk\u002Fclient-setup","en\u002F5.developer\u002F2.sdk\u002F2.client-setup","i-lucide-settings",{"title":186,"path":187,"stem":188,"icon":189},"Type System","\u002Fen\u002Fdeveloper\u002Fsdk\u002Ftype-system","en\u002F5.developer\u002F2.sdk\u002F3.type-system","i-lucide-braces",{"title":191,"path":192,"stem":193,"icon":194},"Advanced","\u002Fen\u002Fdeveloper\u002Fsdk\u002Fadvanced","en\u002F5.developer\u002F2.sdk\u002F5.advanced","i-lucide-puzzle",{"title":196,"path":197,"stem":198,"icon":199},"Application Users","\u002Fen\u002Fdeveloper\u002Fapplication-users","en\u002F5.developer\u002F3.application-users","i-lucide-users",{"title":201,"path":202,"stem":203,"children":204,"page":6},"Reference","\u002Fen\u002Freference","en\u002F6.reference",[205,209,214,219,235,239,244,280,309],{"title":206,"path":207,"stem":208,"icon":184},"Configuration","\u002Fen\u002Freference\u002Fenvironment-variables","en\u002F6.reference\u002F1.environment-variables",{"title":210,"path":211,"stem":212,"icon":213},"System Requirements","\u002Fen\u002Freference\u002Fsystem-requirements","en\u002F6.reference\u002F2.system-requirements","i-lucide-server",{"title":215,"path":216,"stem":217,"icon":218},"Licensing","\u002Fen\u002Freference\u002Flicensing","en\u002F6.reference\u002F3.licensing","i-lucide-gem",{"title":220,"path":221,"stem":222,"children":223,"icon":81},"Connectors","\u002Fen\u002Freference\u002Fconnectors","en\u002F6.reference\u002F4.connectors\u002Findex",[224,225,230],{"title":220,"path":221,"stem":222,"icon":81},{"title":226,"path":227,"stem":228,"icon":229},"PostgreSQL and Supabase","\u002Fen\u002Freference\u002Fconnectors\u002Fpostgresql-supabase","en\u002F6.reference\u002F4.connectors\u002F1.postgresql-supabase","i-simple-icons-postgresql",{"title":231,"path":232,"stem":233,"icon":234},"MySQL and MariaDB","\u002Fen\u002Freference\u002Fconnectors\u002Fmysql-mariadb","en\u002F6.reference\u002F4.connectors\u002F2.mysql-mariadb","i-simple-icons-mysql",{"title":236,"path":237,"stem":238,"icon":189},"Data Types Representation","\u002Fen\u002Freference\u002Fdata-types","en\u002F6.reference\u002F5.data-types",{"title":240,"path":241,"stem":242,"icon":243},"Permissions Reference","\u002Fen\u002Freference\u002Fpermissions","en\u002F6.reference\u002F6.permissions","i-lucide-shield",{"title":245,"path":246,"stem":247,"children":248,"page":6},"API Reference","\u002Fen\u002Freference\u002Fapi-reference","en\u002F6.reference\u002F7.api-reference",[249,253,258],{"title":250,"path":251,"stem":252,"icon":213},"System Endpoints","\u002Fen\u002Freference\u002Fapi-reference\u002Fsystem-endpoints","en\u002F6.reference\u002F7.api-reference\u002F1.system-endpoints",{"title":254,"path":255,"stem":256,"icon":257},"OpenAPI Spec","\u002Fen\u002Freference\u002Fapi-reference\u002Fopenapi-spec","en\u002F6.reference\u002F7.api-reference\u002F2.openapi-spec","i-lucide-file-code",{"title":259,"path":260,"stem":261,"children":262,"icon":264},"Schema Migration","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002Findex",[263,265,270,275],{"title":259,"path":260,"stem":261,"icon":264},"i-lucide-database-zap",{"title":266,"path":267,"stem":268,"icon":269},"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":271,"path":272,"stem":273,"icon":274},"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":276,"path":277,"stem":278,"icon":279},"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":281,"path":282,"stem":283,"children":284,"page":6},"Design Considerations","\u002Fen\u002Freference\u002Fdesign-considerations","en\u002F6.reference\u002F8.design-considerations",[285,289,294,299,304],{"title":123,"path":286,"stem":287,"icon":288},"\u002Fen\u002Freference\u002Fdesign-considerations\u002Foverview","en\u002F6.reference\u002F8.design-considerations\u002F1.overview","i-lucide-compass",{"title":290,"path":291,"stem":292,"icon":293},"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":295,"path":296,"stem":297,"icon":298},"Overly Permissive Public Access","\u002Fen\u002Freference\u002Fdesign-considerations\u002Foverly-permissive","en\u002F6.reference\u002F8.design-considerations\u002F4.overly-permissive","i-lucide-shield-off",{"title":300,"path":301,"stem":302,"icon":303},"No Aggregates","\u002Fen\u002Freference\u002Fdesign-considerations\u002Fno-aggregates","en\u002F6.reference\u002F8.design-considerations\u002F5.no-aggregates","i-lucide-sigma",{"title":305,"path":306,"stem":307,"icon":308},"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":310,"path":311,"stem":312,"icon":313},"CLI","\u002Fen\u002Freference\u002Fcli","en\u002F6.reference\u002F9.cli","i-lucide-square-terminal",{"title":315,"icon":316,"path":317,"stem":318,"children":319,"page":6},"Release Notes","i-lucide-rocket","\u002Fen\u002Frelease-notes","en\u002F7.release-notes",[320],{"title":321,"path":322,"stem":323,"icon":316},"Changelog","\u002Fen\u002Frelease-notes\u002Fchangelog","en\u002F7.release-notes\u002F1.changelog",{"id":325,"title":196,"body":326,"description":546,"extension":547,"links":548,"meta":549,"navigation":550,"path":197,"seo":551,"stem":198,"__hash__":552},"docs_en\u002Fen\u002F5.developer\u002F3.application-users.md",{"type":327,"value":328,"toc":537},"minimark",[329,333,357,360,366,370,385,393,396,436,439,450,454,460,479,486,494,498,506,513,517],[330,331,133],"h2",{"id":332},"authentication",[334,335,336,337,344,345,350,351,356],"p",{},"Use your existing identity provider for app users, such as ",[338,339,343],"a",{"href":340,"rel":341},"https:\u002F\u002Fwww.keycloak.org\u002F",[342],"nofollow","Keycloak"," or ",[338,346,349],{"href":347,"rel":348},"https:\u002F\u002Fauth0.com\u002F",[342],"Auth0",". If you don't have one, use an authentication library such as ",[338,352,355],{"href":353,"rel":354},"https:\u002F\u002Fwww.better-auth.com\u002F",[342],"Better Auth",".",[334,358,359],{},"Reserve Monospace user accounts for people who need direct access to the Studio, API, or MCP server. Don't create Monospace accounts for people who only use your app.",[334,361,362,365],{},[338,363,364],{"href":89},"Monospace SSO"," lets those Monospace users sign in with an identity provider. Configure your app's sign-in separately.",[330,367,369],{"id":368},"user-relations","User Relations",[334,371,372,373,377,378,381,382,356],{},"To link app data to a user, use a ",[374,375,376],"strong",{},"collection"," -- a container for ",[374,379,380],{},"items"," of the same type. Each item's named values are its ",[374,383,384],{},"fields",[334,386,387,388,392],{},"You can also keep a ",[389,390,391],"code",{},"Users"," collection in Monospace for app profiles and user-linked data. Authentication stays with your provider or library; these items are separate from Monospace user accounts.",[334,394,395],{},"For a blog where app users write articles:",[397,398,399,410,417],"ol",{},[400,401,402,403,405,406,409],"li",{},"Create a ",[389,404,391],{}," collection with a ",[389,407,408],{},"user_id"," primary key. Store the user ID from your identity provider or auth library in that field.",[400,411,412,413,416],{},"Store app profile data, such as ",[389,414,415],{},"display_name",", on the same item.",[400,418,419,420,423,424,427,428,431,432,435],{},"Add an ",[389,421,422],{},"author"," relation to ",[389,425,426],{},"Articles",", pointing to ",[389,429,430],{},"Users.user_id",". This ",[374,433,434],{},"to-one"," relation links each article to one author.",[334,437,438],{},"If your data model already has a collection keyed by those user IDs, link to that collection instead.",[334,440,441,442,445,446,449],{},"Use a regular ",[374,443,444],{},"Relation"," field for these links. The built-in ",[374,447,448],{},"User"," field targets Monospace workspace members, so it doesn't represent your app's external users.",[330,451,453],{"id":452},"links-to-monospace-accounts","Links to Monospace Accounts",[334,455,456,457,459],{},"If an app user also needs Studio, API, or MCP access, link their custom ",[389,458,391],{}," item to their Monospace account.",[334,461,462,463,465,466,469,470,472,473,476,477,356],{},"In the Studio, add a ",[374,464,448],{}," field named ",[389,467,468],{},"monospace_user"," to your ",[389,471,391],{}," collection and choose ",[374,474,475],{},"Single User",". Set it to the matching workspace member, keeping the external auth ID in ",[389,478,408],{},[334,480,481,482,485],{},"Keep this field optional so app users without Monospace access remain unlinked. Turn on ",[374,483,484],{},"Exclusive"," if each Monospace member must link to at most one custom user item.",[334,487,488,489,493],{},"This creates a one-to-one relation that ",[338,490,492],{"href":491},"\u002Fen\u002Fconcepts\u002Faccess-permissions#dynamic-filters","dynamic permission filters"," can follow to your custom profile data.",[330,495,497],{"id":496},"server-access","Server Access",[334,499,500,501,505],{},"Connect your app's backend to Monospace with a scoped ",[338,502,504],{"href":503},"\u002Fen\u002Fdeveloper\u002Fapi\u002Fauthentication#service-accounts","service account",", keeping its API key on the server. Validate app sessions and enforce each app user's access in your backend before calling Monospace.",[334,507,508,509,512],{},"Monospace applies the service account's permissions to those requests. ",[389,510,511],{},"$CURRENT_USER"," identifies that service account, not the app user signed in through your auth system.",[330,514,516],{"id":515},"see-also","See Also",[518,519,520,525,531],"ul",{},[400,521,522,524],{},[338,523,133],{"href":134}," -- authenticate your backend's Monospace requests",[400,526,527,530],{},[338,528,39],{"href":529},"\u002Fen\u002Fconcepts\u002Fdata-model#relations"," -- configure relations between collections",[400,532,533,536],{},[338,534,535],{"href":45},"Access & Permissions"," -- scope your service account's access",{"title":538,"searchDepth":539,"depth":539,"links":540},"",2,[541,542,543,544,545],{"id":332,"depth":539,"text":133},{"id":368,"depth":539,"text":369},{"id":452,"depth":539,"text":453},{"id":496,"depth":539,"text":497},{"id":515,"depth":539,"text":516},"Choose authentication for your app's users and link their identities to your data model.","md",null,{},{"icon":199},{"title":196,"description":546},"RW0ZmAIw5lUKHvQ5LR0cnsRuvUlotlPzcxoVYjp1ReU",[554,556],{"title":191,"path":192,"stem":193,"description":555,"icon":194,"children":-1},"Handle composite keys, dynamic collections, and other special cases.",{"title":206,"path":207,"stem":208,"description":557,"icon":184,"children":-1},"Configuring your Monospace environment.",1790808343855]