[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-appwrite-appwrite-python":3,"mdc-tm2lqr-key":36,"related-org-appwrite-appwrite-python":3023,"related-repo-appwrite-appwrite-python":3194},{"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-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},"appwrite","Appwrite","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fappwrite.png",[12,16,19,20,23],{"name":13,"slug":14,"type":15},"Backend","backend","tag",{"name":17,"slug":18,"type":15},"Database","database",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"Python","python",{"name":24,"slug":25,"type":15},"Storage","storage",23,"https:\u002F\u002Fgithub.com\u002Fappwrite\u002Fskills","2026-07-12T08:45:37.768328",null,0,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":29},[],"https:\u002F\u002Fgithub.com\u002Fappwrite\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fappwrite-python","---\nname: appwrite-python\ndescription: 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.\n---\n\n\n# Appwrite Python SDK\n\n## Installation\n\n```bash\npip install appwrite\n```\n\n## Setting Up the Client\n\n```python\nfrom appwrite.client import Client\nfrom appwrite.id import ID\nfrom appwrite.query import Query\nfrom appwrite.services.users import Users\nfrom appwrite.services.tables_db import TablesDB\nfrom appwrite.services.storage import Storage\nfrom appwrite.services.functions import Functions\nfrom appwrite.enums.o_auth_provider import OAuthProvider\n\nimport os\n\nclient = (Client()\n    .set_endpoint('https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1')\n    .set_project(os.environ['APPWRITE_PROJECT_ID'])\n    .set_key(os.environ['APPWRITE_API_KEY']))\n```\n\n## Code Examples\n\n### User Management\n\n```python\nusers = Users(client)\n\n# Create user\nuser = users.create(ID.unique(), 'user@example.com', None, 'password123', 'User Name')\n\n# List users\nresult = users.list([Query.limit(25)])\n\n# Get user\nfetched = users.get('[USER_ID]')\n\n# Delete user\nusers.delete('[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 keyword arguments (e.g., `database_id='...'`) over positional arguments for all SDK method calls. Only use positional style if the existing codebase already uses it or the user explicitly requests it.\n\n```python\ntables_db = TablesDB(client)\n\n# Create database\ndb = tables_db.create(ID.unique(), 'My Database')\n\n# Create row\ndoc = tables_db.create_row('[DATABASE_ID]', '[TABLE_ID]', ID.unique(), {\n    'title': 'Hello World'\n})\n\n# Query rows\nresults = tables_db.list_rows('[DATABASE_ID]', '[TABLE_ID]', [\n    Query.equal('title', 'Hello World'),\n    Query.limit(10)\n])\n\n# Get row\nrow = tables_db.get_row('[DATABASE_ID]', '[TABLE_ID]', '[ROW_ID]')\n\n# Update row\ntables_db.update_row('[DATABASE_ID]', '[TABLE_ID]', '[ROW_ID]', {\n    'title': 'Updated'\n})\n\n# Delete row\ntables_db.delete_row('[DATABASE_ID]', '[TABLE_ID]', '[ROW_ID]')\n```\n\n#### String Column Types\n\n> **Note:** The legacy `string` type is deprecated. Use explicit column types for all new columns.\n\n| Type | Max characters | Indexing | Storage |\n|------|---------------|----------|---------|\n| `varchar` | 16,383 | Full index (if size ≤ 768) | Inline in row |\n| `text` | 16,383 | Prefix only | Off-page |\n| `mediumtext` | 4,194,303 | Prefix only | Off-page |\n| `longtext` | 1,073,741,823 | Prefix only | Off-page |\n\n- `varchar` is stored inline and counts towards the 64 KB row size limit. Prefer for short, indexed fields like names, slugs, or identifiers.\n- `text`, `mediumtext`, and `longtext` are stored off-page (only a 20-byte pointer lives in the row), so they don't consume the row size budget. `size` is not required for these types.\n\n```python\n# Create table with explicit string column types\ntables_db.create_table(\n    database_id='[DATABASE_ID]',\n    table_id=ID.unique(),\n    name='articles',\n    columns=[\n        {'key': 'title',    'type': 'varchar',    'size': 255, 'required': True},   # inline, fully indexable\n        {'key': 'summary',  'type': 'text',                    'required': False},  # off-page, prefix index only\n        {'key': 'body',     'type': 'mediumtext',              'required': False},  # up to ~4 M chars\n        {'key': 'raw_data', 'type': 'longtext',                'required': False},  # up to ~1 B chars\n    ]\n)\n```\n\n### Query Methods\n\n```python\n# Filtering\nQuery.equal('field', 'value')             # == (or pass list for IN)\nQuery.not_equal('field', 'value')         # !=\nQuery.less_than('field', 100)             # \u003C\nQuery.less_than_equal('field', 100)       # \u003C=\nQuery.greater_than('field', 100)          # >\nQuery.greater_than_equal('field', 100)    # >=\nQuery.between('field', 1, 100)            # 1 \u003C= field \u003C= 100\nQuery.is_null('field')                    # is null\nQuery.is_not_null('field')                # is not null\nQuery.starts_with('field', 'prefix')      # starts with\nQuery.ends_with('field', 'suffix')        # ends with\nQuery.contains('field', 'sub')            # contains (string or array)\nQuery.search('field', 'keywords')         # full-text search (requires index)\n\n# Sorting\nQuery.order_asc('field')\nQuery.order_desc('field')\n\n# Pagination\nQuery.limit(25)                           # max rows (default 25, max 100)\nQuery.offset(0)                           # skip N rows\nQuery.cursor_after('[ROW_ID]')            # cursor pagination (preferred)\nQuery.cursor_before('[ROW_ID]')\n\n# Selection & Logic\nQuery.select(['field1', 'field2'])        # return only specified fields\nQuery.or_queries([Query.equal('a', 1), Query.equal('b', 2)])   # OR\nQuery.and_queries([Query.greater_than('age', 18), Query.less_than('age', 65)])  # AND (default)\n```\n\n### File Storage\n\n```python\nfrom appwrite.input_file import InputFile\n\nstorage = Storage(client)\n\n# Upload file\nfile = storage.create_file('[BUCKET_ID]', ID.unique(), InputFile.from_path('\u002Fpath\u002Fto\u002Ffile.png'))\n\n# List files\nfiles = storage.list_files('[BUCKET_ID]')\n\n# Delete file\nstorage.delete_file('[BUCKET_ID]', '[FILE_ID]')\n```\n\n#### InputFile Factory Methods\n\n```python\nfrom appwrite.input_file import InputFile\n\nInputFile.from_path('\u002Fpath\u002Fto\u002Ffile.png')             # from filesystem path\nInputFile.from_bytes(byte_data, 'file.png')          # from bytes\nInputFile.from_string('Hello world', 'hello.txt')    # from string content\n```\n\n### Teams\n\n```python\nfrom appwrite.services.teams import Teams\n\nteams = Teams(client)\n\n# Create team\nteam = teams.create(ID.unique(), 'Engineering')\n\n# List teams\nteam_list = teams.list()\n\n# Create membership (invite user by email)\nmembership = teams.create_membership('[TEAM_ID]', roles=['editor'], email='user@example.com')\n\n# List memberships\nmembers = teams.list_memberships('[TEAM_ID]')\n\n# Update membership roles\nteams.update_membership('[TEAM_ID]', '[MEMBERSHIP_ID]', roles=['admin'])\n\n# Delete team\nteams.delete('[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### Serverless Functions\n\n```python\nfunctions = Functions(client)\n\n# Execute function\nexecution = functions.create_execution('[FUNCTION_ID]', body='{\"key\": \"value\"}')\n\n# List executions\nexecutions = functions.list_executions('[FUNCTION_ID]')\n```\n\n#### Writing a Function Handler (Python runtime)\n\n```python\n# src\u002Fmain.py — Appwrite Function entry point\ndef main(context):\n    # context.req — request object\n    #   .body        — raw request body (string)\n    #   .body_json   — parsed JSON body (dict, or None if not JSON)\n    #   .headers     — request headers (dict)\n    #   .method      — HTTP method (GET, POST, etc.)\n    #   .path        — URL path\n    #   .query       — parsed query parameters (dict)\n    #   .query_string — raw query string\n\n    context.log('Processing: ' + context.req.method + ' ' + context.req.path)\n\n    if context.req.method == 'GET':\n        return context.res.json({'message': 'Hello from Appwrite Function!'})\n\n    data = context.req.body_json or {}\n    if 'name' not in data:\n        context.error('Missing name field')\n        return context.res.json({'error': 'Name is required'}, 400)\n\n    # Response methods\n    return context.res.json({'success': True})                    # JSON response\n    # return context.res.text('Hello')                           # plain text\n    # return context.res.empty()                                 # 204 No Content\n    # return context.res.redirect('https:\u002F\u002Fexample.com')         # 302 Redirect\n    # return context.res.send('data', 200, {'X-Custom': '1'})   # custom response\n```\n\n### Server-Side Rendering (SSR) Authentication\n\nSSR apps (Flask, Django, FastAPI, etc.) use the **server SDK** to handle auth. You need two clients:\n\n- **Admin client** — uses an API key, creates sessions, bypasses rate limits (reusable singleton)\n- **Session client** — uses a session cookie, acts on behalf of a user (create per-request, never share)\n\n```python\nfrom appwrite.client import Client\nfrom appwrite.services.account import Account\nfrom flask import request, jsonify, make_response, redirect\n\n# Admin client (reusable)\nadmin_client = (Client()\n    .set_endpoint('https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1')\n    .set_project('[PROJECT_ID]')\n    .set_key(os.environ['APPWRITE_API_KEY']))\n\n# Session client (create per-request)\nsession_client = (Client()\n    .set_endpoint('https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1')\n    .set_project('[PROJECT_ID]'))\n\nsession = request.cookies.get('a_session_[PROJECT_ID]')\nif session:\n    session_client.set_session(session)\n```\n\n#### Email\u002FPassword Login\n\n```python\n@app.post('\u002Flogin')\ndef login():\n    account = Account(admin_client)\n    session = account.create_email_password_session(\n        request.json['email'], request.json['password']\n    )\n\n    # Cookie name must be a_session_\u003CPROJECT_ID>\n    resp = make_response(jsonify({'success': True}))\n    resp.set_cookie('a_session_[PROJECT_ID]', session['secret'],\n                    httponly=True, secure=True, samesite='Strict',\n                    expires=session['expire'], path='\u002F')\n    return resp\n```\n\n#### Authenticated Requests\n\n```python\n@app.get('\u002Fuser')\ndef get_user():\n    session = request.cookies.get('a_session_[PROJECT_ID]')\n    if not session:\n        return jsonify({'error': 'Unauthorized'}), 401\n\n    session_client = (Client()\n        .set_endpoint('https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1')\n        .set_project('[PROJECT_ID]')\n        .set_session(session))\n\n    account = Account(session_client)\n    return jsonify(account.get())\n```\n\n#### OAuth2 SSR Flow\n\n```python\n# Step 1: Redirect to OAuth provider\n@app.get('\u002Foauth')\ndef oauth():\n    account = Account(admin_client)\n    redirect_url = account.create_o_auth2_token(\n        OAuthProvider.Github,\n        'https:\u002F\u002Fexample.com\u002Foauth\u002Fsuccess',\n        'https:\u002F\u002Fexample.com\u002Foauth\u002Ffailure',\n    )\n    return redirect(redirect_url)\n\n# Step 2: Handle callback — exchange token for session\n@app.get('\u002Foauth\u002Fsuccess')\ndef oauth_success():\n    account = Account(admin_client)\n    session = account.create_session(request.args['userId'], request.args['secret'])\n\n    resp = make_response(jsonify({'success': True}))\n    resp.set_cookie('a_session_[PROJECT_ID]', session['secret'],\n                    httponly=True, secure=True, samesite='Strict',\n                    expires=session['expire'], path='\u002F')\n    return resp\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 `session_client.set_forwarded_user_agent(request.headers.get('user-agent'))` to record the end-user's browser info for debugging and security.\n\n## Error Handling\n\n```python\nfrom appwrite.exception import AppwriteException\n\ntry:\n    row = tables_db.get_row('[DATABASE_ID]', '[TABLE_ID]', '[ROW_ID]')\nexcept AppwriteException as e:\n    print(e.message)    # human-readable error message\n    print(e.code)       # HTTP status code (int)\n    print(e.type)       # Appwrite error type string (e.g. 'document_not_found')\n    print(e.response)   # full response body (dict)\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 for this action |\n| `404` | Not found — resource does not exist |\n| `409` | Conflict — duplicate ID or unique constraint violation |\n| `429` | Rate limited — too many requests, retry after backoff |\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```python\nfrom appwrite.permission import Permission\nfrom appwrite.role import Role\n```\n\n### Database Row with Permissions\n\n```python\ndoc = tables_db.create_row('[DATABASE_ID]', '[TABLE_ID]', ID.unique(), {\n    'title': 'Hello World'\n}, [\n    Permission.read(Role.user('[USER_ID]')),     # specific user can read\n    Permission.update(Role.user('[USER_ID]')),   # specific user can update\n    Permission.read(Role.team('[TEAM_ID]')),     # all team members can read\n    Permission.read(Role.any()),                 # anyone (including guests) can read\n])\n```\n\n### File Upload with Permissions\n\n```python\nfile = storage.create_file('[BUCKET_ID]', ID.unique(), InputFile.from_path('\u002Fpath\u002Fto\u002Ffile.png'), [\n    Permission.read(Role.any()),\n    Permission.update(Role.user('[USER_ID]')),\n    Permission.delete(Role.user('[USER_ID]')),\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,92,98,240,246,253,360,366,423,641,648,668,807,854,957,963,1202,1208,1307,1313,1358,1364,1532,1560,1566,1627,1633,1852,1858,1870,1893,2037,2043,2153,2159,2268,2274,2447,2490,2511,2517,2595,2603,2710,2716,2781,2804,2810,2878,2884,2930,2943,3017],{"type":42,"tag":43,"props":44,"children":46},"element","h1",{"id":45},"appwrite-python-sdk",[47],{"type":48,"value":49},"text","Appwrite Python 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","pip install appwrite\n","bash","",[65],{"type":42,"tag":66,"props":67,"children":68},"code",{"__ignoreMap":63},[69],{"type":42,"tag":70,"props":71,"children":74},"span",{"class":72,"line":73},"line",1,[75,81,87],{"type":42,"tag":70,"props":76,"children":78},{"style":77},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[79],{"type":48,"value":80},"pip",{"type":42,"tag":70,"props":82,"children":84},{"style":83},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[85],{"type":48,"value":86}," install",{"type":42,"tag":70,"props":88,"children":89},{"style":83},[90],{"type":48,"value":91}," appwrite\n",{"type":42,"tag":51,"props":93,"children":95},{"id":94},"setting-up-the-client",[96],{"type":48,"value":97},"Setting Up the Client",{"type":42,"tag":58,"props":99,"children":102},{"className":100,"code":101,"language":22,"meta":63,"style":63},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from appwrite.client import Client\nfrom appwrite.id import ID\nfrom appwrite.query import Query\nfrom appwrite.services.users import Users\nfrom appwrite.services.tables_db import TablesDB\nfrom appwrite.services.storage import Storage\nfrom appwrite.services.functions import Functions\nfrom appwrite.enums.o_auth_provider import OAuthProvider\n\nimport os\n\nclient = (Client()\n    .set_endpoint('https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1')\n    .set_project(os.environ['APPWRITE_PROJECT_ID'])\n    .set_key(os.environ['APPWRITE_API_KEY']))\n",[103],{"type":42,"tag":66,"props":104,"children":105},{"__ignoreMap":63},[106,114,123,132,141,150,159,168,177,187,196,204,213,222,231],{"type":42,"tag":70,"props":107,"children":108},{"class":72,"line":73},[109],{"type":42,"tag":70,"props":110,"children":111},{},[112],{"type":48,"value":113},"from appwrite.client import Client\n",{"type":42,"tag":70,"props":115,"children":117},{"class":72,"line":116},2,[118],{"type":42,"tag":70,"props":119,"children":120},{},[121],{"type":48,"value":122},"from appwrite.id import ID\n",{"type":42,"tag":70,"props":124,"children":126},{"class":72,"line":125},3,[127],{"type":42,"tag":70,"props":128,"children":129},{},[130],{"type":48,"value":131},"from appwrite.query import Query\n",{"type":42,"tag":70,"props":133,"children":135},{"class":72,"line":134},4,[136],{"type":42,"tag":70,"props":137,"children":138},{},[139],{"type":48,"value":140},"from appwrite.services.users import Users\n",{"type":42,"tag":70,"props":142,"children":144},{"class":72,"line":143},5,[145],{"type":42,"tag":70,"props":146,"children":147},{},[148],{"type":48,"value":149},"from appwrite.services.tables_db import TablesDB\n",{"type":42,"tag":70,"props":151,"children":153},{"class":72,"line":152},6,[154],{"type":42,"tag":70,"props":155,"children":156},{},[157],{"type":48,"value":158},"from appwrite.services.storage import Storage\n",{"type":42,"tag":70,"props":160,"children":162},{"class":72,"line":161},7,[163],{"type":42,"tag":70,"props":164,"children":165},{},[166],{"type":48,"value":167},"from appwrite.services.functions import Functions\n",{"type":42,"tag":70,"props":169,"children":171},{"class":72,"line":170},8,[172],{"type":42,"tag":70,"props":173,"children":174},{},[175],{"type":48,"value":176},"from appwrite.enums.o_auth_provider import OAuthProvider\n",{"type":42,"tag":70,"props":178,"children":180},{"class":72,"line":179},9,[181],{"type":42,"tag":70,"props":182,"children":184},{"emptyLinePlaceholder":183},true,[185],{"type":48,"value":186},"\n",{"type":42,"tag":70,"props":188,"children":190},{"class":72,"line":189},10,[191],{"type":42,"tag":70,"props":192,"children":193},{},[194],{"type":48,"value":195},"import os\n",{"type":42,"tag":70,"props":197,"children":199},{"class":72,"line":198},11,[200],{"type":42,"tag":70,"props":201,"children":202},{"emptyLinePlaceholder":183},[203],{"type":48,"value":186},{"type":42,"tag":70,"props":205,"children":207},{"class":72,"line":206},12,[208],{"type":42,"tag":70,"props":209,"children":210},{},[211],{"type":48,"value":212},"client = (Client()\n",{"type":42,"tag":70,"props":214,"children":216},{"class":72,"line":215},13,[217],{"type":42,"tag":70,"props":218,"children":219},{},[220],{"type":48,"value":221},"    .set_endpoint('https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1')\n",{"type":42,"tag":70,"props":223,"children":225},{"class":72,"line":224},14,[226],{"type":42,"tag":70,"props":227,"children":228},{},[229],{"type":48,"value":230},"    .set_project(os.environ['APPWRITE_PROJECT_ID'])\n",{"type":42,"tag":70,"props":232,"children":234},{"class":72,"line":233},15,[235],{"type":42,"tag":70,"props":236,"children":237},{},[238],{"type":48,"value":239},"    .set_key(os.environ['APPWRITE_API_KEY']))\n",{"type":42,"tag":51,"props":241,"children":243},{"id":242},"code-examples",[244],{"type":48,"value":245},"Code Examples",{"type":42,"tag":247,"props":248,"children":250},"h3",{"id":249},"user-management",[251],{"type":48,"value":252},"User Management",{"type":42,"tag":58,"props":254,"children":256},{"className":100,"code":255,"language":22,"meta":63,"style":63},"users = Users(client)\n\n# Create user\nuser = users.create(ID.unique(), 'user@example.com', None, 'password123', 'User Name')\n\n# List users\nresult = users.list([Query.limit(25)])\n\n# Get user\nfetched = users.get('[USER_ID]')\n\n# Delete user\nusers.delete('[USER_ID]')\n",[257],{"type":42,"tag":66,"props":258,"children":259},{"__ignoreMap":63},[260,268,275,283,291,298,306,314,321,329,337,344,352],{"type":42,"tag":70,"props":261,"children":262},{"class":72,"line":73},[263],{"type":42,"tag":70,"props":264,"children":265},{},[266],{"type":48,"value":267},"users = Users(client)\n",{"type":42,"tag":70,"props":269,"children":270},{"class":72,"line":116},[271],{"type":42,"tag":70,"props":272,"children":273},{"emptyLinePlaceholder":183},[274],{"type":48,"value":186},{"type":42,"tag":70,"props":276,"children":277},{"class":72,"line":125},[278],{"type":42,"tag":70,"props":279,"children":280},{},[281],{"type":48,"value":282},"# Create user\n",{"type":42,"tag":70,"props":284,"children":285},{"class":72,"line":134},[286],{"type":42,"tag":70,"props":287,"children":288},{},[289],{"type":48,"value":290},"user = users.create(ID.unique(), 'user@example.com', None, 'password123', 'User Name')\n",{"type":42,"tag":70,"props":292,"children":293},{"class":72,"line":143},[294],{"type":42,"tag":70,"props":295,"children":296},{"emptyLinePlaceholder":183},[297],{"type":48,"value":186},{"type":42,"tag":70,"props":299,"children":300},{"class":72,"line":152},[301],{"type":42,"tag":70,"props":302,"children":303},{},[304],{"type":48,"value":305},"# List users\n",{"type":42,"tag":70,"props":307,"children":308},{"class":72,"line":161},[309],{"type":42,"tag":70,"props":310,"children":311},{},[312],{"type":48,"value":313},"result = users.list([Query.limit(25)])\n",{"type":42,"tag":70,"props":315,"children":316},{"class":72,"line":170},[317],{"type":42,"tag":70,"props":318,"children":319},{"emptyLinePlaceholder":183},[320],{"type":48,"value":186},{"type":42,"tag":70,"props":322,"children":323},{"class":72,"line":179},[324],{"type":42,"tag":70,"props":325,"children":326},{},[327],{"type":48,"value":328},"# Get user\n",{"type":42,"tag":70,"props":330,"children":331},{"class":72,"line":189},[332],{"type":42,"tag":70,"props":333,"children":334},{},[335],{"type":48,"value":336},"fetched = users.get('[USER_ID]')\n",{"type":42,"tag":70,"props":338,"children":339},{"class":72,"line":198},[340],{"type":42,"tag":70,"props":341,"children":342},{"emptyLinePlaceholder":183},[343],{"type":48,"value":186},{"type":42,"tag":70,"props":345,"children":346},{"class":72,"line":206},[347],{"type":42,"tag":70,"props":348,"children":349},{},[350],{"type":48,"value":351},"# Delete user\n",{"type":42,"tag":70,"props":353,"children":354},{"class":72,"line":215},[355],{"type":42,"tag":70,"props":356,"children":357},{},[358],{"type":48,"value":359},"users.delete('[USER_ID]')\n",{"type":42,"tag":247,"props":361,"children":363},{"id":362},"database-operations",[364],{"type":48,"value":365},"Database Operations",{"type":42,"tag":367,"props":368,"children":369},"blockquote",{},[370,405],{"type":42,"tag":371,"props":372,"children":373},"p",{},[374,380,382,388,390,396,398,403],{"type":42,"tag":375,"props":376,"children":377},"strong",{},[378],{"type":48,"value":379},"Note:",{"type":48,"value":381}," Use ",{"type":42,"tag":66,"props":383,"children":385},{"className":384},[],[386],{"type":48,"value":387},"TablesDB",{"type":48,"value":389}," (not the deprecated ",{"type":42,"tag":66,"props":391,"children":393},{"className":392},[],[394],{"type":48,"value":395},"Databases",{"type":48,"value":397}," class) for all new code. Only use ",{"type":42,"tag":66,"props":399,"children":401},{"className":400},[],[402],{"type":48,"value":395},{"type":48,"value":404}," if the existing codebase already relies on it or the user explicitly requests it.",{"type":42,"tag":371,"props":406,"children":407},{},[408,413,415,421],{"type":42,"tag":375,"props":409,"children":410},{},[411],{"type":48,"value":412},"Tip:",{"type":48,"value":414}," Prefer keyword arguments (e.g., ",{"type":42,"tag":66,"props":416,"children":418},{"className":417},[],[419],{"type":48,"value":420},"database_id='...'",{"type":48,"value":422},") over positional arguments for all SDK method calls. Only use positional style if the existing codebase already uses it or the user explicitly requests it.",{"type":42,"tag":58,"props":424,"children":426},{"className":100,"code":425,"language":22,"meta":63,"style":63},"tables_db = TablesDB(client)\n\n# Create database\ndb = tables_db.create(ID.unique(), 'My Database')\n\n# Create row\ndoc = tables_db.create_row('[DATABASE_ID]', '[TABLE_ID]', ID.unique(), {\n    'title': 'Hello World'\n})\n\n# Query rows\nresults = tables_db.list_rows('[DATABASE_ID]', '[TABLE_ID]', [\n    Query.equal('title', 'Hello World'),\n    Query.limit(10)\n])\n\n# Get row\nrow = tables_db.get_row('[DATABASE_ID]', '[TABLE_ID]', '[ROW_ID]')\n\n# Update row\ntables_db.update_row('[DATABASE_ID]', '[TABLE_ID]', '[ROW_ID]', {\n    'title': 'Updated'\n})\n\n# Delete row\ntables_db.delete_row('[DATABASE_ID]', '[TABLE_ID]', '[ROW_ID]')\n",[427],{"type":42,"tag":66,"props":428,"children":429},{"__ignoreMap":63},[430,438,445,453,461,468,476,484,492,500,507,515,523,531,539,547,555,564,573,581,590,599,608,615,623,632],{"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},"tables_db = TablesDB(client)\n",{"type":42,"tag":70,"props":439,"children":440},{"class":72,"line":116},[441],{"type":42,"tag":70,"props":442,"children":443},{"emptyLinePlaceholder":183},[444],{"type":48,"value":186},{"type":42,"tag":70,"props":446,"children":447},{"class":72,"line":125},[448],{"type":42,"tag":70,"props":449,"children":450},{},[451],{"type":48,"value":452},"# Create database\n",{"type":42,"tag":70,"props":454,"children":455},{"class":72,"line":134},[456],{"type":42,"tag":70,"props":457,"children":458},{},[459],{"type":48,"value":460},"db = tables_db.create(ID.unique(), 'My Database')\n",{"type":42,"tag":70,"props":462,"children":463},{"class":72,"line":143},[464],{"type":42,"tag":70,"props":465,"children":466},{"emptyLinePlaceholder":183},[467],{"type":48,"value":186},{"type":42,"tag":70,"props":469,"children":470},{"class":72,"line":152},[471],{"type":42,"tag":70,"props":472,"children":473},{},[474],{"type":48,"value":475},"# Create row\n",{"type":42,"tag":70,"props":477,"children":478},{"class":72,"line":161},[479],{"type":42,"tag":70,"props":480,"children":481},{},[482],{"type":48,"value":483},"doc = tables_db.create_row('[DATABASE_ID]', '[TABLE_ID]', ID.unique(), {\n",{"type":42,"tag":70,"props":485,"children":486},{"class":72,"line":170},[487],{"type":42,"tag":70,"props":488,"children":489},{},[490],{"type":48,"value":491},"    'title': 'Hello World'\n",{"type":42,"tag":70,"props":493,"children":494},{"class":72,"line":179},[495],{"type":42,"tag":70,"props":496,"children":497},{},[498],{"type":48,"value":499},"})\n",{"type":42,"tag":70,"props":501,"children":502},{"class":72,"line":189},[503],{"type":42,"tag":70,"props":504,"children":505},{"emptyLinePlaceholder":183},[506],{"type":48,"value":186},{"type":42,"tag":70,"props":508,"children":509},{"class":72,"line":198},[510],{"type":42,"tag":70,"props":511,"children":512},{},[513],{"type":48,"value":514},"# Query rows\n",{"type":42,"tag":70,"props":516,"children":517},{"class":72,"line":206},[518],{"type":42,"tag":70,"props":519,"children":520},{},[521],{"type":48,"value":522},"results = tables_db.list_rows('[DATABASE_ID]', '[TABLE_ID]', [\n",{"type":42,"tag":70,"props":524,"children":525},{"class":72,"line":215},[526],{"type":42,"tag":70,"props":527,"children":528},{},[529],{"type":48,"value":530},"    Query.equal('title', 'Hello World'),\n",{"type":42,"tag":70,"props":532,"children":533},{"class":72,"line":224},[534],{"type":42,"tag":70,"props":535,"children":536},{},[537],{"type":48,"value":538},"    Query.limit(10)\n",{"type":42,"tag":70,"props":540,"children":541},{"class":72,"line":233},[542],{"type":42,"tag":70,"props":543,"children":544},{},[545],{"type":48,"value":546},"])\n",{"type":42,"tag":70,"props":548,"children":550},{"class":72,"line":549},16,[551],{"type":42,"tag":70,"props":552,"children":553},{"emptyLinePlaceholder":183},[554],{"type":48,"value":186},{"type":42,"tag":70,"props":556,"children":558},{"class":72,"line":557},17,[559],{"type":42,"tag":70,"props":560,"children":561},{},[562],{"type":48,"value":563},"# Get row\n",{"type":42,"tag":70,"props":565,"children":567},{"class":72,"line":566},18,[568],{"type":42,"tag":70,"props":569,"children":570},{},[571],{"type":48,"value":572},"row = tables_db.get_row('[DATABASE_ID]', '[TABLE_ID]', '[ROW_ID]')\n",{"type":42,"tag":70,"props":574,"children":576},{"class":72,"line":575},19,[577],{"type":42,"tag":70,"props":578,"children":579},{"emptyLinePlaceholder":183},[580],{"type":48,"value":186},{"type":42,"tag":70,"props":582,"children":584},{"class":72,"line":583},20,[585],{"type":42,"tag":70,"props":586,"children":587},{},[588],{"type":48,"value":589},"# Update row\n",{"type":42,"tag":70,"props":591,"children":593},{"class":72,"line":592},21,[594],{"type":42,"tag":70,"props":595,"children":596},{},[597],{"type":48,"value":598},"tables_db.update_row('[DATABASE_ID]', '[TABLE_ID]', '[ROW_ID]', {\n",{"type":42,"tag":70,"props":600,"children":602},{"class":72,"line":601},22,[603],{"type":42,"tag":70,"props":604,"children":605},{},[606],{"type":48,"value":607},"    'title': 'Updated'\n",{"type":42,"tag":70,"props":609,"children":610},{"class":72,"line":26},[611],{"type":42,"tag":70,"props":612,"children":613},{},[614],{"type":48,"value":499},{"type":42,"tag":70,"props":616,"children":618},{"class":72,"line":617},24,[619],{"type":42,"tag":70,"props":620,"children":621},{"emptyLinePlaceholder":183},[622],{"type":48,"value":186},{"type":42,"tag":70,"props":624,"children":626},{"class":72,"line":625},25,[627],{"type":42,"tag":70,"props":628,"children":629},{},[630],{"type":48,"value":631},"# Delete row\n",{"type":42,"tag":70,"props":633,"children":635},{"class":72,"line":634},26,[636],{"type":42,"tag":70,"props":637,"children":638},{},[639],{"type":48,"value":640},"tables_db.delete_row('[DATABASE_ID]', '[TABLE_ID]', '[ROW_ID]')\n",{"type":42,"tag":642,"props":643,"children":645},"h4",{"id":644},"string-column-types",[646],{"type":48,"value":647},"String Column Types",{"type":42,"tag":367,"props":649,"children":650},{},[651],{"type":42,"tag":371,"props":652,"children":653},{},[654,658,660,666],{"type":42,"tag":375,"props":655,"children":656},{},[657],{"type":48,"value":379},{"type":48,"value":659}," The legacy ",{"type":42,"tag":66,"props":661,"children":663},{"className":662},[],[664],{"type":48,"value":665},"string",{"type":48,"value":667}," type is deprecated. Use explicit column types for all new columns.",{"type":42,"tag":669,"props":670,"children":671},"table",{},[672,700],{"type":42,"tag":673,"props":674,"children":675},"thead",{},[676],{"type":42,"tag":677,"props":678,"children":679},"tr",{},[680,686,691,696],{"type":42,"tag":681,"props":682,"children":683},"th",{},[684],{"type":48,"value":685},"Type",{"type":42,"tag":681,"props":687,"children":688},{},[689],{"type":48,"value":690},"Max characters",{"type":42,"tag":681,"props":692,"children":693},{},[694],{"type":48,"value":695},"Indexing",{"type":42,"tag":681,"props":697,"children":698},{},[699],{"type":48,"value":24},{"type":42,"tag":701,"props":702,"children":703},"tbody",{},[704,732,757,782],{"type":42,"tag":677,"props":705,"children":706},{},[707,717,722,727],{"type":42,"tag":708,"props":709,"children":710},"td",{},[711],{"type":42,"tag":66,"props":712,"children":714},{"className":713},[],[715],{"type":48,"value":716},"varchar",{"type":42,"tag":708,"props":718,"children":719},{},[720],{"type":48,"value":721},"16,383",{"type":42,"tag":708,"props":723,"children":724},{},[725],{"type":48,"value":726},"Full index (if size ≤ 768)",{"type":42,"tag":708,"props":728,"children":729},{},[730],{"type":48,"value":731},"Inline in row",{"type":42,"tag":677,"props":733,"children":734},{},[735,743,747,752],{"type":42,"tag":708,"props":736,"children":737},{},[738],{"type":42,"tag":66,"props":739,"children":741},{"className":740},[],[742],{"type":48,"value":48},{"type":42,"tag":708,"props":744,"children":745},{},[746],{"type":48,"value":721},{"type":42,"tag":708,"props":748,"children":749},{},[750],{"type":48,"value":751},"Prefix only",{"type":42,"tag":708,"props":753,"children":754},{},[755],{"type":48,"value":756},"Off-page",{"type":42,"tag":677,"props":758,"children":759},{},[760,769,774,778],{"type":42,"tag":708,"props":761,"children":762},{},[763],{"type":42,"tag":66,"props":764,"children":766},{"className":765},[],[767],{"type":48,"value":768},"mediumtext",{"type":42,"tag":708,"props":770,"children":771},{},[772],{"type":48,"value":773},"4,194,303",{"type":42,"tag":708,"props":775,"children":776},{},[777],{"type":48,"value":751},{"type":42,"tag":708,"props":779,"children":780},{},[781],{"type":48,"value":756},{"type":42,"tag":677,"props":783,"children":784},{},[785,794,799,803],{"type":42,"tag":708,"props":786,"children":787},{},[788],{"type":42,"tag":66,"props":789,"children":791},{"className":790},[],[792],{"type":48,"value":793},"longtext",{"type":42,"tag":708,"props":795,"children":796},{},[797],{"type":48,"value":798},"1,073,741,823",{"type":42,"tag":708,"props":800,"children":801},{},[802],{"type":48,"value":751},{"type":42,"tag":708,"props":804,"children":805},{},[806],{"type":48,"value":756},{"type":42,"tag":808,"props":809,"children":810},"ul",{},[811,822],{"type":42,"tag":812,"props":813,"children":814},"li",{},[815,820],{"type":42,"tag":66,"props":816,"children":818},{"className":817},[],[819],{"type":48,"value":716},{"type":48,"value":821}," 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":812,"props":823,"children":824},{},[825,830,832,837,839,844,846,852],{"type":42,"tag":66,"props":826,"children":828},{"className":827},[],[829],{"type":48,"value":48},{"type":48,"value":831},", ",{"type":42,"tag":66,"props":833,"children":835},{"className":834},[],[836],{"type":48,"value":768},{"type":48,"value":838},", and ",{"type":42,"tag":66,"props":840,"children":842},{"className":841},[],[843],{"type":48,"value":793},{"type":48,"value":845}," 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":847,"children":849},{"className":848},[],[850],{"type":48,"value":851},"size",{"type":48,"value":853}," is not required for these types.",{"type":42,"tag":58,"props":855,"children":857},{"className":100,"code":856,"language":22,"meta":63,"style":63},"# Create table with explicit string column types\ntables_db.create_table(\n    database_id='[DATABASE_ID]',\n    table_id=ID.unique(),\n    name='articles',\n    columns=[\n        {'key': 'title',    'type': 'varchar',    'size': 255, 'required': True},   # inline, fully indexable\n        {'key': 'summary',  'type': 'text',                    'required': False},  # off-page, prefix index only\n        {'key': 'body',     'type': 'mediumtext',              'required': False},  # up to ~4 M chars\n        {'key': 'raw_data', 'type': 'longtext',                'required': False},  # up to ~1 B chars\n    ]\n)\n",[858],{"type":42,"tag":66,"props":859,"children":860},{"__ignoreMap":63},[861,869,877,885,893,901,909,917,925,933,941,949],{"type":42,"tag":70,"props":862,"children":863},{"class":72,"line":73},[864],{"type":42,"tag":70,"props":865,"children":866},{},[867],{"type":48,"value":868},"# Create table with explicit string column types\n",{"type":42,"tag":70,"props":870,"children":871},{"class":72,"line":116},[872],{"type":42,"tag":70,"props":873,"children":874},{},[875],{"type":48,"value":876},"tables_db.create_table(\n",{"type":42,"tag":70,"props":878,"children":879},{"class":72,"line":125},[880],{"type":42,"tag":70,"props":881,"children":882},{},[883],{"type":48,"value":884},"    database_id='[DATABASE_ID]',\n",{"type":42,"tag":70,"props":886,"children":887},{"class":72,"line":134},[888],{"type":42,"tag":70,"props":889,"children":890},{},[891],{"type":48,"value":892},"    table_id=ID.unique(),\n",{"type":42,"tag":70,"props":894,"children":895},{"class":72,"line":143},[896],{"type":42,"tag":70,"props":897,"children":898},{},[899],{"type":48,"value":900},"    name='articles',\n",{"type":42,"tag":70,"props":902,"children":903},{"class":72,"line":152},[904],{"type":42,"tag":70,"props":905,"children":906},{},[907],{"type":48,"value":908},"    columns=[\n",{"type":42,"tag":70,"props":910,"children":911},{"class":72,"line":161},[912],{"type":42,"tag":70,"props":913,"children":914},{},[915],{"type":48,"value":916},"        {'key': 'title',    'type': 'varchar',    'size': 255, 'required': True},   # inline, fully indexable\n",{"type":42,"tag":70,"props":918,"children":919},{"class":72,"line":170},[920],{"type":42,"tag":70,"props":921,"children":922},{},[923],{"type":48,"value":924},"        {'key': 'summary',  'type': 'text',                    'required': False},  # off-page, prefix index only\n",{"type":42,"tag":70,"props":926,"children":927},{"class":72,"line":179},[928],{"type":42,"tag":70,"props":929,"children":930},{},[931],{"type":48,"value":932},"        {'key': 'body',     'type': 'mediumtext',              'required': False},  # up to ~4 M chars\n",{"type":42,"tag":70,"props":934,"children":935},{"class":72,"line":189},[936],{"type":42,"tag":70,"props":937,"children":938},{},[939],{"type":48,"value":940},"        {'key': 'raw_data', 'type': 'longtext',                'required': False},  # up to ~1 B chars\n",{"type":42,"tag":70,"props":942,"children":943},{"class":72,"line":198},[944],{"type":42,"tag":70,"props":945,"children":946},{},[947],{"type":48,"value":948},"    ]\n",{"type":42,"tag":70,"props":950,"children":951},{"class":72,"line":206},[952],{"type":42,"tag":70,"props":953,"children":954},{},[955],{"type":48,"value":956},")\n",{"type":42,"tag":247,"props":958,"children":960},{"id":959},"query-methods",[961],{"type":48,"value":962},"Query Methods",{"type":42,"tag":58,"props":964,"children":966},{"className":100,"code":965,"language":22,"meta":63,"style":63},"# Filtering\nQuery.equal('field', 'value')             # == (or pass list for IN)\nQuery.not_equal('field', 'value')         # !=\nQuery.less_than('field', 100)             # \u003C\nQuery.less_than_equal('field', 100)       # \u003C=\nQuery.greater_than('field', 100)          # >\nQuery.greater_than_equal('field', 100)    # >=\nQuery.between('field', 1, 100)            # 1 \u003C= field \u003C= 100\nQuery.is_null('field')                    # is null\nQuery.is_not_null('field')                # is not null\nQuery.starts_with('field', 'prefix')      # starts with\nQuery.ends_with('field', 'suffix')        # ends with\nQuery.contains('field', 'sub')            # contains (string or array)\nQuery.search('field', 'keywords')         # full-text search (requires index)\n\n# Sorting\nQuery.order_asc('field')\nQuery.order_desc('field')\n\n# Pagination\nQuery.limit(25)                           # max rows (default 25, max 100)\nQuery.offset(0)                           # skip N rows\nQuery.cursor_after('[ROW_ID]')            # cursor pagination (preferred)\nQuery.cursor_before('[ROW_ID]')\n\n# Selection & Logic\nQuery.select(['field1', 'field2'])        # return only specified fields\nQuery.or_queries([Query.equal('a', 1), Query.equal('b', 2)])   # OR\nQuery.and_queries([Query.greater_than('age', 18), Query.less_than('age', 65)])  # AND (default)\n",[967],{"type":42,"tag":66,"props":968,"children":969},{"__ignoreMap":63},[970,978,986,994,1002,1010,1018,1026,1034,1042,1050,1058,1066,1074,1082,1089,1097,1105,1113,1120,1128,1136,1144,1152,1160,1167,1175,1184,1193],{"type":42,"tag":70,"props":971,"children":972},{"class":72,"line":73},[973],{"type":42,"tag":70,"props":974,"children":975},{},[976],{"type":48,"value":977},"# Filtering\n",{"type":42,"tag":70,"props":979,"children":980},{"class":72,"line":116},[981],{"type":42,"tag":70,"props":982,"children":983},{},[984],{"type":48,"value":985},"Query.equal('field', 'value')             # == (or pass list for IN)\n",{"type":42,"tag":70,"props":987,"children":988},{"class":72,"line":125},[989],{"type":42,"tag":70,"props":990,"children":991},{},[992],{"type":48,"value":993},"Query.not_equal('field', 'value')         # !=\n",{"type":42,"tag":70,"props":995,"children":996},{"class":72,"line":134},[997],{"type":42,"tag":70,"props":998,"children":999},{},[1000],{"type":48,"value":1001},"Query.less_than('field', 100)             # \u003C\n",{"type":42,"tag":70,"props":1003,"children":1004},{"class":72,"line":143},[1005],{"type":42,"tag":70,"props":1006,"children":1007},{},[1008],{"type":48,"value":1009},"Query.less_than_equal('field', 100)       # \u003C=\n",{"type":42,"tag":70,"props":1011,"children":1012},{"class":72,"line":152},[1013],{"type":42,"tag":70,"props":1014,"children":1015},{},[1016],{"type":48,"value":1017},"Query.greater_than('field', 100)          # >\n",{"type":42,"tag":70,"props":1019,"children":1020},{"class":72,"line":161},[1021],{"type":42,"tag":70,"props":1022,"children":1023},{},[1024],{"type":48,"value":1025},"Query.greater_than_equal('field', 100)    # >=\n",{"type":42,"tag":70,"props":1027,"children":1028},{"class":72,"line":170},[1029],{"type":42,"tag":70,"props":1030,"children":1031},{},[1032],{"type":48,"value":1033},"Query.between('field', 1, 100)            # 1 \u003C= field \u003C= 100\n",{"type":42,"tag":70,"props":1035,"children":1036},{"class":72,"line":179},[1037],{"type":42,"tag":70,"props":1038,"children":1039},{},[1040],{"type":48,"value":1041},"Query.is_null('field')                    # is null\n",{"type":42,"tag":70,"props":1043,"children":1044},{"class":72,"line":189},[1045],{"type":42,"tag":70,"props":1046,"children":1047},{},[1048],{"type":48,"value":1049},"Query.is_not_null('field')                # is not null\n",{"type":42,"tag":70,"props":1051,"children":1052},{"class":72,"line":198},[1053],{"type":42,"tag":70,"props":1054,"children":1055},{},[1056],{"type":48,"value":1057},"Query.starts_with('field', 'prefix')      # starts with\n",{"type":42,"tag":70,"props":1059,"children":1060},{"class":72,"line":206},[1061],{"type":42,"tag":70,"props":1062,"children":1063},{},[1064],{"type":48,"value":1065},"Query.ends_with('field', 'suffix')        # ends with\n",{"type":42,"tag":70,"props":1067,"children":1068},{"class":72,"line":215},[1069],{"type":42,"tag":70,"props":1070,"children":1071},{},[1072],{"type":48,"value":1073},"Query.contains('field', 'sub')            # contains (string or array)\n",{"type":42,"tag":70,"props":1075,"children":1076},{"class":72,"line":224},[1077],{"type":42,"tag":70,"props":1078,"children":1079},{},[1080],{"type":48,"value":1081},"Query.search('field', 'keywords')         # full-text search (requires index)\n",{"type":42,"tag":70,"props":1083,"children":1084},{"class":72,"line":233},[1085],{"type":42,"tag":70,"props":1086,"children":1087},{"emptyLinePlaceholder":183},[1088],{"type":48,"value":186},{"type":42,"tag":70,"props":1090,"children":1091},{"class":72,"line":549},[1092],{"type":42,"tag":70,"props":1093,"children":1094},{},[1095],{"type":48,"value":1096},"# Sorting\n",{"type":42,"tag":70,"props":1098,"children":1099},{"class":72,"line":557},[1100],{"type":42,"tag":70,"props":1101,"children":1102},{},[1103],{"type":48,"value":1104},"Query.order_asc('field')\n",{"type":42,"tag":70,"props":1106,"children":1107},{"class":72,"line":566},[1108],{"type":42,"tag":70,"props":1109,"children":1110},{},[1111],{"type":48,"value":1112},"Query.order_desc('field')\n",{"type":42,"tag":70,"props":1114,"children":1115},{"class":72,"line":575},[1116],{"type":42,"tag":70,"props":1117,"children":1118},{"emptyLinePlaceholder":183},[1119],{"type":48,"value":186},{"type":42,"tag":70,"props":1121,"children":1122},{"class":72,"line":583},[1123],{"type":42,"tag":70,"props":1124,"children":1125},{},[1126],{"type":48,"value":1127},"# Pagination\n",{"type":42,"tag":70,"props":1129,"children":1130},{"class":72,"line":592},[1131],{"type":42,"tag":70,"props":1132,"children":1133},{},[1134],{"type":48,"value":1135},"Query.limit(25)                           # max rows (default 25, max 100)\n",{"type":42,"tag":70,"props":1137,"children":1138},{"class":72,"line":601},[1139],{"type":42,"tag":70,"props":1140,"children":1141},{},[1142],{"type":48,"value":1143},"Query.offset(0)                           # skip N rows\n",{"type":42,"tag":70,"props":1145,"children":1146},{"class":72,"line":26},[1147],{"type":42,"tag":70,"props":1148,"children":1149},{},[1150],{"type":48,"value":1151},"Query.cursor_after('[ROW_ID]')            # cursor pagination (preferred)\n",{"type":42,"tag":70,"props":1153,"children":1154},{"class":72,"line":617},[1155],{"type":42,"tag":70,"props":1156,"children":1157},{},[1158],{"type":48,"value":1159},"Query.cursor_before('[ROW_ID]')\n",{"type":42,"tag":70,"props":1161,"children":1162},{"class":72,"line":625},[1163],{"type":42,"tag":70,"props":1164,"children":1165},{"emptyLinePlaceholder":183},[1166],{"type":48,"value":186},{"type":42,"tag":70,"props":1168,"children":1169},{"class":72,"line":634},[1170],{"type":42,"tag":70,"props":1171,"children":1172},{},[1173],{"type":48,"value":1174},"# Selection & Logic\n",{"type":42,"tag":70,"props":1176,"children":1178},{"class":72,"line":1177},27,[1179],{"type":42,"tag":70,"props":1180,"children":1181},{},[1182],{"type":48,"value":1183},"Query.select(['field1', 'field2'])        # return only specified fields\n",{"type":42,"tag":70,"props":1185,"children":1187},{"class":72,"line":1186},28,[1188],{"type":42,"tag":70,"props":1189,"children":1190},{},[1191],{"type":48,"value":1192},"Query.or_queries([Query.equal('a', 1), Query.equal('b', 2)])   # OR\n",{"type":42,"tag":70,"props":1194,"children":1196},{"class":72,"line":1195},29,[1197],{"type":42,"tag":70,"props":1198,"children":1199},{},[1200],{"type":48,"value":1201},"Query.and_queries([Query.greater_than('age', 18), Query.less_than('age', 65)])  # AND (default)\n",{"type":42,"tag":247,"props":1203,"children":1205},{"id":1204},"file-storage",[1206],{"type":48,"value":1207},"File Storage",{"type":42,"tag":58,"props":1209,"children":1211},{"className":100,"code":1210,"language":22,"meta":63,"style":63},"from appwrite.input_file import InputFile\n\nstorage = Storage(client)\n\n# Upload file\nfile = storage.create_file('[BUCKET_ID]', ID.unique(), InputFile.from_path('\u002Fpath\u002Fto\u002Ffile.png'))\n\n# List files\nfiles = storage.list_files('[BUCKET_ID]')\n\n# Delete file\nstorage.delete_file('[BUCKET_ID]', '[FILE_ID]')\n",[1212],{"type":42,"tag":66,"props":1213,"children":1214},{"__ignoreMap":63},[1215,1223,1230,1238,1245,1253,1261,1268,1276,1284,1291,1299],{"type":42,"tag":70,"props":1216,"children":1217},{"class":72,"line":73},[1218],{"type":42,"tag":70,"props":1219,"children":1220},{},[1221],{"type":48,"value":1222},"from appwrite.input_file import InputFile\n",{"type":42,"tag":70,"props":1224,"children":1225},{"class":72,"line":116},[1226],{"type":42,"tag":70,"props":1227,"children":1228},{"emptyLinePlaceholder":183},[1229],{"type":48,"value":186},{"type":42,"tag":70,"props":1231,"children":1232},{"class":72,"line":125},[1233],{"type":42,"tag":70,"props":1234,"children":1235},{},[1236],{"type":48,"value":1237},"storage = Storage(client)\n",{"type":42,"tag":70,"props":1239,"children":1240},{"class":72,"line":134},[1241],{"type":42,"tag":70,"props":1242,"children":1243},{"emptyLinePlaceholder":183},[1244],{"type":48,"value":186},{"type":42,"tag":70,"props":1246,"children":1247},{"class":72,"line":143},[1248],{"type":42,"tag":70,"props":1249,"children":1250},{},[1251],{"type":48,"value":1252},"# Upload file\n",{"type":42,"tag":70,"props":1254,"children":1255},{"class":72,"line":152},[1256],{"type":42,"tag":70,"props":1257,"children":1258},{},[1259],{"type":48,"value":1260},"file = storage.create_file('[BUCKET_ID]', ID.unique(), InputFile.from_path('\u002Fpath\u002Fto\u002Ffile.png'))\n",{"type":42,"tag":70,"props":1262,"children":1263},{"class":72,"line":161},[1264],{"type":42,"tag":70,"props":1265,"children":1266},{"emptyLinePlaceholder":183},[1267],{"type":48,"value":186},{"type":42,"tag":70,"props":1269,"children":1270},{"class":72,"line":170},[1271],{"type":42,"tag":70,"props":1272,"children":1273},{},[1274],{"type":48,"value":1275},"# List files\n",{"type":42,"tag":70,"props":1277,"children":1278},{"class":72,"line":179},[1279],{"type":42,"tag":70,"props":1280,"children":1281},{},[1282],{"type":48,"value":1283},"files = storage.list_files('[BUCKET_ID]')\n",{"type":42,"tag":70,"props":1285,"children":1286},{"class":72,"line":189},[1287],{"type":42,"tag":70,"props":1288,"children":1289},{"emptyLinePlaceholder":183},[1290],{"type":48,"value":186},{"type":42,"tag":70,"props":1292,"children":1293},{"class":72,"line":198},[1294],{"type":42,"tag":70,"props":1295,"children":1296},{},[1297],{"type":48,"value":1298},"# Delete file\n",{"type":42,"tag":70,"props":1300,"children":1301},{"class":72,"line":206},[1302],{"type":42,"tag":70,"props":1303,"children":1304},{},[1305],{"type":48,"value":1306},"storage.delete_file('[BUCKET_ID]', '[FILE_ID]')\n",{"type":42,"tag":642,"props":1308,"children":1310},{"id":1309},"inputfile-factory-methods",[1311],{"type":48,"value":1312},"InputFile Factory Methods",{"type":42,"tag":58,"props":1314,"children":1316},{"className":100,"code":1315,"language":22,"meta":63,"style":63},"from appwrite.input_file import InputFile\n\nInputFile.from_path('\u002Fpath\u002Fto\u002Ffile.png')             # from filesystem path\nInputFile.from_bytes(byte_data, 'file.png')          # from bytes\nInputFile.from_string('Hello world', 'hello.txt')    # from string content\n",[1317],{"type":42,"tag":66,"props":1318,"children":1319},{"__ignoreMap":63},[1320,1327,1334,1342,1350],{"type":42,"tag":70,"props":1321,"children":1322},{"class":72,"line":73},[1323],{"type":42,"tag":70,"props":1324,"children":1325},{},[1326],{"type":48,"value":1222},{"type":42,"tag":70,"props":1328,"children":1329},{"class":72,"line":116},[1330],{"type":42,"tag":70,"props":1331,"children":1332},{"emptyLinePlaceholder":183},[1333],{"type":48,"value":186},{"type":42,"tag":70,"props":1335,"children":1336},{"class":72,"line":125},[1337],{"type":42,"tag":70,"props":1338,"children":1339},{},[1340],{"type":48,"value":1341},"InputFile.from_path('\u002Fpath\u002Fto\u002Ffile.png')             # from filesystem path\n",{"type":42,"tag":70,"props":1343,"children":1344},{"class":72,"line":134},[1345],{"type":42,"tag":70,"props":1346,"children":1347},{},[1348],{"type":48,"value":1349},"InputFile.from_bytes(byte_data, 'file.png')          # from bytes\n",{"type":42,"tag":70,"props":1351,"children":1352},{"class":72,"line":143},[1353],{"type":42,"tag":70,"props":1354,"children":1355},{},[1356],{"type":48,"value":1357},"InputFile.from_string('Hello world', 'hello.txt')    # from string content\n",{"type":42,"tag":247,"props":1359,"children":1361},{"id":1360},"teams",[1362],{"type":48,"value":1363},"Teams",{"type":42,"tag":58,"props":1365,"children":1367},{"className":100,"code":1366,"language":22,"meta":63,"style":63},"from appwrite.services.teams import Teams\n\nteams = Teams(client)\n\n# Create team\nteam = teams.create(ID.unique(), 'Engineering')\n\n# List teams\nteam_list = teams.list()\n\n# Create membership (invite user by email)\nmembership = teams.create_membership('[TEAM_ID]', roles=['editor'], email='user@example.com')\n\n# List memberships\nmembers = teams.list_memberships('[TEAM_ID]')\n\n# Update membership roles\nteams.update_membership('[TEAM_ID]', '[MEMBERSHIP_ID]', roles=['admin'])\n\n# Delete team\nteams.delete('[TEAM_ID]')\n",[1368],{"type":42,"tag":66,"props":1369,"children":1370},{"__ignoreMap":63},[1371,1379,1386,1394,1401,1409,1417,1424,1432,1440,1447,1455,1463,1470,1478,1486,1493,1501,1509,1516,1524],{"type":42,"tag":70,"props":1372,"children":1373},{"class":72,"line":73},[1374],{"type":42,"tag":70,"props":1375,"children":1376},{},[1377],{"type":48,"value":1378},"from appwrite.services.teams import Teams\n",{"type":42,"tag":70,"props":1380,"children":1381},{"class":72,"line":116},[1382],{"type":42,"tag":70,"props":1383,"children":1384},{"emptyLinePlaceholder":183},[1385],{"type":48,"value":186},{"type":42,"tag":70,"props":1387,"children":1388},{"class":72,"line":125},[1389],{"type":42,"tag":70,"props":1390,"children":1391},{},[1392],{"type":48,"value":1393},"teams = Teams(client)\n",{"type":42,"tag":70,"props":1395,"children":1396},{"class":72,"line":134},[1397],{"type":42,"tag":70,"props":1398,"children":1399},{"emptyLinePlaceholder":183},[1400],{"type":48,"value":186},{"type":42,"tag":70,"props":1402,"children":1403},{"class":72,"line":143},[1404],{"type":42,"tag":70,"props":1405,"children":1406},{},[1407],{"type":48,"value":1408},"# Create team\n",{"type":42,"tag":70,"props":1410,"children":1411},{"class":72,"line":152},[1412],{"type":42,"tag":70,"props":1413,"children":1414},{},[1415],{"type":48,"value":1416},"team = teams.create(ID.unique(), 'Engineering')\n",{"type":42,"tag":70,"props":1418,"children":1419},{"class":72,"line":161},[1420],{"type":42,"tag":70,"props":1421,"children":1422},{"emptyLinePlaceholder":183},[1423],{"type":48,"value":186},{"type":42,"tag":70,"props":1425,"children":1426},{"class":72,"line":170},[1427],{"type":42,"tag":70,"props":1428,"children":1429},{},[1430],{"type":48,"value":1431},"# List teams\n",{"type":42,"tag":70,"props":1433,"children":1434},{"class":72,"line":179},[1435],{"type":42,"tag":70,"props":1436,"children":1437},{},[1438],{"type":48,"value":1439},"team_list = teams.list()\n",{"type":42,"tag":70,"props":1441,"children":1442},{"class":72,"line":189},[1443],{"type":42,"tag":70,"props":1444,"children":1445},{"emptyLinePlaceholder":183},[1446],{"type":48,"value":186},{"type":42,"tag":70,"props":1448,"children":1449},{"class":72,"line":198},[1450],{"type":42,"tag":70,"props":1451,"children":1452},{},[1453],{"type":48,"value":1454},"# Create membership (invite user by email)\n",{"type":42,"tag":70,"props":1456,"children":1457},{"class":72,"line":206},[1458],{"type":42,"tag":70,"props":1459,"children":1460},{},[1461],{"type":48,"value":1462},"membership = teams.create_membership('[TEAM_ID]', roles=['editor'], email='user@example.com')\n",{"type":42,"tag":70,"props":1464,"children":1465},{"class":72,"line":215},[1466],{"type":42,"tag":70,"props":1467,"children":1468},{"emptyLinePlaceholder":183},[1469],{"type":48,"value":186},{"type":42,"tag":70,"props":1471,"children":1472},{"class":72,"line":224},[1473],{"type":42,"tag":70,"props":1474,"children":1475},{},[1476],{"type":48,"value":1477},"# List memberships\n",{"type":42,"tag":70,"props":1479,"children":1480},{"class":72,"line":233},[1481],{"type":42,"tag":70,"props":1482,"children":1483},{},[1484],{"type":48,"value":1485},"members = teams.list_memberships('[TEAM_ID]')\n",{"type":42,"tag":70,"props":1487,"children":1488},{"class":72,"line":549},[1489],{"type":42,"tag":70,"props":1490,"children":1491},{"emptyLinePlaceholder":183},[1492],{"type":48,"value":186},{"type":42,"tag":70,"props":1494,"children":1495},{"class":72,"line":557},[1496],{"type":42,"tag":70,"props":1497,"children":1498},{},[1499],{"type":48,"value":1500},"# Update membership roles\n",{"type":42,"tag":70,"props":1502,"children":1503},{"class":72,"line":566},[1504],{"type":42,"tag":70,"props":1505,"children":1506},{},[1507],{"type":48,"value":1508},"teams.update_membership('[TEAM_ID]', '[MEMBERSHIP_ID]', roles=['admin'])\n",{"type":42,"tag":70,"props":1510,"children":1511},{"class":72,"line":575},[1512],{"type":42,"tag":70,"props":1513,"children":1514},{"emptyLinePlaceholder":183},[1515],{"type":48,"value":186},{"type":42,"tag":70,"props":1517,"children":1518},{"class":72,"line":583},[1519],{"type":42,"tag":70,"props":1520,"children":1521},{},[1522],{"type":48,"value":1523},"# Delete team\n",{"type":42,"tag":70,"props":1525,"children":1526},{"class":72,"line":592},[1527],{"type":42,"tag":70,"props":1528,"children":1529},{},[1530],{"type":48,"value":1531},"teams.delete('[TEAM_ID]')\n",{"type":42,"tag":367,"props":1533,"children":1534},{},[1535],{"type":42,"tag":371,"props":1536,"children":1537},{},[1538,1543,1544,1550,1552,1558],{"type":42,"tag":375,"props":1539,"children":1540},{},[1541],{"type":48,"value":1542},"Role-based access:",{"type":48,"value":381},{"type":42,"tag":66,"props":1545,"children":1547},{"className":1546},[],[1548],{"type":48,"value":1549},"Role.team('[TEAM_ID]')",{"type":48,"value":1551}," for all team members or ",{"type":42,"tag":66,"props":1553,"children":1555},{"className":1554},[],[1556],{"type":48,"value":1557},"Role.team('[TEAM_ID]', 'editor')",{"type":48,"value":1559}," for a specific team role when setting permissions.",{"type":42,"tag":247,"props":1561,"children":1563},{"id":1562},"serverless-functions",[1564],{"type":48,"value":1565},"Serverless Functions",{"type":42,"tag":58,"props":1567,"children":1569},{"className":100,"code":1568,"language":22,"meta":63,"style":63},"functions = Functions(client)\n\n# Execute function\nexecution = functions.create_execution('[FUNCTION_ID]', body='{\"key\": \"value\"}')\n\n# List executions\nexecutions = functions.list_executions('[FUNCTION_ID]')\n",[1570],{"type":42,"tag":66,"props":1571,"children":1572},{"__ignoreMap":63},[1573,1581,1588,1596,1604,1611,1619],{"type":42,"tag":70,"props":1574,"children":1575},{"class":72,"line":73},[1576],{"type":42,"tag":70,"props":1577,"children":1578},{},[1579],{"type":48,"value":1580},"functions = Functions(client)\n",{"type":42,"tag":70,"props":1582,"children":1583},{"class":72,"line":116},[1584],{"type":42,"tag":70,"props":1585,"children":1586},{"emptyLinePlaceholder":183},[1587],{"type":48,"value":186},{"type":42,"tag":70,"props":1589,"children":1590},{"class":72,"line":125},[1591],{"type":42,"tag":70,"props":1592,"children":1593},{},[1594],{"type":48,"value":1595},"# Execute function\n",{"type":42,"tag":70,"props":1597,"children":1598},{"class":72,"line":134},[1599],{"type":42,"tag":70,"props":1600,"children":1601},{},[1602],{"type":48,"value":1603},"execution = functions.create_execution('[FUNCTION_ID]', body='{\"key\": \"value\"}')\n",{"type":42,"tag":70,"props":1605,"children":1606},{"class":72,"line":143},[1607],{"type":42,"tag":70,"props":1608,"children":1609},{"emptyLinePlaceholder":183},[1610],{"type":48,"value":186},{"type":42,"tag":70,"props":1612,"children":1613},{"class":72,"line":152},[1614],{"type":42,"tag":70,"props":1615,"children":1616},{},[1617],{"type":48,"value":1618},"# List executions\n",{"type":42,"tag":70,"props":1620,"children":1621},{"class":72,"line":161},[1622],{"type":42,"tag":70,"props":1623,"children":1624},{},[1625],{"type":48,"value":1626},"executions = functions.list_executions('[FUNCTION_ID]')\n",{"type":42,"tag":642,"props":1628,"children":1630},{"id":1629},"writing-a-function-handler-python-runtime",[1631],{"type":48,"value":1632},"Writing a Function Handler (Python runtime)",{"type":42,"tag":58,"props":1634,"children":1636},{"className":100,"code":1635,"language":22,"meta":63,"style":63},"# src\u002Fmain.py — Appwrite Function entry point\ndef main(context):\n    # context.req — request object\n    #   .body        — raw request body (string)\n    #   .body_json   — parsed JSON body (dict, or None if not JSON)\n    #   .headers     — request headers (dict)\n    #   .method      — HTTP method (GET, POST, etc.)\n    #   .path        — URL path\n    #   .query       — parsed query parameters (dict)\n    #   .query_string — raw query string\n\n    context.log('Processing: ' + context.req.method + ' ' + context.req.path)\n\n    if context.req.method == 'GET':\n        return context.res.json({'message': 'Hello from Appwrite Function!'})\n\n    data = context.req.body_json or {}\n    if 'name' not in data:\n        context.error('Missing name field')\n        return context.res.json({'error': 'Name is required'}, 400)\n\n    # Response methods\n    return context.res.json({'success': True})                    # JSON response\n    # return context.res.text('Hello')                           # plain text\n    # return context.res.empty()                                 # 204 No Content\n    # return context.res.redirect('https:\u002F\u002Fexample.com')         # 302 Redirect\n    # return context.res.send('data', 200, {'X-Custom': '1'})   # custom response\n",[1637],{"type":42,"tag":66,"props":1638,"children":1639},{"__ignoreMap":63},[1640,1648,1656,1664,1672,1680,1688,1696,1704,1712,1720,1727,1735,1742,1750,1758,1765,1773,1781,1789,1797,1804,1812,1820,1828,1836,1844],{"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},"# src\u002Fmain.py — Appwrite Function entry point\n",{"type":42,"tag":70,"props":1649,"children":1650},{"class":72,"line":116},[1651],{"type":42,"tag":70,"props":1652,"children":1653},{},[1654],{"type":48,"value":1655},"def main(context):\n",{"type":42,"tag":70,"props":1657,"children":1658},{"class":72,"line":125},[1659],{"type":42,"tag":70,"props":1660,"children":1661},{},[1662],{"type":48,"value":1663},"    # context.req — request object\n",{"type":42,"tag":70,"props":1665,"children":1666},{"class":72,"line":134},[1667],{"type":42,"tag":70,"props":1668,"children":1669},{},[1670],{"type":48,"value":1671},"    #   .body        — raw request body (string)\n",{"type":42,"tag":70,"props":1673,"children":1674},{"class":72,"line":143},[1675],{"type":42,"tag":70,"props":1676,"children":1677},{},[1678],{"type":48,"value":1679},"    #   .body_json   — parsed JSON body (dict, or None if not JSON)\n",{"type":42,"tag":70,"props":1681,"children":1682},{"class":72,"line":152},[1683],{"type":42,"tag":70,"props":1684,"children":1685},{},[1686],{"type":48,"value":1687},"    #   .headers     — request headers (dict)\n",{"type":42,"tag":70,"props":1689,"children":1690},{"class":72,"line":161},[1691],{"type":42,"tag":70,"props":1692,"children":1693},{},[1694],{"type":48,"value":1695},"    #   .method      — HTTP method (GET, POST, etc.)\n",{"type":42,"tag":70,"props":1697,"children":1698},{"class":72,"line":170},[1699],{"type":42,"tag":70,"props":1700,"children":1701},{},[1702],{"type":48,"value":1703},"    #   .path        — URL path\n",{"type":42,"tag":70,"props":1705,"children":1706},{"class":72,"line":179},[1707],{"type":42,"tag":70,"props":1708,"children":1709},{},[1710],{"type":48,"value":1711},"    #   .query       — parsed query parameters (dict)\n",{"type":42,"tag":70,"props":1713,"children":1714},{"class":72,"line":189},[1715],{"type":42,"tag":70,"props":1716,"children":1717},{},[1718],{"type":48,"value":1719},"    #   .query_string — raw query string\n",{"type":42,"tag":70,"props":1721,"children":1722},{"class":72,"line":198},[1723],{"type":42,"tag":70,"props":1724,"children":1725},{"emptyLinePlaceholder":183},[1726],{"type":48,"value":186},{"type":42,"tag":70,"props":1728,"children":1729},{"class":72,"line":206},[1730],{"type":42,"tag":70,"props":1731,"children":1732},{},[1733],{"type":48,"value":1734},"    context.log('Processing: ' + context.req.method + ' ' + context.req.path)\n",{"type":42,"tag":70,"props":1736,"children":1737},{"class":72,"line":215},[1738],{"type":42,"tag":70,"props":1739,"children":1740},{"emptyLinePlaceholder":183},[1741],{"type":48,"value":186},{"type":42,"tag":70,"props":1743,"children":1744},{"class":72,"line":224},[1745],{"type":42,"tag":70,"props":1746,"children":1747},{},[1748],{"type":48,"value":1749},"    if context.req.method == 'GET':\n",{"type":42,"tag":70,"props":1751,"children":1752},{"class":72,"line":233},[1753],{"type":42,"tag":70,"props":1754,"children":1755},{},[1756],{"type":48,"value":1757},"        return context.res.json({'message': 'Hello from Appwrite Function!'})\n",{"type":42,"tag":70,"props":1759,"children":1760},{"class":72,"line":549},[1761],{"type":42,"tag":70,"props":1762,"children":1763},{"emptyLinePlaceholder":183},[1764],{"type":48,"value":186},{"type":42,"tag":70,"props":1766,"children":1767},{"class":72,"line":557},[1768],{"type":42,"tag":70,"props":1769,"children":1770},{},[1771],{"type":48,"value":1772},"    data = context.req.body_json or {}\n",{"type":42,"tag":70,"props":1774,"children":1775},{"class":72,"line":566},[1776],{"type":42,"tag":70,"props":1777,"children":1778},{},[1779],{"type":48,"value":1780},"    if 'name' not in data:\n",{"type":42,"tag":70,"props":1782,"children":1783},{"class":72,"line":575},[1784],{"type":42,"tag":70,"props":1785,"children":1786},{},[1787],{"type":48,"value":1788},"        context.error('Missing name field')\n",{"type":42,"tag":70,"props":1790,"children":1791},{"class":72,"line":583},[1792],{"type":42,"tag":70,"props":1793,"children":1794},{},[1795],{"type":48,"value":1796},"        return context.res.json({'error': 'Name is required'}, 400)\n",{"type":42,"tag":70,"props":1798,"children":1799},{"class":72,"line":592},[1800],{"type":42,"tag":70,"props":1801,"children":1802},{"emptyLinePlaceholder":183},[1803],{"type":48,"value":186},{"type":42,"tag":70,"props":1805,"children":1806},{"class":72,"line":601},[1807],{"type":42,"tag":70,"props":1808,"children":1809},{},[1810],{"type":48,"value":1811},"    # Response methods\n",{"type":42,"tag":70,"props":1813,"children":1814},{"class":72,"line":26},[1815],{"type":42,"tag":70,"props":1816,"children":1817},{},[1818],{"type":48,"value":1819},"    return context.res.json({'success': True})                    # JSON response\n",{"type":42,"tag":70,"props":1821,"children":1822},{"class":72,"line":617},[1823],{"type":42,"tag":70,"props":1824,"children":1825},{},[1826],{"type":48,"value":1827},"    # return context.res.text('Hello')                           # plain text\n",{"type":42,"tag":70,"props":1829,"children":1830},{"class":72,"line":625},[1831],{"type":42,"tag":70,"props":1832,"children":1833},{},[1834],{"type":48,"value":1835},"    # return context.res.empty()                                 # 204 No Content\n",{"type":42,"tag":70,"props":1837,"children":1838},{"class":72,"line":634},[1839],{"type":42,"tag":70,"props":1840,"children":1841},{},[1842],{"type":48,"value":1843},"    # return context.res.redirect('https:\u002F\u002Fexample.com')         # 302 Redirect\n",{"type":42,"tag":70,"props":1845,"children":1846},{"class":72,"line":1177},[1847],{"type":42,"tag":70,"props":1848,"children":1849},{},[1850],{"type":48,"value":1851},"    # return context.res.send('data', 200, {'X-Custom': '1'})   # custom response\n",{"type":42,"tag":247,"props":1853,"children":1855},{"id":1854},"server-side-rendering-ssr-authentication",[1856],{"type":48,"value":1857},"Server-Side Rendering (SSR) Authentication",{"type":42,"tag":371,"props":1859,"children":1860},{},[1861,1863,1868],{"type":48,"value":1862},"SSR apps (Flask, Django, FastAPI, etc.) use the ",{"type":42,"tag":375,"props":1864,"children":1865},{},[1866],{"type":48,"value":1867},"server SDK",{"type":48,"value":1869}," to handle auth. You need two clients:",{"type":42,"tag":808,"props":1871,"children":1872},{},[1873,1883],{"type":42,"tag":812,"props":1874,"children":1875},{},[1876,1881],{"type":42,"tag":375,"props":1877,"children":1878},{},[1879],{"type":48,"value":1880},"Admin client",{"type":48,"value":1882}," — uses an API key, creates sessions, bypasses rate limits (reusable singleton)",{"type":42,"tag":812,"props":1884,"children":1885},{},[1886,1891],{"type":42,"tag":375,"props":1887,"children":1888},{},[1889],{"type":48,"value":1890},"Session client",{"type":48,"value":1892}," — uses a session cookie, acts on behalf of a user (create per-request, never share)",{"type":42,"tag":58,"props":1894,"children":1896},{"className":100,"code":1895,"language":22,"meta":63,"style":63},"from appwrite.client import Client\nfrom appwrite.services.account import Account\nfrom flask import request, jsonify, make_response, redirect\n\n# Admin client (reusable)\nadmin_client = (Client()\n    .set_endpoint('https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1')\n    .set_project('[PROJECT_ID]')\n    .set_key(os.environ['APPWRITE_API_KEY']))\n\n# Session client (create per-request)\nsession_client = (Client()\n    .set_endpoint('https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1')\n    .set_project('[PROJECT_ID]'))\n\nsession = request.cookies.get('a_session_[PROJECT_ID]')\nif session:\n    session_client.set_session(session)\n",[1897],{"type":42,"tag":66,"props":1898,"children":1899},{"__ignoreMap":63},[1900,1907,1915,1923,1930,1938,1946,1953,1961,1968,1975,1983,1991,1998,2006,2013,2021,2029],{"type":42,"tag":70,"props":1901,"children":1902},{"class":72,"line":73},[1903],{"type":42,"tag":70,"props":1904,"children":1905},{},[1906],{"type":48,"value":113},{"type":42,"tag":70,"props":1908,"children":1909},{"class":72,"line":116},[1910],{"type":42,"tag":70,"props":1911,"children":1912},{},[1913],{"type":48,"value":1914},"from appwrite.services.account import Account\n",{"type":42,"tag":70,"props":1916,"children":1917},{"class":72,"line":125},[1918],{"type":42,"tag":70,"props":1919,"children":1920},{},[1921],{"type":48,"value":1922},"from flask import request, jsonify, make_response, redirect\n",{"type":42,"tag":70,"props":1924,"children":1925},{"class":72,"line":134},[1926],{"type":42,"tag":70,"props":1927,"children":1928},{"emptyLinePlaceholder":183},[1929],{"type":48,"value":186},{"type":42,"tag":70,"props":1931,"children":1932},{"class":72,"line":143},[1933],{"type":42,"tag":70,"props":1934,"children":1935},{},[1936],{"type":48,"value":1937},"# Admin client (reusable)\n",{"type":42,"tag":70,"props":1939,"children":1940},{"class":72,"line":152},[1941],{"type":42,"tag":70,"props":1942,"children":1943},{},[1944],{"type":48,"value":1945},"admin_client = (Client()\n",{"type":42,"tag":70,"props":1947,"children":1948},{"class":72,"line":161},[1949],{"type":42,"tag":70,"props":1950,"children":1951},{},[1952],{"type":48,"value":221},{"type":42,"tag":70,"props":1954,"children":1955},{"class":72,"line":170},[1956],{"type":42,"tag":70,"props":1957,"children":1958},{},[1959],{"type":48,"value":1960},"    .set_project('[PROJECT_ID]')\n",{"type":42,"tag":70,"props":1962,"children":1963},{"class":72,"line":179},[1964],{"type":42,"tag":70,"props":1965,"children":1966},{},[1967],{"type":48,"value":239},{"type":42,"tag":70,"props":1969,"children":1970},{"class":72,"line":189},[1971],{"type":42,"tag":70,"props":1972,"children":1973},{"emptyLinePlaceholder":183},[1974],{"type":48,"value":186},{"type":42,"tag":70,"props":1976,"children":1977},{"class":72,"line":198},[1978],{"type":42,"tag":70,"props":1979,"children":1980},{},[1981],{"type":48,"value":1982},"# Session client (create per-request)\n",{"type":42,"tag":70,"props":1984,"children":1985},{"class":72,"line":206},[1986],{"type":42,"tag":70,"props":1987,"children":1988},{},[1989],{"type":48,"value":1990},"session_client = (Client()\n",{"type":42,"tag":70,"props":1992,"children":1993},{"class":72,"line":215},[1994],{"type":42,"tag":70,"props":1995,"children":1996},{},[1997],{"type":48,"value":221},{"type":42,"tag":70,"props":1999,"children":2000},{"class":72,"line":224},[2001],{"type":42,"tag":70,"props":2002,"children":2003},{},[2004],{"type":48,"value":2005},"    .set_project('[PROJECT_ID]'))\n",{"type":42,"tag":70,"props":2007,"children":2008},{"class":72,"line":233},[2009],{"type":42,"tag":70,"props":2010,"children":2011},{"emptyLinePlaceholder":183},[2012],{"type":48,"value":186},{"type":42,"tag":70,"props":2014,"children":2015},{"class":72,"line":549},[2016],{"type":42,"tag":70,"props":2017,"children":2018},{},[2019],{"type":48,"value":2020},"session = request.cookies.get('a_session_[PROJECT_ID]')\n",{"type":42,"tag":70,"props":2022,"children":2023},{"class":72,"line":557},[2024],{"type":42,"tag":70,"props":2025,"children":2026},{},[2027],{"type":48,"value":2028},"if session:\n",{"type":42,"tag":70,"props":2030,"children":2031},{"class":72,"line":566},[2032],{"type":42,"tag":70,"props":2033,"children":2034},{},[2035],{"type":48,"value":2036},"    session_client.set_session(session)\n",{"type":42,"tag":642,"props":2038,"children":2040},{"id":2039},"emailpassword-login",[2041],{"type":48,"value":2042},"Email\u002FPassword Login",{"type":42,"tag":58,"props":2044,"children":2046},{"className":100,"code":2045,"language":22,"meta":63,"style":63},"@app.post('\u002Flogin')\ndef login():\n    account = Account(admin_client)\n    session = account.create_email_password_session(\n        request.json['email'], request.json['password']\n    )\n\n    # Cookie name must be a_session_\u003CPROJECT_ID>\n    resp = make_response(jsonify({'success': True}))\n    resp.set_cookie('a_session_[PROJECT_ID]', session['secret'],\n                    httponly=True, secure=True, samesite='Strict',\n                    expires=session['expire'], path='\u002F')\n    return resp\n",[2047],{"type":42,"tag":66,"props":2048,"children":2049},{"__ignoreMap":63},[2050,2058,2066,2074,2082,2090,2098,2105,2113,2121,2129,2137,2145],{"type":42,"tag":70,"props":2051,"children":2052},{"class":72,"line":73},[2053],{"type":42,"tag":70,"props":2054,"children":2055},{},[2056],{"type":48,"value":2057},"@app.post('\u002Flogin')\n",{"type":42,"tag":70,"props":2059,"children":2060},{"class":72,"line":116},[2061],{"type":42,"tag":70,"props":2062,"children":2063},{},[2064],{"type":48,"value":2065},"def login():\n",{"type":42,"tag":70,"props":2067,"children":2068},{"class":72,"line":125},[2069],{"type":42,"tag":70,"props":2070,"children":2071},{},[2072],{"type":48,"value":2073},"    account = Account(admin_client)\n",{"type":42,"tag":70,"props":2075,"children":2076},{"class":72,"line":134},[2077],{"type":42,"tag":70,"props":2078,"children":2079},{},[2080],{"type":48,"value":2081},"    session = account.create_email_password_session(\n",{"type":42,"tag":70,"props":2083,"children":2084},{"class":72,"line":143},[2085],{"type":42,"tag":70,"props":2086,"children":2087},{},[2088],{"type":48,"value":2089},"        request.json['email'], request.json['password']\n",{"type":42,"tag":70,"props":2091,"children":2092},{"class":72,"line":152},[2093],{"type":42,"tag":70,"props":2094,"children":2095},{},[2096],{"type":48,"value":2097},"    )\n",{"type":42,"tag":70,"props":2099,"children":2100},{"class":72,"line":161},[2101],{"type":42,"tag":70,"props":2102,"children":2103},{"emptyLinePlaceholder":183},[2104],{"type":48,"value":186},{"type":42,"tag":70,"props":2106,"children":2107},{"class":72,"line":170},[2108],{"type":42,"tag":70,"props":2109,"children":2110},{},[2111],{"type":48,"value":2112},"    # Cookie name must be a_session_\u003CPROJECT_ID>\n",{"type":42,"tag":70,"props":2114,"children":2115},{"class":72,"line":179},[2116],{"type":42,"tag":70,"props":2117,"children":2118},{},[2119],{"type":48,"value":2120},"    resp = make_response(jsonify({'success': True}))\n",{"type":42,"tag":70,"props":2122,"children":2123},{"class":72,"line":189},[2124],{"type":42,"tag":70,"props":2125,"children":2126},{},[2127],{"type":48,"value":2128},"    resp.set_cookie('a_session_[PROJECT_ID]', session['secret'],\n",{"type":42,"tag":70,"props":2130,"children":2131},{"class":72,"line":198},[2132],{"type":42,"tag":70,"props":2133,"children":2134},{},[2135],{"type":48,"value":2136},"                    httponly=True, secure=True, samesite='Strict',\n",{"type":42,"tag":70,"props":2138,"children":2139},{"class":72,"line":206},[2140],{"type":42,"tag":70,"props":2141,"children":2142},{},[2143],{"type":48,"value":2144},"                    expires=session['expire'], path='\u002F')\n",{"type":42,"tag":70,"props":2146,"children":2147},{"class":72,"line":215},[2148],{"type":42,"tag":70,"props":2149,"children":2150},{},[2151],{"type":48,"value":2152},"    return resp\n",{"type":42,"tag":642,"props":2154,"children":2156},{"id":2155},"authenticated-requests",[2157],{"type":48,"value":2158},"Authenticated Requests",{"type":42,"tag":58,"props":2160,"children":2162},{"className":100,"code":2161,"language":22,"meta":63,"style":63},"@app.get('\u002Fuser')\ndef get_user():\n    session = request.cookies.get('a_session_[PROJECT_ID]')\n    if not session:\n        return jsonify({'error': 'Unauthorized'}), 401\n\n    session_client = (Client()\n        .set_endpoint('https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1')\n        .set_project('[PROJECT_ID]')\n        .set_session(session))\n\n    account = Account(session_client)\n    return jsonify(account.get())\n",[2163],{"type":42,"tag":66,"props":2164,"children":2165},{"__ignoreMap":63},[2166,2174,2182,2190,2198,2206,2213,2221,2229,2237,2245,2252,2260],{"type":42,"tag":70,"props":2167,"children":2168},{"class":72,"line":73},[2169],{"type":42,"tag":70,"props":2170,"children":2171},{},[2172],{"type":48,"value":2173},"@app.get('\u002Fuser')\n",{"type":42,"tag":70,"props":2175,"children":2176},{"class":72,"line":116},[2177],{"type":42,"tag":70,"props":2178,"children":2179},{},[2180],{"type":48,"value":2181},"def get_user():\n",{"type":42,"tag":70,"props":2183,"children":2184},{"class":72,"line":125},[2185],{"type":42,"tag":70,"props":2186,"children":2187},{},[2188],{"type":48,"value":2189},"    session = request.cookies.get('a_session_[PROJECT_ID]')\n",{"type":42,"tag":70,"props":2191,"children":2192},{"class":72,"line":134},[2193],{"type":42,"tag":70,"props":2194,"children":2195},{},[2196],{"type":48,"value":2197},"    if not session:\n",{"type":42,"tag":70,"props":2199,"children":2200},{"class":72,"line":143},[2201],{"type":42,"tag":70,"props":2202,"children":2203},{},[2204],{"type":48,"value":2205},"        return jsonify({'error': 'Unauthorized'}), 401\n",{"type":42,"tag":70,"props":2207,"children":2208},{"class":72,"line":152},[2209],{"type":42,"tag":70,"props":2210,"children":2211},{"emptyLinePlaceholder":183},[2212],{"type":48,"value":186},{"type":42,"tag":70,"props":2214,"children":2215},{"class":72,"line":161},[2216],{"type":42,"tag":70,"props":2217,"children":2218},{},[2219],{"type":48,"value":2220},"    session_client = (Client()\n",{"type":42,"tag":70,"props":2222,"children":2223},{"class":72,"line":170},[2224],{"type":42,"tag":70,"props":2225,"children":2226},{},[2227],{"type":48,"value":2228},"        .set_endpoint('https:\u002F\u002F\u003CREGION>.cloud.appwrite.io\u002Fv1')\n",{"type":42,"tag":70,"props":2230,"children":2231},{"class":72,"line":179},[2232],{"type":42,"tag":70,"props":2233,"children":2234},{},[2235],{"type":48,"value":2236},"        .set_project('[PROJECT_ID]')\n",{"type":42,"tag":70,"props":2238,"children":2239},{"class":72,"line":189},[2240],{"type":42,"tag":70,"props":2241,"children":2242},{},[2243],{"type":48,"value":2244},"        .set_session(session))\n",{"type":42,"tag":70,"props":2246,"children":2247},{"class":72,"line":198},[2248],{"type":42,"tag":70,"props":2249,"children":2250},{"emptyLinePlaceholder":183},[2251],{"type":48,"value":186},{"type":42,"tag":70,"props":2253,"children":2254},{"class":72,"line":206},[2255],{"type":42,"tag":70,"props":2256,"children":2257},{},[2258],{"type":48,"value":2259},"    account = Account(session_client)\n",{"type":42,"tag":70,"props":2261,"children":2262},{"class":72,"line":215},[2263],{"type":42,"tag":70,"props":2264,"children":2265},{},[2266],{"type":48,"value":2267},"    return jsonify(account.get())\n",{"type":42,"tag":642,"props":2269,"children":2271},{"id":2270},"oauth2-ssr-flow",[2272],{"type":48,"value":2273},"OAuth2 SSR Flow",{"type":42,"tag":58,"props":2275,"children":2277},{"className":100,"code":2276,"language":22,"meta":63,"style":63},"# Step 1: Redirect to OAuth provider\n@app.get('\u002Foauth')\ndef oauth():\n    account = Account(admin_client)\n    redirect_url = account.create_o_auth2_token(\n        OAuthProvider.Github,\n        'https:\u002F\u002Fexample.com\u002Foauth\u002Fsuccess',\n        'https:\u002F\u002Fexample.com\u002Foauth\u002Ffailure',\n    )\n    return redirect(redirect_url)\n\n# Step 2: Handle callback — exchange token for session\n@app.get('\u002Foauth\u002Fsuccess')\ndef oauth_success():\n    account = Account(admin_client)\n    session = account.create_session(request.args['userId'], request.args['secret'])\n\n    resp = make_response(jsonify({'success': True}))\n    resp.set_cookie('a_session_[PROJECT_ID]', session['secret'],\n                    httponly=True, secure=True, samesite='Strict',\n                    expires=session['expire'], path='\u002F')\n    return resp\n",[2278],{"type":42,"tag":66,"props":2279,"children":2280},{"__ignoreMap":63},[2281,2289,2297,2305,2312,2320,2328,2336,2344,2351,2359,2366,2374,2382,2390,2397,2405,2412,2419,2426,2433,2440],{"type":42,"tag":70,"props":2282,"children":2283},{"class":72,"line":73},[2284],{"type":42,"tag":70,"props":2285,"children":2286},{},[2287],{"type":48,"value":2288},"# Step 1: Redirect to OAuth provider\n",{"type":42,"tag":70,"props":2290,"children":2291},{"class":72,"line":116},[2292],{"type":42,"tag":70,"props":2293,"children":2294},{},[2295],{"type":48,"value":2296},"@app.get('\u002Foauth')\n",{"type":42,"tag":70,"props":2298,"children":2299},{"class":72,"line":125},[2300],{"type":42,"tag":70,"props":2301,"children":2302},{},[2303],{"type":48,"value":2304},"def oauth():\n",{"type":42,"tag":70,"props":2306,"children":2307},{"class":72,"line":134},[2308],{"type":42,"tag":70,"props":2309,"children":2310},{},[2311],{"type":48,"value":2073},{"type":42,"tag":70,"props":2313,"children":2314},{"class":72,"line":143},[2315],{"type":42,"tag":70,"props":2316,"children":2317},{},[2318],{"type":48,"value":2319},"    redirect_url = account.create_o_auth2_token(\n",{"type":42,"tag":70,"props":2321,"children":2322},{"class":72,"line":152},[2323],{"type":42,"tag":70,"props":2324,"children":2325},{},[2326],{"type":48,"value":2327},"        OAuthProvider.Github,\n",{"type":42,"tag":70,"props":2329,"children":2330},{"class":72,"line":161},[2331],{"type":42,"tag":70,"props":2332,"children":2333},{},[2334],{"type":48,"value":2335},"        'https:\u002F\u002Fexample.com\u002Foauth\u002Fsuccess',\n",{"type":42,"tag":70,"props":2337,"children":2338},{"class":72,"line":170},[2339],{"type":42,"tag":70,"props":2340,"children":2341},{},[2342],{"type":48,"value":2343},"        'https:\u002F\u002Fexample.com\u002Foauth\u002Ffailure',\n",{"type":42,"tag":70,"props":2345,"children":2346},{"class":72,"line":179},[2347],{"type":42,"tag":70,"props":2348,"children":2349},{},[2350],{"type":48,"value":2097},{"type":42,"tag":70,"props":2352,"children":2353},{"class":72,"line":189},[2354],{"type":42,"tag":70,"props":2355,"children":2356},{},[2357],{"type":48,"value":2358},"    return redirect(redirect_url)\n",{"type":42,"tag":70,"props":2360,"children":2361},{"class":72,"line":198},[2362],{"type":42,"tag":70,"props":2363,"children":2364},{"emptyLinePlaceholder":183},[2365],{"type":48,"value":186},{"type":42,"tag":70,"props":2367,"children":2368},{"class":72,"line":206},[2369],{"type":42,"tag":70,"props":2370,"children":2371},{},[2372],{"type":48,"value":2373},"# Step 2: Handle callback — exchange token for session\n",{"type":42,"tag":70,"props":2375,"children":2376},{"class":72,"line":215},[2377],{"type":42,"tag":70,"props":2378,"children":2379},{},[2380],{"type":48,"value":2381},"@app.get('\u002Foauth\u002Fsuccess')\n",{"type":42,"tag":70,"props":2383,"children":2384},{"class":72,"line":224},[2385],{"type":42,"tag":70,"props":2386,"children":2387},{},[2388],{"type":48,"value":2389},"def oauth_success():\n",{"type":42,"tag":70,"props":2391,"children":2392},{"class":72,"line":233},[2393],{"type":42,"tag":70,"props":2394,"children":2395},{},[2396],{"type":48,"value":2073},{"type":42,"tag":70,"props":2398,"children":2399},{"class":72,"line":549},[2400],{"type":42,"tag":70,"props":2401,"children":2402},{},[2403],{"type":48,"value":2404},"    session = account.create_session(request.args['userId'], request.args['secret'])\n",{"type":42,"tag":70,"props":2406,"children":2407},{"class":72,"line":557},[2408],{"type":42,"tag":70,"props":2409,"children":2410},{"emptyLinePlaceholder":183},[2411],{"type":48,"value":186},{"type":42,"tag":70,"props":2413,"children":2414},{"class":72,"line":566},[2415],{"type":42,"tag":70,"props":2416,"children":2417},{},[2418],{"type":48,"value":2120},{"type":42,"tag":70,"props":2420,"children":2421},{"class":72,"line":575},[2422],{"type":42,"tag":70,"props":2423,"children":2424},{},[2425],{"type":48,"value":2128},{"type":42,"tag":70,"props":2427,"children":2428},{"class":72,"line":583},[2429],{"type":42,"tag":70,"props":2430,"children":2431},{},[2432],{"type":48,"value":2136},{"type":42,"tag":70,"props":2434,"children":2435},{"class":72,"line":592},[2436],{"type":42,"tag":70,"props":2437,"children":2438},{},[2439],{"type":48,"value":2144},{"type":42,"tag":70,"props":2441,"children":2442},{"class":72,"line":601},[2443],{"type":42,"tag":70,"props":2444,"children":2445},{},[2446],{"type":48,"value":2152},{"type":42,"tag":367,"props":2448,"children":2449},{},[2450],{"type":42,"tag":371,"props":2451,"children":2452},{},[2453,2458,2460,2466,2467,2473,2474,2480,2482,2488],{"type":42,"tag":375,"props":2454,"children":2455},{},[2456],{"type":48,"value":2457},"Cookie security:",{"type":48,"value":2459}," Always use ",{"type":42,"tag":66,"props":2461,"children":2463},{"className":2462},[],[2464],{"type":48,"value":2465},"httponly",{"type":48,"value":831},{"type":42,"tag":66,"props":2468,"children":2470},{"className":2469},[],[2471],{"type":48,"value":2472},"secure",{"type":48,"value":838},{"type":42,"tag":66,"props":2475,"children":2477},{"className":2476},[],[2478],{"type":48,"value":2479},"samesite='Strict'",{"type":48,"value":2481}," to prevent XSS. The cookie name must be ",{"type":42,"tag":66,"props":2483,"children":2485},{"className":2484},[],[2486],{"type":48,"value":2487},"a_session_\u003CPROJECT_ID>",{"type":48,"value":2489},".",{"type":42,"tag":367,"props":2491,"children":2492},{},[2493],{"type":42,"tag":371,"props":2494,"children":2495},{},[2496,2501,2503,2509],{"type":42,"tag":375,"props":2497,"children":2498},{},[2499],{"type":48,"value":2500},"Forwarding user agent:",{"type":48,"value":2502}," Call ",{"type":42,"tag":66,"props":2504,"children":2506},{"className":2505},[],[2507],{"type":48,"value":2508},"session_client.set_forwarded_user_agent(request.headers.get('user-agent'))",{"type":48,"value":2510}," to record the end-user's browser info for debugging and security.",{"type":42,"tag":51,"props":2512,"children":2514},{"id":2513},"error-handling",[2515],{"type":48,"value":2516},"Error Handling",{"type":42,"tag":58,"props":2518,"children":2520},{"className":100,"code":2519,"language":22,"meta":63,"style":63},"from appwrite.exception import AppwriteException\n\ntry:\n    row = tables_db.get_row('[DATABASE_ID]', '[TABLE_ID]', '[ROW_ID]')\nexcept AppwriteException as e:\n    print(e.message)    # human-readable error message\n    print(e.code)       # HTTP status code (int)\n    print(e.type)       # Appwrite error type string (e.g. 'document_not_found')\n    print(e.response)   # full response body (dict)\n",[2521],{"type":42,"tag":66,"props":2522,"children":2523},{"__ignoreMap":63},[2524,2532,2539,2547,2555,2563,2571,2579,2587],{"type":42,"tag":70,"props":2525,"children":2526},{"class":72,"line":73},[2527],{"type":42,"tag":70,"props":2528,"children":2529},{},[2530],{"type":48,"value":2531},"from appwrite.exception import AppwriteException\n",{"type":42,"tag":70,"props":2533,"children":2534},{"class":72,"line":116},[2535],{"type":42,"tag":70,"props":2536,"children":2537},{"emptyLinePlaceholder":183},[2538],{"type":48,"value":186},{"type":42,"tag":70,"props":2540,"children":2541},{"class":72,"line":125},[2542],{"type":42,"tag":70,"props":2543,"children":2544},{},[2545],{"type":48,"value":2546},"try:\n",{"type":42,"tag":70,"props":2548,"children":2549},{"class":72,"line":134},[2550],{"type":42,"tag":70,"props":2551,"children":2552},{},[2553],{"type":48,"value":2554},"    row = tables_db.get_row('[DATABASE_ID]', '[TABLE_ID]', '[ROW_ID]')\n",{"type":42,"tag":70,"props":2556,"children":2557},{"class":72,"line":143},[2558],{"type":42,"tag":70,"props":2559,"children":2560},{},[2561],{"type":48,"value":2562},"except AppwriteException as e:\n",{"type":42,"tag":70,"props":2564,"children":2565},{"class":72,"line":152},[2566],{"type":42,"tag":70,"props":2567,"children":2568},{},[2569],{"type":48,"value":2570},"    print(e.message)    # human-readable error message\n",{"type":42,"tag":70,"props":2572,"children":2573},{"class":72,"line":161},[2574],{"type":42,"tag":70,"props":2575,"children":2576},{},[2577],{"type":48,"value":2578},"    print(e.code)       # HTTP status code (int)\n",{"type":42,"tag":70,"props":2580,"children":2581},{"class":72,"line":170},[2582],{"type":42,"tag":70,"props":2583,"children":2584},{},[2585],{"type":48,"value":2586},"    print(e.type)       # Appwrite error type string (e.g. 'document_not_found')\n",{"type":42,"tag":70,"props":2588,"children":2589},{"class":72,"line":179},[2590],{"type":42,"tag":70,"props":2591,"children":2592},{},[2593],{"type":48,"value":2594},"    print(e.response)   # full response body (dict)\n",{"type":42,"tag":371,"props":2596,"children":2597},{},[2598],{"type":42,"tag":375,"props":2599,"children":2600},{},[2601],{"type":48,"value":2602},"Common error codes:",{"type":42,"tag":669,"props":2604,"children":2605},{},[2606,2622],{"type":42,"tag":673,"props":2607,"children":2608},{},[2609],{"type":42,"tag":677,"props":2610,"children":2611},{},[2612,2617],{"type":42,"tag":681,"props":2613,"children":2614},{},[2615],{"type":48,"value":2616},"Code",{"type":42,"tag":681,"props":2618,"children":2619},{},[2620],{"type":48,"value":2621},"Meaning",{"type":42,"tag":701,"props":2623,"children":2624},{},[2625,2642,2659,2676,2693],{"type":42,"tag":677,"props":2626,"children":2627},{},[2628,2637],{"type":42,"tag":708,"props":2629,"children":2630},{},[2631],{"type":42,"tag":66,"props":2632,"children":2634},{"className":2633},[],[2635],{"type":48,"value":2636},"401",{"type":42,"tag":708,"props":2638,"children":2639},{},[2640],{"type":48,"value":2641},"Unauthorized — missing or invalid session\u002FAPI key",{"type":42,"tag":677,"props":2643,"children":2644},{},[2645,2654],{"type":42,"tag":708,"props":2646,"children":2647},{},[2648],{"type":42,"tag":66,"props":2649,"children":2651},{"className":2650},[],[2652],{"type":48,"value":2653},"403",{"type":42,"tag":708,"props":2655,"children":2656},{},[2657],{"type":48,"value":2658},"Forbidden — insufficient permissions for this action",{"type":42,"tag":677,"props":2660,"children":2661},{},[2662,2671],{"type":42,"tag":708,"props":2663,"children":2664},{},[2665],{"type":42,"tag":66,"props":2666,"children":2668},{"className":2667},[],[2669],{"type":48,"value":2670},"404",{"type":42,"tag":708,"props":2672,"children":2673},{},[2674],{"type":48,"value":2675},"Not found — resource does not exist",{"type":42,"tag":677,"props":2677,"children":2678},{},[2679,2688],{"type":42,"tag":708,"props":2680,"children":2681},{},[2682],{"type":42,"tag":66,"props":2683,"children":2685},{"className":2684},[],[2686],{"type":48,"value":2687},"409",{"type":42,"tag":708,"props":2689,"children":2690},{},[2691],{"type":48,"value":2692},"Conflict — duplicate ID or unique constraint violation",{"type":42,"tag":677,"props":2694,"children":2695},{},[2696,2705],{"type":42,"tag":708,"props":2697,"children":2698},{},[2699],{"type":42,"tag":66,"props":2700,"children":2702},{"className":2701},[],[2703],{"type":48,"value":2704},"429",{"type":42,"tag":708,"props":2706,"children":2707},{},[2708],{"type":48,"value":2709},"Rate limited — too many requests, retry after backoff",{"type":42,"tag":51,"props":2711,"children":2713},{"id":2712},"permissions-roles-critical",[2714],{"type":48,"value":2715},"Permissions & Roles (Critical)",{"type":42,"tag":371,"props":2717,"children":2718},{},[2719,2721,2727,2728,2734,2735,2741,2742,2748,2750,2756,2758,2763,2765,2771,2773,2779],{"type":48,"value":2720},"Appwrite uses permission strings to control access to resources. Each permission pairs an action (",{"type":42,"tag":66,"props":2722,"children":2724},{"className":2723},[],[2725],{"type":48,"value":2726},"read",{"type":48,"value":831},{"type":42,"tag":66,"props":2729,"children":2731},{"className":2730},[],[2732],{"type":48,"value":2733},"update",{"type":48,"value":831},{"type":42,"tag":66,"props":2736,"children":2738},{"className":2737},[],[2739],{"type":48,"value":2740},"delete",{"type":48,"value":831},{"type":42,"tag":66,"props":2743,"children":2745},{"className":2744},[],[2746],{"type":48,"value":2747},"create",{"type":48,"value":2749},", or ",{"type":42,"tag":66,"props":2751,"children":2753},{"className":2752},[],[2754],{"type":48,"value":2755},"write",{"type":48,"value":2757}," which grants create + update + delete) with a role target. By default, ",{"type":42,"tag":375,"props":2759,"children":2760},{},[2761],{"type":48,"value":2762},"no user has access",{"type":48,"value":2764}," 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":2766,"children":2768},{"className":2767},[],[2769],{"type":48,"value":2770},"Permission",{"type":48,"value":2772}," and ",{"type":42,"tag":66,"props":2774,"children":2776},{"className":2775},[],[2777],{"type":48,"value":2778},"Role",{"type":48,"value":2780}," helpers.",{"type":42,"tag":58,"props":2782,"children":2784},{"className":100,"code":2783,"language":22,"meta":63,"style":63},"from appwrite.permission import Permission\nfrom appwrite.role import Role\n",[2785],{"type":42,"tag":66,"props":2786,"children":2787},{"__ignoreMap":63},[2788,2796],{"type":42,"tag":70,"props":2789,"children":2790},{"class":72,"line":73},[2791],{"type":42,"tag":70,"props":2792,"children":2793},{},[2794],{"type":48,"value":2795},"from appwrite.permission import Permission\n",{"type":42,"tag":70,"props":2797,"children":2798},{"class":72,"line":116},[2799],{"type":42,"tag":70,"props":2800,"children":2801},{},[2802],{"type":48,"value":2803},"from appwrite.role import Role\n",{"type":42,"tag":247,"props":2805,"children":2807},{"id":2806},"database-row-with-permissions",[2808],{"type":48,"value":2809},"Database Row with Permissions",{"type":42,"tag":58,"props":2811,"children":2813},{"className":100,"code":2812,"language":22,"meta":63,"style":63},"doc = tables_db.create_row('[DATABASE_ID]', '[TABLE_ID]', ID.unique(), {\n    'title': 'Hello World'\n}, [\n    Permission.read(Role.user('[USER_ID]')),     # specific user can read\n    Permission.update(Role.user('[USER_ID]')),   # specific user can update\n    Permission.read(Role.team('[TEAM_ID]')),     # all team members can read\n    Permission.read(Role.any()),                 # anyone (including guests) can read\n])\n",[2814],{"type":42,"tag":66,"props":2815,"children":2816},{"__ignoreMap":63},[2817,2824,2831,2839,2847,2855,2863,2871],{"type":42,"tag":70,"props":2818,"children":2819},{"class":72,"line":73},[2820],{"type":42,"tag":70,"props":2821,"children":2822},{},[2823],{"type":48,"value":483},{"type":42,"tag":70,"props":2825,"children":2826},{"class":72,"line":116},[2827],{"type":42,"tag":70,"props":2828,"children":2829},{},[2830],{"type":48,"value":491},{"type":42,"tag":70,"props":2832,"children":2833},{"class":72,"line":125},[2834],{"type":42,"tag":70,"props":2835,"children":2836},{},[2837],{"type":48,"value":2838},"}, [\n",{"type":42,"tag":70,"props":2840,"children":2841},{"class":72,"line":134},[2842],{"type":42,"tag":70,"props":2843,"children":2844},{},[2845],{"type":48,"value":2846},"    Permission.read(Role.user('[USER_ID]')),     # specific user can read\n",{"type":42,"tag":70,"props":2848,"children":2849},{"class":72,"line":143},[2850],{"type":42,"tag":70,"props":2851,"children":2852},{},[2853],{"type":48,"value":2854},"    Permission.update(Role.user('[USER_ID]')),   # specific user can update\n",{"type":42,"tag":70,"props":2856,"children":2857},{"class":72,"line":152},[2858],{"type":42,"tag":70,"props":2859,"children":2860},{},[2861],{"type":48,"value":2862},"    Permission.read(Role.team('[TEAM_ID]')),     # all team members can read\n",{"type":42,"tag":70,"props":2864,"children":2865},{"class":72,"line":161},[2866],{"type":42,"tag":70,"props":2867,"children":2868},{},[2869],{"type":48,"value":2870},"    Permission.read(Role.any()),                 # anyone (including guests) can read\n",{"type":42,"tag":70,"props":2872,"children":2873},{"class":72,"line":170},[2874],{"type":42,"tag":70,"props":2875,"children":2876},{},[2877],{"type":48,"value":546},{"type":42,"tag":247,"props":2879,"children":2881},{"id":2880},"file-upload-with-permissions",[2882],{"type":48,"value":2883},"File Upload with Permissions",{"type":42,"tag":58,"props":2885,"children":2887},{"className":100,"code":2886,"language":22,"meta":63,"style":63},"file = storage.create_file('[BUCKET_ID]', ID.unique(), InputFile.from_path('\u002Fpath\u002Fto\u002Ffile.png'), [\n    Permission.read(Role.any()),\n    Permission.update(Role.user('[USER_ID]')),\n    Permission.delete(Role.user('[USER_ID]')),\n])\n",[2888],{"type":42,"tag":66,"props":2889,"children":2890},{"__ignoreMap":63},[2891,2899,2907,2915,2923],{"type":42,"tag":70,"props":2892,"children":2893},{"class":72,"line":73},[2894],{"type":42,"tag":70,"props":2895,"children":2896},{},[2897],{"type":48,"value":2898},"file = storage.create_file('[BUCKET_ID]', ID.unique(), InputFile.from_path('\u002Fpath\u002Fto\u002Ffile.png'), [\n",{"type":42,"tag":70,"props":2900,"children":2901},{"class":72,"line":116},[2902],{"type":42,"tag":70,"props":2903,"children":2904},{},[2905],{"type":48,"value":2906},"    Permission.read(Role.any()),\n",{"type":42,"tag":70,"props":2908,"children":2909},{"class":72,"line":125},[2910],{"type":42,"tag":70,"props":2911,"children":2912},{},[2913],{"type":48,"value":2914},"    Permission.update(Role.user('[USER_ID]')),\n",{"type":42,"tag":70,"props":2916,"children":2917},{"class":72,"line":134},[2918],{"type":42,"tag":70,"props":2919,"children":2920},{},[2921],{"type":48,"value":2922},"    Permission.delete(Role.user('[USER_ID]')),\n",{"type":42,"tag":70,"props":2924,"children":2925},{"class":72,"line":143},[2926],{"type":42,"tag":70,"props":2927,"children":2928},{},[2929],{"type":48,"value":546},{"type":42,"tag":367,"props":2931,"children":2932},{},[2933],{"type":42,"tag":371,"props":2934,"children":2935},{},[2936,2941],{"type":42,"tag":375,"props":2937,"children":2938},{},[2939],{"type":48,"value":2940},"When to set permissions:",{"type":48,"value":2942}," 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":367,"props":2944,"children":2945},{},[2946,2954],{"type":42,"tag":371,"props":2947,"children":2948},{},[2949],{"type":42,"tag":375,"props":2950,"children":2951},{},[2952],{"type":48,"value":2953},"Common mistakes:",{"type":42,"tag":808,"props":2955,"children":2956},{},[2957,2967,3001],{"type":42,"tag":812,"props":2958,"children":2959},{},[2960,2965],{"type":42,"tag":375,"props":2961,"children":2962},{},[2963],{"type":48,"value":2964},"Forgetting permissions",{"type":48,"value":2966}," — the resource becomes inaccessible to all users (including the creator)",{"type":42,"tag":812,"props":2968,"children":2969},{},[2970,2999],{"type":42,"tag":375,"props":2971,"children":2972},{},[2973,2979,2981,2986,2988,2993,2994],{"type":42,"tag":66,"props":2974,"children":2976},{"className":2975},[],[2977],{"type":48,"value":2978},"Role.any()",{"type":48,"value":2980}," with ",{"type":42,"tag":66,"props":2982,"children":2984},{"className":2983},[],[2985],{"type":48,"value":2755},{"type":48,"value":2987},"\u002F",{"type":42,"tag":66,"props":2989,"children":2991},{"className":2990},[],[2992],{"type":48,"value":2733},{"type":48,"value":2987},{"type":42,"tag":66,"props":2995,"children":2997},{"className":2996},[],[2998],{"type":48,"value":2740},{"type":48,"value":3000}," — allows any user, including unauthenticated guests, to modify or remove the resource",{"type":42,"tag":812,"props":3002,"children":3003},{},[3004,3015],{"type":42,"tag":375,"props":3005,"children":3006},{},[3007,3013],{"type":42,"tag":66,"props":3008,"children":3010},{"className":3009},[],[3011],{"type":48,"value":3012},"Permission.read(Role.any())",{"type":48,"value":3014}," on sensitive data",{"type":48,"value":3016}," — makes the resource publicly readable",{"type":42,"tag":3018,"props":3019,"children":3020},"style",{},[3021],{"type":48,"value":3022},"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":3024,"total":198},[3025,3040,3058,3072,3086,3105,3119,3127,3142,3156,3175],{"slug":3026,"name":3026,"fn":3027,"description":3028,"org":3029,"tags":3030,"stars":26,"repoUrl":27,"updatedAt":3039},"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},[3031,3032,3033,3036],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":3034,"slug":3035,"type":15},"CLI","cli",{"name":3037,"slug":3038,"type":15},"Deployment","deployment","2026-07-12T08:45:23.213081",{"slug":3041,"name":3041,"fn":3042,"description":3043,"org":3044,"tags":3045,"stars":26,"repoUrl":27,"updatedAt":3057},"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},[3046,3047,3048,3051,3054],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":3049,"slug":3050,"type":15},"Dart","dart",{"name":3052,"slug":3053,"type":15},"Flutter","flutter",{"name":3055,"slug":3056,"type":15},"Mobile","mobile","2026-07-12T08:45:33.336948",{"slug":3059,"name":3059,"fn":3060,"description":3061,"org":3062,"tags":3063,"stars":26,"repoUrl":27,"updatedAt":3071},"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},[3064,3067,3068,3069,3070],{"name":3065,"slug":3066,"type":15},".NET","net",{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":24,"slug":25,"type":15},"2026-07-12T08:45:28.556413",{"slug":3073,"name":3073,"fn":3074,"description":3075,"org":3076,"tags":3077,"stars":26,"repoUrl":27,"updatedAt":3085},"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},[3078,3079,3080,3081,3084],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":3082,"slug":3083,"type":15},"Go","go",{"name":24,"slug":25,"type":15},"2026-07-12T08:45:19.875231",{"slug":3087,"name":3087,"fn":3088,"description":3089,"org":3090,"tags":3091,"stars":26,"repoUrl":27,"updatedAt":3104},"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},[3092,3095,3096,3099,3100,3101],{"name":3093,"slug":3094,"type":15},"Android","android",{"name":9,"slug":8,"type":15},{"name":3097,"slug":3098,"type":15},"Auth","auth",{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":3102,"slug":3103,"type":15},"Kotlin","kotlin","2026-07-12T08:45:40.750646",{"slug":3106,"name":3106,"fn":3107,"description":3108,"org":3109,"tags":3110,"stars":26,"repoUrl":27,"updatedAt":3118},"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},[3111,3112,3113,3114,3117],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":3115,"slug":3116,"type":15},"PHP","php",{"name":24,"slug":25,"type":15},"2026-07-12T08:45:21.794433",{"slug":4,"name":4,"fn":5,"description":6,"org":3120,"tags":3121,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3122,3123,3124,3125,3126],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":21,"slug":22,"type":15},{"name":24,"slug":25,"type":15},{"slug":3128,"name":3128,"fn":3129,"description":3130,"org":3131,"tags":3132,"stars":26,"repoUrl":27,"updatedAt":3141},"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},[3133,3136,3137,3138],{"name":3134,"slug":3135,"type":15},"API Development","api-development",{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":3139,"slug":3140,"type":15},"Ruby","ruby","2026-07-12T08:45:34.567568",{"slug":3143,"name":3143,"fn":3144,"description":3145,"org":3146,"tags":3147,"stars":26,"repoUrl":27,"updatedAt":3155},"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},[3148,3149,3150,3151,3152],{"name":3134,"slug":3135,"type":15},{"name":3097,"slug":3098,"type":15},{"name":17,"slug":18,"type":15},{"name":1207,"slug":1204,"type":15},{"name":3153,"slug":3154,"type":15},"Rust","rust","2026-07-12T08:45:25.167378",{"slug":3157,"name":3157,"fn":3158,"description":3159,"org":3160,"tags":3161,"stars":26,"repoUrl":27,"updatedAt":3174},"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},[3162,3163,3164,3165,3168,3171],{"name":9,"slug":8,"type":15},{"name":3097,"slug":3098,"type":15},{"name":17,"slug":18,"type":15},{"name":3166,"slug":3167,"type":15},"iOS","ios",{"name":3169,"slug":3170,"type":15},"macOS","macos",{"name":3172,"slug":3173,"type":15},"Swift","swift","2026-07-12T08:45:26.722393",{"slug":3176,"name":3176,"fn":3177,"description":3178,"org":3179,"tags":3180,"stars":26,"repoUrl":27,"updatedAt":3193},"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},[3181,3182,3183,3184,3187,3190],{"name":9,"slug":8,"type":15},{"name":3097,"slug":3098,"type":15},{"name":17,"slug":18,"type":15},{"name":3185,"slug":3186,"type":15},"JavaScript","javascript",{"name":3188,"slug":3189,"type":15},"Node.js","node-js",{"name":3191,"slug":3192,"type":15},"TypeScript","typescript","2026-07-12T08:45:31.181727",{"items":3195,"total":198},[3196,3203,3211,3219,3227,3236,3244],{"slug":3026,"name":3026,"fn":3027,"description":3028,"org":3197,"tags":3198,"stars":26,"repoUrl":27,"updatedAt":3039},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3199,3200,3201,3202],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":3034,"slug":3035,"type":15},{"name":3037,"slug":3038,"type":15},{"slug":3041,"name":3041,"fn":3042,"description":3043,"org":3204,"tags":3205,"stars":26,"repoUrl":27,"updatedAt":3057},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3206,3207,3208,3209,3210],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":3049,"slug":3050,"type":15},{"name":3052,"slug":3053,"type":15},{"name":3055,"slug":3056,"type":15},{"slug":3059,"name":3059,"fn":3060,"description":3061,"org":3212,"tags":3213,"stars":26,"repoUrl":27,"updatedAt":3071},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3214,3215,3216,3217,3218],{"name":3065,"slug":3066,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":24,"slug":25,"type":15},{"slug":3073,"name":3073,"fn":3074,"description":3075,"org":3220,"tags":3221,"stars":26,"repoUrl":27,"updatedAt":3085},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3222,3223,3224,3225,3226],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":3082,"slug":3083,"type":15},{"name":24,"slug":25,"type":15},{"slug":3087,"name":3087,"fn":3088,"description":3089,"org":3228,"tags":3229,"stars":26,"repoUrl":27,"updatedAt":3104},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3230,3231,3232,3233,3234,3235],{"name":3093,"slug":3094,"type":15},{"name":9,"slug":8,"type":15},{"name":3097,"slug":3098,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":3102,"slug":3103,"type":15},{"slug":3106,"name":3106,"fn":3107,"description":3108,"org":3237,"tags":3238,"stars":26,"repoUrl":27,"updatedAt":3118},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3239,3240,3241,3242,3243],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":3115,"slug":3116,"type":15},{"name":24,"slug":25,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":3245,"tags":3246,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3247,3248,3249,3250,3251],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":21,"slug":22,"type":15},{"name":24,"slug":25,"type":15}]