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