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