[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-appwrite-appwrite-swift":3,"mdc--yj9n99-key":39,"related-org-appwrite-appwrite-swift":3590,"related-repo-appwrite-appwrite-swift":3758},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":29,"repoUrl":30,"updatedAt":31,"license":32,"forks":33,"topics":34,"repo":35,"sourceUrl":37,"mdContent":38},"appwrite-swift","build applications with Appwrite Swift SDK","Appwrite Swift SDK skill. Use when building native iOS, macOS, watchOS, or tvOS apps, or server-side Swift applications with Appwrite. Covers client-side auth (email, OAuth), database queries, file uploads, real-time subscriptions with async\u002Fawait, and server-side admin via API keys for user management, database administration, storage, and functions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"appwrite","Appwrite","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fappwrite.png",[12,16,19,22,25,28],{"name":13,"slug":14,"type":15},"Auth","auth","tag",{"name":17,"slug":18,"type":15},"iOS","ios",{"name":20,"slug":21,"type":15},"macOS","macos",{"name":23,"slug":24,"type":15},"Swift","swift",{"name":26,"slug":27,"type":15},"Database","database",{"name":9,"slug":8,"type":15},23,"https:\u002F\u002Fgithub.com\u002Fappwrite\u002Fskills","2026-07-12T08:45:26.722393",null,0,[],{"repoUrl":30,"stars":29,"forks":33,"topics":36,"description":32},[],"https:\u002F\u002Fgithub.com\u002Fappwrite\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fappwrite-swift","---\nname: appwrite-swift\ndescription: Appwrite Swift SDK skill. Use when building native iOS, macOS, watchOS, or tvOS apps, or server-side Swift applications with Appwrite. Covers client-side auth (email, OAuth), database queries, file uploads, real-time subscriptions with async\u002Fawait, and server-side admin via API keys for user management, database administration, storage, and functions.\n---\n\n\n# Appwrite Swift SDK\n\n## Installation\n\n```swift\n\u002F\u002F Swift Package Manager — Package.swift\n.package(url: \"https:\u002F\u002Fgithub.com\u002Fappwrite\u002Fsdk-for-swift\", branch: \"main\")\n```\n\n## Setting Up the Client\n\n### Client-side (Apple platforms)\n\n```swift\nimport Appwrite\n\nlet client = Client()\n    .setEndpoint(\"https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1\")\n    .setProject(\"[PROJECT_ID]\")\n```\n\n### Server-side (Swift)\n\n```swift\nimport Appwrite\n\nlet client = Client()\n    .setEndpoint(\"https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1\")\n    .setProject(ProcessInfo.processInfo.environment[\"APPWRITE_PROJECT_ID\"]!)\n    .setKey(ProcessInfo.processInfo.environment[\"APPWRITE_API_KEY\"]!)\n```\n\n## Code Examples\n\n### Authentication (client-side)\n\n```swift\nlet account = Account(client)\n\n\u002F\u002F Signup\nlet user = try await account.create(userId: ID.unique(), email: \"user@example.com\", password: \"password123\", name: \"User Name\")\n\n\u002F\u002F Login\nlet session = try await account.createEmailPasswordSession(email: \"user@example.com\", password: \"password123\")\n\n\u002F\u002F OAuth\ntry await account.createOAuth2Session(provider: .google)\n\n\u002F\u002F Get current user\nlet me = try await account.get()\n\n\u002F\u002F Logout\ntry await account.deleteSession(sessionId: \"current\")\n```\n\n### User Management (server-side)\n\n```swift\nlet users = Users(client)\n\n\u002F\u002F Create user\nlet user = try await users.create(userId: ID.unique(), email: \"user@example.com\", password: \"password123\", name: \"User Name\")\n\n\u002F\u002F List users\nlet list = try await users.list(queries: [Query.limit(25)])\n\n\u002F\u002F Get user\nlet fetched = try await users.get(userId: \"[USER_ID]\")\n\n\u002F\u002F Delete user\ntry await users.delete(userId: \"[USER_ID]\")\n```\n\n### Database Operations\n\n> **Note:** Use `TablesDB` (not the deprecated `Databases` class) for all new code. Only use `Databases` if the existing codebase already relies on it or the user explicitly requests it.\n>\n> **Tip:** Prefer named parameters (e.g., `databaseId: \"...\"`) for all SDK method calls. Only use positional arguments if the existing codebase already uses them or the user explicitly requests it.\n\n```swift\nlet tablesDB = TablesDB(client)\n\n\u002F\u002F Create database (server-side only)\nlet db = try await tablesDB.create(databaseId: ID.unique(), name: \"My Database\")\n\n\u002F\u002F Create row\nlet doc = try await tablesDB.createRow(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", rowId: ID.unique(), data: [\n    \"title\": \"Hello\",\n    \"done\": false\n])\n\n\u002F\u002F Query rows\nlet results = try await tablesDB.listRows(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", queries: [\n    Query.equal(\"done\", value: false),\n    Query.limit(10)\n])\n\n\u002F\u002F Get row\nlet row = try await tablesDB.getRow(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", rowId: \"[ROW_ID]\")\n\n\u002F\u002F Update row\ntry await tablesDB.updateRow(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", rowId: \"[ROW_ID]\", data: [\"done\": true])\n\n\u002F\u002F Delete row\ntry await tablesDB.deleteRow(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", rowId: \"[ROW_ID]\")\n```\n\n#### String Column Types\n\n> **Note:** The legacy `string` type is deprecated. Use explicit column types for all new columns.\n\n| Type | Max characters | Indexing | Storage |\n|------|---------------|----------|---------|\n| `varchar` | 16,383 | Full index (if size ≤ 768) | Inline in row |\n| `text` | 16,383 | Prefix only | Off-page |\n| `mediumtext` | 4,194,303 | Prefix only | Off-page |\n| `longtext` | 1,073,741,823 | Prefix only | Off-page |\n\n- `varchar` is stored inline and counts towards the 64 KB row size limit. Prefer for short, indexed fields like names, slugs, or identifiers.\n- `text`, `mediumtext`, and `longtext` are stored off-page (only a 20-byte pointer lives in the row), so they don't consume the row size budget. `size` is not required for these types.\n\n```swift\n\u002F\u002F Create table with explicit string column types\ntry await tablesDB.createTable(\n    databaseId: \"[DATABASE_ID]\",\n    tableId: ID.unique(),\n    name: \"articles\",\n    columns: [\n        [\"key\": \"title\",    \"type\": \"varchar\",    \"size\": 255, \"required\": true],\n        [\"key\": \"summary\",  \"type\": \"text\",                    \"required\": false],\n        [\"key\": \"body\",     \"type\": \"mediumtext\",              \"required\": false],\n        [\"key\": \"raw_data\", \"type\": \"longtext\",                \"required\": false],\n    ]\n)\n```\n\n### Query Methods\n\n```swift\n\u002F\u002F Filtering\nQuery.equal(\"field\", value: \"value\")          \u002F\u002F == (or pass array for IN)\nQuery.notEqual(\"field\", value: \"value\")       \u002F\u002F !=\nQuery.lessThan(\"field\", value: 100)           \u002F\u002F \u003C\nQuery.lessThanEqual(\"field\", value: 100)      \u002F\u002F \u003C=\nQuery.greaterThan(\"field\", value: 100)        \u002F\u002F >\nQuery.greaterThanEqual(\"field\", value: 100)   \u002F\u002F >=\nQuery.between(\"field\", start: 1, end: 100)    \u002F\u002F 1 \u003C= field \u003C= 100\nQuery.isNull(\"field\")                         \u002F\u002F is null\nQuery.isNotNull(\"field\")                      \u002F\u002F is not null\nQuery.startsWith(\"field\", value: \"prefix\")    \u002F\u002F starts with\nQuery.endsWith(\"field\", value: \"suffix\")      \u002F\u002F ends with\nQuery.contains(\"field\", value: \"sub\")         \u002F\u002F contains\nQuery.search(\"field\", value: \"keywords\")      \u002F\u002F full-text search (requires index)\n\n\u002F\u002F Sorting\nQuery.orderAsc(\"field\")\nQuery.orderDesc(\"field\")\n\n\u002F\u002F Pagination\nQuery.limit(25)                               \u002F\u002F max rows (default 25, max 100)\nQuery.offset(0)                               \u002F\u002F skip N rows\nQuery.cursorAfter(\"[ROW_ID]\")                 \u002F\u002F cursor pagination (preferred)\nQuery.cursorBefore(\"[ROW_ID]\")\n\n\u002F\u002F Selection & Logic\nQuery.select([\"field1\", \"field2\"])\nQuery.or([Query.equal(\"a\", value: 1), Query.equal(\"b\", value: 2)])   \u002F\u002F OR\nQuery.and([Query.greaterThan(\"age\", value: 18), Query.lessThan(\"age\", value: 65)])  \u002F\u002F AND (default)\n```\n\n### File Storage\n\n```swift\nlet storage = Storage(client)\n\n\u002F\u002F Upload file\nlet file = try await storage.createFile(bucketId: \"[BUCKET_ID]\", fileId: ID.unique(), file: InputFile.fromPath(\"\u002Fpath\u002Fto\u002Ffile.png\"))\n\n\u002F\u002F List files\nlet files = try await storage.listFiles(bucketId: \"[BUCKET_ID]\")\n\n\u002F\u002F Delete file\ntry await storage.deleteFile(bucketId: \"[BUCKET_ID]\", fileId: \"[FILE_ID]\")\n```\n\n#### InputFile Factory Methods\n\n```swift\nInputFile.fromPath(\"\u002Fpath\u002Fto\u002Ffile.png\")                    \u002F\u002F from filesystem path\nInputFile.fromData(data, filename: \"file.png\", mimeType: \"image\u002Fpng\")  \u002F\u002F from Data\n```\n\n### Teams\n\n```swift\nlet teams = Teams(client)\n\n\u002F\u002F Create team\nlet team = try await teams.create(teamId: ID.unique(), name: \"Engineering\")\n\n\u002F\u002F List teams\nlet list = try await teams.list()\n\n\u002F\u002F Create membership (invite user by email)\nlet membership = try await teams.createMembership(\n    teamId: \"[TEAM_ID]\",\n    roles: [\"editor\"],\n    email: \"user@example.com\"\n)\n\n\u002F\u002F List memberships\nlet members = try await teams.listMemberships(teamId: \"[TEAM_ID]\")\n\n\u002F\u002F Update membership roles\ntry await teams.updateMembership(teamId: \"[TEAM_ID]\", membershipId: \"[MEMBERSHIP_ID]\", roles: [\"admin\"])\n\n\u002F\u002F Delete team\ntry await teams.delete(teamId: \"[TEAM_ID]\")\n```\n\n> **Role-based access:** Use `Role.team(\"[TEAM_ID]\")` for all team members or `Role.team(\"[TEAM_ID]\", \"editor\")` for a specific team role when setting permissions.\n\n### Real-time Subscriptions (client-side)\n\n```swift\nlet realtime = Realtime(client)\n\n\u002F\u002F Subscribe to row changes\nlet subscription = try await realtime.subscribe(channels: [\n    Channel.tablesdb(\"[DATABASE_ID]\").table(\"[TABLE_ID]\").row()\n]) { response in\n    print(response.events)   \u002F\u002F e.g. [\"tablesdb.*.tables.*.rows.*.create\"]\n    print(response.payload)  \u002F\u002F the affected resource\n}\n\n\u002F\u002F Subscribe to multiple channels\nlet multi = try await realtime.subscribe(channels: [\n    Channel.tablesdb(\"[DATABASE_ID]\").table(\"[TABLE_ID]\").row(),\n    Channel.files(),\n]) { response in \u002F* ... *\u002F }\n\n\u002F\u002F Cleanup\ntry await subscription.close()\n```\n\n**Available channels:**\n\n| Channel | Description |\n|---------|-------------|\n| `account` | Changes to the authenticated user's account |\n| `tablesdb.[DB_ID].tables.[TABLE_ID].rows` | All rows in a table |\n| `tablesdb.[DB_ID].tables.[TABLE_ID].rows.[ROW_ID]` | A specific row |\n| `buckets.[BUCKET_ID].files` | All files in a bucket |\n| `buckets.[BUCKET_ID].files.[FILE_ID]` | A specific file |\n| `teams` | Changes to teams the user belongs to |\n| `teams.[TEAM_ID]` | A specific team |\n| `memberships` | The user's team memberships |\n| `functions.[FUNCTION_ID].executions` | Function execution updates |\n\nResponse fields: `events` (array), `payload` (resource), `channels` (matched), `timestamp` (ISO 8601).\n\n### Serverless Functions (server-side)\n\n```swift\nlet functions = Functions(client)\n\n\u002F\u002F Execute function\nlet execution = try await functions.createExecution(functionId: \"[FUNCTION_ID]\", body: \"{\\\"key\\\": \\\"value\\\"}\")\n\n\u002F\u002F List executions\nlet executions = try await functions.listExecutions(functionId: \"[FUNCTION_ID]\")\n```\n\n#### Writing a Function Handler (Swift runtime)\n\n```swift\n\u002F\u002F Sources\u002Fmain.swift — Appwrite Function entry point\nfunc main(context: RuntimeContext) async throws -> RuntimeOutput {\n    \u002F\u002F context.req.body        — raw body (String)\n    \u002F\u002F context.req.bodyJson    — parsed JSON ([String: Any]?)\n    \u002F\u002F context.req.headers     — headers ([String: String])\n    \u002F\u002F context.req.method      — HTTP method\n    \u002F\u002F context.req.path        — URL path\n    \u002F\u002F context.req.query       — query params ([String: String])\n\n    context.log(\"Processing: \\(context.req.method) \\(context.req.path)\")\n\n    if context.req.method == \"GET\" {\n        return context.res.json([\"message\": \"Hello from Appwrite Function!\"])\n    }\n\n    return context.res.json([\"success\": true])       \u002F\u002F JSON\n    \u002F\u002F context.res.text(\"Hello\")                     \u002F\u002F plain text\n    \u002F\u002F context.res.empty()                           \u002F\u002F 204\n    \u002F\u002F context.res.redirect(\"https:\u002F\u002F...\")            \u002F\u002F 302\n}\n```\n\n### Server-Side Rendering (SSR) Authentication\n\nSSR apps using server-side Swift (Vapor, Hummingbird, etc.) use the **server SDK** to handle auth. You need two clients:\n\n- **Admin client** — uses an API key, creates sessions, bypasses rate limits (reusable singleton)\n- **Session client** — uses a session cookie, acts on behalf of a user (create per-request, never share)\n\n```swift\nimport Appwrite\n\n\u002F\u002F Admin client (reusable)\nlet adminClient = Client()\n    .setEndpoint(\"https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1\")\n    .setProject(\"[PROJECT_ID]\")\n    .setKey(Environment.get(\"APPWRITE_API_KEY\")!)\n\n\u002F\u002F Session client (create per-request)\nlet sessionClient = Client()\n    .setEndpoint(\"https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1\")\n    .setProject(\"[PROJECT_ID]\")\n\nif let session = req.cookies[\"a_session_[PROJECT_ID]\"]?.string {\n    sessionClient.setSession(session)\n}\n```\n\n#### Email\u002FPassword Login (Vapor)\n\n```swift\napp.post(\"login\") { req async throws -> Response in\n    let body = try req.content.decode(LoginRequest.self)\n    let account = Account(adminClient)\n    let session = try await account.createEmailPasswordSession(\n        email: body.email,\n        password: body.password\n    )\n\n    \u002F\u002F Cookie name must be a_session_\u003CPROJECT_ID>\n    let response = Response(status: .ok, body: .init(string: \"{\\\"success\\\": true}\"))\n    response.cookies[\"a_session_[PROJECT_ID]\"] = HTTPCookies.Value(\n        string: session.secret,\n        isHTTPOnly: true,\n        isSecure: true,\n        sameSite: .strict,\n        path: \"\u002F\"\n    )\n    return response\n}\n```\n\n#### Authenticated Requests\n\n```swift\napp.get(\"user\") { req async throws -> Response in\n    guard let session = req.cookies[\"a_session_[PROJECT_ID]\"]?.string else {\n        throw Abort(.unauthorized)\n    }\n\n    let sessionClient = Client()\n        .setEndpoint(\"https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1\")\n        .setProject(\"[PROJECT_ID]\")\n        .setSession(session)\n\n    let account = Account(sessionClient)\n    let user = try await account.get()\n    \u002F\u002F Return user as JSON\n}\n```\n\n#### OAuth2 SSR Flow\n\n```swift\n\u002F\u002F Step 1: Redirect to OAuth provider\napp.get(\"oauth\") { req async throws -> Response in\n    let account = Account(adminClient)\n    let redirectUrl = try await account.createOAuth2Token(\n        provider: .github,\n        success: \"https:\u002F\u002Fexample.com\u002Foauth\u002Fsuccess\",\n        failure: \"https:\u002F\u002Fexample.com\u002Foauth\u002Ffailure\"\n    )\n    return req.redirect(to: redirectUrl)\n}\n\n\u002F\u002F Step 2: Handle callback — exchange token for session\napp.get(\"oauth\", \"success\") { req async throws -> Response in\n    let userId = try req.query.get(String.self, at: \"userId\")\n    let secret = try req.query.get(String.self, at: \"secret\")\n\n    let account = Account(adminClient)\n    let session = try await account.createSession(userId: userId, secret: secret)\n\n    let response = Response(status: .ok, body: .init(string: \"{\\\"success\\\": true}\"))\n    response.cookies[\"a_session_[PROJECT_ID]\"] = HTTPCookies.Value(\n        string: session.secret,\n        isHTTPOnly: true, isSecure: true, sameSite: .strict, path: \"\u002F\"\n    )\n    return response\n}\n```\n\n> **Cookie security:** Always use `isHTTPOnly`, `isSecure`, and `sameSite: .strict` to prevent XSS. The cookie name must be `a_session_\u003CPROJECT_ID>`.\n\n> **Forwarding user agent:** Call `sessionClient.setForwardedUserAgent(req.headers.first(name: .userAgent) ?? \"\")` to record the end-user's browser info for debugging and security.\n\n## Error Handling\n\n```swift\nimport Appwrite\n\u002F\u002F AppwriteException is included in the main module\n\ndo {\n    let row = try await tablesDB.getRow(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", rowId: \"[ROW_ID]\")\n} catch let error as AppwriteException {\n    print(error.message)     \u002F\u002F human-readable message\n    print(error.code)        \u002F\u002F HTTP status code (Int)\n    print(error.type)        \u002F\u002F error type (e.g. \"document_not_found\")\n    print(error.response)    \u002F\u002F full response body\n}\n```\n\n**Common error codes:**\n\n| Code | Meaning |\n|------|---------|\n| `401` | Unauthorized — missing or invalid session\u002FAPI key |\n| `403` | Forbidden — insufficient permissions |\n| `404` | Not found — resource does not exist |\n| `409` | Conflict — duplicate ID or unique constraint |\n| `429` | Rate limited — too many requests |\n\n## Permissions & Roles (Critical)\n\nAppwrite uses permission strings to control access to resources. Each permission pairs an action (`read`, `update`, `delete`, `create`, or `write` which grants create + update + delete) with a role target. By default, **no user has access** unless permissions are explicitly set at the row\u002Ffile level or inherited from the table\u002Fbucket settings. Permissions are arrays of strings built with the `Permission` and `Role` helpers.\n\n```swift\nimport Appwrite\n\u002F\u002F Permission and Role are included in the main module import\n```\n\n### Database Row with Permissions\n\n```swift\nlet doc = try await tablesDB.createRow(\n    databaseId: \"[DATABASE_ID]\",\n    tableId: \"[TABLE_ID]\",\n    rowId: ID.unique(),\n    data: [\"title\": \"Hello World\"],\n    permissions: [\n        Permission.read(Role.user(\"[USER_ID]\")),     \u002F\u002F specific user can read\n        Permission.update(Role.user(\"[USER_ID]\")),   \u002F\u002F specific user can update\n        Permission.read(Role.team(\"[TEAM_ID]\")),     \u002F\u002F all team members can read\n        Permission.read(Role.any()),                 \u002F\u002F anyone (including guests) can read\n    ]\n)\n```\n\n### File Upload with Permissions\n\n```swift\nlet file = try await storage.createFile(\n    bucketId: \"[BUCKET_ID]\",\n    fileId: ID.unique(),\n    file: InputFile.fromPath(\"\u002Fpath\u002Fto\u002Ffile.png\"),\n    permissions: [\n        Permission.read(Role.any()),\n        Permission.update(Role.user(\"[USER_ID]\")),\n        Permission.delete(Role.user(\"[USER_ID]\")),\n    ]\n)\n```\n\n> **When to set permissions:** Set row\u002Ffile-level permissions when you need per-resource access control. If all rows in a table share the same rules, configure permissions at the table\u002Fbucket level and leave row permissions empty.\n\n> **Common mistakes:**\n> - **Forgetting permissions** — the resource becomes inaccessible to all users (including the creator)\n> - **`Role.any()` with `write`\u002F`update`\u002F`delete`** — allows any user, including unauthenticated guests, to modify or remove the resource\n> - **`Permission.read(Role.any())` on sensitive data** — makes the resource publicly readable\n\n",{"data":40,"body":41},{"name":4,"description":6},{"type":42,"children":43},"root",[44,53,60,91,97,104,155,161,213,219,225,365,371,478,484,541,749,756,776,916,963,1066,1072,1312,1318,1402,1408,1431,1437,1621,1649,1655,1803,1811,1985,2022,2028,2089,2095,2273,2279,2291,2314,2440,2446,2602,2608,2723,2729,2931,2974,2995,3001,3093,3101,3208,3214,3279,3301,3307,3407,3413,3497,3510,3584],{"type":45,"tag":46,"props":47,"children":49},"element","h1",{"id":48},"appwrite-swift-sdk",[50],{"type":51,"value":52},"text","Appwrite Swift SDK",{"type":45,"tag":54,"props":55,"children":57},"h2",{"id":56},"installation",[58],{"type":51,"value":59},"Installation",{"type":45,"tag":61,"props":62,"children":66},"pre",{"className":63,"code":64,"language":24,"meta":65,"style":65},"language-swift shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Swift Package Manager — Package.swift\n.package(url: \"https:\u002F\u002Fgithub.com\u002Fappwrite\u002Fsdk-for-swift\", branch: \"main\")\n","",[67],{"type":45,"tag":68,"props":69,"children":70},"code",{"__ignoreMap":65},[71,82],{"type":45,"tag":72,"props":73,"children":76},"span",{"class":74,"line":75},"line",1,[77],{"type":45,"tag":72,"props":78,"children":79},{},[80],{"type":51,"value":81},"\u002F\u002F Swift Package Manager — Package.swift\n",{"type":45,"tag":72,"props":83,"children":85},{"class":74,"line":84},2,[86],{"type":45,"tag":72,"props":87,"children":88},{},[89],{"type":51,"value":90},".package(url: \"https:\u002F\u002Fgithub.com\u002Fappwrite\u002Fsdk-for-swift\", branch: \"main\")\n",{"type":45,"tag":54,"props":92,"children":94},{"id":93},"setting-up-the-client",[95],{"type":51,"value":96},"Setting Up the Client",{"type":45,"tag":98,"props":99,"children":101},"h3",{"id":100},"client-side-apple-platforms",[102],{"type":51,"value":103},"Client-side (Apple platforms)",{"type":45,"tag":61,"props":105,"children":107},{"className":63,"code":106,"language":24,"meta":65,"style":65},"import Appwrite\n\nlet client = Client()\n    .setEndpoint(\"https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1\")\n    .setProject(\"[PROJECT_ID]\")\n",[108],{"type":45,"tag":68,"props":109,"children":110},{"__ignoreMap":65},[111,119,128,137,146],{"type":45,"tag":72,"props":112,"children":113},{"class":74,"line":75},[114],{"type":45,"tag":72,"props":115,"children":116},{},[117],{"type":51,"value":118},"import Appwrite\n",{"type":45,"tag":72,"props":120,"children":121},{"class":74,"line":84},[122],{"type":45,"tag":72,"props":123,"children":125},{"emptyLinePlaceholder":124},true,[126],{"type":51,"value":127},"\n",{"type":45,"tag":72,"props":129,"children":131},{"class":74,"line":130},3,[132],{"type":45,"tag":72,"props":133,"children":134},{},[135],{"type":51,"value":136},"let client = Client()\n",{"type":45,"tag":72,"props":138,"children":140},{"class":74,"line":139},4,[141],{"type":45,"tag":72,"props":142,"children":143},{},[144],{"type":51,"value":145},"    .setEndpoint(\"https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1\")\n",{"type":45,"tag":72,"props":147,"children":149},{"class":74,"line":148},5,[150],{"type":45,"tag":72,"props":151,"children":152},{},[153],{"type":51,"value":154},"    .setProject(\"[PROJECT_ID]\")\n",{"type":45,"tag":98,"props":156,"children":158},{"id":157},"server-side-swift",[159],{"type":51,"value":160},"Server-side (Swift)",{"type":45,"tag":61,"props":162,"children":164},{"className":63,"code":163,"language":24,"meta":65,"style":65},"import Appwrite\n\nlet client = Client()\n    .setEndpoint(\"https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1\")\n    .setProject(ProcessInfo.processInfo.environment[\"APPWRITE_PROJECT_ID\"]!)\n    .setKey(ProcessInfo.processInfo.environment[\"APPWRITE_API_KEY\"]!)\n",[165],{"type":45,"tag":68,"props":166,"children":167},{"__ignoreMap":65},[168,175,182,189,196,204],{"type":45,"tag":72,"props":169,"children":170},{"class":74,"line":75},[171],{"type":45,"tag":72,"props":172,"children":173},{},[174],{"type":51,"value":118},{"type":45,"tag":72,"props":176,"children":177},{"class":74,"line":84},[178],{"type":45,"tag":72,"props":179,"children":180},{"emptyLinePlaceholder":124},[181],{"type":51,"value":127},{"type":45,"tag":72,"props":183,"children":184},{"class":74,"line":130},[185],{"type":45,"tag":72,"props":186,"children":187},{},[188],{"type":51,"value":136},{"type":45,"tag":72,"props":190,"children":191},{"class":74,"line":139},[192],{"type":45,"tag":72,"props":193,"children":194},{},[195],{"type":51,"value":145},{"type":45,"tag":72,"props":197,"children":198},{"class":74,"line":148},[199],{"type":45,"tag":72,"props":200,"children":201},{},[202],{"type":51,"value":203},"    .setProject(ProcessInfo.processInfo.environment[\"APPWRITE_PROJECT_ID\"]!)\n",{"type":45,"tag":72,"props":205,"children":207},{"class":74,"line":206},6,[208],{"type":45,"tag":72,"props":209,"children":210},{},[211],{"type":51,"value":212},"    .setKey(ProcessInfo.processInfo.environment[\"APPWRITE_API_KEY\"]!)\n",{"type":45,"tag":54,"props":214,"children":216},{"id":215},"code-examples",[217],{"type":51,"value":218},"Code Examples",{"type":45,"tag":98,"props":220,"children":222},{"id":221},"authentication-client-side",[223],{"type":51,"value":224},"Authentication (client-side)",{"type":45,"tag":61,"props":226,"children":228},{"className":63,"code":227,"language":24,"meta":65,"style":65},"let account = Account(client)\n\n\u002F\u002F Signup\nlet user = try await account.create(userId: ID.unique(), email: \"user@example.com\", password: \"password123\", name: \"User Name\")\n\n\u002F\u002F Login\nlet session = try await account.createEmailPasswordSession(email: \"user@example.com\", password: \"password123\")\n\n\u002F\u002F OAuth\ntry await account.createOAuth2Session(provider: .google)\n\n\u002F\u002F Get current user\nlet me = try await account.get()\n\n\u002F\u002F Logout\ntry await account.deleteSession(sessionId: \"current\")\n",[229],{"type":45,"tag":68,"props":230,"children":231},{"__ignoreMap":65},[232,240,247,255,263,270,278,287,295,304,313,321,330,339,347,356],{"type":45,"tag":72,"props":233,"children":234},{"class":74,"line":75},[235],{"type":45,"tag":72,"props":236,"children":237},{},[238],{"type":51,"value":239},"let account = Account(client)\n",{"type":45,"tag":72,"props":241,"children":242},{"class":74,"line":84},[243],{"type":45,"tag":72,"props":244,"children":245},{"emptyLinePlaceholder":124},[246],{"type":51,"value":127},{"type":45,"tag":72,"props":248,"children":249},{"class":74,"line":130},[250],{"type":45,"tag":72,"props":251,"children":252},{},[253],{"type":51,"value":254},"\u002F\u002F Signup\n",{"type":45,"tag":72,"props":256,"children":257},{"class":74,"line":139},[258],{"type":45,"tag":72,"props":259,"children":260},{},[261],{"type":51,"value":262},"let user = try await account.create(userId: ID.unique(), email: \"user@example.com\", password: \"password123\", name: \"User Name\")\n",{"type":45,"tag":72,"props":264,"children":265},{"class":74,"line":148},[266],{"type":45,"tag":72,"props":267,"children":268},{"emptyLinePlaceholder":124},[269],{"type":51,"value":127},{"type":45,"tag":72,"props":271,"children":272},{"class":74,"line":206},[273],{"type":45,"tag":72,"props":274,"children":275},{},[276],{"type":51,"value":277},"\u002F\u002F Login\n",{"type":45,"tag":72,"props":279,"children":281},{"class":74,"line":280},7,[282],{"type":45,"tag":72,"props":283,"children":284},{},[285],{"type":51,"value":286},"let session = try await account.createEmailPasswordSession(email: \"user@example.com\", password: \"password123\")\n",{"type":45,"tag":72,"props":288,"children":290},{"class":74,"line":289},8,[291],{"type":45,"tag":72,"props":292,"children":293},{"emptyLinePlaceholder":124},[294],{"type":51,"value":127},{"type":45,"tag":72,"props":296,"children":298},{"class":74,"line":297},9,[299],{"type":45,"tag":72,"props":300,"children":301},{},[302],{"type":51,"value":303},"\u002F\u002F OAuth\n",{"type":45,"tag":72,"props":305,"children":307},{"class":74,"line":306},10,[308],{"type":45,"tag":72,"props":309,"children":310},{},[311],{"type":51,"value":312},"try await account.createOAuth2Session(provider: .google)\n",{"type":45,"tag":72,"props":314,"children":316},{"class":74,"line":315},11,[317],{"type":45,"tag":72,"props":318,"children":319},{"emptyLinePlaceholder":124},[320],{"type":51,"value":127},{"type":45,"tag":72,"props":322,"children":324},{"class":74,"line":323},12,[325],{"type":45,"tag":72,"props":326,"children":327},{},[328],{"type":51,"value":329},"\u002F\u002F Get current user\n",{"type":45,"tag":72,"props":331,"children":333},{"class":74,"line":332},13,[334],{"type":45,"tag":72,"props":335,"children":336},{},[337],{"type":51,"value":338},"let me = try await account.get()\n",{"type":45,"tag":72,"props":340,"children":342},{"class":74,"line":341},14,[343],{"type":45,"tag":72,"props":344,"children":345},{"emptyLinePlaceholder":124},[346],{"type":51,"value":127},{"type":45,"tag":72,"props":348,"children":350},{"class":74,"line":349},15,[351],{"type":45,"tag":72,"props":352,"children":353},{},[354],{"type":51,"value":355},"\u002F\u002F Logout\n",{"type":45,"tag":72,"props":357,"children":359},{"class":74,"line":358},16,[360],{"type":45,"tag":72,"props":361,"children":362},{},[363],{"type":51,"value":364},"try await account.deleteSession(sessionId: \"current\")\n",{"type":45,"tag":98,"props":366,"children":368},{"id":367},"user-management-server-side",[369],{"type":51,"value":370},"User Management (server-side)",{"type":45,"tag":61,"props":372,"children":374},{"className":63,"code":373,"language":24,"meta":65,"style":65},"let users = Users(client)\n\n\u002F\u002F Create user\nlet user = try await users.create(userId: ID.unique(), email: \"user@example.com\", password: \"password123\", name: \"User Name\")\n\n\u002F\u002F List users\nlet list = try await users.list(queries: [Query.limit(25)])\n\n\u002F\u002F Get user\nlet fetched = try await users.get(userId: \"[USER_ID]\")\n\n\u002F\u002F Delete user\ntry await users.delete(userId: \"[USER_ID]\")\n",[375],{"type":45,"tag":68,"props":376,"children":377},{"__ignoreMap":65},[378,386,393,401,409,416,424,432,439,447,455,462,470],{"type":45,"tag":72,"props":379,"children":380},{"class":74,"line":75},[381],{"type":45,"tag":72,"props":382,"children":383},{},[384],{"type":51,"value":385},"let users = Users(client)\n",{"type":45,"tag":72,"props":387,"children":388},{"class":74,"line":84},[389],{"type":45,"tag":72,"props":390,"children":391},{"emptyLinePlaceholder":124},[392],{"type":51,"value":127},{"type":45,"tag":72,"props":394,"children":395},{"class":74,"line":130},[396],{"type":45,"tag":72,"props":397,"children":398},{},[399],{"type":51,"value":400},"\u002F\u002F Create user\n",{"type":45,"tag":72,"props":402,"children":403},{"class":74,"line":139},[404],{"type":45,"tag":72,"props":405,"children":406},{},[407],{"type":51,"value":408},"let user = try await users.create(userId: ID.unique(), email: \"user@example.com\", password: \"password123\", name: \"User Name\")\n",{"type":45,"tag":72,"props":410,"children":411},{"class":74,"line":148},[412],{"type":45,"tag":72,"props":413,"children":414},{"emptyLinePlaceholder":124},[415],{"type":51,"value":127},{"type":45,"tag":72,"props":417,"children":418},{"class":74,"line":206},[419],{"type":45,"tag":72,"props":420,"children":421},{},[422],{"type":51,"value":423},"\u002F\u002F List users\n",{"type":45,"tag":72,"props":425,"children":426},{"class":74,"line":280},[427],{"type":45,"tag":72,"props":428,"children":429},{},[430],{"type":51,"value":431},"let list = try await users.list(queries: [Query.limit(25)])\n",{"type":45,"tag":72,"props":433,"children":434},{"class":74,"line":289},[435],{"type":45,"tag":72,"props":436,"children":437},{"emptyLinePlaceholder":124},[438],{"type":51,"value":127},{"type":45,"tag":72,"props":440,"children":441},{"class":74,"line":297},[442],{"type":45,"tag":72,"props":443,"children":444},{},[445],{"type":51,"value":446},"\u002F\u002F Get user\n",{"type":45,"tag":72,"props":448,"children":449},{"class":74,"line":306},[450],{"type":45,"tag":72,"props":451,"children":452},{},[453],{"type":51,"value":454},"let fetched = try await users.get(userId: \"[USER_ID]\")\n",{"type":45,"tag":72,"props":456,"children":457},{"class":74,"line":315},[458],{"type":45,"tag":72,"props":459,"children":460},{"emptyLinePlaceholder":124},[461],{"type":51,"value":127},{"type":45,"tag":72,"props":463,"children":464},{"class":74,"line":323},[465],{"type":45,"tag":72,"props":466,"children":467},{},[468],{"type":51,"value":469},"\u002F\u002F Delete user\n",{"type":45,"tag":72,"props":471,"children":472},{"class":74,"line":332},[473],{"type":45,"tag":72,"props":474,"children":475},{},[476],{"type":51,"value":477},"try await users.delete(userId: \"[USER_ID]\")\n",{"type":45,"tag":98,"props":479,"children":481},{"id":480},"database-operations",[482],{"type":51,"value":483},"Database Operations",{"type":45,"tag":485,"props":486,"children":487},"blockquote",{},[488,523],{"type":45,"tag":489,"props":490,"children":491},"p",{},[492,498,500,506,508,514,516,521],{"type":45,"tag":493,"props":494,"children":495},"strong",{},[496],{"type":51,"value":497},"Note:",{"type":51,"value":499}," Use ",{"type":45,"tag":68,"props":501,"children":503},{"className":502},[],[504],{"type":51,"value":505},"TablesDB",{"type":51,"value":507}," (not the deprecated ",{"type":45,"tag":68,"props":509,"children":511},{"className":510},[],[512],{"type":51,"value":513},"Databases",{"type":51,"value":515}," class) for all new code. Only use ",{"type":45,"tag":68,"props":517,"children":519},{"className":518},[],[520],{"type":51,"value":513},{"type":51,"value":522}," if the existing codebase already relies on it or the user explicitly requests it.",{"type":45,"tag":489,"props":524,"children":525},{},[526,531,533,539],{"type":45,"tag":493,"props":527,"children":528},{},[529],{"type":51,"value":530},"Tip:",{"type":51,"value":532}," Prefer named parameters (e.g., ",{"type":45,"tag":68,"props":534,"children":536},{"className":535},[],[537],{"type":51,"value":538},"databaseId: \"...\"",{"type":51,"value":540},") for all SDK method calls. Only use positional arguments if the existing codebase already uses them or the user explicitly requests it.",{"type":45,"tag":61,"props":542,"children":544},{"className":63,"code":543,"language":24,"meta":65,"style":65},"let tablesDB = TablesDB(client)\n\n\u002F\u002F Create database (server-side only)\nlet db = try await tablesDB.create(databaseId: ID.unique(), name: \"My Database\")\n\n\u002F\u002F Create row\nlet doc = try await tablesDB.createRow(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", rowId: ID.unique(), data: [\n    \"title\": \"Hello\",\n    \"done\": false\n])\n\n\u002F\u002F Query rows\nlet results = try await tablesDB.listRows(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", queries: [\n    Query.equal(\"done\", value: false),\n    Query.limit(10)\n])\n\n\u002F\u002F Get row\nlet row = try await tablesDB.getRow(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", rowId: \"[ROW_ID]\")\n\n\u002F\u002F Update row\ntry await tablesDB.updateRow(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", rowId: \"[ROW_ID]\", data: [\"done\": true])\n\n\u002F\u002F Delete row\ntry await tablesDB.deleteRow(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", rowId: \"[ROW_ID]\")\n",[545],{"type":45,"tag":68,"props":546,"children":547},{"__ignoreMap":65},[548,556,563,571,579,586,594,602,610,618,626,633,641,649,657,665,672,680,689,698,706,715,724,731,740],{"type":45,"tag":72,"props":549,"children":550},{"class":74,"line":75},[551],{"type":45,"tag":72,"props":552,"children":553},{},[554],{"type":51,"value":555},"let tablesDB = TablesDB(client)\n",{"type":45,"tag":72,"props":557,"children":558},{"class":74,"line":84},[559],{"type":45,"tag":72,"props":560,"children":561},{"emptyLinePlaceholder":124},[562],{"type":51,"value":127},{"type":45,"tag":72,"props":564,"children":565},{"class":74,"line":130},[566],{"type":45,"tag":72,"props":567,"children":568},{},[569],{"type":51,"value":570},"\u002F\u002F Create database (server-side only)\n",{"type":45,"tag":72,"props":572,"children":573},{"class":74,"line":139},[574],{"type":45,"tag":72,"props":575,"children":576},{},[577],{"type":51,"value":578},"let db = try await tablesDB.create(databaseId: ID.unique(), name: \"My Database\")\n",{"type":45,"tag":72,"props":580,"children":581},{"class":74,"line":148},[582],{"type":45,"tag":72,"props":583,"children":584},{"emptyLinePlaceholder":124},[585],{"type":51,"value":127},{"type":45,"tag":72,"props":587,"children":588},{"class":74,"line":206},[589],{"type":45,"tag":72,"props":590,"children":591},{},[592],{"type":51,"value":593},"\u002F\u002F Create row\n",{"type":45,"tag":72,"props":595,"children":596},{"class":74,"line":280},[597],{"type":45,"tag":72,"props":598,"children":599},{},[600],{"type":51,"value":601},"let doc = try await tablesDB.createRow(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", rowId: ID.unique(), data: [\n",{"type":45,"tag":72,"props":603,"children":604},{"class":74,"line":289},[605],{"type":45,"tag":72,"props":606,"children":607},{},[608],{"type":51,"value":609},"    \"title\": \"Hello\",\n",{"type":45,"tag":72,"props":611,"children":612},{"class":74,"line":297},[613],{"type":45,"tag":72,"props":614,"children":615},{},[616],{"type":51,"value":617},"    \"done\": false\n",{"type":45,"tag":72,"props":619,"children":620},{"class":74,"line":306},[621],{"type":45,"tag":72,"props":622,"children":623},{},[624],{"type":51,"value":625},"])\n",{"type":45,"tag":72,"props":627,"children":628},{"class":74,"line":315},[629],{"type":45,"tag":72,"props":630,"children":631},{"emptyLinePlaceholder":124},[632],{"type":51,"value":127},{"type":45,"tag":72,"props":634,"children":635},{"class":74,"line":323},[636],{"type":45,"tag":72,"props":637,"children":638},{},[639],{"type":51,"value":640},"\u002F\u002F Query rows\n",{"type":45,"tag":72,"props":642,"children":643},{"class":74,"line":332},[644],{"type":45,"tag":72,"props":645,"children":646},{},[647],{"type":51,"value":648},"let results = try await tablesDB.listRows(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", queries: [\n",{"type":45,"tag":72,"props":650,"children":651},{"class":74,"line":341},[652],{"type":45,"tag":72,"props":653,"children":654},{},[655],{"type":51,"value":656},"    Query.equal(\"done\", value: false),\n",{"type":45,"tag":72,"props":658,"children":659},{"class":74,"line":349},[660],{"type":45,"tag":72,"props":661,"children":662},{},[663],{"type":51,"value":664},"    Query.limit(10)\n",{"type":45,"tag":72,"props":666,"children":667},{"class":74,"line":358},[668],{"type":45,"tag":72,"props":669,"children":670},{},[671],{"type":51,"value":625},{"type":45,"tag":72,"props":673,"children":675},{"class":74,"line":674},17,[676],{"type":45,"tag":72,"props":677,"children":678},{"emptyLinePlaceholder":124},[679],{"type":51,"value":127},{"type":45,"tag":72,"props":681,"children":683},{"class":74,"line":682},18,[684],{"type":45,"tag":72,"props":685,"children":686},{},[687],{"type":51,"value":688},"\u002F\u002F Get row\n",{"type":45,"tag":72,"props":690,"children":692},{"class":74,"line":691},19,[693],{"type":45,"tag":72,"props":694,"children":695},{},[696],{"type":51,"value":697},"let row = try await tablesDB.getRow(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", rowId: \"[ROW_ID]\")\n",{"type":45,"tag":72,"props":699,"children":701},{"class":74,"line":700},20,[702],{"type":45,"tag":72,"props":703,"children":704},{"emptyLinePlaceholder":124},[705],{"type":51,"value":127},{"type":45,"tag":72,"props":707,"children":709},{"class":74,"line":708},21,[710],{"type":45,"tag":72,"props":711,"children":712},{},[713],{"type":51,"value":714},"\u002F\u002F Update row\n",{"type":45,"tag":72,"props":716,"children":718},{"class":74,"line":717},22,[719],{"type":45,"tag":72,"props":720,"children":721},{},[722],{"type":51,"value":723},"try await tablesDB.updateRow(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", rowId: \"[ROW_ID]\", data: [\"done\": true])\n",{"type":45,"tag":72,"props":725,"children":726},{"class":74,"line":29},[727],{"type":45,"tag":72,"props":728,"children":729},{"emptyLinePlaceholder":124},[730],{"type":51,"value":127},{"type":45,"tag":72,"props":732,"children":734},{"class":74,"line":733},24,[735],{"type":45,"tag":72,"props":736,"children":737},{},[738],{"type":51,"value":739},"\u002F\u002F Delete row\n",{"type":45,"tag":72,"props":741,"children":743},{"class":74,"line":742},25,[744],{"type":45,"tag":72,"props":745,"children":746},{},[747],{"type":51,"value":748},"try await tablesDB.deleteRow(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", rowId: \"[ROW_ID]\")\n",{"type":45,"tag":750,"props":751,"children":753},"h4",{"id":752},"string-column-types",[754],{"type":51,"value":755},"String Column Types",{"type":45,"tag":485,"props":757,"children":758},{},[759],{"type":45,"tag":489,"props":760,"children":761},{},[762,766,768,774],{"type":45,"tag":493,"props":763,"children":764},{},[765],{"type":51,"value":497},{"type":51,"value":767}," The legacy ",{"type":45,"tag":68,"props":769,"children":771},{"className":770},[],[772],{"type":51,"value":773},"string",{"type":51,"value":775}," type is deprecated. Use explicit column types for all new columns.",{"type":45,"tag":777,"props":778,"children":779},"table",{},[780,809],{"type":45,"tag":781,"props":782,"children":783},"thead",{},[784],{"type":45,"tag":785,"props":786,"children":787},"tr",{},[788,794,799,804],{"type":45,"tag":789,"props":790,"children":791},"th",{},[792],{"type":51,"value":793},"Type",{"type":45,"tag":789,"props":795,"children":796},{},[797],{"type":51,"value":798},"Max characters",{"type":45,"tag":789,"props":800,"children":801},{},[802],{"type":51,"value":803},"Indexing",{"type":45,"tag":789,"props":805,"children":806},{},[807],{"type":51,"value":808},"Storage",{"type":45,"tag":810,"props":811,"children":812},"tbody",{},[813,841,866,891],{"type":45,"tag":785,"props":814,"children":815},{},[816,826,831,836],{"type":45,"tag":817,"props":818,"children":819},"td",{},[820],{"type":45,"tag":68,"props":821,"children":823},{"className":822},[],[824],{"type":51,"value":825},"varchar",{"type":45,"tag":817,"props":827,"children":828},{},[829],{"type":51,"value":830},"16,383",{"type":45,"tag":817,"props":832,"children":833},{},[834],{"type":51,"value":835},"Full index (if size ≤ 768)",{"type":45,"tag":817,"props":837,"children":838},{},[839],{"type":51,"value":840},"Inline in row",{"type":45,"tag":785,"props":842,"children":843},{},[844,852,856,861],{"type":45,"tag":817,"props":845,"children":846},{},[847],{"type":45,"tag":68,"props":848,"children":850},{"className":849},[],[851],{"type":51,"value":51},{"type":45,"tag":817,"props":853,"children":854},{},[855],{"type":51,"value":830},{"type":45,"tag":817,"props":857,"children":858},{},[859],{"type":51,"value":860},"Prefix only",{"type":45,"tag":817,"props":862,"children":863},{},[864],{"type":51,"value":865},"Off-page",{"type":45,"tag":785,"props":867,"children":868},{},[869,878,883,887],{"type":45,"tag":817,"props":870,"children":871},{},[872],{"type":45,"tag":68,"props":873,"children":875},{"className":874},[],[876],{"type":51,"value":877},"mediumtext",{"type":45,"tag":817,"props":879,"children":880},{},[881],{"type":51,"value":882},"4,194,303",{"type":45,"tag":817,"props":884,"children":885},{},[886],{"type":51,"value":860},{"type":45,"tag":817,"props":888,"children":889},{},[890],{"type":51,"value":865},{"type":45,"tag":785,"props":892,"children":893},{},[894,903,908,912],{"type":45,"tag":817,"props":895,"children":896},{},[897],{"type":45,"tag":68,"props":898,"children":900},{"className":899},[],[901],{"type":51,"value":902},"longtext",{"type":45,"tag":817,"props":904,"children":905},{},[906],{"type":51,"value":907},"1,073,741,823",{"type":45,"tag":817,"props":909,"children":910},{},[911],{"type":51,"value":860},{"type":45,"tag":817,"props":913,"children":914},{},[915],{"type":51,"value":865},{"type":45,"tag":917,"props":918,"children":919},"ul",{},[920,931],{"type":45,"tag":921,"props":922,"children":923},"li",{},[924,929],{"type":45,"tag":68,"props":925,"children":927},{"className":926},[],[928],{"type":51,"value":825},{"type":51,"value":930}," is stored inline and counts towards the 64 KB row size limit. Prefer for short, indexed fields like names, slugs, or identifiers.",{"type":45,"tag":921,"props":932,"children":933},{},[934,939,941,946,948,953,955,961],{"type":45,"tag":68,"props":935,"children":937},{"className":936},[],[938],{"type":51,"value":51},{"type":51,"value":940},", ",{"type":45,"tag":68,"props":942,"children":944},{"className":943},[],[945],{"type":51,"value":877},{"type":51,"value":947},", and ",{"type":45,"tag":68,"props":949,"children":951},{"className":950},[],[952],{"type":51,"value":902},{"type":51,"value":954}," are stored off-page (only a 20-byte pointer lives in the row), so they don't consume the row size budget. ",{"type":45,"tag":68,"props":956,"children":958},{"className":957},[],[959],{"type":51,"value":960},"size",{"type":51,"value":962}," is not required for these types.",{"type":45,"tag":61,"props":964,"children":966},{"className":63,"code":965,"language":24,"meta":65,"style":65},"\u002F\u002F Create table with explicit string column types\ntry await tablesDB.createTable(\n    databaseId: \"[DATABASE_ID]\",\n    tableId: ID.unique(),\n    name: \"articles\",\n    columns: [\n        [\"key\": \"title\",    \"type\": \"varchar\",    \"size\": 255, \"required\": true],\n        [\"key\": \"summary\",  \"type\": \"text\",                    \"required\": false],\n        [\"key\": \"body\",     \"type\": \"mediumtext\",              \"required\": false],\n        [\"key\": \"raw_data\", \"type\": \"longtext\",                \"required\": false],\n    ]\n)\n",[967],{"type":45,"tag":68,"props":968,"children":969},{"__ignoreMap":65},[970,978,986,994,1002,1010,1018,1026,1034,1042,1050,1058],{"type":45,"tag":72,"props":971,"children":972},{"class":74,"line":75},[973],{"type":45,"tag":72,"props":974,"children":975},{},[976],{"type":51,"value":977},"\u002F\u002F Create table with explicit string column types\n",{"type":45,"tag":72,"props":979,"children":980},{"class":74,"line":84},[981],{"type":45,"tag":72,"props":982,"children":983},{},[984],{"type":51,"value":985},"try await tablesDB.createTable(\n",{"type":45,"tag":72,"props":987,"children":988},{"class":74,"line":130},[989],{"type":45,"tag":72,"props":990,"children":991},{},[992],{"type":51,"value":993},"    databaseId: \"[DATABASE_ID]\",\n",{"type":45,"tag":72,"props":995,"children":996},{"class":74,"line":139},[997],{"type":45,"tag":72,"props":998,"children":999},{},[1000],{"type":51,"value":1001},"    tableId: ID.unique(),\n",{"type":45,"tag":72,"props":1003,"children":1004},{"class":74,"line":148},[1005],{"type":45,"tag":72,"props":1006,"children":1007},{},[1008],{"type":51,"value":1009},"    name: \"articles\",\n",{"type":45,"tag":72,"props":1011,"children":1012},{"class":74,"line":206},[1013],{"type":45,"tag":72,"props":1014,"children":1015},{},[1016],{"type":51,"value":1017},"    columns: [\n",{"type":45,"tag":72,"props":1019,"children":1020},{"class":74,"line":280},[1021],{"type":45,"tag":72,"props":1022,"children":1023},{},[1024],{"type":51,"value":1025},"        [\"key\": \"title\",    \"type\": \"varchar\",    \"size\": 255, \"required\": true],\n",{"type":45,"tag":72,"props":1027,"children":1028},{"class":74,"line":289},[1029],{"type":45,"tag":72,"props":1030,"children":1031},{},[1032],{"type":51,"value":1033},"        [\"key\": \"summary\",  \"type\": \"text\",                    \"required\": false],\n",{"type":45,"tag":72,"props":1035,"children":1036},{"class":74,"line":297},[1037],{"type":45,"tag":72,"props":1038,"children":1039},{},[1040],{"type":51,"value":1041},"        [\"key\": \"body\",     \"type\": \"mediumtext\",              \"required\": false],\n",{"type":45,"tag":72,"props":1043,"children":1044},{"class":74,"line":306},[1045],{"type":45,"tag":72,"props":1046,"children":1047},{},[1048],{"type":51,"value":1049},"        [\"key\": \"raw_data\", \"type\": \"longtext\",                \"required\": false],\n",{"type":45,"tag":72,"props":1051,"children":1052},{"class":74,"line":315},[1053],{"type":45,"tag":72,"props":1054,"children":1055},{},[1056],{"type":51,"value":1057},"    ]\n",{"type":45,"tag":72,"props":1059,"children":1060},{"class":74,"line":323},[1061],{"type":45,"tag":72,"props":1062,"children":1063},{},[1064],{"type":51,"value":1065},")\n",{"type":45,"tag":98,"props":1067,"children":1069},{"id":1068},"query-methods",[1070],{"type":51,"value":1071},"Query Methods",{"type":45,"tag":61,"props":1073,"children":1075},{"className":63,"code":1074,"language":24,"meta":65,"style":65},"\u002F\u002F Filtering\nQuery.equal(\"field\", value: \"value\")          \u002F\u002F == (or pass array for IN)\nQuery.notEqual(\"field\", value: \"value\")       \u002F\u002F !=\nQuery.lessThan(\"field\", value: 100)           \u002F\u002F \u003C\nQuery.lessThanEqual(\"field\", value: 100)      \u002F\u002F \u003C=\nQuery.greaterThan(\"field\", value: 100)        \u002F\u002F >\nQuery.greaterThanEqual(\"field\", value: 100)   \u002F\u002F >=\nQuery.between(\"field\", start: 1, end: 100)    \u002F\u002F 1 \u003C= field \u003C= 100\nQuery.isNull(\"field\")                         \u002F\u002F is null\nQuery.isNotNull(\"field\")                      \u002F\u002F is not null\nQuery.startsWith(\"field\", value: \"prefix\")    \u002F\u002F starts with\nQuery.endsWith(\"field\", value: \"suffix\")      \u002F\u002F ends with\nQuery.contains(\"field\", value: \"sub\")         \u002F\u002F contains\nQuery.search(\"field\", value: \"keywords\")      \u002F\u002F full-text search (requires index)\n\n\u002F\u002F Sorting\nQuery.orderAsc(\"field\")\nQuery.orderDesc(\"field\")\n\n\u002F\u002F Pagination\nQuery.limit(25)                               \u002F\u002F max rows (default 25, max 100)\nQuery.offset(0)                               \u002F\u002F skip N rows\nQuery.cursorAfter(\"[ROW_ID]\")                 \u002F\u002F cursor pagination (preferred)\nQuery.cursorBefore(\"[ROW_ID]\")\n\n\u002F\u002F Selection & Logic\nQuery.select([\"field1\", \"field2\"])\nQuery.or([Query.equal(\"a\", value: 1), Query.equal(\"b\", value: 2)])   \u002F\u002F OR\nQuery.and([Query.greaterThan(\"age\", value: 18), Query.lessThan(\"age\", value: 65)])  \u002F\u002F AND (default)\n",[1076],{"type":45,"tag":68,"props":1077,"children":1078},{"__ignoreMap":65},[1079,1087,1095,1103,1111,1119,1127,1135,1143,1151,1159,1167,1175,1183,1191,1198,1206,1214,1222,1229,1237,1245,1253,1261,1269,1276,1285,1294,1303],{"type":45,"tag":72,"props":1080,"children":1081},{"class":74,"line":75},[1082],{"type":45,"tag":72,"props":1083,"children":1084},{},[1085],{"type":51,"value":1086},"\u002F\u002F Filtering\n",{"type":45,"tag":72,"props":1088,"children":1089},{"class":74,"line":84},[1090],{"type":45,"tag":72,"props":1091,"children":1092},{},[1093],{"type":51,"value":1094},"Query.equal(\"field\", value: \"value\")          \u002F\u002F == (or pass array for IN)\n",{"type":45,"tag":72,"props":1096,"children":1097},{"class":74,"line":130},[1098],{"type":45,"tag":72,"props":1099,"children":1100},{},[1101],{"type":51,"value":1102},"Query.notEqual(\"field\", value: \"value\")       \u002F\u002F !=\n",{"type":45,"tag":72,"props":1104,"children":1105},{"class":74,"line":139},[1106],{"type":45,"tag":72,"props":1107,"children":1108},{},[1109],{"type":51,"value":1110},"Query.lessThan(\"field\", value: 100)           \u002F\u002F \u003C\n",{"type":45,"tag":72,"props":1112,"children":1113},{"class":74,"line":148},[1114],{"type":45,"tag":72,"props":1115,"children":1116},{},[1117],{"type":51,"value":1118},"Query.lessThanEqual(\"field\", value: 100)      \u002F\u002F \u003C=\n",{"type":45,"tag":72,"props":1120,"children":1121},{"class":74,"line":206},[1122],{"type":45,"tag":72,"props":1123,"children":1124},{},[1125],{"type":51,"value":1126},"Query.greaterThan(\"field\", value: 100)        \u002F\u002F >\n",{"type":45,"tag":72,"props":1128,"children":1129},{"class":74,"line":280},[1130],{"type":45,"tag":72,"props":1131,"children":1132},{},[1133],{"type":51,"value":1134},"Query.greaterThanEqual(\"field\", value: 100)   \u002F\u002F >=\n",{"type":45,"tag":72,"props":1136,"children":1137},{"class":74,"line":289},[1138],{"type":45,"tag":72,"props":1139,"children":1140},{},[1141],{"type":51,"value":1142},"Query.between(\"field\", start: 1, end: 100)    \u002F\u002F 1 \u003C= field \u003C= 100\n",{"type":45,"tag":72,"props":1144,"children":1145},{"class":74,"line":297},[1146],{"type":45,"tag":72,"props":1147,"children":1148},{},[1149],{"type":51,"value":1150},"Query.isNull(\"field\")                         \u002F\u002F is null\n",{"type":45,"tag":72,"props":1152,"children":1153},{"class":74,"line":306},[1154],{"type":45,"tag":72,"props":1155,"children":1156},{},[1157],{"type":51,"value":1158},"Query.isNotNull(\"field\")                      \u002F\u002F is not null\n",{"type":45,"tag":72,"props":1160,"children":1161},{"class":74,"line":315},[1162],{"type":45,"tag":72,"props":1163,"children":1164},{},[1165],{"type":51,"value":1166},"Query.startsWith(\"field\", value: \"prefix\")    \u002F\u002F starts with\n",{"type":45,"tag":72,"props":1168,"children":1169},{"class":74,"line":323},[1170],{"type":45,"tag":72,"props":1171,"children":1172},{},[1173],{"type":51,"value":1174},"Query.endsWith(\"field\", value: \"suffix\")      \u002F\u002F ends with\n",{"type":45,"tag":72,"props":1176,"children":1177},{"class":74,"line":332},[1178],{"type":45,"tag":72,"props":1179,"children":1180},{},[1181],{"type":51,"value":1182},"Query.contains(\"field\", value: \"sub\")         \u002F\u002F contains\n",{"type":45,"tag":72,"props":1184,"children":1185},{"class":74,"line":341},[1186],{"type":45,"tag":72,"props":1187,"children":1188},{},[1189],{"type":51,"value":1190},"Query.search(\"field\", value: \"keywords\")      \u002F\u002F full-text search (requires index)\n",{"type":45,"tag":72,"props":1192,"children":1193},{"class":74,"line":349},[1194],{"type":45,"tag":72,"props":1195,"children":1196},{"emptyLinePlaceholder":124},[1197],{"type":51,"value":127},{"type":45,"tag":72,"props":1199,"children":1200},{"class":74,"line":358},[1201],{"type":45,"tag":72,"props":1202,"children":1203},{},[1204],{"type":51,"value":1205},"\u002F\u002F Sorting\n",{"type":45,"tag":72,"props":1207,"children":1208},{"class":74,"line":674},[1209],{"type":45,"tag":72,"props":1210,"children":1211},{},[1212],{"type":51,"value":1213},"Query.orderAsc(\"field\")\n",{"type":45,"tag":72,"props":1215,"children":1216},{"class":74,"line":682},[1217],{"type":45,"tag":72,"props":1218,"children":1219},{},[1220],{"type":51,"value":1221},"Query.orderDesc(\"field\")\n",{"type":45,"tag":72,"props":1223,"children":1224},{"class":74,"line":691},[1225],{"type":45,"tag":72,"props":1226,"children":1227},{"emptyLinePlaceholder":124},[1228],{"type":51,"value":127},{"type":45,"tag":72,"props":1230,"children":1231},{"class":74,"line":700},[1232],{"type":45,"tag":72,"props":1233,"children":1234},{},[1235],{"type":51,"value":1236},"\u002F\u002F Pagination\n",{"type":45,"tag":72,"props":1238,"children":1239},{"class":74,"line":708},[1240],{"type":45,"tag":72,"props":1241,"children":1242},{},[1243],{"type":51,"value":1244},"Query.limit(25)                               \u002F\u002F max rows (default 25, max 100)\n",{"type":45,"tag":72,"props":1246,"children":1247},{"class":74,"line":717},[1248],{"type":45,"tag":72,"props":1249,"children":1250},{},[1251],{"type":51,"value":1252},"Query.offset(0)                               \u002F\u002F skip N rows\n",{"type":45,"tag":72,"props":1254,"children":1255},{"class":74,"line":29},[1256],{"type":45,"tag":72,"props":1257,"children":1258},{},[1259],{"type":51,"value":1260},"Query.cursorAfter(\"[ROW_ID]\")                 \u002F\u002F cursor pagination (preferred)\n",{"type":45,"tag":72,"props":1262,"children":1263},{"class":74,"line":733},[1264],{"type":45,"tag":72,"props":1265,"children":1266},{},[1267],{"type":51,"value":1268},"Query.cursorBefore(\"[ROW_ID]\")\n",{"type":45,"tag":72,"props":1270,"children":1271},{"class":74,"line":742},[1272],{"type":45,"tag":72,"props":1273,"children":1274},{"emptyLinePlaceholder":124},[1275],{"type":51,"value":127},{"type":45,"tag":72,"props":1277,"children":1279},{"class":74,"line":1278},26,[1280],{"type":45,"tag":72,"props":1281,"children":1282},{},[1283],{"type":51,"value":1284},"\u002F\u002F Selection & Logic\n",{"type":45,"tag":72,"props":1286,"children":1288},{"class":74,"line":1287},27,[1289],{"type":45,"tag":72,"props":1290,"children":1291},{},[1292],{"type":51,"value":1293},"Query.select([\"field1\", \"field2\"])\n",{"type":45,"tag":72,"props":1295,"children":1297},{"class":74,"line":1296},28,[1298],{"type":45,"tag":72,"props":1299,"children":1300},{},[1301],{"type":51,"value":1302},"Query.or([Query.equal(\"a\", value: 1), Query.equal(\"b\", value: 2)])   \u002F\u002F OR\n",{"type":45,"tag":72,"props":1304,"children":1306},{"class":74,"line":1305},29,[1307],{"type":45,"tag":72,"props":1308,"children":1309},{},[1310],{"type":51,"value":1311},"Query.and([Query.greaterThan(\"age\", value: 18), Query.lessThan(\"age\", value: 65)])  \u002F\u002F AND (default)\n",{"type":45,"tag":98,"props":1313,"children":1315},{"id":1314},"file-storage",[1316],{"type":51,"value":1317},"File Storage",{"type":45,"tag":61,"props":1319,"children":1321},{"className":63,"code":1320,"language":24,"meta":65,"style":65},"let storage = Storage(client)\n\n\u002F\u002F Upload file\nlet file = try await storage.createFile(bucketId: \"[BUCKET_ID]\", fileId: ID.unique(), file: InputFile.fromPath(\"\u002Fpath\u002Fto\u002Ffile.png\"))\n\n\u002F\u002F List files\nlet files = try await storage.listFiles(bucketId: \"[BUCKET_ID]\")\n\n\u002F\u002F Delete file\ntry await storage.deleteFile(bucketId: \"[BUCKET_ID]\", fileId: \"[FILE_ID]\")\n",[1322],{"type":45,"tag":68,"props":1323,"children":1324},{"__ignoreMap":65},[1325,1333,1340,1348,1356,1363,1371,1379,1386,1394],{"type":45,"tag":72,"props":1326,"children":1327},{"class":74,"line":75},[1328],{"type":45,"tag":72,"props":1329,"children":1330},{},[1331],{"type":51,"value":1332},"let storage = Storage(client)\n",{"type":45,"tag":72,"props":1334,"children":1335},{"class":74,"line":84},[1336],{"type":45,"tag":72,"props":1337,"children":1338},{"emptyLinePlaceholder":124},[1339],{"type":51,"value":127},{"type":45,"tag":72,"props":1341,"children":1342},{"class":74,"line":130},[1343],{"type":45,"tag":72,"props":1344,"children":1345},{},[1346],{"type":51,"value":1347},"\u002F\u002F Upload file\n",{"type":45,"tag":72,"props":1349,"children":1350},{"class":74,"line":139},[1351],{"type":45,"tag":72,"props":1352,"children":1353},{},[1354],{"type":51,"value":1355},"let file = try await storage.createFile(bucketId: \"[BUCKET_ID]\", fileId: ID.unique(), file: InputFile.fromPath(\"\u002Fpath\u002Fto\u002Ffile.png\"))\n",{"type":45,"tag":72,"props":1357,"children":1358},{"class":74,"line":148},[1359],{"type":45,"tag":72,"props":1360,"children":1361},{"emptyLinePlaceholder":124},[1362],{"type":51,"value":127},{"type":45,"tag":72,"props":1364,"children":1365},{"class":74,"line":206},[1366],{"type":45,"tag":72,"props":1367,"children":1368},{},[1369],{"type":51,"value":1370},"\u002F\u002F List files\n",{"type":45,"tag":72,"props":1372,"children":1373},{"class":74,"line":280},[1374],{"type":45,"tag":72,"props":1375,"children":1376},{},[1377],{"type":51,"value":1378},"let files = try await storage.listFiles(bucketId: \"[BUCKET_ID]\")\n",{"type":45,"tag":72,"props":1380,"children":1381},{"class":74,"line":289},[1382],{"type":45,"tag":72,"props":1383,"children":1384},{"emptyLinePlaceholder":124},[1385],{"type":51,"value":127},{"type":45,"tag":72,"props":1387,"children":1388},{"class":74,"line":297},[1389],{"type":45,"tag":72,"props":1390,"children":1391},{},[1392],{"type":51,"value":1393},"\u002F\u002F Delete file\n",{"type":45,"tag":72,"props":1395,"children":1396},{"class":74,"line":306},[1397],{"type":45,"tag":72,"props":1398,"children":1399},{},[1400],{"type":51,"value":1401},"try await storage.deleteFile(bucketId: \"[BUCKET_ID]\", fileId: \"[FILE_ID]\")\n",{"type":45,"tag":750,"props":1403,"children":1405},{"id":1404},"inputfile-factory-methods",[1406],{"type":51,"value":1407},"InputFile Factory Methods",{"type":45,"tag":61,"props":1409,"children":1411},{"className":63,"code":1410,"language":24,"meta":65,"style":65},"InputFile.fromPath(\"\u002Fpath\u002Fto\u002Ffile.png\")                    \u002F\u002F from filesystem path\nInputFile.fromData(data, filename: \"file.png\", mimeType: \"image\u002Fpng\")  \u002F\u002F from Data\n",[1412],{"type":45,"tag":68,"props":1413,"children":1414},{"__ignoreMap":65},[1415,1423],{"type":45,"tag":72,"props":1416,"children":1417},{"class":74,"line":75},[1418],{"type":45,"tag":72,"props":1419,"children":1420},{},[1421],{"type":51,"value":1422},"InputFile.fromPath(\"\u002Fpath\u002Fto\u002Ffile.png\")                    \u002F\u002F from filesystem path\n",{"type":45,"tag":72,"props":1424,"children":1425},{"class":74,"line":84},[1426],{"type":45,"tag":72,"props":1427,"children":1428},{},[1429],{"type":51,"value":1430},"InputFile.fromData(data, filename: \"file.png\", mimeType: \"image\u002Fpng\")  \u002F\u002F from Data\n",{"type":45,"tag":98,"props":1432,"children":1434},{"id":1433},"teams",[1435],{"type":51,"value":1436},"Teams",{"type":45,"tag":61,"props":1438,"children":1440},{"className":63,"code":1439,"language":24,"meta":65,"style":65},"let teams = Teams(client)\n\n\u002F\u002F Create team\nlet team = try await teams.create(teamId: ID.unique(), name: \"Engineering\")\n\n\u002F\u002F List teams\nlet list = try await teams.list()\n\n\u002F\u002F Create membership (invite user by email)\nlet membership = try await teams.createMembership(\n    teamId: \"[TEAM_ID]\",\n    roles: [\"editor\"],\n    email: \"user@example.com\"\n)\n\n\u002F\u002F List memberships\nlet members = try await teams.listMemberships(teamId: \"[TEAM_ID]\")\n\n\u002F\u002F Update membership roles\ntry await teams.updateMembership(teamId: \"[TEAM_ID]\", membershipId: \"[MEMBERSHIP_ID]\", roles: [\"admin\"])\n\n\u002F\u002F Delete team\ntry await teams.delete(teamId: \"[TEAM_ID]\")\n",[1441],{"type":45,"tag":68,"props":1442,"children":1443},{"__ignoreMap":65},[1444,1452,1459,1467,1475,1482,1490,1498,1505,1513,1521,1529,1537,1545,1552,1559,1567,1575,1582,1590,1598,1605,1613],{"type":45,"tag":72,"props":1445,"children":1446},{"class":74,"line":75},[1447],{"type":45,"tag":72,"props":1448,"children":1449},{},[1450],{"type":51,"value":1451},"let teams = Teams(client)\n",{"type":45,"tag":72,"props":1453,"children":1454},{"class":74,"line":84},[1455],{"type":45,"tag":72,"props":1456,"children":1457},{"emptyLinePlaceholder":124},[1458],{"type":51,"value":127},{"type":45,"tag":72,"props":1460,"children":1461},{"class":74,"line":130},[1462],{"type":45,"tag":72,"props":1463,"children":1464},{},[1465],{"type":51,"value":1466},"\u002F\u002F Create team\n",{"type":45,"tag":72,"props":1468,"children":1469},{"class":74,"line":139},[1470],{"type":45,"tag":72,"props":1471,"children":1472},{},[1473],{"type":51,"value":1474},"let team = try await teams.create(teamId: ID.unique(), name: \"Engineering\")\n",{"type":45,"tag":72,"props":1476,"children":1477},{"class":74,"line":148},[1478],{"type":45,"tag":72,"props":1479,"children":1480},{"emptyLinePlaceholder":124},[1481],{"type":51,"value":127},{"type":45,"tag":72,"props":1483,"children":1484},{"class":74,"line":206},[1485],{"type":45,"tag":72,"props":1486,"children":1487},{},[1488],{"type":51,"value":1489},"\u002F\u002F List teams\n",{"type":45,"tag":72,"props":1491,"children":1492},{"class":74,"line":280},[1493],{"type":45,"tag":72,"props":1494,"children":1495},{},[1496],{"type":51,"value":1497},"let list = try await teams.list()\n",{"type":45,"tag":72,"props":1499,"children":1500},{"class":74,"line":289},[1501],{"type":45,"tag":72,"props":1502,"children":1503},{"emptyLinePlaceholder":124},[1504],{"type":51,"value":127},{"type":45,"tag":72,"props":1506,"children":1507},{"class":74,"line":297},[1508],{"type":45,"tag":72,"props":1509,"children":1510},{},[1511],{"type":51,"value":1512},"\u002F\u002F Create membership (invite user by email)\n",{"type":45,"tag":72,"props":1514,"children":1515},{"class":74,"line":306},[1516],{"type":45,"tag":72,"props":1517,"children":1518},{},[1519],{"type":51,"value":1520},"let membership = try await teams.createMembership(\n",{"type":45,"tag":72,"props":1522,"children":1523},{"class":74,"line":315},[1524],{"type":45,"tag":72,"props":1525,"children":1526},{},[1527],{"type":51,"value":1528},"    teamId: \"[TEAM_ID]\",\n",{"type":45,"tag":72,"props":1530,"children":1531},{"class":74,"line":323},[1532],{"type":45,"tag":72,"props":1533,"children":1534},{},[1535],{"type":51,"value":1536},"    roles: [\"editor\"],\n",{"type":45,"tag":72,"props":1538,"children":1539},{"class":74,"line":332},[1540],{"type":45,"tag":72,"props":1541,"children":1542},{},[1543],{"type":51,"value":1544},"    email: \"user@example.com\"\n",{"type":45,"tag":72,"props":1546,"children":1547},{"class":74,"line":341},[1548],{"type":45,"tag":72,"props":1549,"children":1550},{},[1551],{"type":51,"value":1065},{"type":45,"tag":72,"props":1553,"children":1554},{"class":74,"line":349},[1555],{"type":45,"tag":72,"props":1556,"children":1557},{"emptyLinePlaceholder":124},[1558],{"type":51,"value":127},{"type":45,"tag":72,"props":1560,"children":1561},{"class":74,"line":358},[1562],{"type":45,"tag":72,"props":1563,"children":1564},{},[1565],{"type":51,"value":1566},"\u002F\u002F List memberships\n",{"type":45,"tag":72,"props":1568,"children":1569},{"class":74,"line":674},[1570],{"type":45,"tag":72,"props":1571,"children":1572},{},[1573],{"type":51,"value":1574},"let members = try await teams.listMemberships(teamId: \"[TEAM_ID]\")\n",{"type":45,"tag":72,"props":1576,"children":1577},{"class":74,"line":682},[1578],{"type":45,"tag":72,"props":1579,"children":1580},{"emptyLinePlaceholder":124},[1581],{"type":51,"value":127},{"type":45,"tag":72,"props":1583,"children":1584},{"class":74,"line":691},[1585],{"type":45,"tag":72,"props":1586,"children":1587},{},[1588],{"type":51,"value":1589},"\u002F\u002F Update membership roles\n",{"type":45,"tag":72,"props":1591,"children":1592},{"class":74,"line":700},[1593],{"type":45,"tag":72,"props":1594,"children":1595},{},[1596],{"type":51,"value":1597},"try await teams.updateMembership(teamId: \"[TEAM_ID]\", membershipId: \"[MEMBERSHIP_ID]\", roles: [\"admin\"])\n",{"type":45,"tag":72,"props":1599,"children":1600},{"class":74,"line":708},[1601],{"type":45,"tag":72,"props":1602,"children":1603},{"emptyLinePlaceholder":124},[1604],{"type":51,"value":127},{"type":45,"tag":72,"props":1606,"children":1607},{"class":74,"line":717},[1608],{"type":45,"tag":72,"props":1609,"children":1610},{},[1611],{"type":51,"value":1612},"\u002F\u002F Delete team\n",{"type":45,"tag":72,"props":1614,"children":1615},{"class":74,"line":29},[1616],{"type":45,"tag":72,"props":1617,"children":1618},{},[1619],{"type":51,"value":1620},"try await teams.delete(teamId: \"[TEAM_ID]\")\n",{"type":45,"tag":485,"props":1622,"children":1623},{},[1624],{"type":45,"tag":489,"props":1625,"children":1626},{},[1627,1632,1633,1639,1641,1647],{"type":45,"tag":493,"props":1628,"children":1629},{},[1630],{"type":51,"value":1631},"Role-based access:",{"type":51,"value":499},{"type":45,"tag":68,"props":1634,"children":1636},{"className":1635},[],[1637],{"type":51,"value":1638},"Role.team(\"[TEAM_ID]\")",{"type":51,"value":1640}," for all team members or ",{"type":45,"tag":68,"props":1642,"children":1644},{"className":1643},[],[1645],{"type":51,"value":1646},"Role.team(\"[TEAM_ID]\", \"editor\")",{"type":51,"value":1648}," for a specific team role when setting permissions.",{"type":45,"tag":98,"props":1650,"children":1652},{"id":1651},"real-time-subscriptions-client-side",[1653],{"type":51,"value":1654},"Real-time Subscriptions (client-side)",{"type":45,"tag":61,"props":1656,"children":1658},{"className":63,"code":1657,"language":24,"meta":65,"style":65},"let realtime = Realtime(client)\n\n\u002F\u002F Subscribe to row changes\nlet subscription = try await realtime.subscribe(channels: [\n    Channel.tablesdb(\"[DATABASE_ID]\").table(\"[TABLE_ID]\").row()\n]) { response in\n    print(response.events)   \u002F\u002F e.g. [\"tablesdb.*.tables.*.rows.*.create\"]\n    print(response.payload)  \u002F\u002F the affected resource\n}\n\n\u002F\u002F Subscribe to multiple channels\nlet multi = try await realtime.subscribe(channels: [\n    Channel.tablesdb(\"[DATABASE_ID]\").table(\"[TABLE_ID]\").row(),\n    Channel.files(),\n]) { response in \u002F* ... *\u002F }\n\n\u002F\u002F Cleanup\ntry await subscription.close()\n",[1659],{"type":45,"tag":68,"props":1660,"children":1661},{"__ignoreMap":65},[1662,1670,1677,1685,1693,1701,1709,1717,1725,1733,1740,1748,1756,1764,1772,1780,1787,1795],{"type":45,"tag":72,"props":1663,"children":1664},{"class":74,"line":75},[1665],{"type":45,"tag":72,"props":1666,"children":1667},{},[1668],{"type":51,"value":1669},"let realtime = Realtime(client)\n",{"type":45,"tag":72,"props":1671,"children":1672},{"class":74,"line":84},[1673],{"type":45,"tag":72,"props":1674,"children":1675},{"emptyLinePlaceholder":124},[1676],{"type":51,"value":127},{"type":45,"tag":72,"props":1678,"children":1679},{"class":74,"line":130},[1680],{"type":45,"tag":72,"props":1681,"children":1682},{},[1683],{"type":51,"value":1684},"\u002F\u002F Subscribe to row changes\n",{"type":45,"tag":72,"props":1686,"children":1687},{"class":74,"line":139},[1688],{"type":45,"tag":72,"props":1689,"children":1690},{},[1691],{"type":51,"value":1692},"let subscription = try await realtime.subscribe(channels: [\n",{"type":45,"tag":72,"props":1694,"children":1695},{"class":74,"line":148},[1696],{"type":45,"tag":72,"props":1697,"children":1698},{},[1699],{"type":51,"value":1700},"    Channel.tablesdb(\"[DATABASE_ID]\").table(\"[TABLE_ID]\").row()\n",{"type":45,"tag":72,"props":1702,"children":1703},{"class":74,"line":206},[1704],{"type":45,"tag":72,"props":1705,"children":1706},{},[1707],{"type":51,"value":1708},"]) { response in\n",{"type":45,"tag":72,"props":1710,"children":1711},{"class":74,"line":280},[1712],{"type":45,"tag":72,"props":1713,"children":1714},{},[1715],{"type":51,"value":1716},"    print(response.events)   \u002F\u002F e.g. [\"tablesdb.*.tables.*.rows.*.create\"]\n",{"type":45,"tag":72,"props":1718,"children":1719},{"class":74,"line":289},[1720],{"type":45,"tag":72,"props":1721,"children":1722},{},[1723],{"type":51,"value":1724},"    print(response.payload)  \u002F\u002F the affected resource\n",{"type":45,"tag":72,"props":1726,"children":1727},{"class":74,"line":297},[1728],{"type":45,"tag":72,"props":1729,"children":1730},{},[1731],{"type":51,"value":1732},"}\n",{"type":45,"tag":72,"props":1734,"children":1735},{"class":74,"line":306},[1736],{"type":45,"tag":72,"props":1737,"children":1738},{"emptyLinePlaceholder":124},[1739],{"type":51,"value":127},{"type":45,"tag":72,"props":1741,"children":1742},{"class":74,"line":315},[1743],{"type":45,"tag":72,"props":1744,"children":1745},{},[1746],{"type":51,"value":1747},"\u002F\u002F Subscribe to multiple channels\n",{"type":45,"tag":72,"props":1749,"children":1750},{"class":74,"line":323},[1751],{"type":45,"tag":72,"props":1752,"children":1753},{},[1754],{"type":51,"value":1755},"let multi = try await realtime.subscribe(channels: [\n",{"type":45,"tag":72,"props":1757,"children":1758},{"class":74,"line":332},[1759],{"type":45,"tag":72,"props":1760,"children":1761},{},[1762],{"type":51,"value":1763},"    Channel.tablesdb(\"[DATABASE_ID]\").table(\"[TABLE_ID]\").row(),\n",{"type":45,"tag":72,"props":1765,"children":1766},{"class":74,"line":341},[1767],{"type":45,"tag":72,"props":1768,"children":1769},{},[1770],{"type":51,"value":1771},"    Channel.files(),\n",{"type":45,"tag":72,"props":1773,"children":1774},{"class":74,"line":349},[1775],{"type":45,"tag":72,"props":1776,"children":1777},{},[1778],{"type":51,"value":1779},"]) { response in \u002F* ... *\u002F }\n",{"type":45,"tag":72,"props":1781,"children":1782},{"class":74,"line":358},[1783],{"type":45,"tag":72,"props":1784,"children":1785},{"emptyLinePlaceholder":124},[1786],{"type":51,"value":127},{"type":45,"tag":72,"props":1788,"children":1789},{"class":74,"line":674},[1790],{"type":45,"tag":72,"props":1791,"children":1792},{},[1793],{"type":51,"value":1794},"\u002F\u002F Cleanup\n",{"type":45,"tag":72,"props":1796,"children":1797},{"class":74,"line":682},[1798],{"type":45,"tag":72,"props":1799,"children":1800},{},[1801],{"type":51,"value":1802},"try await subscription.close()\n",{"type":45,"tag":489,"props":1804,"children":1805},{},[1806],{"type":45,"tag":493,"props":1807,"children":1808},{},[1809],{"type":51,"value":1810},"Available channels:",{"type":45,"tag":777,"props":1812,"children":1813},{},[1814,1830],{"type":45,"tag":781,"props":1815,"children":1816},{},[1817],{"type":45,"tag":785,"props":1818,"children":1819},{},[1820,1825],{"type":45,"tag":789,"props":1821,"children":1822},{},[1823],{"type":51,"value":1824},"Channel",{"type":45,"tag":789,"props":1826,"children":1827},{},[1828],{"type":51,"value":1829},"Description",{"type":45,"tag":810,"props":1831,"children":1832},{},[1833,1850,1867,1884,1901,1918,1934,1951,1968],{"type":45,"tag":785,"props":1834,"children":1835},{},[1836,1845],{"type":45,"tag":817,"props":1837,"children":1838},{},[1839],{"type":45,"tag":68,"props":1840,"children":1842},{"className":1841},[],[1843],{"type":51,"value":1844},"account",{"type":45,"tag":817,"props":1846,"children":1847},{},[1848],{"type":51,"value":1849},"Changes to the authenticated user's account",{"type":45,"tag":785,"props":1851,"children":1852},{},[1853,1862],{"type":45,"tag":817,"props":1854,"children":1855},{},[1856],{"type":45,"tag":68,"props":1857,"children":1859},{"className":1858},[],[1860],{"type":51,"value":1861},"tablesdb.[DB_ID].tables.[TABLE_ID].rows",{"type":45,"tag":817,"props":1863,"children":1864},{},[1865],{"type":51,"value":1866},"All rows in a table",{"type":45,"tag":785,"props":1868,"children":1869},{},[1870,1879],{"type":45,"tag":817,"props":1871,"children":1872},{},[1873],{"type":45,"tag":68,"props":1874,"children":1876},{"className":1875},[],[1877],{"type":51,"value":1878},"tablesdb.[DB_ID].tables.[TABLE_ID].rows.[ROW_ID]",{"type":45,"tag":817,"props":1880,"children":1881},{},[1882],{"type":51,"value":1883},"A specific row",{"type":45,"tag":785,"props":1885,"children":1886},{},[1887,1896],{"type":45,"tag":817,"props":1888,"children":1889},{},[1890],{"type":45,"tag":68,"props":1891,"children":1893},{"className":1892},[],[1894],{"type":51,"value":1895},"buckets.[BUCKET_ID].files",{"type":45,"tag":817,"props":1897,"children":1898},{},[1899],{"type":51,"value":1900},"All files in a bucket",{"type":45,"tag":785,"props":1902,"children":1903},{},[1904,1913],{"type":45,"tag":817,"props":1905,"children":1906},{},[1907],{"type":45,"tag":68,"props":1908,"children":1910},{"className":1909},[],[1911],{"type":51,"value":1912},"buckets.[BUCKET_ID].files.[FILE_ID]",{"type":45,"tag":817,"props":1914,"children":1915},{},[1916],{"type":51,"value":1917},"A specific file",{"type":45,"tag":785,"props":1919,"children":1920},{},[1921,1929],{"type":45,"tag":817,"props":1922,"children":1923},{},[1924],{"type":45,"tag":68,"props":1925,"children":1927},{"className":1926},[],[1928],{"type":51,"value":1433},{"type":45,"tag":817,"props":1930,"children":1931},{},[1932],{"type":51,"value":1933},"Changes to teams the user belongs to",{"type":45,"tag":785,"props":1935,"children":1936},{},[1937,1946],{"type":45,"tag":817,"props":1938,"children":1939},{},[1940],{"type":45,"tag":68,"props":1941,"children":1943},{"className":1942},[],[1944],{"type":51,"value":1945},"teams.[TEAM_ID]",{"type":45,"tag":817,"props":1947,"children":1948},{},[1949],{"type":51,"value":1950},"A specific team",{"type":45,"tag":785,"props":1952,"children":1953},{},[1954,1963],{"type":45,"tag":817,"props":1955,"children":1956},{},[1957],{"type":45,"tag":68,"props":1958,"children":1960},{"className":1959},[],[1961],{"type":51,"value":1962},"memberships",{"type":45,"tag":817,"props":1964,"children":1965},{},[1966],{"type":51,"value":1967},"The user's team memberships",{"type":45,"tag":785,"props":1969,"children":1970},{},[1971,1980],{"type":45,"tag":817,"props":1972,"children":1973},{},[1974],{"type":45,"tag":68,"props":1975,"children":1977},{"className":1976},[],[1978],{"type":51,"value":1979},"functions.[FUNCTION_ID].executions",{"type":45,"tag":817,"props":1981,"children":1982},{},[1983],{"type":51,"value":1984},"Function execution updates",{"type":45,"tag":489,"props":1986,"children":1987},{},[1988,1990,1996,1998,2004,2006,2012,2014,2020],{"type":51,"value":1989},"Response fields: ",{"type":45,"tag":68,"props":1991,"children":1993},{"className":1992},[],[1994],{"type":51,"value":1995},"events",{"type":51,"value":1997}," (array), ",{"type":45,"tag":68,"props":1999,"children":2001},{"className":2000},[],[2002],{"type":51,"value":2003},"payload",{"type":51,"value":2005}," (resource), ",{"type":45,"tag":68,"props":2007,"children":2009},{"className":2008},[],[2010],{"type":51,"value":2011},"channels",{"type":51,"value":2013}," (matched), ",{"type":45,"tag":68,"props":2015,"children":2017},{"className":2016},[],[2018],{"type":51,"value":2019},"timestamp",{"type":51,"value":2021}," (ISO 8601).",{"type":45,"tag":98,"props":2023,"children":2025},{"id":2024},"serverless-functions-server-side",[2026],{"type":51,"value":2027},"Serverless Functions (server-side)",{"type":45,"tag":61,"props":2029,"children":2031},{"className":63,"code":2030,"language":24,"meta":65,"style":65},"let functions = Functions(client)\n\n\u002F\u002F Execute function\nlet execution = try await functions.createExecution(functionId: \"[FUNCTION_ID]\", body: \"{\\\"key\\\": \\\"value\\\"}\")\n\n\u002F\u002F List executions\nlet executions = try await functions.listExecutions(functionId: \"[FUNCTION_ID]\")\n",[2032],{"type":45,"tag":68,"props":2033,"children":2034},{"__ignoreMap":65},[2035,2043,2050,2058,2066,2073,2081],{"type":45,"tag":72,"props":2036,"children":2037},{"class":74,"line":75},[2038],{"type":45,"tag":72,"props":2039,"children":2040},{},[2041],{"type":51,"value":2042},"let functions = Functions(client)\n",{"type":45,"tag":72,"props":2044,"children":2045},{"class":74,"line":84},[2046],{"type":45,"tag":72,"props":2047,"children":2048},{"emptyLinePlaceholder":124},[2049],{"type":51,"value":127},{"type":45,"tag":72,"props":2051,"children":2052},{"class":74,"line":130},[2053],{"type":45,"tag":72,"props":2054,"children":2055},{},[2056],{"type":51,"value":2057},"\u002F\u002F Execute function\n",{"type":45,"tag":72,"props":2059,"children":2060},{"class":74,"line":139},[2061],{"type":45,"tag":72,"props":2062,"children":2063},{},[2064],{"type":51,"value":2065},"let execution = try await functions.createExecution(functionId: \"[FUNCTION_ID]\", body: \"{\\\"key\\\": \\\"value\\\"}\")\n",{"type":45,"tag":72,"props":2067,"children":2068},{"class":74,"line":148},[2069],{"type":45,"tag":72,"props":2070,"children":2071},{"emptyLinePlaceholder":124},[2072],{"type":51,"value":127},{"type":45,"tag":72,"props":2074,"children":2075},{"class":74,"line":206},[2076],{"type":45,"tag":72,"props":2077,"children":2078},{},[2079],{"type":51,"value":2080},"\u002F\u002F List executions\n",{"type":45,"tag":72,"props":2082,"children":2083},{"class":74,"line":280},[2084],{"type":45,"tag":72,"props":2085,"children":2086},{},[2087],{"type":51,"value":2088},"let executions = try await functions.listExecutions(functionId: \"[FUNCTION_ID]\")\n",{"type":45,"tag":750,"props":2090,"children":2092},{"id":2091},"writing-a-function-handler-swift-runtime",[2093],{"type":51,"value":2094},"Writing a Function Handler (Swift runtime)",{"type":45,"tag":61,"props":2096,"children":2098},{"className":63,"code":2097,"language":24,"meta":65,"style":65},"\u002F\u002F Sources\u002Fmain.swift — Appwrite Function entry point\nfunc main(context: RuntimeContext) async throws -> RuntimeOutput {\n    \u002F\u002F context.req.body        — raw body (String)\n    \u002F\u002F context.req.bodyJson    — parsed JSON ([String: Any]?)\n    \u002F\u002F context.req.headers     — headers ([String: String])\n    \u002F\u002F context.req.method      — HTTP method\n    \u002F\u002F context.req.path        — URL path\n    \u002F\u002F context.req.query       — query params ([String: String])\n\n    context.log(\"Processing: \\(context.req.method) \\(context.req.path)\")\n\n    if context.req.method == \"GET\" {\n        return context.res.json([\"message\": \"Hello from Appwrite Function!\"])\n    }\n\n    return context.res.json([\"success\": true])       \u002F\u002F JSON\n    \u002F\u002F context.res.text(\"Hello\")                     \u002F\u002F plain text\n    \u002F\u002F context.res.empty()                           \u002F\u002F 204\n    \u002F\u002F context.res.redirect(\"https:\u002F\u002F...\")            \u002F\u002F 302\n}\n",[2099],{"type":45,"tag":68,"props":2100,"children":2101},{"__ignoreMap":65},[2102,2110,2118,2126,2134,2142,2150,2158,2166,2173,2181,2188,2196,2204,2212,2219,2227,2240,2253,2266],{"type":45,"tag":72,"props":2103,"children":2104},{"class":74,"line":75},[2105],{"type":45,"tag":72,"props":2106,"children":2107},{},[2108],{"type":51,"value":2109},"\u002F\u002F Sources\u002Fmain.swift — Appwrite Function entry point\n",{"type":45,"tag":72,"props":2111,"children":2112},{"class":74,"line":84},[2113],{"type":45,"tag":72,"props":2114,"children":2115},{},[2116],{"type":51,"value":2117},"func main(context: RuntimeContext) async throws -> RuntimeOutput {\n",{"type":45,"tag":72,"props":2119,"children":2120},{"class":74,"line":130},[2121],{"type":45,"tag":72,"props":2122,"children":2123},{},[2124],{"type":51,"value":2125},"    \u002F\u002F context.req.body        — raw body (String)\n",{"type":45,"tag":72,"props":2127,"children":2128},{"class":74,"line":139},[2129],{"type":45,"tag":72,"props":2130,"children":2131},{},[2132],{"type":51,"value":2133},"    \u002F\u002F context.req.bodyJson    — parsed JSON ([String: Any]?)\n",{"type":45,"tag":72,"props":2135,"children":2136},{"class":74,"line":148},[2137],{"type":45,"tag":72,"props":2138,"children":2139},{},[2140],{"type":51,"value":2141},"    \u002F\u002F context.req.headers     — headers ([String: String])\n",{"type":45,"tag":72,"props":2143,"children":2144},{"class":74,"line":206},[2145],{"type":45,"tag":72,"props":2146,"children":2147},{},[2148],{"type":51,"value":2149},"    \u002F\u002F context.req.method      — HTTP method\n",{"type":45,"tag":72,"props":2151,"children":2152},{"class":74,"line":280},[2153],{"type":45,"tag":72,"props":2154,"children":2155},{},[2156],{"type":51,"value":2157},"    \u002F\u002F context.req.path        — URL path\n",{"type":45,"tag":72,"props":2159,"children":2160},{"class":74,"line":289},[2161],{"type":45,"tag":72,"props":2162,"children":2163},{},[2164],{"type":51,"value":2165},"    \u002F\u002F context.req.query       — query params ([String: String])\n",{"type":45,"tag":72,"props":2167,"children":2168},{"class":74,"line":297},[2169],{"type":45,"tag":72,"props":2170,"children":2171},{"emptyLinePlaceholder":124},[2172],{"type":51,"value":127},{"type":45,"tag":72,"props":2174,"children":2175},{"class":74,"line":306},[2176],{"type":45,"tag":72,"props":2177,"children":2178},{},[2179],{"type":51,"value":2180},"    context.log(\"Processing: \\(context.req.method) \\(context.req.path)\")\n",{"type":45,"tag":72,"props":2182,"children":2183},{"class":74,"line":315},[2184],{"type":45,"tag":72,"props":2185,"children":2186},{"emptyLinePlaceholder":124},[2187],{"type":51,"value":127},{"type":45,"tag":72,"props":2189,"children":2190},{"class":74,"line":323},[2191],{"type":45,"tag":72,"props":2192,"children":2193},{},[2194],{"type":51,"value":2195},"    if context.req.method == \"GET\" {\n",{"type":45,"tag":72,"props":2197,"children":2198},{"class":74,"line":332},[2199],{"type":45,"tag":72,"props":2200,"children":2201},{},[2202],{"type":51,"value":2203},"        return context.res.json([\"message\": \"Hello from Appwrite Function!\"])\n",{"type":45,"tag":72,"props":2205,"children":2206},{"class":74,"line":341},[2207],{"type":45,"tag":72,"props":2208,"children":2209},{},[2210],{"type":51,"value":2211},"    }\n",{"type":45,"tag":72,"props":2213,"children":2214},{"class":74,"line":349},[2215],{"type":45,"tag":72,"props":2216,"children":2217},{"emptyLinePlaceholder":124},[2218],{"type":51,"value":127},{"type":45,"tag":72,"props":2220,"children":2221},{"class":74,"line":358},[2222],{"type":45,"tag":72,"props":2223,"children":2224},{},[2225],{"type":51,"value":2226},"    return context.res.json([\"success\": true])       \u002F\u002F JSON\n",{"type":45,"tag":72,"props":2228,"children":2229},{"class":74,"line":674},[2230,2235],{"type":45,"tag":72,"props":2231,"children":2232},{},[2233],{"type":51,"value":2234},"    \u002F\u002F context.res.text(\"Hello\")",{"type":45,"tag":72,"props":2236,"children":2237},{},[2238],{"type":51,"value":2239},"                     \u002F\u002F plain text\n",{"type":45,"tag":72,"props":2241,"children":2242},{"class":74,"line":682},[2243,2248],{"type":45,"tag":72,"props":2244,"children":2245},{},[2246],{"type":51,"value":2247},"    \u002F\u002F context.res.empty()",{"type":45,"tag":72,"props":2249,"children":2250},{},[2251],{"type":51,"value":2252},"                           \u002F\u002F 204\n",{"type":45,"tag":72,"props":2254,"children":2255},{"class":74,"line":691},[2256,2261],{"type":45,"tag":72,"props":2257,"children":2258},{},[2259],{"type":51,"value":2260},"    \u002F\u002F context.res.redirect(\"https:\u002F\u002F...\")",{"type":45,"tag":72,"props":2262,"children":2263},{},[2264],{"type":51,"value":2265},"            \u002F\u002F 302\n",{"type":45,"tag":72,"props":2267,"children":2268},{"class":74,"line":700},[2269],{"type":45,"tag":72,"props":2270,"children":2271},{},[2272],{"type":51,"value":1732},{"type":45,"tag":98,"props":2274,"children":2276},{"id":2275},"server-side-rendering-ssr-authentication",[2277],{"type":51,"value":2278},"Server-Side Rendering (SSR) Authentication",{"type":45,"tag":489,"props":2280,"children":2281},{},[2282,2284,2289],{"type":51,"value":2283},"SSR apps using server-side Swift (Vapor, Hummingbird, etc.) use the ",{"type":45,"tag":493,"props":2285,"children":2286},{},[2287],{"type":51,"value":2288},"server SDK",{"type":51,"value":2290}," to handle auth. You need two clients:",{"type":45,"tag":917,"props":2292,"children":2293},{},[2294,2304],{"type":45,"tag":921,"props":2295,"children":2296},{},[2297,2302],{"type":45,"tag":493,"props":2298,"children":2299},{},[2300],{"type":51,"value":2301},"Admin client",{"type":51,"value":2303}," — uses an API key, creates sessions, bypasses rate limits (reusable singleton)",{"type":45,"tag":921,"props":2305,"children":2306},{},[2307,2312],{"type":45,"tag":493,"props":2308,"children":2309},{},[2310],{"type":51,"value":2311},"Session client",{"type":51,"value":2313}," — uses a session cookie, acts on behalf of a user (create per-request, never share)",{"type":45,"tag":61,"props":2315,"children":2317},{"className":63,"code":2316,"language":24,"meta":65,"style":65},"import Appwrite\n\n\u002F\u002F Admin client (reusable)\nlet adminClient = Client()\n    .setEndpoint(\"https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1\")\n    .setProject(\"[PROJECT_ID]\")\n    .setKey(Environment.get(\"APPWRITE_API_KEY\")!)\n\n\u002F\u002F Session client (create per-request)\nlet sessionClient = Client()\n    .setEndpoint(\"https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1\")\n    .setProject(\"[PROJECT_ID]\")\n\nif let session = req.cookies[\"a_session_[PROJECT_ID]\"]?.string {\n    sessionClient.setSession(session)\n}\n",[2318],{"type":45,"tag":68,"props":2319,"children":2320},{"__ignoreMap":65},[2321,2328,2335,2343,2351,2358,2365,2373,2380,2388,2396,2403,2410,2417,2425,2433],{"type":45,"tag":72,"props":2322,"children":2323},{"class":74,"line":75},[2324],{"type":45,"tag":72,"props":2325,"children":2326},{},[2327],{"type":51,"value":118},{"type":45,"tag":72,"props":2329,"children":2330},{"class":74,"line":84},[2331],{"type":45,"tag":72,"props":2332,"children":2333},{"emptyLinePlaceholder":124},[2334],{"type":51,"value":127},{"type":45,"tag":72,"props":2336,"children":2337},{"class":74,"line":130},[2338],{"type":45,"tag":72,"props":2339,"children":2340},{},[2341],{"type":51,"value":2342},"\u002F\u002F Admin client (reusable)\n",{"type":45,"tag":72,"props":2344,"children":2345},{"class":74,"line":139},[2346],{"type":45,"tag":72,"props":2347,"children":2348},{},[2349],{"type":51,"value":2350},"let adminClient = Client()\n",{"type":45,"tag":72,"props":2352,"children":2353},{"class":74,"line":148},[2354],{"type":45,"tag":72,"props":2355,"children":2356},{},[2357],{"type":51,"value":145},{"type":45,"tag":72,"props":2359,"children":2360},{"class":74,"line":206},[2361],{"type":45,"tag":72,"props":2362,"children":2363},{},[2364],{"type":51,"value":154},{"type":45,"tag":72,"props":2366,"children":2367},{"class":74,"line":280},[2368],{"type":45,"tag":72,"props":2369,"children":2370},{},[2371],{"type":51,"value":2372},"    .setKey(Environment.get(\"APPWRITE_API_KEY\")!)\n",{"type":45,"tag":72,"props":2374,"children":2375},{"class":74,"line":289},[2376],{"type":45,"tag":72,"props":2377,"children":2378},{"emptyLinePlaceholder":124},[2379],{"type":51,"value":127},{"type":45,"tag":72,"props":2381,"children":2382},{"class":74,"line":297},[2383],{"type":45,"tag":72,"props":2384,"children":2385},{},[2386],{"type":51,"value":2387},"\u002F\u002F Session client (create per-request)\n",{"type":45,"tag":72,"props":2389,"children":2390},{"class":74,"line":306},[2391],{"type":45,"tag":72,"props":2392,"children":2393},{},[2394],{"type":51,"value":2395},"let sessionClient = Client()\n",{"type":45,"tag":72,"props":2397,"children":2398},{"class":74,"line":315},[2399],{"type":45,"tag":72,"props":2400,"children":2401},{},[2402],{"type":51,"value":145},{"type":45,"tag":72,"props":2404,"children":2405},{"class":74,"line":323},[2406],{"type":45,"tag":72,"props":2407,"children":2408},{},[2409],{"type":51,"value":154},{"type":45,"tag":72,"props":2411,"children":2412},{"class":74,"line":332},[2413],{"type":45,"tag":72,"props":2414,"children":2415},{"emptyLinePlaceholder":124},[2416],{"type":51,"value":127},{"type":45,"tag":72,"props":2418,"children":2419},{"class":74,"line":341},[2420],{"type":45,"tag":72,"props":2421,"children":2422},{},[2423],{"type":51,"value":2424},"if let session = req.cookies[\"a_session_[PROJECT_ID]\"]?.string {\n",{"type":45,"tag":72,"props":2426,"children":2427},{"class":74,"line":349},[2428],{"type":45,"tag":72,"props":2429,"children":2430},{},[2431],{"type":51,"value":2432},"    sessionClient.setSession(session)\n",{"type":45,"tag":72,"props":2434,"children":2435},{"class":74,"line":358},[2436],{"type":45,"tag":72,"props":2437,"children":2438},{},[2439],{"type":51,"value":1732},{"type":45,"tag":750,"props":2441,"children":2443},{"id":2442},"emailpassword-login-vapor",[2444],{"type":51,"value":2445},"Email\u002FPassword Login (Vapor)",{"type":45,"tag":61,"props":2447,"children":2449},{"className":63,"code":2448,"language":24,"meta":65,"style":65},"app.post(\"login\") { req async throws -> Response in\n    let body = try req.content.decode(LoginRequest.self)\n    let account = Account(adminClient)\n    let session = try await account.createEmailPasswordSession(\n        email: body.email,\n        password: body.password\n    )\n\n    \u002F\u002F Cookie name must be a_session_\u003CPROJECT_ID>\n    let response = Response(status: .ok, body: .init(string: \"{\\\"success\\\": true}\"))\n    response.cookies[\"a_session_[PROJECT_ID]\"] = HTTPCookies.Value(\n        string: session.secret,\n        isHTTPOnly: true,\n        isSecure: true,\n        sameSite: .strict,\n        path: \"\u002F\"\n    )\n    return response\n}\n",[2450],{"type":45,"tag":68,"props":2451,"children":2452},{"__ignoreMap":65},[2453,2461,2469,2477,2485,2493,2501,2509,2516,2524,2532,2540,2548,2556,2564,2572,2580,2587,2595],{"type":45,"tag":72,"props":2454,"children":2455},{"class":74,"line":75},[2456],{"type":45,"tag":72,"props":2457,"children":2458},{},[2459],{"type":51,"value":2460},"app.post(\"login\") { req async throws -> Response in\n",{"type":45,"tag":72,"props":2462,"children":2463},{"class":74,"line":84},[2464],{"type":45,"tag":72,"props":2465,"children":2466},{},[2467],{"type":51,"value":2468},"    let body = try req.content.decode(LoginRequest.self)\n",{"type":45,"tag":72,"props":2470,"children":2471},{"class":74,"line":130},[2472],{"type":45,"tag":72,"props":2473,"children":2474},{},[2475],{"type":51,"value":2476},"    let account = Account(adminClient)\n",{"type":45,"tag":72,"props":2478,"children":2479},{"class":74,"line":139},[2480],{"type":45,"tag":72,"props":2481,"children":2482},{},[2483],{"type":51,"value":2484},"    let session = try await account.createEmailPasswordSession(\n",{"type":45,"tag":72,"props":2486,"children":2487},{"class":74,"line":148},[2488],{"type":45,"tag":72,"props":2489,"children":2490},{},[2491],{"type":51,"value":2492},"        email: body.email,\n",{"type":45,"tag":72,"props":2494,"children":2495},{"class":74,"line":206},[2496],{"type":45,"tag":72,"props":2497,"children":2498},{},[2499],{"type":51,"value":2500},"        password: body.password\n",{"type":45,"tag":72,"props":2502,"children":2503},{"class":74,"line":280},[2504],{"type":45,"tag":72,"props":2505,"children":2506},{},[2507],{"type":51,"value":2508},"    )\n",{"type":45,"tag":72,"props":2510,"children":2511},{"class":74,"line":289},[2512],{"type":45,"tag":72,"props":2513,"children":2514},{"emptyLinePlaceholder":124},[2515],{"type":51,"value":127},{"type":45,"tag":72,"props":2517,"children":2518},{"class":74,"line":297},[2519],{"type":45,"tag":72,"props":2520,"children":2521},{},[2522],{"type":51,"value":2523},"    \u002F\u002F Cookie name must be a_session_\u003CPROJECT_ID>\n",{"type":45,"tag":72,"props":2525,"children":2526},{"class":74,"line":306},[2527],{"type":45,"tag":72,"props":2528,"children":2529},{},[2530],{"type":51,"value":2531},"    let response = Response(status: .ok, body: .init(string: \"{\\\"success\\\": true}\"))\n",{"type":45,"tag":72,"props":2533,"children":2534},{"class":74,"line":315},[2535],{"type":45,"tag":72,"props":2536,"children":2537},{},[2538],{"type":51,"value":2539},"    response.cookies[\"a_session_[PROJECT_ID]\"] = HTTPCookies.Value(\n",{"type":45,"tag":72,"props":2541,"children":2542},{"class":74,"line":323},[2543],{"type":45,"tag":72,"props":2544,"children":2545},{},[2546],{"type":51,"value":2547},"        string: session.secret,\n",{"type":45,"tag":72,"props":2549,"children":2550},{"class":74,"line":332},[2551],{"type":45,"tag":72,"props":2552,"children":2553},{},[2554],{"type":51,"value":2555},"        isHTTPOnly: true,\n",{"type":45,"tag":72,"props":2557,"children":2558},{"class":74,"line":341},[2559],{"type":45,"tag":72,"props":2560,"children":2561},{},[2562],{"type":51,"value":2563},"        isSecure: true,\n",{"type":45,"tag":72,"props":2565,"children":2566},{"class":74,"line":349},[2567],{"type":45,"tag":72,"props":2568,"children":2569},{},[2570],{"type":51,"value":2571},"        sameSite: .strict,\n",{"type":45,"tag":72,"props":2573,"children":2574},{"class":74,"line":358},[2575],{"type":45,"tag":72,"props":2576,"children":2577},{},[2578],{"type":51,"value":2579},"        path: \"\u002F\"\n",{"type":45,"tag":72,"props":2581,"children":2582},{"class":74,"line":674},[2583],{"type":45,"tag":72,"props":2584,"children":2585},{},[2586],{"type":51,"value":2508},{"type":45,"tag":72,"props":2588,"children":2589},{"class":74,"line":682},[2590],{"type":45,"tag":72,"props":2591,"children":2592},{},[2593],{"type":51,"value":2594},"    return response\n",{"type":45,"tag":72,"props":2596,"children":2597},{"class":74,"line":691},[2598],{"type":45,"tag":72,"props":2599,"children":2600},{},[2601],{"type":51,"value":1732},{"type":45,"tag":750,"props":2603,"children":2605},{"id":2604},"authenticated-requests",[2606],{"type":51,"value":2607},"Authenticated Requests",{"type":45,"tag":61,"props":2609,"children":2611},{"className":63,"code":2610,"language":24,"meta":65,"style":65},"app.get(\"user\") { req async throws -> Response in\n    guard let session = req.cookies[\"a_session_[PROJECT_ID]\"]?.string else {\n        throw Abort(.unauthorized)\n    }\n\n    let sessionClient = Client()\n        .setEndpoint(\"https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1\")\n        .setProject(\"[PROJECT_ID]\")\n        .setSession(session)\n\n    let account = Account(sessionClient)\n    let user = try await account.get()\n    \u002F\u002F Return user as JSON\n}\n",[2612],{"type":45,"tag":68,"props":2613,"children":2614},{"__ignoreMap":65},[2615,2623,2631,2639,2646,2653,2661,2669,2677,2685,2692,2700,2708,2716],{"type":45,"tag":72,"props":2616,"children":2617},{"class":74,"line":75},[2618],{"type":45,"tag":72,"props":2619,"children":2620},{},[2621],{"type":51,"value":2622},"app.get(\"user\") { req async throws -> Response in\n",{"type":45,"tag":72,"props":2624,"children":2625},{"class":74,"line":84},[2626],{"type":45,"tag":72,"props":2627,"children":2628},{},[2629],{"type":51,"value":2630},"    guard let session = req.cookies[\"a_session_[PROJECT_ID]\"]?.string else {\n",{"type":45,"tag":72,"props":2632,"children":2633},{"class":74,"line":130},[2634],{"type":45,"tag":72,"props":2635,"children":2636},{},[2637],{"type":51,"value":2638},"        throw Abort(.unauthorized)\n",{"type":45,"tag":72,"props":2640,"children":2641},{"class":74,"line":139},[2642],{"type":45,"tag":72,"props":2643,"children":2644},{},[2645],{"type":51,"value":2211},{"type":45,"tag":72,"props":2647,"children":2648},{"class":74,"line":148},[2649],{"type":45,"tag":72,"props":2650,"children":2651},{"emptyLinePlaceholder":124},[2652],{"type":51,"value":127},{"type":45,"tag":72,"props":2654,"children":2655},{"class":74,"line":206},[2656],{"type":45,"tag":72,"props":2657,"children":2658},{},[2659],{"type":51,"value":2660},"    let sessionClient = Client()\n",{"type":45,"tag":72,"props":2662,"children":2663},{"class":74,"line":280},[2664],{"type":45,"tag":72,"props":2665,"children":2666},{},[2667],{"type":51,"value":2668},"        .setEndpoint(\"https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1\")\n",{"type":45,"tag":72,"props":2670,"children":2671},{"class":74,"line":289},[2672],{"type":45,"tag":72,"props":2673,"children":2674},{},[2675],{"type":51,"value":2676},"        .setProject(\"[PROJECT_ID]\")\n",{"type":45,"tag":72,"props":2678,"children":2679},{"class":74,"line":297},[2680],{"type":45,"tag":72,"props":2681,"children":2682},{},[2683],{"type":51,"value":2684},"        .setSession(session)\n",{"type":45,"tag":72,"props":2686,"children":2687},{"class":74,"line":306},[2688],{"type":45,"tag":72,"props":2689,"children":2690},{"emptyLinePlaceholder":124},[2691],{"type":51,"value":127},{"type":45,"tag":72,"props":2693,"children":2694},{"class":74,"line":315},[2695],{"type":45,"tag":72,"props":2696,"children":2697},{},[2698],{"type":51,"value":2699},"    let account = Account(sessionClient)\n",{"type":45,"tag":72,"props":2701,"children":2702},{"class":74,"line":323},[2703],{"type":45,"tag":72,"props":2704,"children":2705},{},[2706],{"type":51,"value":2707},"    let user = try await account.get()\n",{"type":45,"tag":72,"props":2709,"children":2710},{"class":74,"line":332},[2711],{"type":45,"tag":72,"props":2712,"children":2713},{},[2714],{"type":51,"value":2715},"    \u002F\u002F Return user as JSON\n",{"type":45,"tag":72,"props":2717,"children":2718},{"class":74,"line":341},[2719],{"type":45,"tag":72,"props":2720,"children":2721},{},[2722],{"type":51,"value":1732},{"type":45,"tag":750,"props":2724,"children":2726},{"id":2725},"oauth2-ssr-flow",[2727],{"type":51,"value":2728},"OAuth2 SSR Flow",{"type":45,"tag":61,"props":2730,"children":2732},{"className":63,"code":2731,"language":24,"meta":65,"style":65},"\u002F\u002F Step 1: Redirect to OAuth provider\napp.get(\"oauth\") { req async throws -> Response in\n    let account = Account(adminClient)\n    let redirectUrl = try await account.createOAuth2Token(\n        provider: .github,\n        success: \"https:\u002F\u002Fexample.com\u002Foauth\u002Fsuccess\",\n        failure: \"https:\u002F\u002Fexample.com\u002Foauth\u002Ffailure\"\n    )\n    return req.redirect(to: redirectUrl)\n}\n\n\u002F\u002F Step 2: Handle callback — exchange token for session\napp.get(\"oauth\", \"success\") { req async throws -> Response in\n    let userId = try req.query.get(String.self, at: \"userId\")\n    let secret = try req.query.get(String.self, at: \"secret\")\n\n    let account = Account(adminClient)\n    let session = try await account.createSession(userId: userId, secret: secret)\n\n    let response = Response(status: .ok, body: .init(string: \"{\\\"success\\\": true}\"))\n    response.cookies[\"a_session_[PROJECT_ID]\"] = HTTPCookies.Value(\n        string: session.secret,\n        isHTTPOnly: true, isSecure: true, sameSite: .strict, path: \"\u002F\"\n    )\n    return response\n}\n",[2733],{"type":45,"tag":68,"props":2734,"children":2735},{"__ignoreMap":65},[2736,2744,2752,2759,2767,2775,2783,2791,2798,2806,2813,2820,2828,2836,2844,2852,2859,2866,2874,2881,2888,2895,2902,2910,2917,2924],{"type":45,"tag":72,"props":2737,"children":2738},{"class":74,"line":75},[2739],{"type":45,"tag":72,"props":2740,"children":2741},{},[2742],{"type":51,"value":2743},"\u002F\u002F Step 1: Redirect to OAuth provider\n",{"type":45,"tag":72,"props":2745,"children":2746},{"class":74,"line":84},[2747],{"type":45,"tag":72,"props":2748,"children":2749},{},[2750],{"type":51,"value":2751},"app.get(\"oauth\") { req async throws -> Response in\n",{"type":45,"tag":72,"props":2753,"children":2754},{"class":74,"line":130},[2755],{"type":45,"tag":72,"props":2756,"children":2757},{},[2758],{"type":51,"value":2476},{"type":45,"tag":72,"props":2760,"children":2761},{"class":74,"line":139},[2762],{"type":45,"tag":72,"props":2763,"children":2764},{},[2765],{"type":51,"value":2766},"    let redirectUrl = try await account.createOAuth2Token(\n",{"type":45,"tag":72,"props":2768,"children":2769},{"class":74,"line":148},[2770],{"type":45,"tag":72,"props":2771,"children":2772},{},[2773],{"type":51,"value":2774},"        provider: .github,\n",{"type":45,"tag":72,"props":2776,"children":2777},{"class":74,"line":206},[2778],{"type":45,"tag":72,"props":2779,"children":2780},{},[2781],{"type":51,"value":2782},"        success: \"https:\u002F\u002Fexample.com\u002Foauth\u002Fsuccess\",\n",{"type":45,"tag":72,"props":2784,"children":2785},{"class":74,"line":280},[2786],{"type":45,"tag":72,"props":2787,"children":2788},{},[2789],{"type":51,"value":2790},"        failure: \"https:\u002F\u002Fexample.com\u002Foauth\u002Ffailure\"\n",{"type":45,"tag":72,"props":2792,"children":2793},{"class":74,"line":289},[2794],{"type":45,"tag":72,"props":2795,"children":2796},{},[2797],{"type":51,"value":2508},{"type":45,"tag":72,"props":2799,"children":2800},{"class":74,"line":297},[2801],{"type":45,"tag":72,"props":2802,"children":2803},{},[2804],{"type":51,"value":2805},"    return req.redirect(to: redirectUrl)\n",{"type":45,"tag":72,"props":2807,"children":2808},{"class":74,"line":306},[2809],{"type":45,"tag":72,"props":2810,"children":2811},{},[2812],{"type":51,"value":1732},{"type":45,"tag":72,"props":2814,"children":2815},{"class":74,"line":315},[2816],{"type":45,"tag":72,"props":2817,"children":2818},{"emptyLinePlaceholder":124},[2819],{"type":51,"value":127},{"type":45,"tag":72,"props":2821,"children":2822},{"class":74,"line":323},[2823],{"type":45,"tag":72,"props":2824,"children":2825},{},[2826],{"type":51,"value":2827},"\u002F\u002F Step 2: Handle callback — exchange token for session\n",{"type":45,"tag":72,"props":2829,"children":2830},{"class":74,"line":332},[2831],{"type":45,"tag":72,"props":2832,"children":2833},{},[2834],{"type":51,"value":2835},"app.get(\"oauth\", \"success\") { req async throws -> Response in\n",{"type":45,"tag":72,"props":2837,"children":2838},{"class":74,"line":341},[2839],{"type":45,"tag":72,"props":2840,"children":2841},{},[2842],{"type":51,"value":2843},"    let userId = try req.query.get(String.self, at: \"userId\")\n",{"type":45,"tag":72,"props":2845,"children":2846},{"class":74,"line":349},[2847],{"type":45,"tag":72,"props":2848,"children":2849},{},[2850],{"type":51,"value":2851},"    let secret = try req.query.get(String.self, at: \"secret\")\n",{"type":45,"tag":72,"props":2853,"children":2854},{"class":74,"line":358},[2855],{"type":45,"tag":72,"props":2856,"children":2857},{"emptyLinePlaceholder":124},[2858],{"type":51,"value":127},{"type":45,"tag":72,"props":2860,"children":2861},{"class":74,"line":674},[2862],{"type":45,"tag":72,"props":2863,"children":2864},{},[2865],{"type":51,"value":2476},{"type":45,"tag":72,"props":2867,"children":2868},{"class":74,"line":682},[2869],{"type":45,"tag":72,"props":2870,"children":2871},{},[2872],{"type":51,"value":2873},"    let session = try await account.createSession(userId: userId, secret: secret)\n",{"type":45,"tag":72,"props":2875,"children":2876},{"class":74,"line":691},[2877],{"type":45,"tag":72,"props":2878,"children":2879},{"emptyLinePlaceholder":124},[2880],{"type":51,"value":127},{"type":45,"tag":72,"props":2882,"children":2883},{"class":74,"line":700},[2884],{"type":45,"tag":72,"props":2885,"children":2886},{},[2887],{"type":51,"value":2531},{"type":45,"tag":72,"props":2889,"children":2890},{"class":74,"line":708},[2891],{"type":45,"tag":72,"props":2892,"children":2893},{},[2894],{"type":51,"value":2539},{"type":45,"tag":72,"props":2896,"children":2897},{"class":74,"line":717},[2898],{"type":45,"tag":72,"props":2899,"children":2900},{},[2901],{"type":51,"value":2547},{"type":45,"tag":72,"props":2903,"children":2904},{"class":74,"line":29},[2905],{"type":45,"tag":72,"props":2906,"children":2907},{},[2908],{"type":51,"value":2909},"        isHTTPOnly: true, isSecure: true, sameSite: .strict, path: \"\u002F\"\n",{"type":45,"tag":72,"props":2911,"children":2912},{"class":74,"line":733},[2913],{"type":45,"tag":72,"props":2914,"children":2915},{},[2916],{"type":51,"value":2508},{"type":45,"tag":72,"props":2918,"children":2919},{"class":74,"line":742},[2920],{"type":45,"tag":72,"props":2921,"children":2922},{},[2923],{"type":51,"value":2594},{"type":45,"tag":72,"props":2925,"children":2926},{"class":74,"line":1278},[2927],{"type":45,"tag":72,"props":2928,"children":2929},{},[2930],{"type":51,"value":1732},{"type":45,"tag":485,"props":2932,"children":2933},{},[2934],{"type":45,"tag":489,"props":2935,"children":2936},{},[2937,2942,2944,2950,2951,2957,2958,2964,2966,2972],{"type":45,"tag":493,"props":2938,"children":2939},{},[2940],{"type":51,"value":2941},"Cookie security:",{"type":51,"value":2943}," Always use ",{"type":45,"tag":68,"props":2945,"children":2947},{"className":2946},[],[2948],{"type":51,"value":2949},"isHTTPOnly",{"type":51,"value":940},{"type":45,"tag":68,"props":2952,"children":2954},{"className":2953},[],[2955],{"type":51,"value":2956},"isSecure",{"type":51,"value":947},{"type":45,"tag":68,"props":2959,"children":2961},{"className":2960},[],[2962],{"type":51,"value":2963},"sameSite: .strict",{"type":51,"value":2965}," to prevent XSS. The cookie name must be ",{"type":45,"tag":68,"props":2967,"children":2969},{"className":2968},[],[2970],{"type":51,"value":2971},"a_session_\u003CPROJECT_ID>",{"type":51,"value":2973},".",{"type":45,"tag":485,"props":2975,"children":2976},{},[2977],{"type":45,"tag":489,"props":2978,"children":2979},{},[2980,2985,2987,2993],{"type":45,"tag":493,"props":2981,"children":2982},{},[2983],{"type":51,"value":2984},"Forwarding user agent:",{"type":51,"value":2986}," Call ",{"type":45,"tag":68,"props":2988,"children":2990},{"className":2989},[],[2991],{"type":51,"value":2992},"sessionClient.setForwardedUserAgent(req.headers.first(name: .userAgent) ?? \"\")",{"type":51,"value":2994}," to record the end-user's browser info for debugging and security.",{"type":45,"tag":54,"props":2996,"children":2998},{"id":2997},"error-handling",[2999],{"type":51,"value":3000},"Error Handling",{"type":45,"tag":61,"props":3002,"children":3004},{"className":63,"code":3003,"language":24,"meta":65,"style":65},"import Appwrite\n\u002F\u002F AppwriteException is included in the main module\n\ndo {\n    let row = try await tablesDB.getRow(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", rowId: \"[ROW_ID]\")\n} catch let error as AppwriteException {\n    print(error.message)     \u002F\u002F human-readable message\n    print(error.code)        \u002F\u002F HTTP status code (Int)\n    print(error.type)        \u002F\u002F error type (e.g. \"document_not_found\")\n    print(error.response)    \u002F\u002F full response body\n}\n",[3005],{"type":45,"tag":68,"props":3006,"children":3007},{"__ignoreMap":65},[3008,3015,3023,3030,3038,3046,3054,3062,3070,3078,3086],{"type":45,"tag":72,"props":3009,"children":3010},{"class":74,"line":75},[3011],{"type":45,"tag":72,"props":3012,"children":3013},{},[3014],{"type":51,"value":118},{"type":45,"tag":72,"props":3016,"children":3017},{"class":74,"line":84},[3018],{"type":45,"tag":72,"props":3019,"children":3020},{},[3021],{"type":51,"value":3022},"\u002F\u002F AppwriteException is included in the main module\n",{"type":45,"tag":72,"props":3024,"children":3025},{"class":74,"line":130},[3026],{"type":45,"tag":72,"props":3027,"children":3028},{"emptyLinePlaceholder":124},[3029],{"type":51,"value":127},{"type":45,"tag":72,"props":3031,"children":3032},{"class":74,"line":139},[3033],{"type":45,"tag":72,"props":3034,"children":3035},{},[3036],{"type":51,"value":3037},"do {\n",{"type":45,"tag":72,"props":3039,"children":3040},{"class":74,"line":148},[3041],{"type":45,"tag":72,"props":3042,"children":3043},{},[3044],{"type":51,"value":3045},"    let row = try await tablesDB.getRow(databaseId: \"[DATABASE_ID]\", tableId: \"[TABLE_ID]\", rowId: \"[ROW_ID]\")\n",{"type":45,"tag":72,"props":3047,"children":3048},{"class":74,"line":206},[3049],{"type":45,"tag":72,"props":3050,"children":3051},{},[3052],{"type":51,"value":3053},"} catch let error as AppwriteException {\n",{"type":45,"tag":72,"props":3055,"children":3056},{"class":74,"line":280},[3057],{"type":45,"tag":72,"props":3058,"children":3059},{},[3060],{"type":51,"value":3061},"    print(error.message)     \u002F\u002F human-readable message\n",{"type":45,"tag":72,"props":3063,"children":3064},{"class":74,"line":289},[3065],{"type":45,"tag":72,"props":3066,"children":3067},{},[3068],{"type":51,"value":3069},"    print(error.code)        \u002F\u002F HTTP status code (Int)\n",{"type":45,"tag":72,"props":3071,"children":3072},{"class":74,"line":297},[3073],{"type":45,"tag":72,"props":3074,"children":3075},{},[3076],{"type":51,"value":3077},"    print(error.type)        \u002F\u002F error type (e.g. \"document_not_found\")\n",{"type":45,"tag":72,"props":3079,"children":3080},{"class":74,"line":306},[3081],{"type":45,"tag":72,"props":3082,"children":3083},{},[3084],{"type":51,"value":3085},"    print(error.response)    \u002F\u002F full response body\n",{"type":45,"tag":72,"props":3087,"children":3088},{"class":74,"line":315},[3089],{"type":45,"tag":72,"props":3090,"children":3091},{},[3092],{"type":51,"value":1732},{"type":45,"tag":489,"props":3094,"children":3095},{},[3096],{"type":45,"tag":493,"props":3097,"children":3098},{},[3099],{"type":51,"value":3100},"Common error codes:",{"type":45,"tag":777,"props":3102,"children":3103},{},[3104,3120],{"type":45,"tag":781,"props":3105,"children":3106},{},[3107],{"type":45,"tag":785,"props":3108,"children":3109},{},[3110,3115],{"type":45,"tag":789,"props":3111,"children":3112},{},[3113],{"type":51,"value":3114},"Code",{"type":45,"tag":789,"props":3116,"children":3117},{},[3118],{"type":51,"value":3119},"Meaning",{"type":45,"tag":810,"props":3121,"children":3122},{},[3123,3140,3157,3174,3191],{"type":45,"tag":785,"props":3124,"children":3125},{},[3126,3135],{"type":45,"tag":817,"props":3127,"children":3128},{},[3129],{"type":45,"tag":68,"props":3130,"children":3132},{"className":3131},[],[3133],{"type":51,"value":3134},"401",{"type":45,"tag":817,"props":3136,"children":3137},{},[3138],{"type":51,"value":3139},"Unauthorized — missing or invalid session\u002FAPI key",{"type":45,"tag":785,"props":3141,"children":3142},{},[3143,3152],{"type":45,"tag":817,"props":3144,"children":3145},{},[3146],{"type":45,"tag":68,"props":3147,"children":3149},{"className":3148},[],[3150],{"type":51,"value":3151},"403",{"type":45,"tag":817,"props":3153,"children":3154},{},[3155],{"type":51,"value":3156},"Forbidden — insufficient permissions",{"type":45,"tag":785,"props":3158,"children":3159},{},[3160,3169],{"type":45,"tag":817,"props":3161,"children":3162},{},[3163],{"type":45,"tag":68,"props":3164,"children":3166},{"className":3165},[],[3167],{"type":51,"value":3168},"404",{"type":45,"tag":817,"props":3170,"children":3171},{},[3172],{"type":51,"value":3173},"Not found — resource does not exist",{"type":45,"tag":785,"props":3175,"children":3176},{},[3177,3186],{"type":45,"tag":817,"props":3178,"children":3179},{},[3180],{"type":45,"tag":68,"props":3181,"children":3183},{"className":3182},[],[3184],{"type":51,"value":3185},"409",{"type":45,"tag":817,"props":3187,"children":3188},{},[3189],{"type":51,"value":3190},"Conflict — duplicate ID or unique constraint",{"type":45,"tag":785,"props":3192,"children":3193},{},[3194,3203],{"type":45,"tag":817,"props":3195,"children":3196},{},[3197],{"type":45,"tag":68,"props":3198,"children":3200},{"className":3199},[],[3201],{"type":51,"value":3202},"429",{"type":45,"tag":817,"props":3204,"children":3205},{},[3206],{"type":51,"value":3207},"Rate limited — too many requests",{"type":45,"tag":54,"props":3209,"children":3211},{"id":3210},"permissions-roles-critical",[3212],{"type":51,"value":3213},"Permissions & Roles (Critical)",{"type":45,"tag":489,"props":3215,"children":3216},{},[3217,3219,3225,3226,3232,3233,3239,3240,3246,3248,3254,3256,3261,3263,3269,3271,3277],{"type":51,"value":3218},"Appwrite uses permission strings to control access to resources. Each permission pairs an action (",{"type":45,"tag":68,"props":3220,"children":3222},{"className":3221},[],[3223],{"type":51,"value":3224},"read",{"type":51,"value":940},{"type":45,"tag":68,"props":3227,"children":3229},{"className":3228},[],[3230],{"type":51,"value":3231},"update",{"type":51,"value":940},{"type":45,"tag":68,"props":3234,"children":3236},{"className":3235},[],[3237],{"type":51,"value":3238},"delete",{"type":51,"value":940},{"type":45,"tag":68,"props":3241,"children":3243},{"className":3242},[],[3244],{"type":51,"value":3245},"create",{"type":51,"value":3247},", or ",{"type":45,"tag":68,"props":3249,"children":3251},{"className":3250},[],[3252],{"type":51,"value":3253},"write",{"type":51,"value":3255}," which grants create + update + delete) with a role target. By default, ",{"type":45,"tag":493,"props":3257,"children":3258},{},[3259],{"type":51,"value":3260},"no user has access",{"type":51,"value":3262}," unless permissions are explicitly set at the row\u002Ffile level or inherited from the table\u002Fbucket settings. Permissions are arrays of strings built with the ",{"type":45,"tag":68,"props":3264,"children":3266},{"className":3265},[],[3267],{"type":51,"value":3268},"Permission",{"type":51,"value":3270}," and ",{"type":45,"tag":68,"props":3272,"children":3274},{"className":3273},[],[3275],{"type":51,"value":3276},"Role",{"type":51,"value":3278}," helpers.",{"type":45,"tag":61,"props":3280,"children":3282},{"className":63,"code":3281,"language":24,"meta":65,"style":65},"import Appwrite\n\u002F\u002F Permission and Role are included in the main module import\n",[3283],{"type":45,"tag":68,"props":3284,"children":3285},{"__ignoreMap":65},[3286,3293],{"type":45,"tag":72,"props":3287,"children":3288},{"class":74,"line":75},[3289],{"type":45,"tag":72,"props":3290,"children":3291},{},[3292],{"type":51,"value":118},{"type":45,"tag":72,"props":3294,"children":3295},{"class":74,"line":84},[3296],{"type":45,"tag":72,"props":3297,"children":3298},{},[3299],{"type":51,"value":3300},"\u002F\u002F Permission and Role are included in the main module import\n",{"type":45,"tag":98,"props":3302,"children":3304},{"id":3303},"database-row-with-permissions",[3305],{"type":51,"value":3306},"Database Row with Permissions",{"type":45,"tag":61,"props":3308,"children":3310},{"className":63,"code":3309,"language":24,"meta":65,"style":65},"let doc = try await tablesDB.createRow(\n    databaseId: \"[DATABASE_ID]\",\n    tableId: \"[TABLE_ID]\",\n    rowId: ID.unique(),\n    data: [\"title\": \"Hello World\"],\n    permissions: [\n        Permission.read(Role.user(\"[USER_ID]\")),     \u002F\u002F specific user can read\n        Permission.update(Role.user(\"[USER_ID]\")),   \u002F\u002F specific user can update\n        Permission.read(Role.team(\"[TEAM_ID]\")),     \u002F\u002F all team members can read\n        Permission.read(Role.any()),                 \u002F\u002F anyone (including guests) can read\n    ]\n)\n",[3311],{"type":45,"tag":68,"props":3312,"children":3313},{"__ignoreMap":65},[3314,3322,3329,3337,3345,3353,3361,3369,3377,3385,3393,3400],{"type":45,"tag":72,"props":3315,"children":3316},{"class":74,"line":75},[3317],{"type":45,"tag":72,"props":3318,"children":3319},{},[3320],{"type":51,"value":3321},"let doc = try await tablesDB.createRow(\n",{"type":45,"tag":72,"props":3323,"children":3324},{"class":74,"line":84},[3325],{"type":45,"tag":72,"props":3326,"children":3327},{},[3328],{"type":51,"value":993},{"type":45,"tag":72,"props":3330,"children":3331},{"class":74,"line":130},[3332],{"type":45,"tag":72,"props":3333,"children":3334},{},[3335],{"type":51,"value":3336},"    tableId: \"[TABLE_ID]\",\n",{"type":45,"tag":72,"props":3338,"children":3339},{"class":74,"line":139},[3340],{"type":45,"tag":72,"props":3341,"children":3342},{},[3343],{"type":51,"value":3344},"    rowId: ID.unique(),\n",{"type":45,"tag":72,"props":3346,"children":3347},{"class":74,"line":148},[3348],{"type":45,"tag":72,"props":3349,"children":3350},{},[3351],{"type":51,"value":3352},"    data: [\"title\": \"Hello World\"],\n",{"type":45,"tag":72,"props":3354,"children":3355},{"class":74,"line":206},[3356],{"type":45,"tag":72,"props":3357,"children":3358},{},[3359],{"type":51,"value":3360},"    permissions: [\n",{"type":45,"tag":72,"props":3362,"children":3363},{"class":74,"line":280},[3364],{"type":45,"tag":72,"props":3365,"children":3366},{},[3367],{"type":51,"value":3368},"        Permission.read(Role.user(\"[USER_ID]\")),     \u002F\u002F specific user can read\n",{"type":45,"tag":72,"props":3370,"children":3371},{"class":74,"line":289},[3372],{"type":45,"tag":72,"props":3373,"children":3374},{},[3375],{"type":51,"value":3376},"        Permission.update(Role.user(\"[USER_ID]\")),   \u002F\u002F specific user can update\n",{"type":45,"tag":72,"props":3378,"children":3379},{"class":74,"line":297},[3380],{"type":45,"tag":72,"props":3381,"children":3382},{},[3383],{"type":51,"value":3384},"        Permission.read(Role.team(\"[TEAM_ID]\")),     \u002F\u002F all team members can read\n",{"type":45,"tag":72,"props":3386,"children":3387},{"class":74,"line":306},[3388],{"type":45,"tag":72,"props":3389,"children":3390},{},[3391],{"type":51,"value":3392},"        Permission.read(Role.any()),                 \u002F\u002F anyone (including guests) can read\n",{"type":45,"tag":72,"props":3394,"children":3395},{"class":74,"line":315},[3396],{"type":45,"tag":72,"props":3397,"children":3398},{},[3399],{"type":51,"value":1057},{"type":45,"tag":72,"props":3401,"children":3402},{"class":74,"line":323},[3403],{"type":45,"tag":72,"props":3404,"children":3405},{},[3406],{"type":51,"value":1065},{"type":45,"tag":98,"props":3408,"children":3410},{"id":3409},"file-upload-with-permissions",[3411],{"type":51,"value":3412},"File Upload with Permissions",{"type":45,"tag":61,"props":3414,"children":3416},{"className":63,"code":3415,"language":24,"meta":65,"style":65},"let file = try await storage.createFile(\n    bucketId: \"[BUCKET_ID]\",\n    fileId: ID.unique(),\n    file: InputFile.fromPath(\"\u002Fpath\u002Fto\u002Ffile.png\"),\n    permissions: [\n        Permission.read(Role.any()),\n        Permission.update(Role.user(\"[USER_ID]\")),\n        Permission.delete(Role.user(\"[USER_ID]\")),\n    ]\n)\n",[3417],{"type":45,"tag":68,"props":3418,"children":3419},{"__ignoreMap":65},[3420,3428,3436,3444,3452,3459,3467,3475,3483,3490],{"type":45,"tag":72,"props":3421,"children":3422},{"class":74,"line":75},[3423],{"type":45,"tag":72,"props":3424,"children":3425},{},[3426],{"type":51,"value":3427},"let file = try await storage.createFile(\n",{"type":45,"tag":72,"props":3429,"children":3430},{"class":74,"line":84},[3431],{"type":45,"tag":72,"props":3432,"children":3433},{},[3434],{"type":51,"value":3435},"    bucketId: \"[BUCKET_ID]\",\n",{"type":45,"tag":72,"props":3437,"children":3438},{"class":74,"line":130},[3439],{"type":45,"tag":72,"props":3440,"children":3441},{},[3442],{"type":51,"value":3443},"    fileId: ID.unique(),\n",{"type":45,"tag":72,"props":3445,"children":3446},{"class":74,"line":139},[3447],{"type":45,"tag":72,"props":3448,"children":3449},{},[3450],{"type":51,"value":3451},"    file: InputFile.fromPath(\"\u002Fpath\u002Fto\u002Ffile.png\"),\n",{"type":45,"tag":72,"props":3453,"children":3454},{"class":74,"line":148},[3455],{"type":45,"tag":72,"props":3456,"children":3457},{},[3458],{"type":51,"value":3360},{"type":45,"tag":72,"props":3460,"children":3461},{"class":74,"line":206},[3462],{"type":45,"tag":72,"props":3463,"children":3464},{},[3465],{"type":51,"value":3466},"        Permission.read(Role.any()),\n",{"type":45,"tag":72,"props":3468,"children":3469},{"class":74,"line":280},[3470],{"type":45,"tag":72,"props":3471,"children":3472},{},[3473],{"type":51,"value":3474},"        Permission.update(Role.user(\"[USER_ID]\")),\n",{"type":45,"tag":72,"props":3476,"children":3477},{"class":74,"line":289},[3478],{"type":45,"tag":72,"props":3479,"children":3480},{},[3481],{"type":51,"value":3482},"        Permission.delete(Role.user(\"[USER_ID]\")),\n",{"type":45,"tag":72,"props":3484,"children":3485},{"class":74,"line":297},[3486],{"type":45,"tag":72,"props":3487,"children":3488},{},[3489],{"type":51,"value":1057},{"type":45,"tag":72,"props":3491,"children":3492},{"class":74,"line":306},[3493],{"type":45,"tag":72,"props":3494,"children":3495},{},[3496],{"type":51,"value":1065},{"type":45,"tag":485,"props":3498,"children":3499},{},[3500],{"type":45,"tag":489,"props":3501,"children":3502},{},[3503,3508],{"type":45,"tag":493,"props":3504,"children":3505},{},[3506],{"type":51,"value":3507},"When to set permissions:",{"type":51,"value":3509}," Set row\u002Ffile-level permissions when you need per-resource access control. If all rows in a table share the same rules, configure permissions at the table\u002Fbucket level and leave row permissions empty.",{"type":45,"tag":485,"props":3511,"children":3512},{},[3513,3521],{"type":45,"tag":489,"props":3514,"children":3515},{},[3516],{"type":45,"tag":493,"props":3517,"children":3518},{},[3519],{"type":51,"value":3520},"Common mistakes:",{"type":45,"tag":917,"props":3522,"children":3523},{},[3524,3534,3568],{"type":45,"tag":921,"props":3525,"children":3526},{},[3527,3532],{"type":45,"tag":493,"props":3528,"children":3529},{},[3530],{"type":51,"value":3531},"Forgetting permissions",{"type":51,"value":3533}," — the resource becomes inaccessible to all users (including the creator)",{"type":45,"tag":921,"props":3535,"children":3536},{},[3537,3566],{"type":45,"tag":493,"props":3538,"children":3539},{},[3540,3546,3548,3553,3555,3560,3561],{"type":45,"tag":68,"props":3541,"children":3543},{"className":3542},[],[3544],{"type":51,"value":3545},"Role.any()",{"type":51,"value":3547}," with ",{"type":45,"tag":68,"props":3549,"children":3551},{"className":3550},[],[3552],{"type":51,"value":3253},{"type":51,"value":3554},"\u002F",{"type":45,"tag":68,"props":3556,"children":3558},{"className":3557},[],[3559],{"type":51,"value":3231},{"type":51,"value":3554},{"type":45,"tag":68,"props":3562,"children":3564},{"className":3563},[],[3565],{"type":51,"value":3238},{"type":51,"value":3567}," — allows any user, including unauthenticated guests, to modify or remove the resource",{"type":45,"tag":921,"props":3569,"children":3570},{},[3571,3582],{"type":45,"tag":493,"props":3572,"children":3573},{},[3574,3580],{"type":45,"tag":68,"props":3575,"children":3577},{"className":3576},[],[3578],{"type":51,"value":3579},"Permission.read(Role.any())",{"type":51,"value":3581}," on sensitive data",{"type":51,"value":3583}," — makes the resource publicly readable",{"type":45,"tag":3585,"props":3586,"children":3587},"style",{},[3588],{"type":51,"value":3589},"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);}",{"items":3591,"total":315},[3592,3609,3627,3642,3656,3673,3687,3701,3716,3730,3739],{"slug":3593,"name":3593,"fn":3594,"description":3595,"org":3596,"tags":3597,"stars":29,"repoUrl":30,"updatedAt":3608},"appwrite-cli","manage Appwrite projects via CLI","Appwrite CLI skill. Use when managing Appwrite projects from the command line. Covers installation, login, project initialization, multi-file project configuration, deploying functions\u002Fsites\u002Ftables\u002Fbuckets\u002Fteams\u002Fwebhooks\u002Ftopics, flag-based list queries, non-interactive CI\u002FCD mode, and generating type-safe SDKs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3598,3599,3602,3605],{"name":9,"slug":8,"type":15},{"name":3600,"slug":3601,"type":15},"Backend","backend",{"name":3603,"slug":3604,"type":15},"CLI","cli",{"name":3606,"slug":3607,"type":15},"Deployment","deployment","2026-07-12T08:45:23.213081",{"slug":3610,"name":3610,"fn":3611,"description":3612,"org":3613,"tags":3614,"stars":29,"repoUrl":30,"updatedAt":3626},"appwrite-dart","build applications with Appwrite Dart SDK","Appwrite Dart SDK skill. Use when building Flutter apps (mobile, web, desktop) or server-side Dart applications with Appwrite. Covers client-side auth (email, OAuth), database queries, file uploads with native file handling, real-time subscriptions, and server-side admin via API keys for user management, database administration, storage, and functions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3615,3616,3617,3620,3623],{"name":9,"slug":8,"type":15},{"name":3600,"slug":3601,"type":15},{"name":3618,"slug":3619,"type":15},"Dart","dart",{"name":3621,"slug":3622,"type":15},"Flutter","flutter",{"name":3624,"slug":3625,"type":15},"Mobile","mobile","2026-07-12T08:45:33.336948",{"slug":3628,"name":3628,"fn":3629,"description":3630,"org":3631,"tags":3632,"stars":29,"repoUrl":30,"updatedAt":3641},"appwrite-dotnet","build .NET applications with Appwrite SDK","Appwrite .NET SDK skill. Use when building server-side C# or .NET applications with Appwrite, including ASP.NET and Blazor integrations. Covers user management, database\u002Ftable CRUD, file storage, and functions via API keys.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3633,3636,3637,3638,3639],{"name":3634,"slug":3635,"type":15},".NET","net",{"name":9,"slug":8,"type":15},{"name":3600,"slug":3601,"type":15},{"name":26,"slug":27,"type":15},{"name":808,"slug":3640,"type":15},"storage","2026-07-12T08:45:28.556413",{"slug":3643,"name":3643,"fn":3644,"description":3645,"org":3646,"tags":3647,"stars":29,"repoUrl":30,"updatedAt":3655},"appwrite-go","build Go applications with Appwrite SDK","Appwrite Go SDK skill. Use when building server-side Go applications with Appwrite. Covers user management, database\u002Ftable CRUD, file storage, and functions via API keys. Uses per-service packages and functional options pattern.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3648,3649,3650,3651,3654],{"name":9,"slug":8,"type":15},{"name":3600,"slug":3601,"type":15},{"name":26,"slug":27,"type":15},{"name":3652,"slug":3653,"type":15},"Go","go",{"name":808,"slug":3640,"type":15},"2026-07-12T08:45:19.875231",{"slug":3657,"name":3657,"fn":3658,"description":3659,"org":3660,"tags":3661,"stars":29,"repoUrl":30,"updatedAt":3672},"appwrite-kotlin","build applications with Appwrite Kotlin SDK","Appwrite Kotlin SDK skill. Use when building native Android apps or server-side Kotlin\u002FJVM backends with Appwrite. Covers client-side auth (email, OAuth with Activity integration), database queries, file uploads, real-time subscriptions with coroutine support, and server-side admin via API keys for user management, database administration, storage, and functions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3662,3665,3666,3667,3668,3669],{"name":3663,"slug":3664,"type":15},"Android","android",{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":3600,"slug":3601,"type":15},{"name":26,"slug":27,"type":15},{"name":3670,"slug":3671,"type":15},"Kotlin","kotlin","2026-07-12T08:45:40.750646",{"slug":3674,"name":3674,"fn":3675,"description":3676,"org":3677,"tags":3678,"stars":29,"repoUrl":30,"updatedAt":3686},"appwrite-php","build PHP applications with Appwrite","Appwrite PHP SDK skill. Use when building server-side PHP applications with Appwrite, including Laravel and Symfony integrations. Covers user management, database\u002Ftable CRUD, file storage, and functions via API keys.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3679,3680,3681,3682,3685],{"name":9,"slug":8,"type":15},{"name":3600,"slug":3601,"type":15},{"name":26,"slug":27,"type":15},{"name":3683,"slug":3684,"type":15},"PHP","php",{"name":808,"slug":3640,"type":15},"2026-07-12T08:45:21.794433",{"slug":3688,"name":3688,"fn":3689,"description":3690,"org":3691,"tags":3692,"stars":29,"repoUrl":30,"updatedAt":3700},"appwrite-python","build Python applications with Appwrite","Appwrite Python SDK skill. Use when building server-side Python applications with Appwrite, including Django, Flask, and FastAPI integrations. Covers user management, database\u002Ftable CRUD, file storage, and functions via API keys.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3693,3694,3695,3696,3699],{"name":9,"slug":8,"type":15},{"name":3600,"slug":3601,"type":15},{"name":26,"slug":27,"type":15},{"name":3697,"slug":3698,"type":15},"Python","python",{"name":808,"slug":3640,"type":15},"2026-07-12T08:45:37.768328",{"slug":3702,"name":3702,"fn":3703,"description":3704,"org":3705,"tags":3706,"stars":29,"repoUrl":30,"updatedAt":3715},"appwrite-ruby","build applications with Appwrite Ruby SDK","Appwrite Ruby SDK skill. Use when building server-side Ruby applications with Appwrite, including Rails and Sinatra integrations. Covers user management, database\u002Ftable CRUD, file storage, and functions via API keys.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3707,3710,3711,3712],{"name":3708,"slug":3709,"type":15},"API Development","api-development",{"name":9,"slug":8,"type":15},{"name":3600,"slug":3601,"type":15},{"name":3713,"slug":3714,"type":15},"Ruby","ruby","2026-07-12T08:45:34.567568",{"slug":3717,"name":3717,"fn":3718,"description":3719,"org":3720,"tags":3721,"stars":29,"repoUrl":30,"updatedAt":3729},"appwrite-rust","build server-side applications with Appwrite","Appwrite Rust SDK skill. Use when building server-side Rust applications with Appwrite. Covers async client setup with API keys, user management, TablesDB database\u002Ftable\u002Frow operations, file storage, function executions, permissions, queries, and error handling. Uses the crates.io `appwrite` package and Tokio.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3722,3723,3724,3725,3726],{"name":3708,"slug":3709,"type":15},{"name":13,"slug":14,"type":15},{"name":26,"slug":27,"type":15},{"name":1317,"slug":1314,"type":15},{"name":3727,"slug":3728,"type":15},"Rust","rust","2026-07-12T08:45:25.167378",{"slug":4,"name":4,"fn":5,"description":6,"org":3731,"tags":3732,"stars":29,"repoUrl":30,"updatedAt":31},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3733,3734,3735,3736,3737,3738],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":26,"slug":27,"type":15},{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"name":23,"slug":24,"type":15},{"slug":3740,"name":3740,"fn":3741,"description":3742,"org":3743,"tags":3744,"stars":29,"repoUrl":30,"updatedAt":3757},"appwrite-typescript","build applications with Appwrite TypeScript SDK","Appwrite TypeScript SDK skill. Use when building browser-based JavaScript\u002FTypeScript apps, React Native mobile apps, or server-side Node.js\u002FDeno backends with Appwrite. Covers client-side auth (email, OAuth, anonymous), database queries, file uploads, real-time subscriptions, and server-side admin via API keys for user management, database administration, storage, and functions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3745,3746,3747,3748,3751,3754],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":26,"slug":27,"type":15},{"name":3749,"slug":3750,"type":15},"JavaScript","javascript",{"name":3752,"slug":3753,"type":15},"Node.js","node-js",{"name":3755,"slug":3756,"type":15},"TypeScript","typescript","2026-07-12T08:45:31.181727",{"items":3759,"total":315},[3760,3767,3775,3783,3791,3800,3808],{"slug":3593,"name":3593,"fn":3594,"description":3595,"org":3761,"tags":3762,"stars":29,"repoUrl":30,"updatedAt":3608},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3763,3764,3765,3766],{"name":9,"slug":8,"type":15},{"name":3600,"slug":3601,"type":15},{"name":3603,"slug":3604,"type":15},{"name":3606,"slug":3607,"type":15},{"slug":3610,"name":3610,"fn":3611,"description":3612,"org":3768,"tags":3769,"stars":29,"repoUrl":30,"updatedAt":3626},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3770,3771,3772,3773,3774],{"name":9,"slug":8,"type":15},{"name":3600,"slug":3601,"type":15},{"name":3618,"slug":3619,"type":15},{"name":3621,"slug":3622,"type":15},{"name":3624,"slug":3625,"type":15},{"slug":3628,"name":3628,"fn":3629,"description":3630,"org":3776,"tags":3777,"stars":29,"repoUrl":30,"updatedAt":3641},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3778,3779,3780,3781,3782],{"name":3634,"slug":3635,"type":15},{"name":9,"slug":8,"type":15},{"name":3600,"slug":3601,"type":15},{"name":26,"slug":27,"type":15},{"name":808,"slug":3640,"type":15},{"slug":3643,"name":3643,"fn":3644,"description":3645,"org":3784,"tags":3785,"stars":29,"repoUrl":30,"updatedAt":3655},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3786,3787,3788,3789,3790],{"name":9,"slug":8,"type":15},{"name":3600,"slug":3601,"type":15},{"name":26,"slug":27,"type":15},{"name":3652,"slug":3653,"type":15},{"name":808,"slug":3640,"type":15},{"slug":3657,"name":3657,"fn":3658,"description":3659,"org":3792,"tags":3793,"stars":29,"repoUrl":30,"updatedAt":3672},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3794,3795,3796,3797,3798,3799],{"name":3663,"slug":3664,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":3600,"slug":3601,"type":15},{"name":26,"slug":27,"type":15},{"name":3670,"slug":3671,"type":15},{"slug":3674,"name":3674,"fn":3675,"description":3676,"org":3801,"tags":3802,"stars":29,"repoUrl":30,"updatedAt":3686},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3803,3804,3805,3806,3807],{"name":9,"slug":8,"type":15},{"name":3600,"slug":3601,"type":15},{"name":26,"slug":27,"type":15},{"name":3683,"slug":3684,"type":15},{"name":808,"slug":3640,"type":15},{"slug":3688,"name":3688,"fn":3689,"description":3690,"org":3809,"tags":3810,"stars":29,"repoUrl":30,"updatedAt":3700},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3811,3812,3813,3814,3815],{"name":9,"slug":8,"type":15},{"name":3600,"slug":3601,"type":15},{"name":26,"slug":27,"type":15},{"name":3697,"slug":3698,"type":15},{"name":808,"slug":3640,"type":15}]