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