[{"data":1,"prerenderedAt":1421},["ShallowReactive",2],{"navigation":3,"\u002Fconcepts\u002Fpermissions":773,"\u002Fconcepts\u002Fpermissions-surround":1416},[4,28,63,85,103,112,269,355,453,485,506,542,576,594,647,669,693,721,747],{"title":5,"path":6,"stem":7,"children":8,"icon":27},"Getting Started","\u002Fgetting-started","01.getting-started\u002F01.index",[9,11,15,19,23],{"title":10,"path":6,"stem":7},"Introduction",{"title":12,"path":13,"stem":14},"Installation","\u002Fgetting-started\u002Finstallation","01.getting-started\u002F02.installation",{"title":16,"path":17,"stem":18},"Quickstart with AI","\u002Fgetting-started\u002Fquickstart-with-ai","01.getting-started\u002F03.quickstart-with-ai",{"title":20,"path":21,"stem":22},"Quickstart by Hand","\u002Fgetting-started\u002Fquickstart-by-hand","01.getting-started\u002F04.quickstart-by-hand",{"title":24,"path":25,"stem":26},"The Admin","\u002Fgetting-started\u002Fadmin-tour","01.getting-started\u002F05.admin-tour","i-lucide-rocket",{"title":29,"icon":30,"path":31,"stem":32,"children":33,"page":62},"Concepts","i-lucide-lightbulb","\u002Fconcepts","02.concepts",[34,38,42,46,50,54,58],{"title":35,"path":36,"stem":37},"PostgreSQL First","\u002Fconcepts\u002Fpostgresql-first","02.concepts\u002F01.postgresql-first",{"title":39,"path":40,"stem":41},"Resources","\u002Fconcepts\u002Fresources","02.concepts\u002F02.resources",{"title":43,"path":44,"stem":45},"Users and Roles","\u002Fconcepts\u002Fusers-and-roles","02.concepts\u002F03.users-and-roles",{"title":47,"path":48,"stem":49},"Permissions","\u002Fconcepts\u002Fpermissions","02.concepts\u002F04.permissions",{"title":51,"path":52,"stem":53},"Drafts and Publishing","\u002Fconcepts\u002Fdrafts-and-publishing","02.concepts\u002F05.drafts-and-publishing",{"title":55,"path":56,"stem":57},"Audit and Events","\u002Fconcepts\u002Faudit-and-events","02.concepts\u002F06.audit-and-events",{"title":59,"path":60,"stem":61},"Object Access","\u002Fconcepts\u002Fobject-access","02.concepts\u002F07.object-access",false,{"title":64,"icon":65,"path":66,"stem":67,"children":68,"page":62},"App","i-lucide-app-window","\u002Fapp","03.app",[69,73,77,81],{"title":70,"path":71,"stem":72},"The App","\u002Fapp\u002Foverview","03.app\u002F01.overview",{"title":74,"path":75,"stem":76},"DataViews","\u002Fapp\u002Fdataviews","03.app\u002F02.dataviews",{"title":78,"path":79,"stem":80},"Dashboards","\u002Fapp\u002Fdashboards","03.app\u002F03.dashboards",{"title":82,"path":83,"stem":84},"Arrange menu","\u002Fapp\u002Farrange-menu","03.app\u002F04.arrange-menu",{"title":86,"icon":87,"path":88,"stem":89,"children":90,"page":62},"Database","i-lucide-database","\u002Fdatabase","04.database",[91,95,99],{"title":92,"path":93,"stem":94},"Tables","\u002Fdatabase\u002Ftables","04.database\u002F01.tables",{"title":96,"path":97,"stem":98},"Views","\u002Fdatabase\u002Fviews","04.database\u002F02.views",{"title":100,"path":101,"stem":102},"Functions","\u002Fdatabase\u002Ffunctions","04.database\u002F03.functions",{"title":104,"icon":105,"path":106,"stem":107,"children":108,"page":62},"SQL Console","i-lucide-square-terminal","\u002Fsql-console","05.sql-console",[109],{"title":104,"path":110,"stem":111},"\u002Fsql-console\u002Foverview","05.sql-console\u002F01.overview",{"title":74,"icon":113,"path":114,"stem":115,"children":116,"page":62},"i-lucide-layout-list","\u002Fdataviews","06.dataviews",[117,121,125,129,183,214],{"title":118,"path":119,"stem":120},"Overview","\u002Fdataviews\u002Foverview","06.dataviews\u002F01.overview",{"title":122,"path":123,"stem":124},"Creating a DataView","\u002Fdataviews\u002Fcreating","06.dataviews\u002F02.creating",{"title":126,"path":127,"stem":128},"Publishing","\u002Fdataviews\u002Fpublishing","06.dataviews\u002F03.publishing",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":62},"Types","i-lucide-shapes","\u002Fdataviews\u002Ftypes","06.dataviews\u002F04.types",[135,139,143,147,151,155,159,163,167,171,175,179],{"title":136,"path":137,"stem":138},"Table","\u002Fdataviews\u002Ftypes\u002Ftable","06.dataviews\u002F04.types\u002F01.table",{"title":140,"path":141,"stem":142},"Cards","\u002Fdataviews\u002Ftypes\u002Fcards","06.dataviews\u002F04.types\u002F02.cards",{"title":144,"path":145,"stem":146},"Kanban","\u002Fdataviews\u002Ftypes\u002Fkanban","06.dataviews\u002F04.types\u002F03.kanban",{"title":148,"path":149,"stem":150},"Calendar","\u002Fdataviews\u002Ftypes\u002Fcalendar","06.dataviews\u002F04.types\u002F04.calendar",{"title":152,"path":153,"stem":154},"Gantt","\u002Fdataviews\u002Ftypes\u002Fgantt","06.dataviews\u002F04.types\u002F05.gantt",{"title":156,"path":157,"stem":158},"Map","\u002Fdataviews\u002Ftypes\u002Fmap","06.dataviews\u002F04.types\u002F06.map",{"title":160,"path":161,"stem":162},"Tree","\u002Fdataviews\u002Ftypes\u002Ftree","06.dataviews\u002F04.types\u002F07.tree",{"title":164,"path":165,"stem":166},"Form","\u002Fdataviews\u002Ftypes\u002Fform","06.dataviews\u002F04.types\u002F08.form",{"title":168,"path":169,"stem":170},"Master-detail","\u002Fdataviews\u002Ftypes\u002Fmaster-detail","06.dataviews\u002F04.types\u002F09.master-detail",{"title":172,"path":173,"stem":174},"Settings","\u002Fdataviews\u002Ftypes\u002Fsettings","06.dataviews\u002F04.types\u002F10.settings",{"title":176,"path":177,"stem":178},"Custom","\u002Fdataviews\u002Ftypes\u002Fcustom","06.dataviews\u002F04.types\u002F11.custom",{"title":180,"path":181,"stem":182},"External Frame","\u002Fdataviews\u002Ftypes\u002Fexternal-frame","06.dataviews\u002F04.types\u002F12.external-frame",{"title":172,"icon":184,"path":185,"stem":186,"children":187,"page":62},"i-lucide-settings-2","\u002Fdataviews\u002Fsettings","06.dataviews\u002F05.settings",[188,192,196,199,202,206,210],{"title":189,"path":190,"stem":191},"General","\u002Fdataviews\u002Fsettings\u002Fgeneral","06.dataviews\u002F05.settings\u002F01.general",{"title":193,"path":194,"stem":195},"Data","\u002Fdataviews\u002Fsettings\u002Fdata","06.dataviews\u002F05.settings\u002F02.data",{"title":96,"path":197,"stem":198},"\u002Fdataviews\u002Fsettings\u002Fviews","06.dataviews\u002F05.settings\u002F03.views",{"title":164,"path":200,"stem":201},"\u002Fdataviews\u002Fsettings\u002Fform","06.dataviews\u002F05.settings\u002F04.form",{"title":203,"path":204,"stem":205},"Actions","\u002Fdataviews\u002Fsettings\u002Factions","06.dataviews\u002F05.settings\u002F05.actions",{"title":207,"path":208,"stem":209},"Security","\u002Fdataviews\u002Fsettings\u002Fsecurity","06.dataviews\u002F05.settings\u002F06.security",{"title":211,"path":212,"stem":213},"Versions","\u002Fdataviews\u002Fsettings\u002Fversions","06.dataviews\u002F05.settings\u002F07.versions",{"title":215,"icon":216,"path":217,"stem":218,"children":219,"page":62},"Design Form","i-lucide-pencil-ruler","\u002Fdataviews\u002Fdesign-form","06.dataviews\u002F06.design-form",[220,223,257,261,265],{"title":118,"path":221,"stem":222},"\u002Fdataviews\u002Fdesign-form\u002Foverview","06.dataviews\u002F06.design-form\u002F01.overview",{"title":224,"icon":131,"path":225,"stem":226,"children":227,"page":62},"Widgets","\u002Fdataviews\u002Fdesign-form\u002Fwidgets","06.dataviews\u002F06.design-form\u002F02.widgets",[228,231,234,238,242,246,250,254],{"title":224,"path":229,"stem":230},"\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Foverview","06.dataviews\u002F06.design-form\u002F02.widgets\u002F01.overview",{"title":164,"path":232,"stem":233},"\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Fform","06.dataviews\u002F06.design-form\u002F02.widgets\u002F02.form",{"title":235,"path":236,"stem":237},"Inputs","\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Finputs","06.dataviews\u002F06.design-form\u002F02.widgets\u002F03.inputs",{"title":239,"path":240,"stem":241},"Display","\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Fdisplay","06.dataviews\u002F06.design-form\u002F02.widgets\u002F04.display",{"title":243,"path":244,"stem":245},"Embeds","\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Fembeds","06.dataviews\u002F06.design-form\u002F02.widgets\u002F05.embeds",{"title":247,"path":248,"stem":249},"Layout","\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Flayout","06.dataviews\u002F06.design-form\u002F02.widgets\u002F06.layout",{"title":251,"path":252,"stem":253},"Overlays","\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Foverlays","06.dataviews\u002F06.design-form\u002F02.widgets\u002F07.overlays",{"title":203,"path":255,"stem":256},"\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Factions","06.dataviews\u002F06.design-form\u002F02.widgets\u002F08.actions",{"title":258,"path":259,"stem":260},"Variables","\u002Fdataviews\u002Fdesign-form\u002Fvariables","06.dataviews\u002F06.design-form\u002F03.variables",{"title":262,"path":263,"stem":264},"Code","\u002Fdataviews\u002Fdesign-form\u002Fcode","06.dataviews\u002F06.design-form\u002F04.code",{"title":266,"path":267,"stem":268},"Formulas","\u002Fdataviews\u002Fdesign-form\u002Fformulas","06.dataviews\u002F06.design-form\u002F05.formulas",{"title":78,"icon":270,"path":271,"stem":272,"children":273,"page":62},"i-lucide-layout-dashboard","\u002Fdashboards","07.dashboards",[274,277,281,285,332],{"title":118,"path":275,"stem":276},"\u002Fdashboards\u002Foverview","07.dashboards\u002F01.overview",{"title":278,"path":279,"stem":280},"Creating a Dashboard","\u002Fdashboards\u002Fcreating","07.dashboards\u002F02.creating",{"title":282,"path":283,"stem":284},"Editor","\u002Fdashboards\u002Feditor","07.dashboards\u002F03.editor",{"title":224,"icon":286,"path":287,"stem":288,"children":289,"page":62},"i-lucide-chart-bar","\u002Fdashboards\u002Fwidgets","07.dashboards\u002F04.widgets",[290,293,297,301,305,309,313,317,321,324,328],{"title":224,"path":291,"stem":292},"\u002Fdashboards\u002Fwidgets\u002Foverview","07.dashboards\u002F04.widgets\u002F01.overview",{"title":294,"path":295,"stem":296},"Editing a Widget","\u002Fdashboards\u002Fwidgets\u002Fediting-a-widget","07.dashboards\u002F04.widgets\u002F02.editing-a-widget",{"title":298,"path":299,"stem":300},"Indicators","\u002Fdashboards\u002Fwidgets\u002Findicators","07.dashboards\u002F04.widgets\u002F03.indicators",{"title":302,"path":303,"stem":304},"Comparison","\u002Fdashboards\u002Fwidgets\u002Fcomparison","07.dashboards\u002F04.widgets\u002F04.comparison",{"title":306,"path":307,"stem":308},"Trend","\u002Fdashboards\u002Fwidgets\u002Ftrend","07.dashboards\u002F04.widgets\u002F05.trend",{"title":310,"path":311,"stem":312},"Proportion","\u002Fdashboards\u002Fwidgets\u002Fproportion","07.dashboards\u002F04.widgets\u002F06.proportion",{"title":314,"path":315,"stem":316},"Distribution and Relation","\u002Fdashboards\u002Fwidgets\u002Fdistribution-and-relation","07.dashboards\u002F04.widgets\u002F07.distribution-and-relation",{"title":318,"path":319,"stem":320},"Maps","\u002Fdashboards\u002Fwidgets\u002Fmaps","07.dashboards\u002F04.widgets\u002F08.maps",{"title":92,"path":322,"stem":323},"\u002Fdashboards\u002Fwidgets\u002Ftables","07.dashboards\u002F04.widgets\u002F09.tables",{"title":325,"path":326,"stem":327},"Visualization and Insertion","\u002Fdashboards\u002Fwidgets\u002Fvisualization-and-insertion","07.dashboards\u002F04.widgets\u002F10.visualization-and-insertion",{"title":329,"path":330,"stem":331},"SQL Conventions","\u002Fdashboards\u002Fwidgets\u002Fsql-conventions","07.dashboards\u002F04.widgets\u002F11.sql-conventions",{"title":172,"icon":184,"path":333,"stem":334,"children":335,"page":62},"\u002Fdashboards\u002Fsettings","07.dashboards\u002F05.settings",[336,339,342,345,349,352],{"title":189,"path":337,"stem":338},"\u002Fdashboards\u002Fsettings\u002Fgeneral","07.dashboards\u002F05.settings\u002F01.general",{"title":258,"path":340,"stem":341},"\u002Fdashboards\u002Fsettings\u002Fvariables","07.dashboards\u002F05.settings\u002F02.variables",{"title":193,"path":343,"stem":344},"\u002Fdashboards\u002Fsettings\u002Fdata","07.dashboards\u002F05.settings\u002F03.data",{"title":346,"path":347,"stem":348},"Share","\u002Fdashboards\u002Fsettings\u002Fshare","07.dashboards\u002F05.settings\u002F04.share",{"title":207,"path":350,"stem":351},"\u002Fdashboards\u002Fsettings\u002Fsecurity","07.dashboards\u002F05.settings\u002F05.security",{"title":211,"path":353,"stem":354},"\u002Fdashboards\u002Fsettings\u002Fversions","07.dashboards\u002F05.settings\u002F06.versions",{"title":356,"icon":357,"path":358,"stem":359,"children":360,"page":62},"Workflows","i-lucide-workflow","\u002Fworkflows","08.workflows",[361,364,368,371,393,432],{"title":118,"path":362,"stem":363},"\u002Fworkflows\u002Foverview","08.workflows\u002F01.overview",{"title":365,"path":366,"stem":367},"Creating a Workflow","\u002Fworkflows\u002Fcreating","08.workflows\u002F02.creating",{"title":282,"path":369,"stem":370},"\u002Fworkflows\u002Feditor","08.workflows\u002F03.editor",{"title":372,"icon":373,"path":374,"stem":375,"children":376,"page":62},"Triggers","i-lucide-zap","\u002Fworkflows\u002Ftriggers","08.workflows\u002F04.triggers",[377,381,385,389],{"title":378,"path":379,"stem":380},"Manual","\u002Fworkflows\u002Ftriggers\u002Fmanual","08.workflows\u002F04.triggers\u002F01.manual",{"title":382,"path":383,"stem":384},"Database Event","\u002Fworkflows\u002Ftriggers\u002Fdatabase-event","08.workflows\u002F04.triggers\u002F02.database-event",{"title":386,"path":387,"stem":388},"Schedule","\u002Fworkflows\u002Ftriggers\u002Fschedule","08.workflows\u002F04.triggers\u002F03.schedule",{"title":390,"path":391,"stem":392},"Webhook","\u002Fworkflows\u002Ftriggers\u002Fwebhook","08.workflows\u002F04.triggers\u002F04.webhook",{"title":394,"icon":357,"path":395,"stem":396,"children":397,"page":62},"Steps","\u002Fworkflows\u002Fsteps","08.workflows\u002F05.steps",[398,401,405,408,412,416,420,424,428],{"title":193,"path":399,"stem":400},"\u002Fworkflows\u002Fsteps\u002Fdata","08.workflows\u002F05.steps\u002F01.data",{"title":402,"path":403,"stem":404},"Control","\u002Fworkflows\u002Fsteps\u002Fcontrol","08.workflows\u002F05.steps\u002F02.control",{"title":262,"path":406,"stem":407},"\u002Fworkflows\u002Fsteps\u002Fcode","08.workflows\u002F05.steps\u002F03.code",{"title":409,"path":410,"stem":411},"Integration","\u002Fworkflows\u002Fsteps\u002Fintegration","08.workflows\u002F05.steps\u002F04.integration",{"title":413,"path":414,"stem":415},"Communication","\u002Fworkflows\u002Fsteps\u002Fcommunication","08.workflows\u002F05.steps\u002F05.communication",{"title":417,"path":418,"stem":419},"Files","\u002Fworkflows\u002Fsteps\u002Ffiles","08.workflows\u002F05.steps\u002F06.files",{"title":421,"path":422,"stem":423},"Documents","\u002Fworkflows\u002Fsteps\u002Fdocuments","08.workflows\u002F05.steps\u002F07.documents",{"title":425,"path":426,"stem":427},"Composition","\u002Fworkflows\u002Fsteps\u002Fcomposition","08.workflows\u002F05.steps\u002F08.composition",{"title":429,"path":430,"stem":431},"Values","\u002Fworkflows\u002Fsteps\u002Fvalues","08.workflows\u002F05.steps\u002F09.values",{"title":172,"icon":184,"path":433,"stem":434,"children":435,"page":62},"\u002Fworkflows\u002Fsettings","08.workflows\u002F06.settings",[436,439,443,446,449],{"title":189,"path":437,"stem":438},"\u002Fworkflows\u002Fsettings\u002Fgeneral","08.workflows\u002F06.settings\u002F01.general",{"title":440,"path":441,"stem":442},"Trigger","\u002Fworkflows\u002Fsettings\u002Ftrigger","08.workflows\u002F06.settings\u002F02.trigger",{"title":207,"path":444,"stem":445},"\u002Fworkflows\u002Fsettings\u002Fsecurity","08.workflows\u002F06.settings\u002F03.security",{"title":211,"path":447,"stem":448},"\u002Fworkflows\u002Fsettings\u002Fversions","08.workflows\u002F06.settings\u002F04.versions",{"title":450,"path":451,"stem":452},"Runs","\u002Fworkflows\u002Fsettings\u002Fruns","08.workflows\u002F06.settings\u002F05.runs",{"title":417,"icon":454,"path":455,"stem":456,"children":457,"page":62},"i-lucide-files","\u002Ffiles","09.files",[458,461,465,469,473,477,481],{"title":118,"path":459,"stem":460},"\u002Ffiles\u002Foverview","09.files\u002F01.overview",{"title":462,"path":463,"stem":464},"Uploading","\u002Ffiles\u002Fuploading","09.files\u002F02.uploading",{"title":466,"path":467,"stem":468},"File Details","\u002Ffiles\u002Ffile-details","09.files\u002F03.file-details",{"title":470,"path":471,"stem":472},"Editing Files","\u002Ffiles\u002Fediting-files","09.files\u002F04.editing-files",{"title":474,"path":475,"stem":476},"Using Files in Tables","\u002Ffiles\u002Fusing-files-in-tables","09.files\u002F05.using-files-in-tables",{"title":478,"path":479,"stem":480},"Image Transformations","\u002Ffiles\u002Fimage-transformations","09.files\u002F06.image-transformations",{"title":482,"path":483,"stem":484},"Who Can See a File","\u002Ffiles\u002Fwho-can-see-a-file","09.files\u002F07.who-can-see-a-file",{"title":486,"icon":487,"path":488,"stem":489,"children":490,"page":62},"Templates","i-lucide-file-text","\u002Ftemplates","10.templates",[491,494,498,502],{"title":118,"path":492,"stem":493},"\u002Ftemplates\u002Foverview","10.templates\u002F01.overview",{"title":495,"path":496,"stem":497},"Emails","\u002Ftemplates\u002Femails","10.templates\u002F02.emails",{"title":499,"path":500,"stem":501},"PDF","\u002Ftemplates\u002Fpdf","10.templates\u002F03.pdf",{"title":503,"path":504,"stem":505},"System Emails","\u002Ftemplates\u002Fsystem-emails","10.templates\u002F04.system-emails",{"title":507,"icon":508,"path":509,"stem":510,"children":511,"page":62},"Users","i-lucide-users","\u002Fusers","11.users",[512,516,520,524,528],{"title":513,"path":514,"stem":515},"Managing Users","\u002Fusers\u002Fmanaging-users","11.users\u002F01.managing-users",{"title":517,"path":518,"stem":519},"A User's Page","\u002Fusers\u002Fa-users-page","11.users\u002F02.a-users-page",{"title":521,"path":522,"stem":523},"API Tokens","\u002Fusers\u002Fapi-tokens","11.users\u002F03.api-tokens",{"title":525,"path":526,"stem":527},"Sessions","\u002Fusers\u002Fsessions","11.users\u002F04.sessions",{"title":529,"icon":530,"path":531,"stem":532,"children":533,"page":62},"Insights","i-lucide-chart-line","\u002Fusers\u002Finsights","11.users\u002F05.insights",[534,538],{"title":535,"path":536,"stem":537},"Sign-ins","\u002Fusers\u002Finsights\u002Fsign-ins","11.users\u002F05.insights\u002F01.sign-ins",{"title":539,"path":540,"stem":541},"Activity","\u002Fusers\u002Finsights\u002Factivity","11.users\u002F05.insights\u002F02.activity",{"title":543,"icon":544,"path":545,"stem":546,"children":547,"page":62},"Roles","i-lucide-shield-check","\u002Froles","12.roles",[548,552,556,560,564,568,572],{"title":549,"path":550,"stem":551},"Creating a Role","\u002Froles\u002Fcreating-a-role","12.roles\u002F01.creating-a-role",{"title":553,"path":554,"stem":555},"Granting Permissions","\u002Froles\u002Fgranting-permissions","12.roles\u002F02.granting-permissions",{"title":557,"path":558,"stem":559},"Row Filters","\u002Froles\u002Frow-filters","12.roles\u002F03.row-filters",{"title":561,"path":562,"stem":563},"Payload Checks","\u002Froles\u002Fpayload-checks","12.roles\u002F04.payload-checks",{"title":565,"path":566,"stem":567},"Members","\u002Froles\u002Fmembers","12.roles\u002F05.members",{"title":569,"path":570,"stem":571},"Access Reviews","\u002Froles\u002Faccess-reviews","12.roles\u002F06.access-reviews",{"title":573,"path":574,"stem":575},"Delegated Administration","\u002Froles\u002Fdelegated-administration","12.roles\u002F07.delegated-administration",{"title":577,"icon":578,"path":579,"stem":580,"children":581,"page":62},"Logs","i-lucide-scroll-text","\u002Flogs","13.logs",[582,586,590],{"title":583,"path":584,"stem":585},"Audit Log","\u002Flogs\u002Faudit-log","13.logs\u002F01.audit-log",{"title":587,"path":588,"stem":589},"An Entry","\u002Flogs\u002Fan-entry","13.logs\u002F02.an-entry",{"title":591,"path":592,"stem":593},"Where Else It Shows","\u002Flogs\u002Fwhere-else-it-shows","13.logs\u002F03.where-else-it-shows",{"title":595,"icon":596,"path":597,"stem":598,"children":599,"page":62},"Data API","i-lucide-braces","\u002Fdata-api","14.data-api",[600,603,607,611,615,619,623,627,631,635,639,643],{"title":118,"path":601,"stem":602},"\u002Fdata-api\u002Foverview","14.data-api\u002F01.overview",{"title":604,"path":605,"stem":606},"Authentication","\u002Fdata-api\u002Fauthentication","14.data-api\u002F02.authentication",{"title":608,"path":609,"stem":610},"Reading","\u002Fdata-api\u002Freading","14.data-api\u002F03.reading",{"title":612,"path":613,"stem":614},"Filtering","\u002Fdata-api\u002Ffiltering","14.data-api\u002F04.filtering",{"title":616,"path":617,"stem":618},"Aggregating","\u002Fdata-api\u002Faggregating","14.data-api\u002F05.aggregating",{"title":620,"path":621,"stem":622},"Writing","\u002Fdata-api\u002Fwriting","14.data-api\u002F06.writing",{"title":624,"path":625,"stem":626},"Nested Writes","\u002Fdata-api\u002Fnested-writes","14.data-api\u002F07.nested-writes",{"title":628,"path":629,"stem":630},"Transactions","\u002Fdata-api\u002Ftransactions","14.data-api\u002F08.transactions",{"title":632,"path":633,"stem":634},"Calling Functions","\u002Fdata-api\u002Fcalling-functions","14.data-api\u002F09.calling-functions",{"title":636,"path":637,"stem":638},"OpenAPI","\u002Fdata-api\u002Fopenapi","14.data-api\u002F10.openapi",{"title":640,"path":641,"stem":642},"Routes","\u002Fdata-api\u002Froutes","14.data-api\u002F11.routes",{"title":644,"path":645,"stem":646},"A client, end to end","\u002Fdata-api\u002Fa-client","14.data-api\u002F12.a-client",{"title":172,"icon":648,"path":649,"stem":650,"children":651,"page":62},"i-lucide-settings","\u002Fsettings","15.settings",[652,655,659,662,665],{"title":189,"path":653,"stem":654},"\u002Fsettings\u002Fgeneral","15.settings\u002F01.general",{"title":656,"path":657,"stem":658},"Access","\u002Fsettings\u002Faccess","15.settings\u002F02.access",{"title":207,"path":660,"stem":661},"\u002Fsettings\u002Fsecurity","15.settings\u002F03.security",{"title":595,"path":663,"stem":664},"\u002Fsettings\u002Fdata-api","15.settings\u002F04.data-api",{"title":666,"path":667,"stem":668},"Features","\u002Fsettings\u002Ffeatures","15.settings\u002F05.features",{"title":670,"icon":671,"path":672,"stem":673,"children":674,"page":62},"User Profile","i-lucide-circle-user","\u002Fuser-profile","16.user-profile",[675,679,682,686,690],{"title":676,"path":677,"stem":678},"My Account","\u002Fuser-profile\u002Fmy-account","16.user-profile\u002F01.my-account",{"title":525,"path":680,"stem":681},"\u002Fuser-profile\u002Fsessions","16.user-profile\u002F02.sessions",{"title":683,"path":684,"stem":685},"Tokens","\u002Fuser-profile\u002Ftokens","16.user-profile\u002F03.tokens",{"title":687,"path":688,"stem":689},"Preferences","\u002Fuser-profile\u002Fpreferences","16.user-profile\u002F04.preferences",{"title":539,"path":691,"stem":692},"\u002Fuser-profile\u002Factivity","16.user-profile\u002F05.activity",{"title":694,"icon":695,"path":696,"stem":697,"children":698,"page":62},"AI Agents","i-lucide-bot","\u002Fai-agents","17.ai-agents",[699,702,705,709,713,717],{"title":118,"path":700,"stem":701},"\u002Fai-agents\u002Foverview","17.ai-agents\u002F01.overview",{"title":683,"path":703,"stem":704},"\u002Fai-agents\u002Ftokens","17.ai-agents\u002F02.tokens",{"title":706,"path":707,"stem":708},"MCP Server","\u002Fai-agents\u002Fmcp-server","17.ai-agents\u002F03.mcp-server",{"title":710,"path":711,"stem":712},"Recipes","\u002Fai-agents\u002Frecipes","17.ai-agents\u002F04.recipes",{"title":714,"path":715,"stem":716},"Tools","\u002Fai-agents\u002Ftools","17.ai-agents\u002F05.tools",{"title":718,"path":719,"stem":720},"llms.txt","\u002Fai-agents\u002Fllms-txt","17.ai-agents\u002F06.llms-txt",{"title":722,"icon":723,"path":724,"stem":725,"children":726,"page":62},"Operations","i-lucide-server","\u002Foperations","18.operations",[727,731,735,739,743],{"title":728,"path":729,"stem":730},"Deployment","\u002Foperations\u002Fdeployment","18.operations\u002F01.deployment",{"title":732,"path":733,"stem":734},"PostgreSQL","\u002Foperations\u002Fpostgresql","18.operations\u002F02.postgresql",{"title":736,"path":737,"stem":738},"Public URL, Proxy and CORS","\u002Foperations\u002Fpublic-url-proxy-cors","18.operations\u002F03.public-url-proxy-cors",{"title":740,"path":741,"stem":742},"Backup and Restore","\u002Foperations\u002Fbackup-restore","18.operations\u002F04.backup-restore",{"title":744,"path":745,"stem":746},"Upgrading","\u002Foperations\u002Fupgrading","18.operations\u002F05.upgrading",{"title":748,"icon":749,"path":750,"stem":751,"children":752,"page":62},"Reference","i-lucide-library","\u002Freference","19.reference",[753,757,761,765,769],{"title":754,"path":755,"stem":756},"Query Language","\u002Freference\u002Fquery-language","19.reference\u002F01.query-language",{"title":758,"path":759,"stem":760},"Errors","\u002Freference\u002Ferrors","19.reference\u002F02.errors",{"title":762,"path":763,"stem":764},"Admin API","\u002Freference\u002Fadmin-api","19.reference\u002F03.admin-api",{"title":766,"path":767,"stem":768},"Authentication API","\u002Freference\u002Fauth-api","19.reference\u002F04.auth-api",{"title":770,"path":771,"stem":772},"Environment Variables","\u002Freference\u002Fenvironment","19.reference\u002F05.environment",{"id":774,"title":47,"admin":775,"body":776,"description":1410,"extension":1411,"links":775,"meta":1412,"navigation":1413,"path":48,"seo":1414,"stem":49,"__hash__":1415},"docs\u002F02.concepts\u002F04.permissions.md",null,{"type":777,"value":778,"toc":1399},"minimark",[779,788,840,843,847,902,906,909,919,928,934,937,944,954,977,981,991,1033,1039,1042,1072,1076,1120,1127,1131,1138,1160,1325,1332,1341,1345,1348,1352,1364,1369,1373,1395],[780,781,782,783,787],"p",{},"A permission, also called a ",[784,785,786],"strong",{},"grant",", says what one role may do with one resource. It has up to four parts:",[789,790,791,820,827,834],"ol",{},[792,793,794,795,798,799,802,803,807,808,811,812,815,816,819],"li",{},"an ",[784,796,797],{},"action"," and its ",[784,800,801],{},"effect",": ",[804,805,806],"code",{},"READ"," on ",[804,809,810],{},"work_orders",", ",[804,813,814],{},"ALLOW"," or ",[804,817,818],{},"DENY",";",[792,821,822,823,826],{},"the ",[784,824,825],{},"fields"," the role may use;",[792,828,829,830,833],{},"a ",[784,831,832],{},"row filter",": which rows the role may act on;",[792,835,836,839],{},[784,837,838],{},"payload checks",": rules the values written must meet (create and update only).",[780,841,842],{},"The same model is used everywhere: Data API reads and writes, relations, the generated OpenAPI, the App, and workflows. It is enforced by one resolver, and in the end by PostgreSQL.",[844,845,203],"h2",{"id":846},"actions",[848,849,850,862],"table",{},[851,852,853],"thead",{},[854,855,856,860],"tr",{},[857,858,859],"th",{},"Resource",[857,861,203],{},[863,864,865,883,892],"tbody",{},[854,866,867,870],{},[868,869,136],"td",{},[868,871,872,811,875,811,877,811,880],{},[804,873,874],{},"CREATE",[804,876,806],{},[804,878,879],{},"UPDATE",[804,881,882],{},"DELETE",[854,884,885,888],{},[868,886,887],{},"View",[868,889,890],{},[804,891,806],{},[854,893,894,897],{},[868,895,896],{},"Function",[868,898,899],{},[804,900,901],{},"EXECUTE",[844,903,905],{"id":904},"deny-by-default-and-any-deny-wins","Deny by default, and any DENY wins",[780,907,908],{},"For each resource and action, TotalBase looks at the grants of all of the caller's active roles:",[910,911,917],"pre",{"className":912,"code":914,"language":915,"meta":916},[913],"language-text","any DENY             →  denied\nno DENY, any ALLOW   →  allowed\nno grant at all      →  denied\n","text","",[804,918,914],{"__ignoreMap":916},[780,920,921,922,924,925,927],{},"If nothing allows an action, it is denied. A user with no roles can do nothing. An explicit ",[804,923,818],{}," wins over any ",[804,926,814],{}," from another role, so you can use it to block one action for one role whatever else that person holds.",[929,930,931],"note",{},[780,932,933],{},"Administrators skip this check entirely. They aren't granted everything; the check is never applied to them. PostgreSQL's own rules still apply.",[844,935,936],{"id":825},"Fields",[780,938,939,940,943],{},"When an action is allowed, each field is decided the same way, DENY over ALLOW over nothing. ",[784,941,942],{},"Every field must be granted explicitly."," There is no \"all columns\" option, so a column added to a table later stays invisible until someone grants it.",[780,945,946,947,949,950,953],{},"A read without ",[804,948,825],{}," returns exactly the columns the caller may read. Naming a column the caller may not use is ",[804,951,952],{},"403 FIELD_PERMISSION_DENIED",". A column that doesn't exist gets the same answer, so a role can't find out which columns are hidden from it.",[780,955,956,959,960,807,963,965,966,968,969,972,973,976],{},[784,957,958],{},"Relations are fields too."," If Dispatchers may read ",[804,961,962],{},"site.customer.name",[804,964,810],{},", that path must be granted on the ",[804,967,810],{}," grant itself. Granting ",[804,970,971],{},"site"," doesn't include it, and neither does a grant on ",[804,974,975],{},"customers",". What a relation exposes is decided by the resource being read, path by path.",[844,978,980],{"id":979},"row-filters","Row filters",[780,982,983,984,987,988,990],{},"A row filter limits a grant to some rows. It is written in the same filter syntax as a request's ",[804,985,986],{},"where",". Acme's grants on ",[804,989,810],{},":",[848,992,993,1003],{},[851,994,995],{},[854,996,997,1000],{},[857,998,999],{},"Role",[857,1001,1002],{},"Row filter on READ and UPDATE",[863,1004,1005,1015,1025],{},[854,1006,1007,1010],{},[868,1008,1009],{},"Dispatcher",[868,1011,1012],{},[804,1013,1014],{},"{ \"branch\": { \"_eq\": \"$USER.branch\" } }",[854,1016,1017,1020],{},[868,1018,1019],{},"Technician",[868,1021,1022],{},[804,1023,1024],{},"{ \"technician.user\": { \"_eq\": \"$USER.id\" } }",[854,1026,1027,1030],{},[868,1028,1029],{},"Manager",[868,1031,1032],{},"none: every row",[780,1034,1035,1038],{},[804,1036,1037],{},"$USER.*"," is read from the caller's current user row on every request. Move a dispatcher to another branch and they see the other branch's orders on their next request.",[780,1040,1041],{},"The rules for combining filters:",[1043,1044,1045,1056,1065],"ul",{},[792,1046,1047,1050,1051,1055],{},[784,1048,1049],{},"Across roles, filters combine with OR."," A Dispatcher who is also a Technician sees their branch's orders ",[1052,1053,1054],"em",{},"and"," the orders assigned to them. An ALLOW without a filter means every row.",[792,1057,1058,1064],{},[784,1059,1060,1061,1063],{},"A request's own ",[804,1062,986],{}," combines with AND."," A request can narrow what a role sees, never widen it.",[792,1066,1067,1068,1071],{},"PostgreSQL evaluates the filter as part of the query. Rows outside it are never read or touched, and reading one by key returns ",[804,1069,1070],{},"404",".",[844,1073,1075],{"id":1074},"writes-check-the-row-before-and-after","Writes check the row before and after",[848,1077,1078,1088],{},[851,1079,1080],{},[854,1081,1082,1085],{},[857,1083,1084],{},"Action",[857,1086,1087],{},"Checked against",[863,1089,1090,1099,1111],{},[854,1091,1092,1096],{},[868,1093,1094],{},[804,1095,874],{},[868,1097,1098],{},"the new row",[854,1100,1101,1105],{},[868,1102,1103],{},[804,1104,879],{},[868,1106,1107,1108,1110],{},"the row before ",[784,1109,1054],{}," the row after",[854,1112,1113,1117],{},[868,1114,1115],{},[804,1116,882],{},[868,1118,1119],{},"the row before",[780,1121,1122,1123,1126],{},"Checking both sides of an update matters. A Salta dispatcher may update Salta's orders, so the row before passes. If they try to move an order to the Jujuy branch, the row after fails the same filter, the update is refused with ",[804,1124,1125],{},"403 ACTION_DENIED",", and the transaction rolls back. The check is evaluated by PostgreSQL on the real resulting row, inside the same statement, so triggers and defaults are already applied when it runs.",[844,1128,1130],{"id":1129},"payload-checks","Payload checks",[780,1132,1133,1134,1137],{},"A payload check is a rule about the values a role writes, for rules that apply to one role and not to another, so they can't be a ",[804,1135,1136],{},"CHECK"," constraint. Acme has two:",[1043,1139,1140,1150],{},[792,1141,1142,1145,1146,1149],{},[784,1143,1144],{},"Discount cap",": Sales and Dispatchers may write quote items only with ",[804,1147,1148],{},"{ \"discount_pct\": { \"_lte\": \"20\" } }",". Managers have no such check.",[792,1151,1152,1155,1156,1159],{},[784,1153,1154],{},"Closing an order",": a Technician may set an order to ",[804,1157,1158],{},"COMPLETED"," only with a resolution and the customer's signature:",[910,1161,1165],{"className":1162,"code":1163,"language":1164,"meta":916,"style":916},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{ \"_or\": [\n  { \"status\": { \"_neq\": \"COMPLETED\" } },\n  { \"_and\": [ { \"resolution\": { \"_nnull\": true } },\n              { \"customer_signature\": { \"_nnull\": true } } ] }\n] }\n","json",[804,1166,1167,1191,1233,1280,1317],{"__ignoreMap":916},[1168,1169,1172,1176,1179,1183,1186,1188],"span",{"class":1170,"line":1171},"line",1,[1168,1173,1175],{"class":1174},"sMK4o","{",[1168,1177,1178],{"class":1174}," \"",[1168,1180,1182],{"class":1181},"spNyl","_or",[1168,1184,1185],{"class":1174},"\"",[1168,1187,990],{"class":1174},[1168,1189,1190],{"class":1174}," [\n",[1168,1192,1194,1197,1199,1203,1205,1207,1210,1212,1216,1218,1220,1222,1225,1227,1230],{"class":1170,"line":1193},2,[1168,1195,1196],{"class":1174},"  {",[1168,1198,1178],{"class":1174},[1168,1200,1202],{"class":1201},"sBMFI","status",[1168,1204,1185],{"class":1174},[1168,1206,990],{"class":1174},[1168,1208,1209],{"class":1174}," {",[1168,1211,1178],{"class":1174},[1168,1213,1215],{"class":1214},"sbssI","_neq",[1168,1217,1185],{"class":1174},[1168,1219,990],{"class":1174},[1168,1221,1178],{"class":1174},[1168,1223,1158],{"class":1224},"sfazB",[1168,1226,1185],{"class":1174},[1168,1228,1229],{"class":1174}," }",[1168,1231,1232],{"class":1174}," },\n",[1168,1234,1236,1238,1240,1243,1245,1247,1250,1252,1254,1257,1259,1261,1263,1265,1269,1271,1273,1276,1278],{"class":1170,"line":1235},3,[1168,1237,1196],{"class":1174},[1168,1239,1178],{"class":1174},[1168,1241,1242],{"class":1201},"_and",[1168,1244,1185],{"class":1174},[1168,1246,990],{"class":1174},[1168,1248,1249],{"class":1174}," [",[1168,1251,1209],{"class":1174},[1168,1253,1178],{"class":1174},[1168,1255,1256],{"class":1214},"resolution",[1168,1258,1185],{"class":1174},[1168,1260,990],{"class":1174},[1168,1262,1209],{"class":1174},[1168,1264,1178],{"class":1174},[1168,1266,1268],{"class":1267},"swJcz","_nnull",[1168,1270,1185],{"class":1174},[1168,1272,990],{"class":1174},[1168,1274,1275],{"class":1174}," true",[1168,1277,1229],{"class":1174},[1168,1279,1232],{"class":1174},[1168,1281,1283,1286,1288,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311,1314],{"class":1170,"line":1282},4,[1168,1284,1285],{"class":1174},"              {",[1168,1287,1178],{"class":1174},[1168,1289,1290],{"class":1214},"customer_signature",[1168,1292,1185],{"class":1174},[1168,1294,990],{"class":1174},[1168,1296,1209],{"class":1174},[1168,1298,1178],{"class":1174},[1168,1300,1268],{"class":1267},[1168,1302,1185],{"class":1174},[1168,1304,990],{"class":1174},[1168,1306,1275],{"class":1174},[1168,1308,1229],{"class":1174},[1168,1310,1229],{"class":1174},[1168,1312,1313],{"class":1174}," ]",[1168,1315,1316],{"class":1174}," }\n",[1168,1318,1320,1323],{"class":1170,"line":1319},5,[1168,1321,1322],{"class":1174},"]",[1168,1324,1316],{"class":1174},[780,1326,1327,1328,1331],{},"Every check from every grant must pass (AND). A failure is ",[804,1329,1330],{},"422 PAYLOAD_CHECK_FAILED"," with the check's label as the message.",[1333,1334,1335],"warning",{},[780,1336,1337,1338,1340],{},"A payload check applies only to writes made through TotalBase by that role. The SQL Console and external scripts skip it. If a rule must hold for every writer, use a ",[804,1339,1136],{}," constraint or a trigger.",[844,1342,1344],{"id":1343},"permissions-apply-immediately","Permissions apply immediately",[780,1346,1347],{},"Grants, roles and assignments are read from PostgreSQL on every request. Nothing about authorization is cached in a session or a token, so a change applies on the next request.",[844,1349,1351],{"id":1350},"setting-permissions","Setting permissions",[780,1353,1354,1355,1357,1358,1360,1361,1363],{},"In the admin, open ",[784,1356,543],{},", choose a role and its ",[784,1359,47],{}," section: a matrix of resources by actions. Click a cell to edit that grant: its effect and fields, its row filter, its payload checks. A user's ",[784,1362,47],{}," section shows the combined result of all their roles, and which role contributes each part.",[1365,1366],"screenshot",{"caption":1367,"id":1368},"The Dispatcher role's permission matrix, with the work_orders READ grant open.","permissions-matrix",[844,1370,1372],{"id":1371},"next-steps","Next steps",[1043,1374,1375,1382,1389],{},[792,1376,1377,1381],{},[1378,1379,1380],"a",{"href":554},"Granting permissions",": the matrix step by step.",[792,1383,1384,1386,1387,1071],{},[1378,1385,980],{"href":558}," and ",[1378,1388,1130],{"href":562},[792,1390,1391,1394],{},[1378,1392,1393],{"href":60},"Object access",": who may open a DataView or dashboard. This is a separate layer that grants no data.",[1396,1397,1398],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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);}",{"title":916,"searchDepth":1171,"depth":1193,"links":1400},[1401,1402,1403,1404,1405,1406,1407,1408,1409],{"id":846,"depth":1193,"text":203},{"id":904,"depth":1193,"text":905},{"id":825,"depth":1193,"text":936},{"id":979,"depth":1193,"text":980},{"id":1074,"depth":1193,"text":1075},{"id":1129,"depth":1193,"text":1130},{"id":1343,"depth":1193,"text":1344},{"id":1350,"depth":1193,"text":1351},{"id":1371,"depth":1193,"text":1372},"How access is decided: actions, fields, row filters and payload checks, and why any DENY wins.","md",{},true,{"title":47,"description":1410},"JT6YYWtZGsFx2SaxOfPQL1Grw8wteQA1cRzZLqNYdfI",[1417,1419],{"title":43,"path":44,"stem":45,"description":1418,"children":-1},"Who acts in TotalBase: users, roles and role assignments.",{"title":51,"path":52,"stem":53,"description":1420,"children":-1},"DataViews, dashboards and workflows are drafts until published to the roles that may use them.",1792339942232]