-
Notifications
You must be signed in to change notification settings - Fork 299
add and changes to quickstart prompts #2662
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
WalkthroughThis PR adds comprehensive quick-start documentation guides across 25+ frameworks and languages for integrating Appwrite authentication and database operations. New markdown files are introduced for mobile platforms (Android Java/Kotlin, Flutter, React Native, iOS/macOS), web frameworks (React, Vue, Angular, SvelteKit, Nuxt, Solid, Next.js, Refine, TanStack Start), backend/CLI languages (Node, Python, Go, Dart, Deno, .NET, PHP, Kotlin, Ruby, Swift, Web), each containing step-by-step setup instructions, user interaction prompts, code snippets, and configuration guidance. Minor refinements to existing Next.js and React Native guides improve project setup flow handling. Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes 🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 17
🤖 Fix all issues with AI agents
In `@src/routes/docs/quick-starts/android/prompt.md`:
- Around line 140-211: The login form Column is always rendered even when a user
is authenticated; change the UI so only one state shows by converting the
current separate if (user.isNotEmpty()) { /* logged-in Column */ } and the
subsequent standalone Column (login form) into an if/else or otherwise render
the login form only when user.isEmpty(); locate the first Column guarded by
user.isNotEmpty() and wrap the second Column (the TextField/Row with Buttons and
the coroutineScope.launch calls to Appwrite.onLogin/Appwrite.onRegister) inside
the else branch so the logged-in message and the login form cannot appear
simultaneously.
In `@src/routes/docs/quick-starts/angular/prompt.md`:
- Around line 99-107: The register method calls the async login(email, password)
without awaiting it, risking race conditions; update register (the async
register method) to await the login call (await this.login(email, password)) so
the registration flow completes only after login finishes and UI/state updates
reliably; ensure any returned value from login is handled or returned if callers
expect it.
In `@src/routes/docs/quick-starts/dart/prompt.md`:
- Around line 44-49: The file declares an unused variable "databases" while
later assigning to an undeclared "tablesDB", causing a runtime error; remove the
unused "databases" declaration and declare "tablesDB" before use (e.g., var
tablesDB; or TablesDB tablesDB;) so that the existing assignment tablesDB =
TablesDB(client); refers to a defined variable; keep the existing todoDatabase
and todoTable declarations as needed.
In `@src/routes/docs/quick-starts/dotnet/prompt.md`:
- Around line 115-134: The calls to tablesDB.createRow use camelCase but C#
methods should be PascalCase; update each invocation (tablesDB.createRow) to use
tablesDB.CreateRow and ensure any other occurrences (e.g., CreateRow overloads
or references) are updated consistently so the method resolves correctly at
compile time.
In `@src/routes/docs/quick-starts/flutter/prompt.md`:
- Around line 114-117: The call to widget.account.createEmailPasswordSession
incorrectly uses curly braces around parameters (JavaScript/JSON style); change
it to a normal Dart method call by removing the { } so the named parameters are
passed directly inside the parentheses to createEmailPasswordSession (reference:
widget.account.createEmailPasswordSession).
- Around line 125-130: The Flutter Appwrite calls are using a JS-style object
literal; update both widget.account.create and
widget.account.createEmailPasswordSession to use Dart named parameters instead
of wrapping them in {}—call widget.account.create(userId: ID.unique(), email:
email, password: password, name: name) and
widget.account.createEmailPasswordSession(email: email, password: password) by
removing the surrounding braces and passing parameters as named arguments.
In `@src/routes/docs/quick-starts/go/prompt.md`:
- Around line 42-51: The declaration uses the wrong variable name: you declared
appwriteDatabases *tablesDB.TablesDB but the code later references tablesDB;
rename the declared variable to tablesDB (e.g., change appwriteDatabases to
tablesDB inside the var block) so the symbol tablesDB (used in subsequent calls)
matches the actual variable type *tablesDB.TablesDB and resolves the compilation
errors.
- Around line 128-147: Replace the unexported method calls to createRow with the
exported SDK method CreateRow on the tablesDB client in all three places where
you call it (the calls passing todoDatabase.Id, todoTable.Id, id.Unique(),
testTodo1/testTodo2/testTodo3); update each tablesDB.createRow(...) to
tablesDB.CreateRow(...) so it matches the Appwrite Go SDK exported method name.
In `@src/routes/docs/quick-starts/php/prompt.md`:
- Line 210: The run command incorrectly points to "php src/index.php" while the
example creates the file as "index.php" (see creation at line 33); update the
run instruction to execute the correct path "php index.php" so the command
matches the created file and avoids a file-not-found error.
In `@src/routes/docs/quick-starts/python/prompt.md`:
- Around line 91-98: The quick-start Python snippet uses the wrong parameter
name for the Appwrite SDK: change the create_string_column call so that the
parameter currently named default is renamed to xdefault; update the invocation
of tablesDB.create_string_column (the call that references todoDatabase['$id']
and todoTable['$id'] with key='description', size=255, required=False) to pass
xdefault='This is a test description.' instead of default='This is a test
description.' so it matches the SDK signature used in the Deno and .NET
examples.
In `@src/routes/docs/quick-starts/ruby/prompt.md`:
- Around line 153-160: The script calls run_all_tasks(databases) but never
defines databases, causing a NameError; after the client is initialized create
the Databases service instance (e.g., instantiate Appwrite::Databases with the
existing client) and assign it to databases, then pass that variable into
run_all_tasks(databases); update the call site where run_all_tasks is invoked
and ensure helper methods prepare_database, seed_database, and get_todos receive
that databases instance.
- Around line 28-91: The prepare_database method currently takes an unused
parameter (databases) and relies on the outer tablesDB variable, causing unclear
scope; fix by changing prepare_database to accept the TablesDB instance (e.g.,
def prepare_database(tables_db)) and use that local parameter (tables_db.create,
tables_db.create_table, tables_db.create_string_column, etc.), and when
referencing created resources use their returned id fields (e.g.,
todo_database['$id'] and todo_table['$id'] for database_id/table_id) rather than
relying on .id so the function is self-contained and does not depend on global
state.
In `@src/routes/docs/quick-starts/swift/prompt.md`:
- Around line 137-138: The getTodos function contains unnecessary forced casts
(databaseId: todoDatabase!.id as! String, tableId: todoTable!.id as! String);
remove the forced as! String casts and mirror the prepareDatabase fix by passing
the id values directly (or safely unwrapping them first) e.g. use
todoDatabase!.id and todoTable!.id or guard-let unwrap todoDatabase and
todoTable and then use their .id properties without casting.
- Around line 70-79: Remove the unnecessary forced casts and unsafe
force-unwrapping around todoDatabase!.id and todoTable!.id: stop using "as!
String" and avoid force-unwrapping; instead use the id property directly (if
it’s already a String) or safely unwrap with guard/if let before calling
tablesDB.createTextColumn / tablesDB.createBooleanColumn (and any other
create*Column calls shown), and apply the same change to the later occurrences
referenced at lines 137-138 so all calls use safe/unwrapped ids (refer to
todoDatabase, todoTable, createTextColumn, createBooleanColumn).
In `@src/routes/docs/quick-starts/vue/prompt.md`:
- Line 110: The phrase "auto login" in the markdown sentence should be a
hyphenated compound adjective; change "auto login works" to "auto-login works"
in the sentence (look for the line containing "Register a new user and auto
login works" in src/routes/docs/quick-starts/vue/prompt.md) so the compound
adjective is correctly hyphenated.
In `@src/routes/docs/quick-starts/web/prompt.md`:
- Around line 29-40: The npm example is missing a TablesDB export which later
examples expect; update the module that creates the Appwrite client (the code
that defines client and account) to also import TablesDB from 'appwrite' and
instantiate/export it as tablesDB (e.g., add import of TablesDB, create tablesDB
= new TablesDB(client), and export tablesDB) while keeping the existing client,
account, and ID exports so later uses of tablesDB succeed.
- Around line 42-51: The CDN example hardcodes the endpoint URL without the
Cloud Region placeholder; update the client.setEndpoint call used with
Appwrite.Client (the CDN snippet creating client, then calling
client.setEndpoint(...).setProject(...)) to use
'https://<REGION>.cloud.appwrite.io/v1' instead of
'https://cloud.appwrite.io/v1' so it matches the npm example and Step 3
instructions about choosing a Cloud Region.
🧹 Nitpick comments (21)
src/routes/docs/quick-starts/php/prompt.md (3)
6-6: Consider wrapping the URL in angle brackets.The bare URL can be improved for better markdown rendering in some parsers.
📝 Proposed fix
- - Guide the user to the Appwrite Console (https://cloud.appwrite.io/console). + - Guide the user to the Appwrite Console (<https://cloud.appwrite.io/console>).
9-15: Add blank lines around the table.Markdown tables should be surrounded by blank lines for better compatibility with various markdown parsers.
📝 Proposed fix
- Under "Integrate with your server", add an API Key with the following scopes: + | Category | Required scopes | Purpose | |----------|-----------------|---------| | Database | `databases.write` | Allows API key to create, update, and delete databases. | | | `tables.write` | Allows API key to create, update, and delete tables. | | | `columns.write` | Allows API key to create, update, and delete columns. | | | `rows.read` | Allows API key to read rows. | | | `rows.write` | Allows API key to create, update, and delete rows. | +
77-83: Add missing default value for the description column.The Dart prompt (lines 70-77) includes a default value for the description column (
xdefault: 'This is a test description'), but this PHP example omits it. For consistency across quick-start guides and to match the seed data behavior (wheretestTodo2omits the description field), consider adding a default value.♻️ Proposed fix for consistency
$tablesDB->createStringColumn( databaseId: $todoDatabase['$id'], tableId: $todoTable['$id'], key: 'description', size: 255, required: false, + xdefault: 'This is a test description' );src/routes/docs/quick-starts/tanstack-start/prompt.md (1)
120-120: Fix hyphenation for compound modifier.The phrase "auto login" should be hyphenated as "auto-login" when used as a compound modifier before a noun.
📝 Proposed fix
- - Register a new user and auto login works + - Register a new user and auto-login workssrc/routes/docs/quick-starts/kotlin/prompt.md (2)
8-8: Consider wrapping the URL in angle brackets.Similar to the PHP guide, the bare URL can be improved for better markdown rendering.
📝 Proposed fix
- - Guide the user to the Appwrite Console (https://cloud.appwrite.io/console) + - Guide the user to the Appwrite Console (<https://cloud.appwrite.io/console>)
10-18: Add blank lines around the table.Markdown tables should be surrounded by blank lines for better compatibility.
📝 Proposed fix
- Under "Integrate with your server", add an API Key with the following scopes: + | Category | Required scopes | Purpose | |-----------|---------------------|---------| | Database | databases.write | Allows API key to create, update, and delete databases | | | tables.write | Allows API key to create, update, and delete tables | | | columns.write | Allows API key to create, update, and delete columns | | | rows.read | Allows API key to read rows | | | rows.write | Allows API key to create, update, and delete rows | + - Other scopes are optionalsrc/routes/docs/quick-starts/apple/prompt.md (1)
24-24: Use markdown link syntax for URLs.The bare URL should be wrapped in angle brackets or converted to a markdown link for better formatting.
📝 Proposed fix
- - In the **Package URL** search box, enter: https://github.com/appwrite/sdk-for-apple + - In the **Package URL** search box, enter: <https://github.com/appwrite/sdk-for-apple>src/routes/docs/quick-starts/dotnet/prompt.md (1)
6-16: Improve markdown formatting for better rendering.The documentation has minor markdown formatting issues: bare URL at line 6 and tables that should be surrounded by blank lines.
📝 Proposed fixes
- Head to the Appwrite Console (https://cloud.appwrite.io/console). + - Head to the Appwrite Console (<https://cloud.appwrite.io/console>). - If this is the user's first time, guide them to create an account and create their first project. - Under **Integrate with your server**, add an **API Key** with the following scopes: + | Category | Required scopes | Purpose | |-----------|-----------------------|---------| | Database | `databases.write` | Allows API key to create, update, and delete databases. | | | `tables.write` | Allows API key to create, update, and delete tables. | | | `columns.write` | Allows API key to create, update, and delete columns. | | | `rows.read` | Allows API key to read rows. | | | `rows.write` | Allows API key to create, update, and delete rows. | + - Other scopes are optional.src/routes/docs/quick-starts/react/prompt.md (2)
22-31: Clarify TypeScript support or remove .ts references.The documentation mentions creating
src/lib/appwrite.js (or .ts)but the code snippet only shows JavaScript syntax. If TypeScript is supported, consider adding a TypeScript code example or notes about type imports. Otherwise, remove the(or .ts)references to avoid confusion.
52-52: Wrap URL in code formatting.The bare URL should be formatted for consistency with markdown best practices.
📝 Suggested fix
- - Open: http://localhost:3000 + - Open: `http://localhost:3000`src/routes/docs/quick-starts/solid/prompt.md (4)
7-10: Consider consistency with other quick-start guides.This guide begins with Appwrite Console setup, while the React guide (and potentially others) defers this to step 3 where it asks for region/project ID. For a consistent user experience across all framework quick-starts, consider aligning the structure.
8-8: Wrap URL in code formatting.📝 Suggested fix
- - Guide the user to head to the Appwrite Console (https://cloud.appwrite.io/console). + - Guide the user to head to the Appwrite Console (`https://cloud.appwrite.io/console`).
133-133: Wrap URL in code formatting.📝 Suggested fix
- - Open: http://localhost:3000 + - Open: `http://localhost:3000`
135-135: Use hyphenated compound modifier.The phrase "auto login" should be hyphenated when used as a compound modifier.
📝 Suggested fix
- - Register a new user and auto login works + - Register a new user and auto-login workssrc/routes/docs/quick-starts/sveltekit/prompt.md (2)
109-109: Wrap URL in code formatting.📝 Suggested fix
- - Open: http://localhost:5173 + - Open: `http://localhost:5173`
111-111: Use hyphenated compound modifier.📝 Suggested fix
- - Register a new user and auto login works + - Register a new user and auto-login workssrc/routes/docs/quick-starts/ruby/prompt.md (1)
6-6: Wrap URL in code formatting.📝 Suggested fix
- - Guide the user to the Appwrite Console (https://cloud.appwrite.io/console) + - Guide the user to the Appwrite Console (`https://cloud.appwrite.io/console`)src/routes/docs/quick-starts/nuxt/prompt.md (3)
20-32: Consider consistent file paths across framework guides.This guide uses
utils/appwrite.jswhile other framework guides (React, Solid, SvelteKit) usesrc/lib/appwrite.js. While Nuxt conventions may differ, consider whether alignment would improve cross-framework consistency for users learning multiple platforms.
105-105: Wrap URL in code formatting.📝 Suggested fix
- - Open: http://localhost:3000 + - Open: `http://localhost:3000`
107-107: Use hyphenated compound modifier.📝 Suggested fix
- - Register a new user and auto login works + - Register a new user and auto-login workssrc/routes/docs/quick-starts/android/prompt.md (1)
199-209: Consider auto-login after successful registration.After successful registration, the user must manually log in. For better user experience, consider automatically logging in the user after registration, similar to the Angular example (angular/prompt.md line 106).
✨ Proposed enhancement
Button(onClick = { coroutineScope.launch { try { Appwrite.onRegister(email, password) + Appwrite.onLogin(email, password) + user = email } catch (e: Exception) { e.printStackTrace() } } }) { Text("Register") }
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (25)
src/routes/docs/quick-starts/android-java/prompt.mdsrc/routes/docs/quick-starts/android/prompt.mdsrc/routes/docs/quick-starts/angular/prompt.mdsrc/routes/docs/quick-starts/apple/prompt.mdsrc/routes/docs/quick-starts/dart/prompt.mdsrc/routes/docs/quick-starts/deno/prompt.mdsrc/routes/docs/quick-starts/dotnet/prompt.mdsrc/routes/docs/quick-starts/flutter/prompt.mdsrc/routes/docs/quick-starts/go/prompt.mdsrc/routes/docs/quick-starts/kotlin/prompt.mdsrc/routes/docs/quick-starts/nextjs/prompt.mdsrc/routes/docs/quick-starts/node/prompt.mdsrc/routes/docs/quick-starts/nuxt/prompt.mdsrc/routes/docs/quick-starts/php/prompt.mdsrc/routes/docs/quick-starts/python/prompt.mdsrc/routes/docs/quick-starts/react-native/prompt.mdsrc/routes/docs/quick-starts/react/prompt.mdsrc/routes/docs/quick-starts/refine/prompt.mdsrc/routes/docs/quick-starts/ruby/prompt.mdsrc/routes/docs/quick-starts/solid/prompt.mdsrc/routes/docs/quick-starts/sveltekit/prompt.mdsrc/routes/docs/quick-starts/swift/prompt.mdsrc/routes/docs/quick-starts/tanstack-start/prompt.mdsrc/routes/docs/quick-starts/vue/prompt.mdsrc/routes/docs/quick-starts/web/prompt.md
🧰 Additional context used
🧠 Learnings (5)
📓 Common learnings
Learnt from: atharvadeosthale
Repo: appwrite/website PR: 2614
File: src/routes/docs/products/sites/one-click-deployment/+page.markdoc:74-122
Timestamp: 2025-11-18T21:53:20.905Z
Learning: Appwrite Sites one-click deployment supports the following framework presets: Analog (analog), Angular (angular), Next.js (nextjs), React (react), Nuxt (nuxt), Vue (vue), SvelteKit (sveltekit), Astro (astro), TanStack Start (tanstack-start), Remix (remix), Lynx (lynx), Flutter (flutter), React Native (react-native), Vite (vite), and Other (other).
📚 Learning: 2025-09-05T19:35:04.162Z
Learnt from: ebenezerdon
Repo: appwrite/website PR: 2372
File: src/routes/docs/tutorials/nuxt/step-6/+page.markdoc:79-83
Timestamp: 2025-09-05T19:35:04.162Z
Learning: In Nuxt tutorial files, the correct Appwrite database instance to use is `tablesDB` (imported from "~/appwrite"), not `database`. All tablesDB method calls should use the object parameter format: listRows({ databaseId, tableId, queries }), createRow({ databaseId, tableId, rowId, data }), and deleteRow({ databaseId, tableId, rowId }).
Applied to files:
src/routes/docs/quick-starts/node/prompt.md
📚 Learning: 2025-09-05T19:35:59.449Z
Learnt from: ebenezerdon
Repo: appwrite/website PR: 2372
File: src/routes/docs/tutorials/react-native/step-6/+page.markdoc:67-73
Timestamp: 2025-09-05T19:35:59.449Z
Learning: In React Native tutorials, the lib/appwrite.js file exports `tablesDB` (not `databases`), so imports should use `import { tablesDB } from "../lib/appwrite"` to match the export pattern established in step-3.
Applied to files:
src/routes/docs/quick-starts/node/prompt.md
📚 Learning: 2025-09-05T19:35:53.943Z
Learnt from: ebenezerdon
Repo: appwrite/website PR: 2372
File: src/routes/docs/tutorials/react/step-6/+page.markdoc:70-75
Timestamp: 2025-09-05T19:35:53.943Z
Learning: In React tutorial files, the correct Appwrite database instance to import is `tablesDB` from "../appwrite", not `databases`. The import statement should be `import { tablesDB } from "../appwrite"` to match the usage throughout the React tutorial code.
Applied to files:
src/routes/docs/quick-starts/node/prompt.mdsrc/routes/docs/quick-starts/web/prompt.md
📚 Learning: 2025-11-18T21:53:20.905Z
Learnt from: atharvadeosthale
Repo: appwrite/website PR: 2614
File: src/routes/docs/products/sites/one-click-deployment/+page.markdoc:74-122
Timestamp: 2025-11-18T21:53:20.905Z
Learning: Appwrite Sites one-click deployment supports the following framework presets: Analog (analog), Angular (angular), Next.js (nextjs), React (react), Nuxt (nuxt), Vue (vue), SvelteKit (sveltekit), Astro (astro), TanStack Start (tanstack-start), Remix (remix), Lynx (lynx), Flutter (flutter), React Native (react-native), Vite (vite), and Other (other).
Applied to files:
src/routes/docs/quick-starts/react/prompt.mdsrc/routes/docs/quick-starts/refine/prompt.md
🪛 LanguageTool
src/routes/docs/quick-starts/android/prompt.md
[grammar] ~234-~234: Ensure spelling is correct
Context: ... - Login with the registered user - Logout - Surface any Appwrite errors and fix by g...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
src/routes/docs/quick-starts/nuxt/prompt.md
[grammar] ~107-~107: Use a hyphen to join words.
Context: ...: - Register a new user and auto login works - Logout then login ...
(QB_NEW_EN_HYPHEN)
src/routes/docs/quick-starts/sveltekit/prompt.md
[grammar] ~111-~111: Use a hyphen to join words.
Context: ...: - Register a new user and auto login works - Logout then login ...
(QB_NEW_EN_HYPHEN)
src/routes/docs/quick-starts/vue/prompt.md
[grammar] ~110-~110: Use a hyphen to join words.
Context: ...: - Register a new user and auto login works - Logout then login ...
(QB_NEW_EN_HYPHEN)
src/routes/docs/quick-starts/solid/prompt.md
[grammar] ~135-~135: Use a hyphen to join words.
Context: ...: - Register a new user and auto login works - Logout then login ...
(QB_NEW_EN_HYPHEN)
src/routes/docs/quick-starts/tanstack-start/prompt.md
[grammar] ~120-~120: Use a hyphen to join words.
Context: ...: - Register a new user and auto login works - Logout then login ...
(QB_NEW_EN_HYPHEN)
🪛 markdownlint-cli2 (0.18.1)
src/routes/docs/quick-starts/angular/prompt.md
124-124: Bare URL used
(MD034, no-bare-urls)
src/routes/docs/quick-starts/flutter/prompt.md
6-6: Bare URL used
(MD034, no-bare-urls)
9-9: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
src/routes/docs/quick-starts/dotnet/prompt.md
6-6: Bare URL used
(MD034, no-bare-urls)
9-9: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
15-15: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
src/routes/docs/quick-starts/nuxt/prompt.md
6-6: Bare URL used
(MD034, no-bare-urls)
8-8: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
14-14: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
src/routes/docs/quick-starts/apple/prompt.md
24-24: Bare URL used
(MD034, no-bare-urls)
src/routes/docs/quick-starts/node/prompt.md
14-14: Bare URL used
(MD034, no-bare-urls)
src/routes/docs/quick-starts/web/prompt.md
8-8: Bare URL used
(MD034, no-bare-urls)
108-108: Bare URL used
(MD034, no-bare-urls)
src/routes/docs/quick-starts/react/prompt.md
52-52: Bare URL used
(MD034, no-bare-urls)
src/routes/docs/quick-starts/kotlin/prompt.md
6-6: Bare URL used
(MD034, no-bare-urls)
9-9: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
15-15: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
src/routes/docs/quick-starts/sveltekit/prompt.md
109-109: Bare URL used
(MD034, no-bare-urls)
src/routes/docs/quick-starts/refine/prompt.md
8-8: Bare URL used
(MD034, no-bare-urls)
23-23: Bare URL used
(MD034, no-bare-urls)
27-27: Bare URL used
(MD034, no-bare-urls)
140-140: Bare URL used
(MD034, no-bare-urls)
src/routes/docs/quick-starts/go/prompt.md
6-6: Bare URL used
(MD034, no-bare-urls)
9-9: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
15-15: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
src/routes/docs/quick-starts/swift/prompt.md
8-8: Bare URL used
(MD034, no-bare-urls)
133-133: Bare URL used
(MD034, no-bare-urls)
src/routes/docs/quick-starts/solid/prompt.md
118-118: Bare URL used
(MD034, no-bare-urls)
src/routes/docs/quick-starts/php/prompt.md
6-6: Bare URL used
(MD034, no-bare-urls)
9-9: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
src/routes/docs/quick-starts/ruby/prompt.md
6-6: Bare URL used
(MD034, no-bare-urls)
src/routes/docs/quick-starts/nextjs/prompt.md
8-8: Bare URL used
(MD034, no-bare-urls)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
- GitHub Check: tests
- GitHub Check: assets
- GitHub Check: build
🔇 Additional comments (16)
src/routes/docs/quick-starts/dart/prompt.md (1)
167-167: Verify the command path matches the project structure.The run command uses
dart run bin/my_app.dart, but based on the Dart project structure created in step 1, this should work correctly. However, since step 1 instructs to remove thelib/andtest/directories, ensure this is intentional and that the user understands they're building a minimal console application.src/routes/docs/quick-starts/react-native/prompt.md (2)
9-11: Excellent improvement for flexible project integration.The updated step now handles both new and existing projects gracefully, reducing friction for developers who want to add Appwrite to an existing app.
37-39: Good conditional guidance for UI wiring.The added guidance helps developers choose the appropriate approach based on their project state, preventing accidental override of important routes in existing projects.
src/routes/docs/quick-starts/tanstack-start/prompt.md (1)
7-11: Excellent directory safety checks.The logic to detect non-development files in the working directory helps prevent accidental scaffolding in inappropriate locations (e.g., user's Downloads or Documents folder). This is a thoughtful UX improvement.
src/routes/docs/quick-starts/kotlin/prompt.md (2)
5-5: Helpful clarification for SDK selection.The note distinguishing between the Kotlin Server SDK and Android client SDK helps prevent confusion and guides users to the appropriate quick-start.
78-85: No action needed—the parameter name is correct.
defaultis not a reserved keyword in Kotlin and is the correct parameter name for the Appwrite Kotlin SDK'screateStringColumnmethod. The code example is accurate.Likely an incorrect or invalid review comment.
src/routes/docs/quick-starts/dotnet/prompt.md (2)
141-144: Fix method naming to follow C# PascalCase conventions.The method call uses camelCase (
listRows) but C# methods follow PascalCase naming conventions. The correct method name should beListRows.🔧 Proposed fix
- var todos = await tablesDB.listRows( + var todos = await tablesDB.ListRows( databaseId: todoDatabase.Id, tableId: todoTable.Id );⛔ Skipped due to learnings
Learnt from: ebenezerdon Repo: appwrite/website PR: 2372 File: src/routes/docs/tutorials/nuxt/step-6/+page.markdoc:79-83 Timestamp: 2025-09-05T19:35:04.162Z Learning: In Nuxt tutorial files, the correct Appwrite database instance to use is `tablesDB` (imported from "~/appwrite"), not `database`. All tablesDB method calls should use the object parameter format: listRows({ databaseId, tableId, queries }), createRow({ databaseId, tableId, rowId, data }), and deleteRow({ databaseId, tableId, rowId }).
23-23: Version0.13.0of the Appwrite .NET SDK is valid, publicly available on NuGet, and has no known security advisories.src/routes/docs/quick-starts/python/prompt.md (1)
39-39: Upgrade Appwrite Python SDK to version 14.1.0 — version 13.6.1 has known security vulnerabilities.Version
13.6.1is flagged by SafetyDB with documented vulnerabilities (including CVE-2024-1063 and CVE-2023-50974). Update the pin topip install appwrite==14.1.0(released December 2025, latest stable).src/routes/docs/quick-starts/apple/prompt.md (1)
25-25: Update SDK version to latest release in quick-start guide.Version
10.1.0is outdated; the latest Appwrite Apple SDK is v13.4.0 (released 2025). Update the quick-start instructions to use a current version to prevent users from starting with obsolete dependencies and missing critical features or improvements across 3+ major versions.⛔ Skipped due to learnings
Learnt from: stnguyen90 Repo: appwrite/website PR: 2520 File: src/routes/docs/advanced/self-hosting/production/updates/+page.markdoc:13-15 Timestamp: 2025-10-24T22:17:14.669Z Learning: In Appwrite versioning, RC (Release Candidate) versions like `1.6.2-RC1` come before the stable release `1.6.2`. Documentation should recommend upgrading to stable versions, not RC versions.src/routes/docs/quick-starts/nextjs/prompt.md (2)
7-12: Excellent improvement to project setup flow.The added logic to check for non-development files and ask the user before proceeding is a thoughtful UX improvement. This prevents accidentally creating projects in inappropriate directories while still allowing flexibility.
36-37: Good distinction between fresh and existing projects.The conditional routing logic (replace
app/page.jsfor fresh projects vs. createapp/auth/page.jsfor existing) properly respects the user's existing codebase.src/routes/docs/quick-starts/android-java/prompt.md (2)
64-126: Well-structured singleton pattern with proper callbacks.The
AppwriteHelperclass demonstrates good practices:
- Singleton pattern with thread-safe initialization
- Clean callback interface for async operations
- Proper error propagation
256-282: Good UI thread handling and error management.The login method properly handles:
- Input validation
- UI thread updates with
runOnUiThread- User feedback via Toast messages
- Error logging
src/routes/docs/quick-starts/go/prompt.md (1)
42-42: Fix the import casing: use lowercasetablesdb.The import path should be
github.com/appwrite/sdk-for-go/tablesdb(lowercase), nottablesDB. Go package names follow lowercase conventions.⛔ Skipped due to learnings
Learnt from: ebenezerdon Repo: appwrite/website PR: 2372 File: src/routes/docs/tutorials/react/step-6/+page.markdoc:70-75 Timestamp: 2025-09-05T19:35:53.943Z Learning: In React tutorial files, the correct Appwrite database instance to import is `tablesDB` from "../appwrite", not `databases`. The import statement should be `import { tablesDB } from "../appwrite"` to match the usage throughout the React tutorial code.Learnt from: ebenezerdon Repo: appwrite/website PR: 2372 File: src/routes/docs/tutorials/react-native/step-6/+page.markdoc:67-73 Timestamp: 2025-09-05T19:35:59.449Z Learning: In React Native tutorials, the lib/appwrite.js file exports `tablesDB` (not `databases`), so imports should use `import { tablesDB } from "../lib/appwrite"` to match the export pattern established in step-3.Learnt from: ebenezerdon Repo: appwrite/website PR: 2372 File: src/routes/docs/tutorials/react-native/step-6/+page.markdoc:67-73 Timestamp: 2025-09-05T19:35:59.449Z Learning: In React Native tutorials, the lib/appwrite.js file exports `tablesDB` (not `databases`), so imports should use `import { tablesDB } from "../lib/appwrite"` to match the export pattern established in step-3.Learnt from: ebenezerdon Repo: appwrite/website PR: 2372 File: src/routes/docs/tutorials/nuxt/step-6/+page.markdoc:79-83 Timestamp: 2025-09-05T19:35:04.162Z Learning: In Nuxt tutorial files, the correct Appwrite database instance to use is `tablesDB` (imported from "~/appwrite"), not `database`. All tablesDB method calls should use the object parameter format: listRows({ databaseId, tableId, queries }), createRow({ databaseId, tableId, rowId, data }), and deleteRow({ databaseId, tableId, rowId }).src/routes/docs/quick-starts/flutter/prompt.md (1)
68-68: Update the Flutter SDK version to the latest stable release.Line 68 specifies
appwrite:17.0.0, but the latest stable version is20.3.3(released January 14, 2026). Update the version reference to ensure users install the current SDK.⛔ Skipped due to learnings
Learnt from: stnguyen90 Repo: appwrite/website PR: 2520 File: src/routes/docs/advanced/self-hosting/production/updates/+page.markdoc:13-15 Timestamp: 2025-10-24T22:17:14.669Z Learning: In Appwrite versioning, RC (Release Candidate) versions like `1.6.2-RC1` come before the stable release `1.6.2`. Documentation should recommend upgrading to stable versions, not RC versions.
✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.
| if (user.isNotEmpty()) { | ||
| Column( | ||
| modifier = Modifier.fillMaxSize(), | ||
| horizontalAlignment = Alignment.CenterHorizontally, | ||
| verticalArrangement = Arrangement.Center | ||
| ) { | ||
| Text(text = "Logged in as $user") | ||
| Button(onClick = { | ||
| coroutineScope.launch { | ||
| Appwrite.onLogout() | ||
| } | ||
| }) { | ||
| Text("Logout") | ||
| } | ||
| } | ||
| } | ||
|
|
||
| Column( | ||
| modifier = Modifier.fillMaxSize(), | ||
| horizontalAlignment = Alignment.CenterHorizontally, | ||
| verticalArrangement = Arrangement.Center | ||
| ) { | ||
| TextField( | ||
| value = email, | ||
| onValueChange = { email = it }, | ||
| label = { Text("Username") }, | ||
| modifier = Modifier | ||
| .fillMaxWidth() | ||
| .padding(16.dp) | ||
| ) | ||
| TextField( | ||
| value = password, | ||
| onValueChange = { password = it }, | ||
| label = { Text("Password") }, | ||
| modifier = Modifier | ||
| .fillMaxWidth() | ||
| .padding(16.dp), | ||
| visualTransformation = PasswordVisualTransformation(), | ||
| keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password) | ||
| ) | ||
| Row( | ||
| modifier = Modifier | ||
| .fillMaxWidth() | ||
| .padding(16.dp), | ||
| horizontalArrangement = Arrangement.SpaceBetween | ||
| ) { | ||
| Button(onClick = { | ||
| coroutineScope.launch { | ||
| try { | ||
| Appwrite.onLogin(email, password) | ||
|
|
||
| user = email | ||
| } catch (e: Exception) { | ||
| e.printStackTrace() | ||
| } | ||
| } | ||
| }) { | ||
| Text("Login") | ||
| } | ||
| Button(onClick = { | ||
| coroutineScope.launch { | ||
| try { | ||
| Appwrite.onRegister(email, password) | ||
| } catch (e: Exception) { | ||
| e.printStackTrace() | ||
| } | ||
| } | ||
| }) { | ||
| Text("Register") | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Login form always visible, causing UI overlap.
The logged-in UI (lines 140-155) displays when user.isNotEmpty(), but the login form (lines 157-211) is always rendered. This results in both the "Logged in as..." message and the login form appearing simultaneously when a user is authenticated.
🎨 Proposed fix to show only one UI state
var email by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") }
if (user.isNotEmpty()) {
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Text(text = "Logged in as $user")
Button(onClick = {
coroutineScope.launch {
Appwrite.onLogout()
+ user = ""
}
}) {
Text("Logout")
}
}
- }
-
- Column(
+ } else {
+ Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
TextField(
value = email,
onValueChange = { email = it },
label = { Text("Username") },
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
)
TextField(
value = password,
onValueChange = { password = it },
label = { Text("Password") },
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
visualTransformation = PasswordVisualTransformation(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password)
)
Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
horizontalArrangement = Arrangement.SpaceBetween
) {
Button(onClick = {
coroutineScope.launch {
try {
Appwrite.onLogin(email, password)
user = email
} catch (e: Exception) {
e.printStackTrace()
}
}
}) {
Text("Login")
}
Button(onClick = {
coroutineScope.launch {
try {
Appwrite.onRegister(email, password)
} catch (e: Exception) {
e.printStackTrace()
}
}
}) {
Text("Register")
}
}
+ }
}
}
}
}
}
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| if (user.isNotEmpty()) { | |
| Column( | |
| modifier = Modifier.fillMaxSize(), | |
| horizontalAlignment = Alignment.CenterHorizontally, | |
| verticalArrangement = Arrangement.Center | |
| ) { | |
| Text(text = "Logged in as $user") | |
| Button(onClick = { | |
| coroutineScope.launch { | |
| Appwrite.onLogout() | |
| } | |
| }) { | |
| Text("Logout") | |
| } | |
| } | |
| } | |
| Column( | |
| modifier = Modifier.fillMaxSize(), | |
| horizontalAlignment = Alignment.CenterHorizontally, | |
| verticalArrangement = Arrangement.Center | |
| ) { | |
| TextField( | |
| value = email, | |
| onValueChange = { email = it }, | |
| label = { Text("Username") }, | |
| modifier = Modifier | |
| .fillMaxWidth() | |
| .padding(16.dp) | |
| ) | |
| TextField( | |
| value = password, | |
| onValueChange = { password = it }, | |
| label = { Text("Password") }, | |
| modifier = Modifier | |
| .fillMaxWidth() | |
| .padding(16.dp), | |
| visualTransformation = PasswordVisualTransformation(), | |
| keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password) | |
| ) | |
| Row( | |
| modifier = Modifier | |
| .fillMaxWidth() | |
| .padding(16.dp), | |
| horizontalArrangement = Arrangement.SpaceBetween | |
| ) { | |
| Button(onClick = { | |
| coroutineScope.launch { | |
| try { | |
| Appwrite.onLogin(email, password) | |
| user = email | |
| } catch (e: Exception) { | |
| e.printStackTrace() | |
| } | |
| } | |
| }) { | |
| Text("Login") | |
| } | |
| Button(onClick = { | |
| coroutineScope.launch { | |
| try { | |
| Appwrite.onRegister(email, password) | |
| } catch (e: Exception) { | |
| e.printStackTrace() | |
| } | |
| } | |
| }) { | |
| Text("Register") | |
| } | |
| } | |
| } | |
| if (user.isNotEmpty()) { | |
| Column( | |
| modifier = Modifier.fillMaxSize(), | |
| horizontalAlignment = Alignment.CenterHorizontally, | |
| verticalArrangement = Arrangement.Center | |
| ) { | |
| Text(text = "Logged in as $user") | |
| Button(onClick = { | |
| coroutineScope.launch { | |
| Appwrite.onLogout() | |
| user = "" | |
| } | |
| }) { | |
| Text("Logout") | |
| } | |
| } | |
| } else { | |
| Column( | |
| modifier = Modifier.fillMaxSize(), | |
| horizontalAlignment = Alignment.CenterHorizontally, | |
| verticalArrangement = Arrangement.Center | |
| ) { | |
| TextField( | |
| value = email, | |
| onValueChange = { email = it }, | |
| label = { Text("Username") }, | |
| modifier = Modifier | |
| .fillMaxWidth() | |
| .padding(16.dp) | |
| ) | |
| TextField( | |
| value = password, | |
| onValueChange = { password = it }, | |
| label = { Text("Password") }, | |
| modifier = Modifier | |
| .fillMaxWidth() | |
| .padding(16.dp), | |
| visualTransformation = PasswordVisualTransformation(), | |
| keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password) | |
| ) | |
| Row( | |
| modifier = Modifier | |
| .fillMaxWidth() | |
| .padding(16.dp), | |
| horizontalArrangement = Arrangement.SpaceBetween | |
| ) { | |
| Button(onClick = { | |
| coroutineScope.launch { | |
| try { | |
| Appwrite.onLogin(email, password) | |
| user = email | |
| } catch (e: Exception) { | |
| e.printStackTrace() | |
| } | |
| } | |
| }) { | |
| Text("Login") | |
| } | |
| Button(onClick = { | |
| coroutineScope.launch { | |
| try { | |
| Appwrite.onRegister(email, password) | |
| } catch (e: Exception) { | |
| e.printStackTrace() | |
| } | |
| } | |
| }) { | |
| Text("Register") | |
| } | |
| } | |
| } | |
| } |
🤖 Prompt for AI Agents
In `@src/routes/docs/quick-starts/android/prompt.md` around lines 140 - 211, The
login form Column is always rendered even when a user is authenticated; change
the UI so only one state shows by converting the current separate if
(user.isNotEmpty()) { /* logged-in Column */ } and the subsequent standalone
Column (login form) into an if/else or otherwise render the login form only when
user.isEmpty(); locate the first Column guarded by user.isNotEmpty() and wrap
the second Column (the TextField/Row with Buttons and the coroutineScope.launch
calls to Appwrite.onLogin/Appwrite.onRegister) inside the else branch so the
logged-in message and the login form cannot appear simultaneously.
| async register(email: string, password: string, name: string) { | ||
| await account.create({ | ||
| userId: ID.unique(), | ||
| email, | ||
| password, | ||
| name | ||
| }); | ||
| this.login(email, password); | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Missing await on login call in register method.
Line 106 calls this.login(email, password) without awaiting it. Since login is an async function, this could lead to race conditions or the user interface not updating correctly after registration.
⚡ Proposed fix
async register(email: string, password: string, name: string) {
await account.create({
userId: ID.unique(),
email,
password,
name
});
- this.login(email, password);
+ await this.login(email, password);
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| async register(email: string, password: string, name: string) { | |
| await account.create({ | |
| userId: ID.unique(), | |
| email, | |
| password, | |
| name | |
| }); | |
| this.login(email, password); | |
| } | |
| async register(email: string, password: string, name: string) { | |
| await account.create({ | |
| userId: ID.unique(), | |
| email, | |
| password, | |
| name | |
| }); | |
| await this.login(email, password); | |
| } |
🤖 Prompt for AI Agents
In `@src/routes/docs/quick-starts/angular/prompt.md` around lines 99 - 107, The
register method calls the async login(email, password) without awaiting it,
risking race conditions; update register (the async register method) to await
the login call (await this.login(email, password)) so the registration flow
completes only after login finishes and UI/state updates reliably; ensure any
returned value from login is handled or returned if callers expect it.
| var databases; | ||
| var todoDatabase; | ||
| var todoTable; | ||
|
|
||
| Future<void> prepareDatabase() async { | ||
| tablesDB = TablesDB(client); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix variable naming inconsistency.
Line 44 declares var databases; but Line 49 initializes tablesDB = TablesDB(client);. This creates an unused databases variable and leaves tablesDB undeclared globally, which will cause a runtime error.
🐛 Proposed fix
-var databases;
+var tablesDB;
var todoDatabase;
var todoTable;
Future<void> prepareDatabase() async {
tablesDB = TablesDB(client);📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| var databases; | |
| var todoDatabase; | |
| var todoTable; | |
| Future<void> prepareDatabase() async { | |
| tablesDB = TablesDB(client); | |
| var tablesDB; | |
| var todoDatabase; | |
| var todoTable; | |
| Future<void> prepareDatabase() async { | |
| tablesDB = TablesDB(client); |
🤖 Prompt for AI Agents
In `@src/routes/docs/quick-starts/dart/prompt.md` around lines 44 - 49, The file
declares an unused variable "databases" while later assigning to an undeclared
"tablesDB", causing a runtime error; remove the unused "databases" declaration
and declare "tablesDB" before use (e.g., var tablesDB; or TablesDB tablesDB;) so
that the existing assignment tablesDB = TablesDB(client); refers to a defined
variable; keep the existing todoDatabase and todoTable declarations as needed.
| await tablesDB.createRow( | ||
| databaseId: todoDatabase.Id, | ||
| tableId: todoTable.Id, | ||
| rowId: ID.Unique(), | ||
| data: testTodo1 | ||
| ); | ||
|
|
||
| await tablesDB.createRow( | ||
| databaseId: todoDatabase.Id, | ||
| tableId: todoTable.Id, | ||
| rowId: ID.Unique(), | ||
| data: testTodo2 | ||
| ); | ||
|
|
||
| await tablesDB.createRow( | ||
| databaseId: todoDatabase.Id, | ||
| tableId: todoTable.Id, | ||
| rowId: ID.Unique(), | ||
| data: testTodo3 | ||
| ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix method naming to follow C# PascalCase conventions.
The method calls use camelCase (createRow) but C# methods follow PascalCase naming conventions. The correct method name should be CreateRow.
🔧 Proposed fix
- await tablesDB.createRow(
+ await tablesDB.CreateRow(
databaseId: todoDatabase.Id,
tableId: todoTable.Id,
rowId: ID.Unique(),
data: testTodo1
);
- await tablesDB.createRow(
+ await tablesDB.CreateRow(
databaseId: todoDatabase.Id,
tableId: todoTable.Id,
rowId: ID.Unique(),
data: testTodo2
);
- await tablesDB.createRow(
+ await tablesDB.CreateRow(
databaseId: todoDatabase.Id,
tableId: todoTable.Id,
rowId: ID.Unique(),
data: testTodo3
);📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| await tablesDB.createRow( | |
| databaseId: todoDatabase.Id, | |
| tableId: todoTable.Id, | |
| rowId: ID.Unique(), | |
| data: testTodo1 | |
| ); | |
| await tablesDB.createRow( | |
| databaseId: todoDatabase.Id, | |
| tableId: todoTable.Id, | |
| rowId: ID.Unique(), | |
| data: testTodo2 | |
| ); | |
| await tablesDB.createRow( | |
| databaseId: todoDatabase.Id, | |
| tableId: todoTable.Id, | |
| rowId: ID.Unique(), | |
| data: testTodo3 | |
| ); | |
| await tablesDB.CreateRow( | |
| databaseId: todoDatabase.Id, | |
| tableId: todoTable.Id, | |
| rowId: ID.Unique(), | |
| data: testTodo1 | |
| ); | |
| await tablesDB.CreateRow( | |
| databaseId: todoDatabase.Id, | |
| tableId: todoTable.Id, | |
| rowId: ID.Unique(), | |
| data: testTodo2 | |
| ); | |
| await tablesDB.CreateRow( | |
| databaseId: todoDatabase.Id, | |
| tableId: todoTable.Id, | |
| rowId: ID.Unique(), | |
| data: testTodo3 | |
| ); |
🤖 Prompt for AI Agents
In `@src/routes/docs/quick-starts/dotnet/prompt.md` around lines 115 - 134, The
calls to tablesDB.createRow use camelCase but C# methods should be PascalCase;
update each invocation (tablesDB.createRow) to use tablesDB.CreateRow and ensure
any other occurrences (e.g., CreateRow overloads or references) are updated
consistently so the method resolves correctly at compile time.
| await widget.account.createEmailPasswordSession({ | ||
| email: email, | ||
| password: password | ||
| }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
# Search for Flutter SDK examples or documentation in the repository
find . -type f -name "*.md" -o -name "*.dart" | xargs grep -l "createEmailPasswordSession" | head -20Repository: appwrite/website
Length of output: 746
🏁 Script executed:
# Look for Flutter-specific documentation or SDK reference
fd -e md -e dart | xargs grep -l "flutter" | head -10Repository: appwrite/website
Length of output: 147
🏁 Script executed:
# Search for any Appwrite SDK documentation about method syntax
rg "createEmailPasswordSession" -A 3 -B 3 --max-count 20Repository: appwrite/website
Length of output: 50374
🏁 Script executed:
sed -n '114,117p' src/routes/docs/quick-starts/flutter/prompt.mdRepository: appwrite/website
Length of output: 198
🏁 Script executed:
# Also check the markdoc version for comparison
sed -n '114,117p' src/routes/docs/quick-starts/flutter/+page.markdocRepository: appwrite/website
Length of output: 425
🏁 Script executed:
# Find the flutter createEmailPasswordSession code in the markdoc file
grep -n "createEmailPasswordSession" src/routes/docs/quick-starts/flutter/+page.markdocRepository: appwrite/website
Length of output: 117
🏁 Script executed:
# Compare the official Flutter SDK documentation syntax from a known Appwrite source
# Search for all Flutter examples in the repository
rg "client-flutter" -A 10 "createEmailPasswordSession" src/routes/docs/products/auth/Repository: appwrite/website
Length of output: 50458
Fix Flutter syntax: remove curly braces from method call.
The Flutter SDK uses named parameters without curly braces. The correct syntax is:
await widget.account.createEmailPasswordSession(
email: email,
password: password
);Remove the curly braces { } around the parameters—they are not used in Dart method calls.
🤖 Prompt for AI Agents
In `@src/routes/docs/quick-starts/flutter/prompt.md` around lines 114 - 117, The
call to widget.account.createEmailPasswordSession incorrectly uses curly braces
around parameters (JavaScript/JSON style); change it to a normal Dart method
call by removing the { } so the named parameters are passed directly inside the
parentheses to createEmailPasswordSession (reference:
widget.account.createEmailPasswordSession).
| databaseId: todoDatabase!.id as! String, | ||
| tableId: todoTable!.id as! String, | ||
| key: "description", | ||
| size: 255, | ||
| xrequired: false, | ||
| xdefault: "This is a test description." | ||
| ) | ||
| try? await tablesDB.createBooleanColumn( | ||
| databaseId: todoDatabase!.id as! String, | ||
| tableId: todoTable!.id as! String, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove unnecessary and potentially unsafe type casts.
Lines 70-71 and 78-79 use forced type casting (as! String) on todoDatabase!.id and todoTable!.id. If these properties are already of type String, the cast is redundant. If they're not, forced casting can cause runtime crashes.
♻️ Proposed fix
try? await tablesDB.createStringColumn(
- databaseId: todoDatabase!.id as! String,
- tableId: todoTable!.id as! String,
+ databaseId: todoDatabase!.id,
+ tableId: todoTable!.id,
key: "description",
size: 255,
xrequired: false,
xdefault: "This is a test description."
)
try? await tablesDB.createBooleanColumn(
- databaseId: todoDatabase!.id as! String,
- tableId: todoTable!.id as! String,
+ databaseId: todoDatabase!.id,
+ tableId: todoTable!.id,
key: "isComplete",
xrequired: true
)Apply the same fix to lines 137-138.
What is the type of the id property on Database and Table models in Appwrite Swift SDK version 10.0.0?
🤖 Prompt for AI Agents
In `@src/routes/docs/quick-starts/swift/prompt.md` around lines 70 - 79, Remove
the unnecessary forced casts and unsafe force-unwrapping around todoDatabase!.id
and todoTable!.id: stop using "as! String" and avoid force-unwrapping; instead
use the id property directly (if it’s already a String) or safely unwrap with
guard/if let before calling tablesDB.createTextColumn /
tablesDB.createBooleanColumn (and any other create*Column calls shown), and
apply the same change to the later occurrences referenced at lines 137-138 so
all calls use safe/unwrapped ids (refer to todoDatabase, todoTable,
createTextColumn, createBooleanColumn).
| databaseId: todoDatabase!.id as! String, | ||
| tableId: todoTable!.id as! String |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same type casting issue in getTodos function.
The same unnecessary type casting appears here. Should be consistent with the fix applied to the prepareDatabase function.
♻️ Proposed fix
let todos = try? await tablesDB.listRows(
- databaseId: todoDatabase!.id as! String,
- tableId: todoTable!.id as! String
+ databaseId: todoDatabase!.id,
+ tableId: todoTable!.id
)📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| databaseId: todoDatabase!.id as! String, | |
| tableId: todoTable!.id as! String | |
| databaseId: todoDatabase!.id, | |
| tableId: todoTable!.id |
🤖 Prompt for AI Agents
In `@src/routes/docs/quick-starts/swift/prompt.md` around lines 137 - 138, The
getTodos function contains unnecessary forced casts (databaseId:
todoDatabase!.id as! String, tableId: todoTable!.id as! String); remove the
forced as! String casts and mirror the prepareDatabase fix by passing the id
values directly (or safely unwrapping them first) e.g. use todoDatabase!.id and
todoTable!.id or guard-let unwrap todoDatabase and todoTable and then use their
.id properties without casting.
| - Run: npm run dev -- --open --port 3000 | ||
| - Open: http://localhost:3000 | ||
| - Test flows: | ||
| - Register a new user and auto login works |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use hyphenated compound adjective.
The phrase "auto login" should be hyphenated when used as a compound adjective.
📝 Proposed fix
- - Register a new user and auto login works
+ - Register a new user and auto-login works📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - Register a new user and auto login works | |
| - Register a new user and auto-login works |
🧰 Tools
🪛 LanguageTool
[grammar] ~110-~110: Use a hyphen to join words.
Context: ...: - Register a new user and auto login works - Logout then login ...
(QB_NEW_EN_HYPHEN)
🤖 Prompt for AI Agents
In `@src/routes/docs/quick-starts/vue/prompt.md` at line 110, The phrase "auto
login" in the markdown sentence should be a hyphenated compound adjective;
change "auto login works" to "auto-login works" in the sentence (look for the
line containing "Register a new user and auto login works" in
src/routes/docs/quick-starts/vue/prompt.md) so the compound adjective is
correctly hyphenated.
| - If using npm, create an appwrite.js (or appwrite.ts) file with: | ||
|
|
||
| ```js | ||
| import { Client, Account } from 'appwrite'; | ||
|
|
||
| export const client = new Client(); | ||
|
|
||
| client.setEndpoint('https://<REGION>.cloud.appwrite.io/v1').setProject('<PROJECT_ID>'); // Replace with your project ID | ||
|
|
||
| export const account = new Account(client); | ||
| export { ID } from 'appwrite'; | ||
| ``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add TablesDB export to match later usage.
The npm-based setup only exports account and ID, but later examples (steps 5-6, lines 78-127) use tablesDB for database operations. This inconsistency will cause errors for users following the npm path.
📝 Proposed fix to include TablesDB export
- If using npm, create an appwrite.js (or appwrite.ts) file with:
```js
- import { Client, Account } from 'appwrite';
+ import { Client, Account, TablesDB } from 'appwrite';
export const client = new Client();
client.setEndpoint('https://<REGION>.cloud.appwrite.io/v1').setProject('<PROJECT_ID>'); // Replace with your project ID
export const account = new Account(client);
+ export const tablesDB = new TablesDB(client);
export { ID } from 'appwrite';
```🤖 Prompt for AI Agents
In `@src/routes/docs/quick-starts/web/prompt.md` around lines 29 - 40, The npm
example is missing a TablesDB export which later examples expect; update the
module that creates the Appwrite client (the code that defines client and
account) to also import TablesDB from 'appwrite' and instantiate/export it as
tablesDB (e.g., add import of TablesDB, create tablesDB = new TablesDB(client),
and export tablesDB) while keeping the existing client, account, and ID exports
so later uses of tablesDB succeed.
| - If using CDN, use the global Appwrite object: | ||
|
|
||
| ```js | ||
| const client = new Appwrite.Client(); | ||
|
|
||
| client.setEndpoint('https://cloud.appwrite.io/v1').setProject('<PROJECT_ID>'); // Replace with your project ID | ||
|
|
||
| const account = new Appwrite.Account(client); | ||
| const tablesDB = new Appwrite.TablesDB(client); | ||
| ``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
CDN endpoint missing region placeholder.
Line 47 uses https://cloud.appwrite.io/v1 without a region placeholder, while the npm example (line 36) correctly uses https://<REGION>.cloud.appwrite.io/v1. Step 3 asks users for their Cloud Region, so the CDN example should also include the region placeholder for consistency.
🔧 Proposed fix
- If using CDN, use the global Appwrite object:
```js
const client = new Appwrite.Client();
- client.setEndpoint('https://cloud.appwrite.io/v1').setProject('<PROJECT_ID>'); // Replace with your project ID
+ client.setEndpoint('https://<REGION>.cloud.appwrite.io/v1').setProject('<PROJECT_ID>'); // Replace with your project ID
const account = new Appwrite.Account(client);
const tablesDB = new Appwrite.TablesDB(client);
```📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - If using CDN, use the global Appwrite object: | |
| ```js | |
| const client = new Appwrite.Client(); | |
| client.setEndpoint('https://cloud.appwrite.io/v1').setProject('<PROJECT_ID>'); // Replace with your project ID | |
| const account = new Appwrite.Account(client); | |
| const tablesDB = new Appwrite.TablesDB(client); | |
| ``` | |
| const client = new Appwrite.Client(); | |
| client.setEndpoint('https://<REGION>.cloud.appwrite.io/v1').setProject('<PROJECT_ID>'); // Replace with your project ID | |
| const account = new Appwrite.Account(client); | |
| const tablesDB = new Appwrite.TablesDB(client); |
🤖 Prompt for AI Agents
In `@src/routes/docs/quick-starts/web/prompt.md` around lines 42 - 51, The CDN
example hardcodes the endpoint URL without the Cloud Region placeholder; update
the client.setEndpoint call used with Appwrite.Client (the CDN snippet creating
client, then calling client.setEndpoint(...).setProject(...)) to use
'https://<REGION>.cloud.appwrite.io/v1' instead of
'https://cloud.appwrite.io/v1' so it matches the npm example and Step 3
instructions about choosing a Cloud Region.
| await tablesDB.createRow( | ||
| databaseId: todoDatabase.Id, | ||
| tableId: todoTable.Id, | ||
| rowId: ID.Unique(), | ||
| data: testTodo1 | ||
| ); | ||
|
|
||
| await tablesDB.createRow( | ||
| databaseId: todoDatabase.Id, | ||
| tableId: todoTable.Id, | ||
| rowId: ID.Unique(), | ||
| data: testTodo2 | ||
| ); | ||
|
|
||
| await tablesDB.createRow( | ||
| databaseId: todoDatabase.Id, | ||
| tableId: todoTable.Id, | ||
| rowId: ID.Unique(), | ||
| data: testTodo3 | ||
| ); | ||
| ``` | ||
|
|
||
| 7. Retrieve rows | ||
| - Add code to retrieve and display the todo data: | ||
|
|
||
| ```csharp | ||
| var todos = await tablesDB.listRows( | ||
| databaseId: todoDatabase.Id, | ||
| tableId: todoTable.Id | ||
| ); | ||
|
|
||
| foreach (var todo in todos.Documents) | ||
| { | ||
| Console.WriteLine($"Title: {todo.Data["title"]}\nDescription: {todo.Data["description"]}\nIs Todo Complete: {todo.Data["isComplete"]}\n\n"); | ||
| } | ||
| ``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| await tablesDB.createRow( | |
| databaseId: todoDatabase.Id, | |
| tableId: todoTable.Id, | |
| rowId: ID.Unique(), | |
| data: testTodo1 | |
| ); | |
| await tablesDB.createRow( | |
| databaseId: todoDatabase.Id, | |
| tableId: todoTable.Id, | |
| rowId: ID.Unique(), | |
| data: testTodo2 | |
| ); | |
| await tablesDB.createRow( | |
| databaseId: todoDatabase.Id, | |
| tableId: todoTable.Id, | |
| rowId: ID.Unique(), | |
| data: testTodo3 | |
| ); | |
| ``` | |
| 7. Retrieve rows | |
| - Add code to retrieve and display the todo data: | |
| ```csharp | |
| var todos = await tablesDB.listRows( | |
| databaseId: todoDatabase.Id, | |
| tableId: todoTable.Id | |
| ); | |
| foreach (var todo in todos.Documents) | |
| { | |
| Console.WriteLine($"Title: {todo.Data["title"]}\nDescription: {todo.Data["description"]}\nIs Todo Complete: {todo.Data["isComplete"]}\n\n"); | |
| } | |
| ``` | |
| await tablesDB.CreateRow( | |
| databaseId: todoDatabase.Id, | |
| tableId: todoTable.Id, | |
| rowId: ID.Unique(), | |
| data: testTodo1 | |
| ); | |
| await tablesDB.CreateRow( | |
| databaseId: todoDatabase.Id, | |
| tableId: todoTable.Id, | |
| rowId: ID.Unique(), | |
| data: testTodo2 | |
| ); | |
| await tablesDB.CreateRow( | |
| databaseId: todoDatabase.Id, | |
| tableId: todoTable.Id, | |
| rowId: ID.Unique(), | |
| data: testTodo3 | |
| ); | |
| ``` | |
| 7. Retrieve rows | |
| - Add code to retrieve and display the todo data: | |
| ```csharp | |
| var todos = await tablesDB.ListRows( | |
| databaseId: todoDatabase.Id, | |
| tableId: todoTable.Id | |
| ); | |
| foreach (var todo in todos.Rows) | |
| { | |
| Console.WriteLine($"Title: {todo.Data["title"]}\nDescription: {todo.Data["description"]}\nIs Todo Complete: {todo.Data["isComplete"]}\n\n"); | |
| } | |
| ``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@atharvadeosthale you'll need to check case of SDK methods and basic correctness across all SDKs
Summary by CodeRabbit
✏️ Tip: You can customize this high-level summary in your review settings.