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