[{"data":1,"prerenderedAt":2475},["ShallowReactive",2],{"navigation_docs_en":3,"-en-release-notes-changelog":270,"-en-release-notes-changelog-surround":2472},[4,30,68,98,182,260],{"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],{"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,"children":72,"page":6},"Guides","\u002Fen\u002Fguides","en\u002F4.guides",[73,78,83,88,93],{"title":74,"path":75,"stem":76,"icon":77},"REST API Quickstart","\u002Fen\u002Fguides\u002Frest-api","en\u002F4.guides\u002F1.rest-api","i-lucide-plug",{"title":79,"path":80,"stem":81,"icon":82},"SDK Quickstart","\u002Fen\u002Fguides\u002Fsdk","en\u002F4.guides\u002F2.sdk","i-lucide-terminal",{"title":84,"path":85,"stem":86,"icon":87},"Configure SSO","\u002Fen\u002Fguides\u002Fconfigure-sso","en\u002F4.guides\u002F3.configure-sso","i-lucide-key-round",{"title":89,"path":90,"stem":91,"icon":92},"Configure MCP","\u002Fen\u002Fguides\u002Fmcp","en\u002F4.guides\u002F4.mcp","i-lucide-brain-cog",{"title":94,"path":95,"stem":96,"icon":97},"Customize Content Space","\u002Fen\u002Fguides\u002Fcustomize-content-space","en\u002F4.guides\u002F5.customize-content-space","i-lucide-columns-3-cog",{"title":99,"path":100,"stem":101,"children":102,"page":6},"Developer","\u002Fen\u002Fdeveloper","en\u002F5.developer",[103,158],{"title":104,"path":105,"stem":106,"children":107,"page":6},"Data Access","\u002Fen\u002Fdeveloper\u002Fapi","en\u002F5.developer\u002F1.api",[108,113,118,123,128,133,138,143,148,153],{"title":109,"path":110,"stem":111,"icon":112},"Overview","\u002Fen\u002Fdeveloper\u002Fapi\u002Foverview","en\u002F5.developer\u002F1.api\u002F1.overview","i-lucide-globe",{"title":114,"path":115,"stem":116,"icon":117},"Errors","\u002Fen\u002Fdeveloper\u002Fapi\u002Ferrors","en\u002F5.developer\u002F1.api\u002F10.errors","i-lucide-alert-triangle",{"title":119,"path":120,"stem":121,"icon":122},"Authentication","\u002Fen\u002Fdeveloper\u002Fapi\u002Fauthentication","en\u002F5.developer\u002F1.api\u002F2.authentication","i-lucide-lock",{"title":124,"path":125,"stem":126,"icon":127},"Reading Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Freading-data","en\u002F5.developer\u002F1.api\u002F3.reading-data","i-lucide-book-open",{"title":129,"path":130,"stem":131,"icon":132},"Writing Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Fwriting-data","en\u002F5.developer\u002F1.api\u002F4.writing-data","i-lucide-pencil",{"title":134,"path":135,"stem":136,"icon":137},"Filtering","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffiltering","en\u002F5.developer\u002F1.api\u002F5.filtering","i-lucide-filter",{"title":139,"path":140,"stem":141,"icon":142},"Field Selection","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffield-selection","en\u002F5.developer\u002F1.api\u002F6.field-selection","i-lucide-list-checks",{"title":144,"path":145,"stem":146,"icon":147},"Sorting & Pagination","\u002Fen\u002Fdeveloper\u002Fapi\u002Fsorting-pagination","en\u002F5.developer\u002F1.api\u002F7.sorting-pagination","i-lucide-arrow-up-down",{"title":149,"path":150,"stem":151,"icon":152},"Relational Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Frelational-data","en\u002F5.developer\u002F1.api\u002F8.relational-data","i-lucide-network",{"title":154,"path":155,"stem":156,"icon":157},"Files & Assets","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffiles","en\u002F5.developer\u002F1.api\u002F9.files","i-lucide-file-up",{"title":159,"path":160,"stem":161,"children":162,"page":6},"Client SDK","\u002Fen\u002Fdeveloper\u002Fsdk","en\u002F5.developer\u002F2.sdk",[163,167,172,177],{"title":164,"path":165,"stem":166,"icon":19},"Installation","\u002Fen\u002Fdeveloper\u002Fsdk\u002Finstallation","en\u002F5.developer\u002F2.sdk\u002F1.installation",{"title":168,"path":169,"stem":170,"icon":171},"Client Setup","\u002Fen\u002Fdeveloper\u002Fsdk\u002Fclient-setup","en\u002F5.developer\u002F2.sdk\u002F2.client-setup","i-lucide-settings",{"title":173,"path":174,"stem":175,"icon":176},"Type System","\u002Fen\u002Fdeveloper\u002Fsdk\u002Ftype-system","en\u002F5.developer\u002F2.sdk\u002F3.type-system","i-lucide-braces",{"title":178,"path":179,"stem":180,"icon":181},"Advanced","\u002Fen\u002Fdeveloper\u002Fsdk\u002Fadvanced","en\u002F5.developer\u002F2.sdk\u002F5.advanced","i-lucide-puzzle",{"title":183,"path":184,"stem":185,"children":186,"page":6},"Reference","\u002Fen\u002Freference","en\u002F6.reference",[187,191,207,211,216,231],{"title":188,"path":189,"stem":190,"icon":171},"Configuration","\u002Fen\u002Freference\u002Fenvironment-variables","en\u002F6.reference\u002F1.environment-variables",{"title":192,"path":193,"stem":194,"children":195,"icon":77},"Connectors","\u002Fen\u002Freference\u002Fconnectors","en\u002F6.reference\u002F2.connectors\u002Findex",[196,197,202],{"title":192,"path":193,"stem":194,"icon":77},{"title":198,"path":199,"stem":200,"icon":201},"PostgreSQL and Supabase","\u002Fen\u002Freference\u002Fconnectors\u002Fpostgresql-supabase","en\u002F6.reference\u002F2.connectors\u002F1.postgresql-supabase","i-simple-icons-postgresql",{"title":203,"path":204,"stem":205,"icon":206},"MySQL and MariaDB","\u002Fen\u002Freference\u002Fconnectors\u002Fmysql-mariadb","en\u002F6.reference\u002F2.connectors\u002F2.mysql-mariadb","i-simple-icons-mysql",{"title":208,"path":209,"stem":210,"icon":176},"Data Types Representation","\u002Fen\u002Freference\u002Fdata-types","en\u002F6.reference\u002F3.data-types",{"title":212,"path":213,"stem":214,"icon":215},"Permissions Reference","\u002Fen\u002Freference\u002Fpermissions","en\u002F6.reference\u002F4.permissions","i-lucide-shield",{"title":217,"path":218,"stem":219,"children":220,"page":6},"API Reference","\u002Fen\u002Freference\u002Fapi-reference","en\u002F6.reference\u002F5.api-reference",[221,226],{"title":222,"path":223,"stem":224,"icon":225},"System Endpoints","\u002Fen\u002Freference\u002Fapi-reference\u002Fsystem-endpoints","en\u002F6.reference\u002F5.api-reference\u002F1.system-endpoints","i-lucide-server",{"title":227,"path":228,"stem":229,"icon":230},"OpenAPI Spec","\u002Fen\u002Freference\u002Fapi-reference\u002Fopenapi-spec","en\u002F6.reference\u002F5.api-reference\u002F2.openapi-spec","i-lucide-file-code",{"title":232,"path":233,"stem":234,"children":235,"page":6},"Pitfalls","\u002Fen\u002Freference\u002Fpitfalls","en\u002F6.reference\u002F6.pitfalls",[236,240,245,250,255],{"title":109,"path":237,"stem":238,"icon":239},"\u002Fen\u002Freference\u002Fpitfalls\u002Foverview","en\u002F6.reference\u002F6.pitfalls\u002F1.overview","i-lucide-triangle-alert",{"title":241,"path":242,"stem":243,"icon":244},"Concurrent Migrations","\u002Fen\u002Freference\u002Fpitfalls\u002Fconcurrent-migrations","en\u002F6.reference\u002F6.pitfalls\u002F2.concurrent-migrations","i-lucide-git-merge",{"title":246,"path":247,"stem":248,"icon":249},"Instance Configuration","\u002Fen\u002Freference\u002Fpitfalls\u002Finstance-configuration-related-problems","en\u002F6.reference\u002F6.pitfalls\u002F3.instance-configuration-related-problems","i-lucide-wrench",{"title":251,"path":252,"stem":253,"icon":254},"Overly Permissive Public Roles","\u002Fen\u002Freference\u002Fpitfalls\u002Foverly-permissive","en\u002F6.reference\u002F6.pitfalls\u002F4.overly-permissive","i-lucide-shield-off",{"title":256,"path":257,"stem":258,"icon":259},"No Aggregates","\u002Fen\u002Freference\u002Fpitfalls\u002Fno-aggregates","en\u002F6.reference\u002F6.pitfalls\u002F5.no-aggregates","i-lucide-sigma",{"title":261,"icon":262,"path":263,"stem":264,"children":265,"page":6},"Release Notes","i-lucide-rocket","\u002Fen\u002Frelease-notes","en\u002F7.release-notes",[266],{"title":267,"path":268,"stem":269,"icon":262},"Changelog","\u002Fen\u002Frelease-notes\u002Fchangelog","en\u002F7.release-notes\u002F1.changelog",{"id":271,"title":267,"body":272,"description":2465,"extension":2466,"links":2467,"meta":2468,"navigation":2469,"path":268,"seo":2470,"stem":269,"__hash__":2471},"docs_en\u002Fen\u002F7.release-notes\u002F1.changelog.md",{"type":273,"value":274,"toc":2430},"minimark",[275,1680,1866,1933,2248,2426],[276,277,280,285,289,294,319,1436,1443,1556,1569,1574,1578,1581,1587,1591],"release",{"date":278,"version":279},"July 14, 2026","0.4.0",[281,282,284],"h2",{"id":283},"project-to-workspace-rename-and-authentication-audit-logs","Project to Workspace rename and authentication audit logs",[286,287,288],"p",{},"This release renames the core Project resource to Workspace — a breaking change — and adds engine-side audit logging for authentication events, alongside a batch of Studio and API improvements and fixes.",[290,291,293],"h3",{"id":292},"project-is-now-workspace","Project is now Workspace",[295,296,297,301,302,306,307,310,311,314,315,318],"caution",{},[298,299,300],"strong",{},"Breaking change."," The rename reaches the database schema, so an existing instance will not boot against the old layout. Back up your database, then run the migration below once, directly against your system database, before starting the upgraded instance. It renames the system tables, columns, indexes, and foreign-key constraints; rewrites historical audit actions and invitation payloads; and renames every per-workspace ",[303,304,305],"code",{},"monospace_project_\u003Cname>_meta"," and ",[303,308,309],{},"_data"," schema to ",[303,312,313],{},"monospace_workspace_\u003Cname>_…",". The whole script runs in one transaction and takes an ",[303,316,317],{},"ACCESS EXCLUSIVE"," lock, so run it during a maintenance window.",[320,321,322],"accordion",{},[323,324,326],"accordion-item",{"label":325},"Run this SQL once on upgrade",[327,328,333],"pre",{"className":329,"code":330,"language":331,"meta":332,"style":332},"language-sql shiki shiki-themes monospace-light monospace-light monospace-dark","ROLLBACK;\n\nBEGIN;\n\nSET LOCAL lock_timeout = '10s';\n\nLOCK TABLE\n  monospace_system.monospace_projects,\n  monospace_system.monospace_project_members,\n  monospace_system.monospace_invitations,\n  monospace_system.monospace_migrations,\n  monospace_audit.audit_logs\nIN ACCESS EXCLUSIVE MODE;\n\n-- System tables and columns\nALTER TABLE monospace_system.monospace_projects\n  RENAME TO monospace_workspaces;\n\nALTER TABLE monospace_system.monospace_project_members\n  RENAME COLUMN project_id TO workspace_id;\n\nALTER TABLE monospace_system.monospace_project_members\n  RENAME TO monospace_workspace_members;\n\nALTER TABLE monospace_system.monospace_invitations\n  RENAME COLUMN project_id TO workspace_id;\n\nALTER TABLE monospace_system.monospace_invitations\n  RENAME COLUMN project_roles TO workspace_roles;\n\nALTER TABLE monospace_system.monospace_migrations\n  RENAME COLUMN last_project_migration TO last_workspace_migration;\n\nALTER TABLE monospace_audit.audit_logs\n  RENAME COLUMN project_id TO workspace_id;\n\n-- Indexes\nALTER INDEX monospace_system.monospace_projects_id_primary\n  RENAME TO monospace_workspaces_id_primary;\n\nALTER INDEX monospace_system.monospace_projects_api_name_unique\n  RENAME TO monospace_workspaces_api_name_unique;\n\nALTER INDEX monospace_system.\"monospace_project_members_userId_projectId_unique\"\n  RENAME TO \"monospace_workspace_members_userId_workspaceId_unique\";\n\nALTER INDEX monospace_system.monospace_migrations_last_project_migration_unique\n  RENAME TO monospace_migrations_last_workspace_migration_unique;\n\nALTER INDEX monospace_audit.audit_logs_project_id_idx\n  RENAME TO audit_logs_workspace_id_idx;\n\n-- Foreign-key constraints\nALTER TABLE monospace_system.monospace_workspaces\n  RENAME CONSTRAINT \"MonospaceProject_logo_fkey\"\n  TO \"MonospaceWorkspace_logo_fkey\";\n\nALTER TABLE monospace_system.monospace_workspace_members\n  RENAME CONSTRAINT \"MonospaceProjectMember_project_fkey\"\n  TO \"MonospaceWorkspaceMember_workspace_fkey\";\n\nALTER TABLE monospace_system.monospace_workspace_members\n  RENAME CONSTRAINT \"MonospaceProjectMember_user_fkey\"\n  TO \"MonospaceWorkspaceMember_user_fkey\";\n\nALTER TABLE monospace_system.monospace_invitations\n  RENAME CONSTRAINT \"MonospaceInvitation_project_fkey\"\n  TO \"MonospaceInvitation_workspace_fkey\";\n\n-- Handle installations stopped exactly on renamed migrations\nUPDATE monospace_system.monospace_migrations\nSET last_system_migration = CASE last_system_migration\n  WHEN '_20260217_110409_project_settings'\n    THEN '_20260217_110409_workspace_settings'\n  WHEN '_20260307_000638_project_timestamps'\n    THEN '_20260307_000638_workspace_timestamps'\n  ELSE last_system_migration\nEND;\n\n-- Rewrite historical audit vocabulary\nUPDATE monospace_audit.audit_logs\nSET action = CASE action\n  WHEN 'user.join_project.v1' THEN 'user.join_workspace.v1'\n  WHEN 'user.remove_project.v1' THEN 'user.remove_workspace.v1'\n  ELSE action\nEND\nWHERE action IN (\n  'user.join_project.v1',\n  'user.remove_project.v1'\n);\n\nUPDATE monospace_audit.audit_logs\nSET payload = jsonb_set(\n  payload - 'project_roles',\n  '{workspace_roles}',\n  payload -> 'project_roles',\n  true\n)\nWHERE payload ? 'project_roles';\n\n-- Rename workspace metadata\u002Fdata schemas and repair persisted metadata\nDO $migration$\nDECLARE\n  item RECORD;\n  old_data TEXT;\n  new_meta TEXT;\n  new_data TEXT;\nBEGIN\n  FOR item IN\n    SELECT nspname AS old_meta\n    FROM pg_namespace\n    WHERE nspname LIKE 'monospace\\_project\\_%\\_meta' ESCAPE '\\'\n    ORDER BY nspname\n  LOOP\n    old_data := left(item.old_meta, -5) || '_data';\n\n    new_meta := regexp_replace(\n      item.old_meta,\n      '^monospace_project_',\n      'monospace_workspace_'\n    );\n\n    new_data := regexp_replace(\n      old_data,\n      '^monospace_project_',\n      'monospace_workspace_'\n    );\n\n    IF octet_length(new_meta) > 63 OR octet_length(new_data) > 63 THEN\n      RAISE EXCEPTION\n        'Workspace schema name exceeds PostgreSQL 63-byte limit: % \u002F %',\n        new_meta,\n        new_data;\n    END IF;\n\n    IF to_regnamespace(new_meta) IS NOT NULL\n       OR to_regnamespace(new_data) IS NOT NULL THEN\n      RAISE EXCEPTION\n        'Target workspace schema already exists: % or %',\n        new_meta,\n        new_data;\n    END IF;\n\n    EXECUTE format(\n      'ALTER SCHEMA %I RENAME TO %I',\n      item.old_meta,\n      new_meta\n    );\n\n    IF to_regnamespace(old_data) IS NOT NULL THEN\n      EXECUTE format(\n        'ALTER SCHEMA %I RENAME TO %I',\n        old_data,\n        new_data\n      );\n    END IF;\n\n    EXECUTE format(\n      'UPDATE %I.monospace_namespaces\n       SET db_name = CASE db_name\n         WHEN $1 THEN $2\n         WHEN $3 THEN $4\n         ELSE db_name\n       END\n       WHERE db_name IN ($1, $3)',\n      new_meta\n    )\n    USING item.old_meta, new_meta, old_data, new_data;\n\n    -- Rename persisted entitlement values\n    EXECUTE format(\n      $sql$\n        UPDATE %I.monospace_policies\n        SET content = replace(\n          replace(\n            content::text,\n            '\"projectMembers:',\n            '\"workspaceMembers:'\n          ),\n          '\"projectSettings:',\n          '\"workspaceSettings:'\n        )::jsonb\n        WHERE content::text LIKE '%%\"projectMembers:%%'\n           OR content::text LIKE '%%\"projectSettings:%%'\n      $sql$,\n      new_meta\n    );\n  END LOOP;\nEND\n$migration$;\n\nCOMMIT;\n","sql","",[303,334,335,343,350,356,361,367,372,378,384,390,396,402,408,414,419,425,431,437,442,448,454,459,464,470,475,481,486,491,496,502,507,513,519,524,530,535,540,546,552,558,563,569,575,580,586,592,597,603,609,614,620,626,631,637,643,649,655,660,666,672,678,683,688,694,700,705,710,716,722,727,733,739,745,751,757,763,769,775,781,786,792,798,804,810,816,822,828,834,840,846,852,857,862,868,874,880,886,892,898,904,909,915,921,927,933,939,945,951,957,963,969,975,981,987,993,999,1004,1010,1016,1022,1028,1034,1039,1045,1051,1056,1061,1066,1071,1077,1083,1089,1095,1101,1107,1112,1118,1124,1129,1135,1140,1145,1150,1155,1161,1167,1172,1178,1183,1188,1194,1200,1206,1212,1218,1224,1229,1234,1239,1245,1251,1257,1263,1269,1275,1281,1286,1292,1298,1303,1309,1314,1320,1326,1332,1338,1344,1350,1356,1362,1368,1374,1380,1386,1392,1398,1403,1408,1414,1419,1425,1430],{"__ignoreMap":332},[336,337,340],"span",{"class":338,"line":339},"line",1,[336,341,342],{},"ROLLBACK;\n",[336,344,346],{"class":338,"line":345},2,[336,347,349],{"emptyLinePlaceholder":348},true,"\n",[336,351,353],{"class":338,"line":352},3,[336,354,355],{},"BEGIN;\n",[336,357,359],{"class":338,"line":358},4,[336,360,349],{"emptyLinePlaceholder":348},[336,362,364],{"class":338,"line":363},5,[336,365,366],{},"SET LOCAL lock_timeout = '10s';\n",[336,368,370],{"class":338,"line":369},6,[336,371,349],{"emptyLinePlaceholder":348},[336,373,375],{"class":338,"line":374},7,[336,376,377],{},"LOCK TABLE\n",[336,379,381],{"class":338,"line":380},8,[336,382,383],{},"  monospace_system.monospace_projects,\n",[336,385,387],{"class":338,"line":386},9,[336,388,389],{},"  monospace_system.monospace_project_members,\n",[336,391,393],{"class":338,"line":392},10,[336,394,395],{},"  monospace_system.monospace_invitations,\n",[336,397,399],{"class":338,"line":398},11,[336,400,401],{},"  monospace_system.monospace_migrations,\n",[336,403,405],{"class":338,"line":404},12,[336,406,407],{},"  monospace_audit.audit_logs\n",[336,409,411],{"class":338,"line":410},13,[336,412,413],{},"IN ACCESS EXCLUSIVE MODE;\n",[336,415,417],{"class":338,"line":416},14,[336,418,349],{"emptyLinePlaceholder":348},[336,420,422],{"class":338,"line":421},15,[336,423,424],{},"-- System tables and columns\n",[336,426,428],{"class":338,"line":427},16,[336,429,430],{},"ALTER TABLE monospace_system.monospace_projects\n",[336,432,434],{"class":338,"line":433},17,[336,435,436],{},"  RENAME TO monospace_workspaces;\n",[336,438,440],{"class":338,"line":439},18,[336,441,349],{"emptyLinePlaceholder":348},[336,443,445],{"class":338,"line":444},19,[336,446,447],{},"ALTER TABLE monospace_system.monospace_project_members\n",[336,449,451],{"class":338,"line":450},20,[336,452,453],{},"  RENAME COLUMN project_id TO workspace_id;\n",[336,455,457],{"class":338,"line":456},21,[336,458,349],{"emptyLinePlaceholder":348},[336,460,462],{"class":338,"line":461},22,[336,463,447],{},[336,465,467],{"class":338,"line":466},23,[336,468,469],{},"  RENAME TO monospace_workspace_members;\n",[336,471,473],{"class":338,"line":472},24,[336,474,349],{"emptyLinePlaceholder":348},[336,476,478],{"class":338,"line":477},25,[336,479,480],{},"ALTER TABLE monospace_system.monospace_invitations\n",[336,482,484],{"class":338,"line":483},26,[336,485,453],{},[336,487,489],{"class":338,"line":488},27,[336,490,349],{"emptyLinePlaceholder":348},[336,492,494],{"class":338,"line":493},28,[336,495,480],{},[336,497,499],{"class":338,"line":498},29,[336,500,501],{},"  RENAME COLUMN project_roles TO workspace_roles;\n",[336,503,505],{"class":338,"line":504},30,[336,506,349],{"emptyLinePlaceholder":348},[336,508,510],{"class":338,"line":509},31,[336,511,512],{},"ALTER TABLE monospace_system.monospace_migrations\n",[336,514,516],{"class":338,"line":515},32,[336,517,518],{},"  RENAME COLUMN last_project_migration TO last_workspace_migration;\n",[336,520,522],{"class":338,"line":521},33,[336,523,349],{"emptyLinePlaceholder":348},[336,525,527],{"class":338,"line":526},34,[336,528,529],{},"ALTER TABLE monospace_audit.audit_logs\n",[336,531,533],{"class":338,"line":532},35,[336,534,453],{},[336,536,538],{"class":338,"line":537},36,[336,539,349],{"emptyLinePlaceholder":348},[336,541,543],{"class":338,"line":542},37,[336,544,545],{},"-- Indexes\n",[336,547,549],{"class":338,"line":548},38,[336,550,551],{},"ALTER INDEX monospace_system.monospace_projects_id_primary\n",[336,553,555],{"class":338,"line":554},39,[336,556,557],{},"  RENAME TO monospace_workspaces_id_primary;\n",[336,559,561],{"class":338,"line":560},40,[336,562,349],{"emptyLinePlaceholder":348},[336,564,566],{"class":338,"line":565},41,[336,567,568],{},"ALTER INDEX monospace_system.monospace_projects_api_name_unique\n",[336,570,572],{"class":338,"line":571},42,[336,573,574],{},"  RENAME TO monospace_workspaces_api_name_unique;\n",[336,576,578],{"class":338,"line":577},43,[336,579,349],{"emptyLinePlaceholder":348},[336,581,583],{"class":338,"line":582},44,[336,584,585],{},"ALTER INDEX monospace_system.\"monospace_project_members_userId_projectId_unique\"\n",[336,587,589],{"class":338,"line":588},45,[336,590,591],{},"  RENAME TO \"monospace_workspace_members_userId_workspaceId_unique\";\n",[336,593,595],{"class":338,"line":594},46,[336,596,349],{"emptyLinePlaceholder":348},[336,598,600],{"class":338,"line":599},47,[336,601,602],{},"ALTER INDEX monospace_system.monospace_migrations_last_project_migration_unique\n",[336,604,606],{"class":338,"line":605},48,[336,607,608],{},"  RENAME TO monospace_migrations_last_workspace_migration_unique;\n",[336,610,612],{"class":338,"line":611},49,[336,613,349],{"emptyLinePlaceholder":348},[336,615,617],{"class":338,"line":616},50,[336,618,619],{},"ALTER INDEX monospace_audit.audit_logs_project_id_idx\n",[336,621,623],{"class":338,"line":622},51,[336,624,625],{},"  RENAME TO audit_logs_workspace_id_idx;\n",[336,627,629],{"class":338,"line":628},52,[336,630,349],{"emptyLinePlaceholder":348},[336,632,634],{"class":338,"line":633},53,[336,635,636],{},"-- Foreign-key constraints\n",[336,638,640],{"class":338,"line":639},54,[336,641,642],{},"ALTER TABLE monospace_system.monospace_workspaces\n",[336,644,646],{"class":338,"line":645},55,[336,647,648],{},"  RENAME CONSTRAINT \"MonospaceProject_logo_fkey\"\n",[336,650,652],{"class":338,"line":651},56,[336,653,654],{},"  TO \"MonospaceWorkspace_logo_fkey\";\n",[336,656,658],{"class":338,"line":657},57,[336,659,349],{"emptyLinePlaceholder":348},[336,661,663],{"class":338,"line":662},58,[336,664,665],{},"ALTER TABLE monospace_system.monospace_workspace_members\n",[336,667,669],{"class":338,"line":668},59,[336,670,671],{},"  RENAME CONSTRAINT \"MonospaceProjectMember_project_fkey\"\n",[336,673,675],{"class":338,"line":674},60,[336,676,677],{},"  TO \"MonospaceWorkspaceMember_workspace_fkey\";\n",[336,679,681],{"class":338,"line":680},61,[336,682,349],{"emptyLinePlaceholder":348},[336,684,686],{"class":338,"line":685},62,[336,687,665],{},[336,689,691],{"class":338,"line":690},63,[336,692,693],{},"  RENAME CONSTRAINT \"MonospaceProjectMember_user_fkey\"\n",[336,695,697],{"class":338,"line":696},64,[336,698,699],{},"  TO \"MonospaceWorkspaceMember_user_fkey\";\n",[336,701,703],{"class":338,"line":702},65,[336,704,349],{"emptyLinePlaceholder":348},[336,706,708],{"class":338,"line":707},66,[336,709,480],{},[336,711,713],{"class":338,"line":712},67,[336,714,715],{},"  RENAME CONSTRAINT \"MonospaceInvitation_project_fkey\"\n",[336,717,719],{"class":338,"line":718},68,[336,720,721],{},"  TO \"MonospaceInvitation_workspace_fkey\";\n",[336,723,725],{"class":338,"line":724},69,[336,726,349],{"emptyLinePlaceholder":348},[336,728,730],{"class":338,"line":729},70,[336,731,732],{},"-- Handle installations stopped exactly on renamed migrations\n",[336,734,736],{"class":338,"line":735},71,[336,737,738],{},"UPDATE monospace_system.monospace_migrations\n",[336,740,742],{"class":338,"line":741},72,[336,743,744],{},"SET last_system_migration = CASE last_system_migration\n",[336,746,748],{"class":338,"line":747},73,[336,749,750],{},"  WHEN '_20260217_110409_project_settings'\n",[336,752,754],{"class":338,"line":753},74,[336,755,756],{},"    THEN '_20260217_110409_workspace_settings'\n",[336,758,760],{"class":338,"line":759},75,[336,761,762],{},"  WHEN '_20260307_000638_project_timestamps'\n",[336,764,766],{"class":338,"line":765},76,[336,767,768],{},"    THEN '_20260307_000638_workspace_timestamps'\n",[336,770,772],{"class":338,"line":771},77,[336,773,774],{},"  ELSE last_system_migration\n",[336,776,778],{"class":338,"line":777},78,[336,779,780],{},"END;\n",[336,782,784],{"class":338,"line":783},79,[336,785,349],{"emptyLinePlaceholder":348},[336,787,789],{"class":338,"line":788},80,[336,790,791],{},"-- Rewrite historical audit vocabulary\n",[336,793,795],{"class":338,"line":794},81,[336,796,797],{},"UPDATE monospace_audit.audit_logs\n",[336,799,801],{"class":338,"line":800},82,[336,802,803],{},"SET action = CASE action\n",[336,805,807],{"class":338,"line":806},83,[336,808,809],{},"  WHEN 'user.join_project.v1' THEN 'user.join_workspace.v1'\n",[336,811,813],{"class":338,"line":812},84,[336,814,815],{},"  WHEN 'user.remove_project.v1' THEN 'user.remove_workspace.v1'\n",[336,817,819],{"class":338,"line":818},85,[336,820,821],{},"  ELSE action\n",[336,823,825],{"class":338,"line":824},86,[336,826,827],{},"END\n",[336,829,831],{"class":338,"line":830},87,[336,832,833],{},"WHERE action IN (\n",[336,835,837],{"class":338,"line":836},88,[336,838,839],{},"  'user.join_project.v1',\n",[336,841,843],{"class":338,"line":842},89,[336,844,845],{},"  'user.remove_project.v1'\n",[336,847,849],{"class":338,"line":848},90,[336,850,851],{},");\n",[336,853,855],{"class":338,"line":854},91,[336,856,349],{"emptyLinePlaceholder":348},[336,858,860],{"class":338,"line":859},92,[336,861,797],{},[336,863,865],{"class":338,"line":864},93,[336,866,867],{},"SET payload = jsonb_set(\n",[336,869,871],{"class":338,"line":870},94,[336,872,873],{},"  payload - 'project_roles',\n",[336,875,877],{"class":338,"line":876},95,[336,878,879],{},"  '{workspace_roles}',\n",[336,881,883],{"class":338,"line":882},96,[336,884,885],{},"  payload -> 'project_roles',\n",[336,887,889],{"class":338,"line":888},97,[336,890,891],{},"  true\n",[336,893,895],{"class":338,"line":894},98,[336,896,897],{},")\n",[336,899,901],{"class":338,"line":900},99,[336,902,903],{},"WHERE payload ? 'project_roles';\n",[336,905,907],{"class":338,"line":906},100,[336,908,349],{"emptyLinePlaceholder":348},[336,910,912],{"class":338,"line":911},101,[336,913,914],{},"-- Rename workspace metadata\u002Fdata schemas and repair persisted metadata\n",[336,916,918],{"class":338,"line":917},102,[336,919,920],{},"DO $migration$\n",[336,922,924],{"class":338,"line":923},103,[336,925,926],{},"DECLARE\n",[336,928,930],{"class":338,"line":929},104,[336,931,932],{},"  item RECORD;\n",[336,934,936],{"class":338,"line":935},105,[336,937,938],{},"  old_data TEXT;\n",[336,940,942],{"class":338,"line":941},106,[336,943,944],{},"  new_meta TEXT;\n",[336,946,948],{"class":338,"line":947},107,[336,949,950],{},"  new_data TEXT;\n",[336,952,954],{"class":338,"line":953},108,[336,955,956],{},"BEGIN\n",[336,958,960],{"class":338,"line":959},109,[336,961,962],{},"  FOR item IN\n",[336,964,966],{"class":338,"line":965},110,[336,967,968],{},"    SELECT nspname AS old_meta\n",[336,970,972],{"class":338,"line":971},111,[336,973,974],{},"    FROM pg_namespace\n",[336,976,978],{"class":338,"line":977},112,[336,979,980],{},"    WHERE nspname LIKE 'monospace\\_project\\_%\\_meta' ESCAPE '\\'\n",[336,982,984],{"class":338,"line":983},113,[336,985,986],{},"    ORDER BY nspname\n",[336,988,990],{"class":338,"line":989},114,[336,991,992],{},"  LOOP\n",[336,994,996],{"class":338,"line":995},115,[336,997,998],{},"    old_data := left(item.old_meta, -5) || '_data';\n",[336,1000,1002],{"class":338,"line":1001},116,[336,1003,349],{"emptyLinePlaceholder":348},[336,1005,1007],{"class":338,"line":1006},117,[336,1008,1009],{},"    new_meta := regexp_replace(\n",[336,1011,1013],{"class":338,"line":1012},118,[336,1014,1015],{},"      item.old_meta,\n",[336,1017,1019],{"class":338,"line":1018},119,[336,1020,1021],{},"      '^monospace_project_',\n",[336,1023,1025],{"class":338,"line":1024},120,[336,1026,1027],{},"      'monospace_workspace_'\n",[336,1029,1031],{"class":338,"line":1030},121,[336,1032,1033],{},"    );\n",[336,1035,1037],{"class":338,"line":1036},122,[336,1038,349],{"emptyLinePlaceholder":348},[336,1040,1042],{"class":338,"line":1041},123,[336,1043,1044],{},"    new_data := regexp_replace(\n",[336,1046,1048],{"class":338,"line":1047},124,[336,1049,1050],{},"      old_data,\n",[336,1052,1054],{"class":338,"line":1053},125,[336,1055,1021],{},[336,1057,1059],{"class":338,"line":1058},126,[336,1060,1027],{},[336,1062,1064],{"class":338,"line":1063},127,[336,1065,1033],{},[336,1067,1069],{"class":338,"line":1068},128,[336,1070,349],{"emptyLinePlaceholder":348},[336,1072,1074],{"class":338,"line":1073},129,[336,1075,1076],{},"    IF octet_length(new_meta) > 63 OR octet_length(new_data) > 63 THEN\n",[336,1078,1080],{"class":338,"line":1079},130,[336,1081,1082],{},"      RAISE EXCEPTION\n",[336,1084,1086],{"class":338,"line":1085},131,[336,1087,1088],{},"        'Workspace schema name exceeds PostgreSQL 63-byte limit: % \u002F %',\n",[336,1090,1092],{"class":338,"line":1091},132,[336,1093,1094],{},"        new_meta,\n",[336,1096,1098],{"class":338,"line":1097},133,[336,1099,1100],{},"        new_data;\n",[336,1102,1104],{"class":338,"line":1103},134,[336,1105,1106],{},"    END IF;\n",[336,1108,1110],{"class":338,"line":1109},135,[336,1111,349],{"emptyLinePlaceholder":348},[336,1113,1115],{"class":338,"line":1114},136,[336,1116,1117],{},"    IF to_regnamespace(new_meta) IS NOT NULL\n",[336,1119,1121],{"class":338,"line":1120},137,[336,1122,1123],{},"       OR to_regnamespace(new_data) IS NOT NULL THEN\n",[336,1125,1127],{"class":338,"line":1126},138,[336,1128,1082],{},[336,1130,1132],{"class":338,"line":1131},139,[336,1133,1134],{},"        'Target workspace schema already exists: % or %',\n",[336,1136,1138],{"class":338,"line":1137},140,[336,1139,1094],{},[336,1141,1143],{"class":338,"line":1142},141,[336,1144,1100],{},[336,1146,1148],{"class":338,"line":1147},142,[336,1149,1106],{},[336,1151,1153],{"class":338,"line":1152},143,[336,1154,349],{"emptyLinePlaceholder":348},[336,1156,1158],{"class":338,"line":1157},144,[336,1159,1160],{},"    EXECUTE format(\n",[336,1162,1164],{"class":338,"line":1163},145,[336,1165,1166],{},"      'ALTER SCHEMA %I RENAME TO %I',\n",[336,1168,1170],{"class":338,"line":1169},146,[336,1171,1015],{},[336,1173,1175],{"class":338,"line":1174},147,[336,1176,1177],{},"      new_meta\n",[336,1179,1181],{"class":338,"line":1180},148,[336,1182,1033],{},[336,1184,1186],{"class":338,"line":1185},149,[336,1187,349],{"emptyLinePlaceholder":348},[336,1189,1191],{"class":338,"line":1190},150,[336,1192,1193],{},"    IF to_regnamespace(old_data) IS NOT NULL THEN\n",[336,1195,1197],{"class":338,"line":1196},151,[336,1198,1199],{},"      EXECUTE format(\n",[336,1201,1203],{"class":338,"line":1202},152,[336,1204,1205],{},"        'ALTER SCHEMA %I RENAME TO %I',\n",[336,1207,1209],{"class":338,"line":1208},153,[336,1210,1211],{},"        old_data,\n",[336,1213,1215],{"class":338,"line":1214},154,[336,1216,1217],{},"        new_data\n",[336,1219,1221],{"class":338,"line":1220},155,[336,1222,1223],{},"      );\n",[336,1225,1227],{"class":338,"line":1226},156,[336,1228,1106],{},[336,1230,1232],{"class":338,"line":1231},157,[336,1233,349],{"emptyLinePlaceholder":348},[336,1235,1237],{"class":338,"line":1236},158,[336,1238,1160],{},[336,1240,1242],{"class":338,"line":1241},159,[336,1243,1244],{},"      'UPDATE %I.monospace_namespaces\n",[336,1246,1248],{"class":338,"line":1247},160,[336,1249,1250],{},"       SET db_name = CASE db_name\n",[336,1252,1254],{"class":338,"line":1253},161,[336,1255,1256],{},"         WHEN $1 THEN $2\n",[336,1258,1260],{"class":338,"line":1259},162,[336,1261,1262],{},"         WHEN $3 THEN $4\n",[336,1264,1266],{"class":338,"line":1265},163,[336,1267,1268],{},"         ELSE db_name\n",[336,1270,1272],{"class":338,"line":1271},164,[336,1273,1274],{},"       END\n",[336,1276,1278],{"class":338,"line":1277},165,[336,1279,1280],{},"       WHERE db_name IN ($1, $3)',\n",[336,1282,1284],{"class":338,"line":1283},166,[336,1285,1177],{},[336,1287,1289],{"class":338,"line":1288},167,[336,1290,1291],{},"    )\n",[336,1293,1295],{"class":338,"line":1294},168,[336,1296,1297],{},"    USING item.old_meta, new_meta, old_data, new_data;\n",[336,1299,1301],{"class":338,"line":1300},169,[336,1302,349],{"emptyLinePlaceholder":348},[336,1304,1306],{"class":338,"line":1305},170,[336,1307,1308],{},"    -- Rename persisted entitlement values\n",[336,1310,1312],{"class":338,"line":1311},171,[336,1313,1160],{},[336,1315,1317],{"class":338,"line":1316},172,[336,1318,1319],{},"      $sql$\n",[336,1321,1323],{"class":338,"line":1322},173,[336,1324,1325],{},"        UPDATE %I.monospace_policies\n",[336,1327,1329],{"class":338,"line":1328},174,[336,1330,1331],{},"        SET content = replace(\n",[336,1333,1335],{"class":338,"line":1334},175,[336,1336,1337],{},"          replace(\n",[336,1339,1341],{"class":338,"line":1340},176,[336,1342,1343],{},"            content::text,\n",[336,1345,1347],{"class":338,"line":1346},177,[336,1348,1349],{},"            '\"projectMembers:',\n",[336,1351,1353],{"class":338,"line":1352},178,[336,1354,1355],{},"            '\"workspaceMembers:'\n",[336,1357,1359],{"class":338,"line":1358},179,[336,1360,1361],{},"          ),\n",[336,1363,1365],{"class":338,"line":1364},180,[336,1366,1367],{},"          '\"projectSettings:',\n",[336,1369,1371],{"class":338,"line":1370},181,[336,1372,1373],{},"          '\"workspaceSettings:'\n",[336,1375,1377],{"class":338,"line":1376},182,[336,1378,1379],{},"        )::jsonb\n",[336,1381,1383],{"class":338,"line":1382},183,[336,1384,1385],{},"        WHERE content::text LIKE '%%\"projectMembers:%%'\n",[336,1387,1389],{"class":338,"line":1388},184,[336,1390,1391],{},"           OR content::text LIKE '%%\"projectSettings:%%'\n",[336,1393,1395],{"class":338,"line":1394},185,[336,1396,1397],{},"      $sql$,\n",[336,1399,1401],{"class":338,"line":1400},186,[336,1402,1177],{},[336,1404,1406],{"class":338,"line":1405},187,[336,1407,1033],{},[336,1409,1411],{"class":338,"line":1410},188,[336,1412,1413],{},"  END LOOP;\n",[336,1415,1417],{"class":338,"line":1416},189,[336,1418,827],{},[336,1420,1422],{"class":338,"line":1421},190,[336,1423,1424],{},"$migration$;\n",[336,1426,1428],{"class":338,"line":1427},191,[336,1429,349],{"emptyLinePlaceholder":348},[336,1431,1433],{"class":338,"line":1432},192,[336,1434,1435],{},"COMMIT;\n",[286,1437,1438,1439,1442],{},"The resource you create inside an organization is now a ",[298,1440,1441],{},"workspace",". In the Studio, \"Project\" becomes \"Workspace\" everywhere — the navigation selector, settings, members, and invitations. The change is uniform on the wire:",[1444,1445,1446,1473,1497,1517,1539],"ul",{},[1447,1448,1449,1452,1453,1456,1457,1460,1461,1464,1465,1468,1469,1472],"li",{},[298,1450,1451],{},"REST and MCP"," — the workspace-scoped path is ",[303,1454,1455],{},"\u002Fapi\u002F{workspace}\u002F…"," (items, assets, ",[303,1458,1459],{},"openapi",", ",[303,1462,1463],{},"mcp","), and the system endpoints move from ",[303,1466,1467],{},"\u002Fapi\u002Fsystem\u002Fprojects"," to ",[303,1470,1471],{},"\u002Fapi\u002Fsystem\u002Fworkspaces",".",[1447,1474,1475,1478,1479,1482,1483,1485,1486,1489,1490,1493,1494,1496],{},[298,1476,1477],{},"SDK"," — ",[303,1480,1481],{},"createClient"," takes a ",[303,1484,1441],{}," option instead of ",[303,1487,1488],{},"project",", and the generator config in ",[303,1491,1492],{},"monospace.config.ts"," uses ",[303,1495,1441],{}," too.",[1447,1498,1499,1478,1502,1505,1506,1509,1510,1513,1514,1472],{},[298,1500,1501],{},"Fields and payloads",[303,1503,1504],{},"projectId"," becomes ",[303,1507,1508],{},"workspaceId",", and invitation ",[303,1511,1512],{},"project_roles"," become ",[303,1515,1516],{},"workspace_roles",[1447,1518,1519,1478,1522,1505,1524,1460,1526,1505,1529,1532,1533,1505,1536,1472],{},[298,1520,1521],{},"Entitlements",[303,1523,1488],{},[303,1525,1441],{},[303,1527,1528],{},"projectMembers",[303,1530,1531],{},"workspaceMembers",", and ",[303,1534,1535],{},"projectSettings",[303,1537,1538],{},"workspaceSettings",[1447,1540,1541,1478,1544,306,1547,1513,1550,306,1553,1472],{},[298,1542,1543],{},"Audit log",[303,1545,1546],{},"user.join_project.v1",[303,1548,1549],{},"user.remove_project.v1",[303,1551,1552],{},"user.join_workspace.v1",[303,1554,1555],{},"user.remove_workspace.v1",[286,1557,1558,1559,1563,1564,1568],{},"See ",[1560,1561,35],"a",{"href":1562},"\u002Fconcepts\u002Forganization"," for the resource hierarchy and ",[1560,1565,1567],{"href":1566},"\u002Fguides\u002Frest-api","REST API"," for the request shape.",[1570,1571],"release-credit",{"handle":1572,"name":1573},"rijkvanzanten","Rijk van Zanten",[290,1575,1577],{"id":1576},"audit-logs-for-authentication-events","Audit logs for authentication events",[286,1579,1580],{},"Monospace now records authentication activity in the audit log: successful and failed logins, logouts, token refreshes, and password reset requests, confirmations, and changes. Each entry captures the actor, their IP address, and the outcome — and failures are recorded without revealing whether an account exists.",[286,1582,1558,1583,1586],{},[1560,1584,49],{"href":1585},"\u002Fconcepts\u002Faudit-logs"," for the full list of actions and how to query them.",[1570,1588],{"handle":1589,"name":1590},"MaxenceMaire","Maxence Maire",[320,1592,1593,1642],{},[323,1594,1596],{"label":1595},"Improvements",[1444,1597,1598,1609,1612,1619,1622,1625,1639],{},[1447,1599,1600,1601,1604,1605,1608],{},"The PostgreSQL connector supports AWS IAM authentication for RDS and Aurora: set an ",[303,1602,1603],{},"aws_iam"," object (with at least a ",[303,1606,1607],{},"region",") on the connection instead of a password, and each connection mints a short-lived token. It is configured in the connector config only — there is no Studio UI for it yet. That will come in a subsequent release.",[1447,1610,1611],{},"The Studio shows the server's maximum file upload size in the upload UI, and over-limit uploads fail with a clear message instead of a generic error.",[1447,1613,1614,1615,1618],{},"Paginated Studio views use the engine's ",[303,1616,1617],{},"meta.totalCount"," for exact total-item counts instead of estimating from the last page.",[1447,1620,1621],{},"Hide or show a collection directly from its actions menu in the Data Model.",[1447,1623,1624],{},"Listing layouts appear in a consistent order — Table, then Cards, then Calendar — in the view options.",[1447,1626,1627,1628,1460,1631,1634,1635,1638],{},"A to-many relational filter must use exactly one of ",[303,1629,1630],{},"_some",[303,1632,1633],{},"_every",", or ",[303,1636,1637],{},"_none","; invalid combinations are rejected with a clear message.",[1447,1640,1641],{},"When no AI provider is configured, anyone who can set up AI sees a \"Set Up AI Assistant\" prompt instead of an empty panel.",[323,1643,1645],{"label":1644},"Fixes",[1444,1646,1647,1656,1659,1662,1665,1668,1671,1674,1677],{},[1447,1648,1649,306,1652,1655],{},[303,1650,1651],{},"_eq",[303,1653,1654],{},"_neq"," on a JSON field compare by JSON value instead of raw text — object key order is ignored, while array order and value types are significant — across PostgreSQL, MySQL, and MariaDB.",[1447,1657,1658],{},"An expired session cookie no longer blocks login, invite signup, or password reset; the request proceeds instead of failing with an invalid-token error.",[1447,1660,1661],{},"Introspecting an unknown data source returns a 404 with a clear message instead of a 500.",[1447,1663,1664],{},"The AI chat panel shows an error when a response stream fails, instead of failing silently.",[1447,1666,1667],{},"Editing a date or date-time field in a form enables the Save button.",[1447,1669,1670],{},"The calendar layout loads events for the exact week or day in view, including multi-day events and events that span a month boundary.",[1447,1672,1673],{},"In-browser filtering and sorting compare date-time values by their actual instant and numeric fields by value, so those columns behave correctly.",[1447,1675,1676],{},"File preview text and action buttons are legible over the dark-theme overlay.",[1447,1678,1679],{},"Long links wrap instead of overflowing narrow containers such as the code panel.",[276,1681,1684,1688,1691,1695,1708,1715,1723,1727,1731,1735,1739,1746,1752,1758,1760,1764,1771,1777,1781,1785,1803,1810,1814],{"date":1682,"version":1683},"July 8, 2026","0.3.0",[281,1685,1687],{"id":1686},"api-request-panels-and-ai-tool-approvals","API request panels and AI tool approvals",[286,1689,1690],{},"This release adds an API Request code panel to every collection, a tool-approval workflow for the AI assistant, many-to-many file fields, and a total-count option for read queries.",[290,1692,1694],{"id":1693},"api-request-code-panel","API Request Code Panel",[286,1696,1697,1698,1701,1702,306,1704,1707],{},"Reproducing a Studio view in code meant hand-writing the request. Now every content collection has an ",[298,1699,1700],{},"API Request"," panel that turns what you're viewing — your fields, filter, sort, and pagination, or the open item and its values — into ready-to-run ",[298,1703,1477],{},[298,1705,1706],{},"cURL"," snippets you can copy in one click. Open it from the code button in the header; it docks beside your content on wide screens and slides in as a drawer on narrow ones.",[286,1709,1710],{},[1711,1712],"img",{"alt":1713,"src":1714},"The API Request panel showing an SDK snippet generated from the collection's active fields, filter, and sort, with SDK and cURL tabs","\u002Fimages\u002Fchangelog\u002F0-3-0\u002Fmonospace-code-panel.png",[286,1716,1558,1717,306,1720,1722],{},[1560,1718,1477],{"href":1719},"\u002Fguides\u002Fsdk",[1560,1721,1567],{"href":1566}," for client setup.",[1570,1724],{"handle":1725,"name":1726},"Akryum","Guillaume Chau",[1570,1728],{"handle":1729,"name":1730},"HZooly","Hugo Torzuoli",[1570,1732],{"handle":1733,"name":1734},"hanneskuettner","Hannes Küttner",[290,1736,1738],{"id":1737},"ai-assistant-tool-approvals","AI Assistant Tool Approvals",[286,1740,1741,1742,1745],{},"The AI assistant used to run deletes and schema changes without a checkpoint. Now it pauses first: deleting items or changing the schema surfaces a ",[298,1743,1744],{},"Tool approval required"," panel where you approve, deny, or send back a different instruction. Tool inputs and outputs render as readable YAML instead of raw JSON, and approval never grants access beyond your own permissions.",[286,1747,1748],{},[1711,1749],{"alt":1750,"src":1751},"The AI Assistant showing a \"Tool approval required\" panel for a delete action, with Approve and run and Deny buttons","\u002Fimages\u002Fchangelog\u002F0-3-0\u002Fmonospace-tool-approval.png",[286,1753,1558,1754,1757],{},[1560,1755,64],{"href":1756},"\u002Fconcepts\u002Fai"," for the assistant and its tools.",[1570,1759],{"handle":1572,"name":1573},[290,1761,1763],{"id":1762},"many-to-many-file-fields","Many-to-Many File Fields",[286,1765,1766,1767,1770],{},"A File field held a single file, so attaching several meant modeling a junction collection by hand. Now picking the ",[298,1768,1769],{},"Multiple Files"," option when adding a File field creates a many-to-many relation to your asset library from just a field name — the junction collection is generated and hidden for you, and attached files show as thumbnails in the item form and table.",[286,1772,1558,1773,1776],{},[1560,1774,39],{"href":1775},"\u002Fconcepts\u002Fdata-model"," for fields and relations.",[1570,1778],{"handle":1779,"name":1780},"themarcba","Marc Backes",[290,1782,1784],{"id":1783},"total-count-for-read-queries","Total Count for Read Queries",[286,1786,1787,1788,1791,1792,1795,1796,306,1799,1802],{},"Getting a total count used to mean a second query — or fetching every matching item just to count them. Now you can pass a ",[303,1789,1790],{},"meta"," option with ",[303,1793,1794],{},"totalCount"," on a read query to get the total number of matching items — ignoring ",[303,1797,1798],{},"limit",[303,1800,1801],{},"offset"," — alongside the data in one request. It's a top-level option; nested relation reads don't accept it.",[286,1804,1558,1805,1809],{},[1560,1806,1808],{"href":1807},"\u002Fdeveloper\u002Fapi\u002Fsorting-pagination#get-the-total-count","Get the Total Count"," for the request and response shape.",[1570,1811],{"handle":1812,"name":1813},"SomeoneToIgnore","Kirill Bulatov",[320,1815,1816,1829],{},[323,1817,1818],{"label":1595},[1444,1819,1820,1823,1826],{},[1447,1821,1822],{},"UUID fields can default to an engine-generated random UUID, in either v4 (random) or v7 (time-ordered) form.",[1447,1824,1825],{},"Change a relation's on-delete and on-update referential actions with a migration, instead of only when the relation is first created.",[1447,1827,1828],{},"The field type picker is sorted alphabetically by its translated label.",[323,1830,1831],{"label":1644},[1444,1832,1833,1836,1839,1842,1845,1848,1851,1857,1860,1863],{},[1447,1834,1835],{},"New fields adopt their type template's preferred type, so a JSON-template field is created as JSON instead of text.",[1447,1837,1838],{},"Icon and color inputs on select options can be cleared again, and color inputs gain a \"Remove color\" action.",[1447,1840,1841],{},"Hiding or re-adding a column in the table layout updates the header and grid immediately, without a reload.",[1447,1843,1844],{},"Markdown content renders with the correct text colors in dark mode.",[1447,1846,1847],{},"Creating a custom page connects it to its space.",[1447,1849,1850],{},"The interface color mode follows your saved appearance preference on load.",[1447,1852,1853,1854,1472],{},"The display-template input stays open when a template segment contains a ",[303,1855,1856],{},"\u002F",[1447,1858,1859],{},"Onboarding consent links to the End User License Agreement.",[1447,1861,1862],{},"Edits to items in a repeater field register as you type instead of being dropped.",[1447,1864,1865],{},"The secondary header no longer overlaps content when a long description wraps.",[276,1867,1870,1874,1877,1881,1884,1890,1892,1896,1899,1905,1909],{"date":1868,"version":1869},"July 3, 2026","0.2.1",[281,1871,1873],{"id":1872},"stricter-query-validation-and-access-fixes","Stricter query validation and access fixes",[286,1875,1876],{},"This release tightens API query validation, makes the policy \"All\" access override grant full access, and fixes Studio issues across permissions, filtering, and the schema visualizer.",[290,1878,1880],{"id":1879},"stricter-query-validation","Stricter Query Validation",[286,1882,1883],{},"Invalid field selections on a primitive field used to be accepted silently. Now the query engine rejects them: selecting nested subfields on a primitive field — or passing arguments to one — is rejected as an invalid query. Nested selections and arguments still work on relation fields, where they apply.",[286,1885,1558,1886,1889],{},[1560,1887,139],{"href":1888},"\u002Fdeveloper\u002Fapi\u002Ffield-selection"," for valid field, relation, and nested-query syntax.",[1570,1891],{"handle":1589,"name":1590},[290,1893,1895],{"id":1894},"accurate-all-access-override","Accurate \"All\" Access Override",[286,1897,1898],{},"A filter left on a single action used to survive the \"All\" access override, so \"All\" didn't actually grant full access. Now, in the policy editor, a collection's \"All\" override grants genuine unrestricted access — it clears any custom per-action filters and opens create, read, update, and delete together.",[286,1900,1558,1901,1904],{},[1560,1902,44],{"href":1903},"\u002Fconcepts\u002Faccess-permissions"," for how policies and collection permissions combine.",[1570,1906],{"handle":1907,"name":1908},"formfcw","Florian Wachmann",[320,1910,1911],{},[323,1912,1913],{"label":1644},[1444,1914,1915,1918,1921,1924,1927,1930],{},[1447,1916,1917],{},"Permissions load reliably right after you create the first project on a fresh instance, instead of showing a \"couldn't load your permissions\" error.",[1447,1919,1920],{},"Newly created collections are arranged automatically in the schema visualizer instead of stacking in the corner.",[1447,1922,1923],{},"The organization dashboard shows a project you just created without a manual refresh.",[1447,1925,1926],{},"The Policies page no longer occasionally loads blank until you refresh.",[1447,1928,1929],{},"Numeric values in an \"is one of\" or \"isn't one of\" filter are preserved instead of dropped.",[1447,1931,1932],{},"The permission rules editor stays usable on narrow screens, scrolling sideways instead of clipping the delete action.",[276,1934,1937,1941,1944,1948,1951,1957,1959,1963,1965,1969,1972,1978,1980,1984,1987,1993,2003,2005,2009,2012,2024,2028,2030,2032,2036,2039,2045,2051,2053,2057,2060,2064,2066,2070,2085,2103,2105,2107,2111,2121,2128,2130,2134,2145,2151,2153,2157,2167,2174,2176,2180],{"date":1935,"version":1936},"July 2, 2026","0.2.0",[281,1938,1940],{"id":1939},"a-refreshed-studio-onboarding-and-native-json","A refreshed Studio, onboarding, and native JSON",[286,1942,1943],{},"This release refreshes the Studio, adds guided onboarding and a project connection screen, moves JSON fields to native JSON, introduces branded data source presets and permission-aware controls, and ships configurable CORS, query-parameter authentication, and anonymous usage telemetry.",[290,1945,1947],{"id":1946},"refreshed-studio-design","Refreshed Studio Design",[286,1949,1950],{},"The Studio interface is restyled from the chrome inward. Project headers, the sidebar, and footers use consistent heights, spacing, and typography. Breadcrumbs now show the item you're viewing on a detail page, and the collection back control is labeled with the collection name.",[286,1952,1953],{},[1711,1954],{"alt":1955,"src":1956},"An item detail page with the breadcrumb showing the current item and a back control labeled with the collection name","\u002Fimages\u002Fchangelog\u002F0-2-0\u002Fmonospace-item-details.png",[1570,1958],{"handle":1729,"name":1730},[1570,1960],{"handle":1961,"name":1962},"re-baar","Reza Baar",[1570,1964],{"handle":1907,"name":1908},[290,1966,1968],{"id":1967},"onboarding","Onboarding",[286,1970,1971],{},"New instances walk you through first-run setup. When no user exists yet, Monospace prompts you to create the first administrator — name, email, password, and terms acceptance. When an administrator was provisioned automatically, you confirm your details and accept the terms the first time you sign in.",[286,1973,1974],{},[1711,1975],{"alt":1976,"src":1977},"The first-run screen prompting you to create the first administrator account","\u002Fimages\u002Fchangelog\u002F0-2-0\u002Fmonospace-onboarding.png",[1570,1979],{"handle":1779,"name":1780},[290,1981,1983],{"id":1982},"connect-to-your-project","Connect to Your Project",[286,1985,1986],{},"Connecting a client to a project used to mean assembling the base URL and minting a key by hand. A new connection screen now gathers everything in one place: tabbed setup instructions for the SDK, MCP server, and REST API, an API key generated on the spot — personal or through a service account — and deep links to add the project's MCP server to supported tools.",[286,1988,1989],{},[1711,1990],{"alt":1991,"src":1992},"The Connect screen's MCP tab with the client picker open, listing Claude Code, Cursor, and other agents","\u002Fimages\u002Fchangelog\u002F0-2-0\u002Fmonospace-connect.png",[286,1994,1558,1995,1460,1997,1532,2001,1722],{},[1560,1996,1477],{"href":1719},[1560,1998,2000],{"href":1999},"\u002Fguides\u002Fmcp","MCP",[1560,2002,1567],{"href":1566},[1570,2004],{"handle":1779,"name":1780},[290,2006,2008],{"id":2007},"native-json-fields","Native JSON Fields",[286,2010,2011],{},"JSON fields used to travel as encoded strings you had to parse and re-stringify yourself. Now they use native JSON end to end: the API returns and accepts raw JSON, and in the Studio new JSON fields default to the native JSON type, edit in a pretty-printed code editor, and display as compact single-line JSON in tables.",[295,2013,2014,2016,2017,2020,2021,1472],{},[298,2015,300],{}," JSON fields now use native JSON on the wire. The API returns them as raw JSON instead of encoded strings and no longer accepts a stringified JSON value on input, so update any client that parsed the old string form or sent JSON as a string. Filtering a JSON field also requires an explicit operator now — ",[303,2018,2019],{},"{ filter: { metadata: 2 } }"," is rejected; use ",[303,2022,2023],{},"{ filter: { metadata: { _eq: 2 } } }",[1570,2025],{"handle":2026,"name":2027},"Weakky","Flavian Desverne",[1570,2029],{"handle":1725,"name":1726},[1570,2031],{"handle":1733,"name":1734},[290,2033,2035],{"id":2034},"branded-data-source-presets","Branded Data Source Presets",[286,2037,2038],{},"The data source picker listed only raw database engines. Now it opens on a branded connector picker: alongside PostgreSQL, MySQL, MariaDB, and SQLite, you can pick managed providers like Neon, Aiven, PlanetScale, and Aurora — each with its own name, logo, and setup notes. The preset is display metadata; the underlying connector still determines how the source connects.",[286,2040,2041],{},[1711,2042],{"alt":2043,"src":2044},"The Add a Data Source connector picker showing branded presets including Aiven, AlloyDB, and Amazon Aurora","\u002Fimages\u002Fchangelog\u002F0-2-0\u002Fmonospace-data-sources.png",[286,2046,1558,2047,2050],{},[1560,2048,192],{"href":2049},"\u002Freference\u002Fconnectors"," for supported databases.",[1570,2052],{"handle":1733,"name":1734},[290,2054,2056],{"id":2055},"permission-aware-studio","Permission-Aware Studio",[286,2058,2059],{},"The Studio didn't reflect your permissions — it showed controls and navigation you couldn't actually use. Now it reflects them throughout: controls you can't use are disabled with a tooltip explaining why, role and policy pickers list only the values you may assign, and navigation entries you can't access are hidden. Opening a restricted page by URL redirects you to one you can reach.",[2061,2062,2063],"note",{},"These gates are a convenience layer. The backend remains the source of truth for every permission check.",[1570,2065],{"handle":1733,"name":1734},[290,2067,2069],{"id":2068},"dedicated-project-schemas","Dedicated Project Schemas",[286,2071,2072,2073,2076,2077,2080,2081,2084],{},"User collections used to share the ",[303,2074,2075],{},"public"," schema, where separate projects could collide. Now each project uses two dedicated schemas on the system data source: ",[303,2078,2079],{},"monospace_\u003Cproject>_meta"," for system metadata and ",[303,2082,2083],{},"monospace_\u003Cproject>_data"," for the collections you create. When a data source exposes more than one namespace, the Add Collection form also lets you choose which namespace a new collection belongs to.",[295,2086,2087,2089,2090,2093,2094,2096,2097,2099,2100,2102],{},[298,2088,300],{}," On the first boot after upgrading, Monospace provides migration instructions for moving an existing project to the new layout — ",[303,2091,2092],{},"monospace_\u003Cproject>"," is renamed to ",[303,2095,2079],{},", and user collections move from ",[303,2098,2075],{}," into ",[303,2101,2083],{},". Back up your database before updating.",[1570,2104],{"handle":2026,"name":2027},[1570,2106],{"handle":1779,"name":1780},[290,2108,2110],{"id":2109},"configurable-cors","Configurable CORS",[286,2112,2113,2114,2117,2118,1472],{},"Browser apps on another origin couldn't call your API. Now the engine can send CORS headers so they can. CORS is off by default — enable it with ",[303,2115,2116],{},"MONOSPACE_CORS__ENABLED"," and set the allowed origins with ",[303,2119,2120],{},"MONOSPACE_CORS__ORIGIN",[286,2122,1558,2123,2127],{},[1560,2124,2126],{"href":2125},"\u002Freference\u002Fenvironment-variables#cors","CORS"," for the full configuration.",[1570,2129],{"handle":1733,"name":1734},[290,2131,2133],{"id":2132},"access-tokens-in-query-parameters","Access Tokens in Query Parameters",[286,2135,2136,2137,2140,2141,2144],{},"Passing an access token used to require the ",[303,2138,2139],{},"Authorization"," header. Now you can pass it as an ",[303,2142,2143],{},"access_token"," query parameter too, alongside the header and the session cookie — for clients that can't set request headers. Sending more than one of these at once is rejected with a 400.",[286,2146,1558,2147,2150],{},[1560,2148,119],{"href":2149},"\u002Fdeveloper\u002Fapi\u002Fauthentication"," for all token sources.",[1570,2152],{"handle":1572,"name":1573},[290,2154,2156],{"id":2155},"anonymous-usage-telemetry","Anonymous Usage Telemetry",[286,2158,2159,2160,2163,2164,1472],{},"Monospace sends anonymous usage telemetry to guide development. Pings carry a random install ID, the version, a configuration snapshot, and operation counts — never credentials, connection details, or your data. Disable scheduled telemetry with ",[303,2161,2162],{},"MONOSPACE_TELEMETRY__ENABLED=false",". Instance-owner details captured during onboarding sync separately; opt out with ",[303,2165,2166],{},"MONOSPACE_INSTANCE_OWNER_SYNC_ENABLED=false",[286,2168,1558,2169,2173],{},[1560,2170,2172],{"href":2171},"\u002Freference\u002Fenvironment-variables#telemetry","Telemetry"," for the opt-out variables.",[1570,2175],{"handle":1733,"name":1734},[1570,2177],{"handle":2178,"name":2179},"bgeron","Bram Geron",[320,2181,2182,2226],{},[323,2183,2184],{"label":1595},[1444,2185,2186,2208,2211,2214,2217,2220,2223],{},[1447,2187,2188,2189,2192,2193,1460,2196,1460,2199,1634,2202,2205,2206,1472],{},"Choose the engine log format with the new ",[303,2190,2191],{},"MONOSPACE_LOG_FORMAT"," variable (",[303,2194,2195],{},"compact",[303,2197,2198],{},"full",[303,2200,2201],{},"pretty",[303,2203,2204],{},"json","); it defaults to ",[303,2207,2204],{},[1447,2209,2210],{},"Listing views are shared across users, with each person's filter, search, and layout changes saved automatically and a \"Save for everyone\" action to publish them.",[1447,2212,2213],{},"The Calendar layout reopens on the date and view you were last using.",[1447,2215,2216],{},"Auto-generated many-to-many junction collections are hidden from content navigation by default.",[1447,2218,2219],{},"Data model collections use list cards, matching the data sources list.",[1447,2221,2222],{},"The organization projects dashboard shows an empty state with a create action when you have no projects.",[1447,2224,2225],{},"The add-source form names the missing fields when a pasted connection string is incomplete.",[323,2227,2228],{"label":1644},[1444,2229,2230,2233,2236,2239,2242,2245],{},[1447,2231,2232],{},"Many-to-many relation displays link to the related item instead of the junction record.",[1447,2234,2235],{},"Deleting the file you're viewing redirects to the asset listing instead of leaving an empty panel.",[1447,2237,2238],{},"Schema migrations normalize their operation order, so they apply regardless of how the operations are listed.",[1447,2240,2241],{},"Custom detail pages load the item from the URL, so the form opens populated.",[1447,2243,2244],{},"Data table rows with taller content render at full height without clamping.",[1447,2246,2247],{},"CA certificate and mutual TLS settings reach the engine for PostgreSQL, MySQL, and MariaDB sources.",[276,2249,2252,2256,2259,2263,2270,2276,2282,2284,2286,2290,2304,2310,2315,2317,2320,2323,2329,2334,2336,2338,2342,2349,2355,2357,2361,2367,2373,2378,2380],{"date":2250,"version":2251},"June 23, 2026","0.1.0",[281,2253,2255],{"id":2254},"single-sign-on-mcp-and-the-ai-assistant","Single sign-on, MCP, and the AI assistant",[286,2257,2258],{},"This release adds single sign-on, an MCP server for AI agents, audit logging, MySQL and MariaDB data sources, and an in-Studio AI assistant.",[290,2260,2262],{"id":2261},"single-sign-on","Single Sign-On",[286,2264,2265,2266,2269],{},"Let members sign in with your organization's identity provider instead of a Monospace password. Set up Google, GitHub, Microsoft Entra, Okta, and other OAuth 2.0 providers from ",[298,2267,2268],{},"Settings → Sign-in Providers"," — common providers come with presets.",[286,2271,2272],{},[1711,2273],{"alt":2274,"src":2275},"The Add sign-in method dialog with provider presets","\u002Fimages\u002Fchangelog\u002F0-1-0\u002Fmonospace-sso.png",[286,2277,1558,2278,2281],{},[1560,2279,84],{"href":2280},"\u002Fguides\u002Fconfigure-sso"," to connect a provider.",[1570,2283],{"handle":1961,"name":1962},[1570,2285],{"handle":2026,"name":2027},[290,2287,2289],{"id":2288},"mcp-server","MCP Server",[286,2291,2292,2293,2299,2300,2303],{},"Connect AI agents to your project through a ",[1560,2294,2298],{"href":2295,"rel":2296},"https:\u002F\u002Fmodelcontextprotocol.io",[2297],"nofollow","Model Context Protocol"," server. Each project exposes its own endpoint at ",[303,2301,2302],{},"\u002Fapi\u002F{project}\u002Fmcp"," over streamable HTTP. Agents authenticate with an API key and can query, create, update, and delete items, inspect and modify the schema, and list data sources. Every call runs under the permissions of the key you connect with.",[286,2305,2306],{},[1711,2307],{"alt":2308,"src":2309},"An AI agent inspecting and updating a project schema through the Monospace MCP server","\u002Fimages\u002Fchangelog\u002F0-1-0\u002Fmcp-changelog.png",[286,2311,1558,2312,2314],{},[1560,2313,89],{"href":1999}," for setup and client configuration.",[1570,2316],{"handle":1572,"name":1573},[290,2318,49],{"id":2319},"audit-logs",[286,2321,2322],{},"Monospace now records key activity — user and account changes, invitations, project membership, and schema migrations — to an audit log. Each entry captures who made the change, the outcome, and when it happened. Administrators can read and filter the log through the system API.",[286,2324,2325],{},[1711,2326],{"alt":2327,"src":2328},"Audit logs in Monospace","\u002Fimages\u002Fchangelog\u002F0-1-0\u002Fmonospace-audit-logs.png",[286,2330,1558,2331,2333],{},[1560,2332,49],{"href":1585}," for the event catalog and how to query them.",[1570,2335],{"handle":1779,"name":1780},[1570,2337],{"handle":2026,"name":2027},[290,2339,2341],{"id":2340},"mysql-mariadb","MySQL & MariaDB",[286,2343,2344,2345,2348],{},"Connect MySQL and MariaDB databases as data sources, alongside PostgreSQL. Add a connection from ",[298,2346,2347],{},"Data Model → Data Sources"," using the connection parameters or a connection string, with optional TLS.",[286,2350,1558,2351,2354],{},[1560,2352,203],{"href":2353},"\u002Freference\u002Fconnectors\u002Fmysql-mariadb"," for connection options.",[1570,2356],{"handle":2178,"name":2179},[290,2358,2360],{"id":2359},"ai-assistant","AI Assistant",[286,2362,2363,2364,1472],{},"Chat with an AI assistant directly in the Studio. It can query your data, create, update, and delete items, and read or change your schema — all under your own permissions. Configure an AI provider under ",[298,2365,2366],{},"Settings → AI",[286,2368,2369],{},[1711,2370],{"alt":2371,"src":2372},"Configuring the AI assistant's model, and the assistant analyzing data in the Studio","\u002Fimages\u002Fchangelog\u002F0-1-0\u002Fmonospace-integrated-ai.png",[286,2374,1558,2375,2377],{},[1560,2376,64],{"href":1756}," for the assistant and the MCP server.",[1570,2379],{"handle":1572,"name":1573},[320,2381,2382],{},[323,2383,2384],{"label":1595},[1444,2385,2386,2389,2392,2399,2408,2411,2414,2417,2420,2423],{},[1447,2387,2388],{},"Assign an organization role when inviting a member.",[1447,2390,2391],{},"Set fields to default to the current date or the acting user.",[1447,2393,2394,2395,2398],{},"Filter for empty or non-empty values with the ",[303,2396,2397],{},"_null"," operator.",[1447,2400,2401,2402,306,2405,1472],{},"Control where nulls appear in sorted results with ",[303,2403,2404],{},"NULLS FIRST",[303,2406,2407],{},"NULLS LAST",[1447,2409,2410],{},"Pick date ranges with a new date range picker.",[1447,2412,2413],{},"Expand rows in data tables to view more detail.",[1447,2415,2416],{},"Preview images inline with image quick look.",[1447,2418,2419],{},"Data table columns auto-size to their content, up to a maximum width.",[1447,2421,2422],{},"The last-used sign-in method is highlighted on the login screen.",[1447,2424,2425],{},"Refreshed email templates to match the sign-in screen.",[2427,2428,2429],"style",{},"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":332,"searchDepth":345,"depth":345,"links":2431},[2432,2436,2442,2446,2458],{"id":283,"depth":345,"text":284,"children":2433},[2434,2435],{"id":292,"depth":352,"text":293},{"id":1576,"depth":352,"text":1577},{"id":1686,"depth":345,"text":1687,"children":2437},[2438,2439,2440,2441],{"id":1693,"depth":352,"text":1694},{"id":1737,"depth":352,"text":1738},{"id":1762,"depth":352,"text":1763},{"id":1783,"depth":352,"text":1784},{"id":1872,"depth":345,"text":1873,"children":2443},[2444,2445],{"id":1879,"depth":352,"text":1880},{"id":1894,"depth":352,"text":1895},{"id":1939,"depth":345,"text":1940,"children":2447},[2448,2449,2450,2451,2452,2453,2454,2455,2456,2457],{"id":1946,"depth":352,"text":1947},{"id":1967,"depth":352,"text":1968},{"id":1982,"depth":352,"text":1983},{"id":2007,"depth":352,"text":2008},{"id":2034,"depth":352,"text":2035},{"id":2055,"depth":352,"text":2056},{"id":2068,"depth":352,"text":2069},{"id":2109,"depth":352,"text":2110},{"id":2132,"depth":352,"text":2133},{"id":2155,"depth":352,"text":2156},{"id":2254,"depth":345,"text":2255,"children":2459},[2460,2461,2462,2463,2464],{"id":2261,"depth":352,"text":2262},{"id":2288,"depth":352,"text":2289},{"id":2319,"depth":352,"text":49},{"id":2340,"depth":352,"text":2341},{"id":2359,"depth":352,"text":2360},"Review the new features, improvements, and fixes shipped in each Monospace release.","md",null,{"aside":6,"sidebar":6},{"icon":262},{"title":267,"description":2465},"5_fkzR_85j1iOPb9tZjfr7KUnYEFw3bhIWxJx_j7jys",[2473,2467],{"title":256,"path":257,"stem":258,"description":2474,"icon":259,"children":-1},"Understand the current limitations around data aggregation natively in the Monospace API.",1784053971291]