Appwrite® - complete cloud infrastructure for your web, mobile and AI apps. Including Auth, Databases, Storage, Functions, Messaging, Hosting, Realtime and more
This report presents the forensic synthetic code analysis of appwrite/appwrite, a TypeScript project with 57,152 GitHub stars. SynthScan v2.0 examined 437,844 lines of code across 2533 source files, recording 2322 pattern matches distributed across 11 syntactic categories. The overall adjusted score of 5.5 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 2322 distinct pattern matches across 11 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/AvatarPhotos/Providers/FallbackTest.php | 64 | public function testGetDrawsOnNeutralSurface(): void | CODE |
| LOW | tests/unit/AvatarPhotos/Providers/InitialsTest.php | 51 | public function testGetDeclinesUnprintableName(): void | CODE |
| LOW | tests/unit/AvatarPhotos/Providers/InitialsTest.php | 76 | public function testGetRendersMultibyteNames(string $name, bool $renders): void | CODE |
| LOW | tests/unit/AvatarPhotos/Providers/InitialsTest.php | 91 | public function testGetUppercasesInitials(): void | CODE |
| LOW | tests/unit/AvatarPhotos/Providers/InitialsTest.php | 115 | public function testGetDerivesInitialsFromWords(string $name, string $equivalent): void | CODE |
| LOW | tests/unit/AvatarPhotos/Providers/InitialsTest.php | 133 | public function testGetDrawsOnNeutralSurface(): void | CODE |
| LOW | tests/unit/AvatarPhotos/Providers/InitialsTest.php | 146 | public function testGetHonoursBackgroundOverride(): void | CODE |
| LOW | tests/unit/Advisor/Validator/CTAsTest.php | 43 | public function testAcceptsEntryWithoutParams(): void | CODE |
| LOW | tests/unit/Advisor/Validator/CTAsTest.php | 54 | public function testRejectsEntryMissingRequiredKeys(): void | CODE |
| LOW | tests/unit/Advisor/Validator/CTAsTest.php | 63 | public function testRejectsEntryWithEmptyStrings(): void | CODE |
| LOW | tests/unit/Advisor/Validator/CTAsTest.php | 74 | public function testRejectsEntryWithNonStringFields(): void | CODE |
| LOW | tests/unit/Advisor/Validator/CTAsTest.php | 85 | public function testRejectsEntryWithScalarParams(): void | CODE |
| LOW | tests/unit/Advisor/Validator/CTAsTest.php | 105 | public function testRejectsMoreThanMaxCount(): void | CODE |
| LOW | tests/unit/Advisor/Validator/CTAsTest.php | 122 | public function testAcceptsExactlyMaxCount(): void | CODE |
| LOW | tests/unit/Advisor/Validator/CTAsTest.php | 152 | public function testRejectsEntryWithEmptyService(): void | CODE |
| LOW | tests/unit/Advisor/Validator/CTAsTest.php | 163 | public function testRejectsEntryWithEmptyMethod(): void | CODE |
| LOW | tests/unit/Advisor/Validator/CTAsTest.php | 174 | public function testRejectsUnknownService(): void | CODE |
| LOW | tests/unit/Advisor/Validator/CTAsTest.php | 198 | public function testAcceptsCustomAllowedLists(): void | CODE |
| LOW | tests/unit/Advisor/Validator/CTAsTest.php | 218 | public function testDefaultMaxCountIsSixteen(): void | CODE |
| LOW | tests/unit/Docker/EnvTest.php | 45 | public function testMultilineDoubleQuotedPrivateKey(): void | CODE |
| LOW | tests/unit/Docker/EnvTest.php | 56 | public function testEscapedNewlineInDoubleQuotedValue(): void | CODE |
| LOW | tests/unit/Docker/EnvTest.php | 68 | public function testRoundTripPreservesMultilineSecret(): void | CODE |
| LOW⚡ | tests/unit/Docker/EnvTest.php | 84 | public function testEncodeValueEscapesSpecialCharacters(): void | CODE |
| LOW⚡ | tests/unit/Docker/EnvTest.php | 92 | public function testUnknownEscapesPreserveBackslash(): void | CODE |
| LOW⚡ | tests/unit/Docker/EnvTest.php | 102 | public function testIndentedCommentDoesNotCaptureNextAssignment(): void | CODE |
| LOW | tests/unit/Docker/EnvTest.php | 114 | public function testLineWithoutAssignmentIsSkipped(): void | CODE |
| LOW | tests/unit/Docker/EnvTest.php | 124 | public function testUnterminatedQuoteDoesNotAbsorbLaterAssignments(): void | CODE |
| LOW | tests/unit/Docker/EnvTest.php | 135 | public function testUnterminatedQuoteDoesNotAbsorbLaterQuotedAssignment(): void | CODE |
| LOW | tests/unit/Docker/Compose/GeneratorTest.php | 23 | public function testSelectsDatabaseService(): void | CODE |
| LOW | tests/unit/Docker/Compose/GeneratorTest.php | 50 | public function testTogglesAssistantService(): void | CODE |
| LOW | tests/unit/Docker/Compose/GeneratorTest.php | 63 | public function testKeepsProductionWorkers(): void | CODE |
| LOW | tests/unit/Docker/Compose/GeneratorTest.php | 79 | public function testSelectsSeparateTopology(): void | CODE |
| LOW | tests/unit/Docker/Compose/GeneratorTest.php | 105 | public function testAddsLocalHostPathMount(): void | CODE |
| LOW | tests/unit/Docker/Compose/GeneratorTest.php | 115 | public function testRewritesLocalRelativeBindMountsToHostPath(): void | CODE |
| LOW | tests/unit/Docker/Compose/GeneratorTest.php | 129 | public function testDoesNotAddDatabaseDependencyWithoutPlaceholder(): void | CODE |
| LOW | tests/unit/Docker/Compose/GeneratorTest.php | 140 | public function testKeepsLongCommandsReadable(): void | CODE |
| LOW | tests/unit/Utopia/ResponseTest.php | 91 | public function testResponseModelRequired(): void | CODE |
| LOW | tests/unit/Utopia/ResponseTest.php | 106 | public function testResponseModelRequiredException(): void | CODE |
| LOW | tests/unit/Utopia/ResponseTest.php | 237 | public function testShowSensitiveRestoresPreviousState(): void | CODE |
| LOW | tests/unit/Utopia/RequestTest.php | 65 | public function testGetParamsWithMultipleMethods(): void | CODE |
| LOW | tests/unit/Utopia/RequestTest.php | 81 | public function testGetParamsWithAllRequired(): void | CODE |
| LOW | tests/unit/Utopia/RequestTest.php | 99 | public function testGetParamsWithAllOptional(): void | CODE |
| LOW | tests/unit/Utopia/RequestTest.php | 116 | public function testGetParamsMatchesMethodB(): void | CODE |
| LOW | tests/unit/Utopia/RequestTest.php | 132 | public function testGetParamsFallbackForMixedAndUnknown(): void | CODE |
| LOW | tests/unit/Utopia/RequestTest.php | 153 | public function testRouteIsScopedToRequestInstance(): void | CODE |
| LOW⚡ | tests/unit/Utopia/RequestTest.php | 168 | public function testGetHeaderLineReturnsStringValue(): void | CODE |
| LOW⚡ | tests/unit/Utopia/RequestTest.php | 175 | public function testGetHeaderLineReturnsDefaultWhenMissing(): void | CODE |
| LOW⚡ | tests/unit/Utopia/RequestTest.php | 181 | public function testGetHeaderLineJoinsMultipleValues(): void | CODE |
| LOW⚡ | tests/unit/Utopia/RequestTest.php | 190 | public function testGetHeadersSynthesizesCookieHeaderFromCookieJar(): void | CODE |
| LOW | tests/unit/Utopia/RequestTest.php | 205 | public function testGetHeadersOmitsCookieHeaderWhenNoCookies(): void | CODE |
| LOW | tests/unit/Utopia/RequestTest.php | 250 | public function testGetParamsDoesNotCacheRawParamsForServerError(): void | CODE |
| LOW | tests/unit/Utopia/RequestTest.php | 276 | public function testGetParamsDoesNotCacheRawParamsForUncodedException(): void | CODE |
| LOW | tests/unit/Utopia/Database/Validator/AttributesTest.php | 87 | public function testResolveMatchesDedicatedEndpoints(): void | CODE |
| LOW | tests/unit/Utopia/Database/Validator/AttributesTest.php | 125 | public function testResolveKeepsExplicitSize(): void | CODE |
| LOW | tests/unit/Utopia/Database/Validator/KeywordIdTest.php | 52 | public function testKeywordIsScopedToInstance(): void | CODE |
| LOW | tests/unit/Utopia/Database/Validator/KeywordIdTest.php | 72 | public function testDescriptionMentionsKeyword(): void | CODE |
| LOW | …ts/unit/Utopia/Database/Validator/Queries/BaseTest.php | 13 | public function testQueryAtMaxValuesIsValid(): void | CODE |
| LOW | …ts/unit/Utopia/Database/Validator/Queries/BaseTest.php | 24 | public function testQueryOverMaxValuesIsInvalid(): void | CODE |
| LOW | …ts/unit/Utopia/Database/Validator/Queries/BaseTest.php | 40 | public function testSequenceTypedAttributeIsValidated(): void | CODE |
| LOW | …t/Utopia/Database/Validator/Queries/MigrationsTest.php | 13 | public function testCanonicalResourceFieldsCanBeQueried(): void | CODE |
| 1697 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | app/controllers/shared/api.php | 125 | // Step 1: Check if project is empty | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 130 | // Step 2: Get roles configuration | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 133 | // Step 3: Determine role for user | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 140 | // Step 4: Get scopes for the role | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 143 | // Step 5: API Key Authentication | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 482 | // Step 9: Validate scope permissions | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 488 | // Step 10: Check if user is blocked | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 493 | // Step 11: Verify password status | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 498 | // Step 12: Validate MFA requirements | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 506 | // Step 13: Handle Multi-Factor Authentication | COMMENT |
| LOW | app/controllers/shared/api.php | 393 | // Step 6: Update project and user last activity | COMMENT |
| LOW⚡ | tests/unit/Messaging/MessagingTest.php | 594 | // Step 1: guest subscribes. convertChannels preserves the literal form. | COMMENT |
| LOW⚡ | tests/unit/Messaging/MessagingTest.php | 599 | // Step 2: fromPayload publishes account.create alongside the user-scoped form. | COMMENT |
| LOW | tests/unit/Messaging/MessagingTest.php | 547 | // Step 2: A → B. | COMMENT |
| LOW | tests/unit/Messaging/MessagingTest.php | 558 | // Step 3: permissions-change for B (userId stays 'B'). | COMMENT |
| LOW | tests/unit/Messaging/MessagingTest.php | 569 | // Step 4: B → C. | COMMENT |
| LOW | tests/unit/Messaging/MessagingTest.php | 618 | // Step 3: in-band auth promotes the guest to user 'B'. | COMMENT |
| LOW | tests/benchmarks/bulk-operations/utils.js | 69 | // Step 1: Create Account | COMMENT |
| LOW | tests/benchmarks/bulk-operations/utils.js | 85 | // Step 2: Create Session | COMMENT |
| LOW | tests/benchmarks/bulk-operations/utils.js | 110 | // Step 3: Create Team | COMMENT |
| LOW | tests/benchmarks/bulk-operations/utils.js | 122 | // Step 4: Create Project | COMMENT |
| LOW | tests/benchmarks/bulk-operations/utils.js | 135 | // Step 5: Create API Key | COMMENT |
| LOW | …e/Services/Databases/Transactions/TransactionsBase.php | 3189 | // Step 1: Create new documents with age > 25 in transaction | COMMENT |
| LOW | …e/Services/Databases/Transactions/TransactionsBase.php | 3222 | // Step 2: Bulk update all documents with age > 25 to have status 'active' | COMMENT |
| LOW | …e/Services/Databases/Transactions/TransactionsBase.php | 3372 | // Step 1: Update some documents to have category 'special' in transaction | COMMENT |
| LOW | …e/Services/Databases/Transactions/TransactionsBase.php | 3399 | // Step 2: Bulk update all documents with category 'special' to have priority 'high' | COMMENT |
| LOW | …e/Services/Databases/Transactions/TransactionsBase.php | 3538 | // Step 1: Create temporary documents in transaction | COMMENT |
| LOW | …e/Services/Databases/Transactions/TransactionsBase.php | 3569 | // Step 2: Bulk delete all documents with type 'temporary' | COMMENT |
| LOW | …e/Services/Databases/Transactions/TransactionsBase.php | 3702 | // Step 1: Mark some documents for deletion by updating their status | COMMENT |
| LOW | …e/Services/Databases/Transactions/TransactionsBase.php | 3729 | // Step 2: Bulk delete all documents with status 'marked_for_deletion' | COMMENT |
| LOW | …Services/Project/PoliciesMFAFactorsIntegrationTest.php | 71 | // Step 1: Enable the custom factor and disable email | COMMENT |
| LOW⚡ | …Services/Project/PoliciesMFAFactorsIntegrationTest.php | 85 | // Step 2: A user with a verified email sees the policy reflected in factors | COMMENT |
| LOW⚡ | …Services/Project/PoliciesMFAFactorsIntegrationTest.php | 93 | // Step 3: Challenges for a disabled factor are rejected | COMMENT |
| LOW⚡ | …Services/Project/PoliciesMFAFactorsIntegrationTest.php | 100 | // Step 4: The custom factor completes the full challenge flow | COMMENT |
| LOW | …Services/Project/PoliciesMFAFactorsIntegrationTest.php | 119 | // Step 5: Leave a custom challenge pending, then restore email and disable custom again | COMMENT |
| LOW⚡ | …ces/Project/PoliciesSessionDurationIntegrationTest.php | 44 | // Step 1: Set session duration to 60 seconds (the policy minimum) | COMMENT |
| LOW⚡ | …ces/Project/PoliciesSessionDurationIntegrationTest.php | 47 | // Step 2: Create user and a session | COMMENT |
| LOW⚡ | …ces/Project/PoliciesSessionDurationIntegrationTest.php | 76 | // Step 3: Poll until the 60s TTL elapses - session should expire | COMMENT |
| LOW⚡ | …ces/Project/PoliciesSessionDurationIntegrationTest.php | 82 | // Step 4: Raise duration to 120s - same session should still not be usable | COMMENT |
| LOW⚡ | …ces/Project/PoliciesSessionDurationIntegrationTest.php | 88 | // Step 5: Set duration to 1 year | COMMENT |
| LOW⚡ | …ces/Project/PoliciesSessionDurationIntegrationTest.php | 91 | // Step 6: Same session should still not be usable | COMMENT |
| LOW⚡ | …roject/PoliciesPasswordPersonalDataIntegrationTest.php | 87 | // Step 1: Enable password personal data policy | COMMENT |
| LOW⚡ | …roject/PoliciesPasswordPersonalDataIntegrationTest.php | 90 | // Step 2: Each of the four personal-data fields in the password must block user creation | COMMENT |
| LOW⚡ | …roject/PoliciesPasswordPersonalDataIntegrationTest.php | 97 | // Step 3: Disable password personal data policy | COMMENT |
| LOW⚡ | …roject/PoliciesPasswordPersonalDataIntegrationTest.php | 100 | // Step 4: The same categories of passwords should now be accepted (fresh data to avoid uniqueness conflicts) | COMMENT |
| LOW | …/Services/Project/MockPhonesSessionIntegrationTest.php | 35 | // Step 1: Configure two mock phones with distinct OTPs. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 369 | // Step 1: Set a custom replyToEmail. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 380 | // Step 2: Clear it with an empty string. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 385 | // Step 3: Verify the cleared value persists. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 396 | // Step 1: Configure SMTP with a sender email, then disable it. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 405 | // Step 2: Clear senderEmail while keeping SMTP disabled. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 414 | // Step 3: Verify the cleared value persists. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 615 | // Step 1: Set username and password. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 627 | // Step 2: Clear both credentials by passing empty strings. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 637 | // Step 3: Verify the cleared username persists (a no-params PATCH must not restore it). | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/TemplatesBase.php | 565 | // Step 1: Set a custom en verification template with sender and reply-to fields. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/TemplatesBase.php | 582 | // Step 2: GET en verification template and ensure it reflects the custom values. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/TemplatesBase.php | 590 | // Step 3: Update the same template, clearing sender and reply-to fields to empty strings. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/TemplatesBase.php | 605 | // Step 4: GET again to confirm the cleared values persist. | COMMENT |
| LOW⚡ | …rvices/Project/PoliciesSessionAlertIntegrationTest.php | 84 | // Step 1: Disable session alerts | COMMENT |
| 89 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | app/controllers/shared/api.php | 125 | // Step 1: Check if project is empty | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 130 | // Step 2: Get roles configuration | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 133 | // Step 3: Determine role for user | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 140 | // Step 4: Get scopes for the role | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 143 | // Step 5: API Key Authentication | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 482 | // Step 9: Validate scope permissions | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 488 | // Step 10: Check if user is blocked | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 493 | // Step 11: Verify password status | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 498 | // Step 12: Validate MFA requirements | COMMENT |
| LOW⚡ | app/controllers/shared/api.php | 506 | // Step 13: Handle Multi-Factor Authentication | COMMENT |
| LOW | app/controllers/shared/api.php | 393 | // Step 6: Update project and user last activity | COMMENT |
| LOW⚡ | tests/unit/Messaging/MessagingTest.php | 594 | // Step 1: guest subscribes. convertChannels preserves the literal form. | COMMENT |
| LOW⚡ | tests/unit/Messaging/MessagingTest.php | 599 | // Step 2: fromPayload publishes account.create alongside the user-scoped form. | COMMENT |
| LOW | tests/unit/Messaging/MessagingTest.php | 547 | // Step 2: A → B. | COMMENT |
| LOW | tests/unit/Messaging/MessagingTest.php | 558 | // Step 3: permissions-change for B (userId stays 'B'). | COMMENT |
| LOW | tests/unit/Messaging/MessagingTest.php | 569 | // Step 4: B → C. | COMMENT |
| LOW | tests/unit/Messaging/MessagingTest.php | 618 | // Step 3: in-band auth promotes the guest to user 'B'. | COMMENT |
| LOW | tests/benchmarks/bulk-operations/utils.js | 69 | // Step 1: Create Account | COMMENT |
| LOW | tests/benchmarks/bulk-operations/utils.js | 85 | // Step 2: Create Session | COMMENT |
| LOW | tests/benchmarks/bulk-operations/utils.js | 110 | // Step 3: Create Team | COMMENT |
| LOW | tests/benchmarks/bulk-operations/utils.js | 122 | // Step 4: Create Project | COMMENT |
| LOW | tests/benchmarks/bulk-operations/utils.js | 135 | // Step 5: Create API Key | COMMENT |
| LOW | …e/Services/Databases/Transactions/TransactionsBase.php | 3189 | // Step 1: Create new documents with age > 25 in transaction | COMMENT |
| LOW | …e/Services/Databases/Transactions/TransactionsBase.php | 3222 | // Step 2: Bulk update all documents with age > 25 to have status 'active' | COMMENT |
| LOW | …e/Services/Databases/Transactions/TransactionsBase.php | 3372 | // Step 1: Update some documents to have category 'special' in transaction | COMMENT |
| LOW | …e/Services/Databases/Transactions/TransactionsBase.php | 3399 | // Step 2: Bulk update all documents with category 'special' to have priority 'high' | COMMENT |
| LOW | …e/Services/Databases/Transactions/TransactionsBase.php | 3538 | // Step 1: Create temporary documents in transaction | COMMENT |
| LOW | …e/Services/Databases/Transactions/TransactionsBase.php | 3569 | // Step 2: Bulk delete all documents with type 'temporary' | COMMENT |
| LOW | …e/Services/Databases/Transactions/TransactionsBase.php | 3702 | // Step 1: Mark some documents for deletion by updating their status | COMMENT |
| LOW | …e/Services/Databases/Transactions/TransactionsBase.php | 3729 | // Step 2: Bulk delete all documents with status 'marked_for_deletion' | COMMENT |
| LOW | …Services/Project/PoliciesMFAFactorsIntegrationTest.php | 71 | // Step 1: Enable the custom factor and disable email | COMMENT |
| LOW⚡ | …Services/Project/PoliciesMFAFactorsIntegrationTest.php | 85 | // Step 2: A user with a verified email sees the policy reflected in factors | COMMENT |
| LOW⚡ | …Services/Project/PoliciesMFAFactorsIntegrationTest.php | 93 | // Step 3: Challenges for a disabled factor are rejected | COMMENT |
| LOW⚡ | …Services/Project/PoliciesMFAFactorsIntegrationTest.php | 100 | // Step 4: The custom factor completes the full challenge flow | COMMENT |
| LOW | …Services/Project/PoliciesMFAFactorsIntegrationTest.php | 119 | // Step 5: Leave a custom challenge pending, then restore email and disable custom again | COMMENT |
| LOW⚡ | …ces/Project/PoliciesSessionDurationIntegrationTest.php | 44 | // Step 1: Set session duration to 60 seconds (the policy minimum) | COMMENT |
| LOW⚡ | …ces/Project/PoliciesSessionDurationIntegrationTest.php | 47 | // Step 2: Create user and a session | COMMENT |
| LOW⚡ | …ces/Project/PoliciesSessionDurationIntegrationTest.php | 76 | // Step 3: Poll until the 60s TTL elapses - session should expire | COMMENT |
| LOW⚡ | …ces/Project/PoliciesSessionDurationIntegrationTest.php | 82 | // Step 4: Raise duration to 120s - same session should still not be usable | COMMENT |
| LOW⚡ | …ces/Project/PoliciesSessionDurationIntegrationTest.php | 88 | // Step 5: Set duration to 1 year | COMMENT |
| LOW⚡ | …ces/Project/PoliciesSessionDurationIntegrationTest.php | 91 | // Step 6: Same session should still not be usable | COMMENT |
| LOW⚡ | …roject/PoliciesPasswordPersonalDataIntegrationTest.php | 87 | // Step 1: Enable password personal data policy | COMMENT |
| LOW⚡ | …roject/PoliciesPasswordPersonalDataIntegrationTest.php | 90 | // Step 2: Each of the four personal-data fields in the password must block user creation | COMMENT |
| LOW⚡ | …roject/PoliciesPasswordPersonalDataIntegrationTest.php | 97 | // Step 3: Disable password personal data policy | COMMENT |
| LOW⚡ | …roject/PoliciesPasswordPersonalDataIntegrationTest.php | 100 | // Step 4: The same categories of passwords should now be accepted (fresh data to avoid uniqueness conflicts) | COMMENT |
| LOW | …/Services/Project/MockPhonesSessionIntegrationTest.php | 35 | // Step 1: Configure two mock phones with distinct OTPs. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 369 | // Step 1: Set a custom replyToEmail. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 380 | // Step 2: Clear it with an empty string. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 385 | // Step 3: Verify the cleared value persists. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 396 | // Step 1: Configure SMTP with a sender email, then disable it. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 405 | // Step 2: Clear senderEmail while keeping SMTP disabled. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 414 | // Step 3: Verify the cleared value persists. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 615 | // Step 1: Set username and password. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 627 | // Step 2: Clear both credentials by passing empty strings. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/SMTPBase.php | 637 | // Step 3: Verify the cleared username persists (a no-params PATCH must not restore it). | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/TemplatesBase.php | 565 | // Step 1: Set a custom en verification template with sender and reply-to fields. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/TemplatesBase.php | 582 | // Step 2: GET en verification template and ensure it reflects the custom values. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/TemplatesBase.php | 590 | // Step 3: Update the same template, clearing sender and reply-to fields to empty strings. | COMMENT |
| LOW⚡ | tests/e2e/Services/Project/TemplatesBase.php | 605 | // Step 4: GET again to confirm the cleared values persist. | COMMENT |
| LOW⚡ | …rvices/Project/PoliciesSessionAlertIntegrationTest.php | 84 | // Step 1: Disable session alerts | COMMENT |
| 89 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | app/config/templates/function.php | 213 | 'placeholder' => 'neo4j+s://4tg4mddo.databases.neo4j.io', | CODE |
| LOW⚡ | app/config/templates/function.php | 221 | 'placeholder' => 'neo4j', | CODE |
| LOW⚡ | app/config/templates/function.php | 229 | 'placeholder' => 'mCUc4PbVUQN-_NkTLJLisb6ccnwzQKKhrkF77YMctzx', | CODE |
| LOW⚡ | app/config/templates/function.php | 306 | 'placeholder' => 'ep-still-sea-a792sh84.eu-central-1.aws.neon.tech', | CODE |
| LOW⚡ | app/config/templates/function.php | 314 | 'placeholder' => 'main', | CODE |
| LOW⚡ | app/config/templates/function.php | 322 | 'placeholder' => 'main_owner', | CODE |
| LOW⚡ | app/config/templates/function.php | 330 | 'placeholder' => 'iQCfaUaaWB3B', | CODE |
| LOW⚡ | app/config/templates/function.php | 338 | 'placeholder' => 'ep-still-sea-a792sh84', | CODE |
| LOW⚡ | app/config/templates/function.php | 396 | 'placeholder' => 'sk-wzG...vcy', | CODE |
| LOW⚡ | app/config/templates/function.php | 404 | 'placeholder' => '512', | CODE |
| LOW⚡ | app/config/templates/function.php | 441 | 'placeholder' => 'appwrite-hosted-mcp', | CODE |
| LOW⚡ | app/config/templates/function.php | 449 | 'placeholder' => 'none', | CODE |
| LOW⚡ | app/config/templates/function.php | 457 | 'placeholder' => 'your-long-random-secret', | CODE |
| LOW⚡ | app/config/templates/function.php | 465 | 'placeholder' => '25', | CODE |
| LOW⚡ | app/config/templates/function.php | 516 | 'placeholder' => 'db9...980', | CODE |
| LOW⚡ | app/config/templates/function.php | 524 | 'placeholder' => '427...169', | CODE |
| LOW⚡ | app/config/templates/function.php | 532 | 'placeholder' => 'NDI...LUfg', | CODE |
| LOW⚡ | app/config/templates/function.php | 726 | 'placeholder' => 'urlShortener', | CODE |
| LOW⚡ | app/config/templates/function.php | 734 | 'placeholder' => 'urls', | CODE |
| LOW⚡ | app/config/templates/function.php | 742 | 'placeholder' => 'https://shortdomain.io', | CODE |
| LOW⚡ | app/config/templates/function.php | 792 | 'placeholder' => '64a55...7b912', | CODE |
| LOW⚡ | app/config/templates/function.php | 799 | 'placeholder' => '7c3e8...2a9f1', | CODE |
| LOW⚡ | app/config/templates/function.php | 806 | 'placeholder' => 'OFCNCOG2CU', | CODE |
| LOW⚡ | app/config/templates/function.php | 813 | 'placeholder' => 'fd0aa...136a8', | CODE |
| LOW⚡ | app/config/templates/function.php | 820 | 'placeholder' => 'my_index', | CODE |
| LOW⚡ | app/config/templates/function.php | 827 | 'placeholder' => 'bf2f5...df733', | CODE |
| LOW⚡ | app/config/templates/function.php | 891 | 'placeholder' => '64a55...7b912', | CODE |
| LOW⚡ | app/config/templates/function.php | 898 | 'placeholder' => '7c3e8...2a9f1', | CODE |
| LOW⚡ | app/config/templates/function.php | 905 | 'placeholder' => 'http://127.0.0.1:7700', | CODE |
| LOW⚡ | app/config/templates/function.php | 912 | 'placeholder' => 'masterKey1234', | CODE |
| LOW⚡ | app/config/templates/function.php | 919 | 'placeholder' => 'searchKey1234', | CODE |
| LOW⚡ | app/config/templates/function.php | 926 | 'placeholder' => 'appwrite_index', | CODE |
| LOW⚡ | app/config/templates/function.php | 998 | 'placeholder' => '62...97', | CODE |
| LOW⚡ | app/config/templates/function.php | 1005 | 'placeholder' => 'Zjc...5PH', | CODE |
| LOW⚡ | app/config/templates/function.php | 1012 | 'placeholder' => 'NXOi3...IBHDa', | CODE |
| LOW⚡ | app/config/templates/function.php | 1019 | 'placeholder' => '+14000000102', | CODE |
| LOW⚡ | app/config/templates/function.php | 1056 | 'placeholder' => 'mywebapp-f6e57', | CODE |
| LOW⚡ | app/config/templates/function.php | 1063 | 'placeholder' => 'fcm-adminsdk-2f0de@test-f7q57.iam.gserviceaccount.com', | CODE |
| LOW⚡ | app/config/templates/function.php | 1070 | 'placeholder' => '0b683...75675', | CODE |
| LOW⚡ | app/config/templates/function.php | 1077 | 'placeholder' => 'https://my-app-f298e.firebaseio.com', | CODE |
| LOW⚡ | app/config/templates/function.php | 1128 | 'placeholder' => 'smtp.mailgun.org', | CODE |
| LOW⚡ | app/config/templates/function.php | 1135 | 'placeholder' => '25', | CODE |
| LOW⚡ | app/config/templates/function.php | 1142 | 'placeholder' => 'no-reply@mywebapp.org', | CODE |
| LOW⚡ | app/config/templates/function.php | 1149 | 'placeholder' => '5up3r5tr0ngP4ssw0rd', | CODE |
| LOW⚡ | app/config/templates/function.php | 1156 | 'placeholder' => 'me@mywebapp.org', | CODE |
| LOW⚡ | app/config/templates/function.php | 1164 | 'placeholder' => 'https://mywebapp.org,https://mywebapp.com', | CODE |
| LOW⚡ | app/config/templates/function.php | 1243 | 'placeholder' => 'sk_test_51J...', | CODE |
| LOW⚡ | app/config/templates/function.php | 1250 | 'placeholder' => 'whsec_...', | CODE |
| LOW⚡ | app/config/templates/function.php | 1258 | 'placeholder' => 'orders', | CODE |
| LOW⚡ | app/config/templates/function.php | 1266 | 'placeholder' => 'orders', | CODE |
| LOW⚡ | app/config/templates/function.php | 1375 | 'placeholder' => 'ai', | CODE |
| LOW⚡ | app/config/templates/function.php | 1383 | 'placeholder' => 'image_classification', | CODE |
| LOW⚡ | app/config/templates/function.php | 1391 | 'placeholder' => 'image_classification', | CODE |
| LOW⚡ | app/config/templates/function.php | 1398 | 'placeholder' => 'hf_MUvn...', | CODE |
| LOW⚡ | app/config/templates/function.php | 1435 | 'placeholder' => 'ai', | CODE |
| LOW⚡ | app/config/templates/function.php | 1443 | 'placeholder' => 'object_detection', | CODE |
| LOW⚡ | app/config/templates/function.php | 1451 | 'placeholder' => 'object_detection', | CODE |
| LOW⚡ | app/config/templates/function.php | 1458 | 'placeholder' => 'hf_MUvn...', | CODE |
| LOW⚡ | app/config/templates/function.php | 1495 | 'placeholder' => 'ai', | CODE |
| LOW⚡ | app/config/templates/function.php | 1503 | 'placeholder' => 'speech_recognition', | CODE |
| 170 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | app/config/templates/function.php | 394 | 'description' => 'A unique key used to authenticate with the OpenAI API. This is a paid service and you | CODE |
| HIGH⚡ | app/config/templates/function.php | 1777 | 'description' => 'A unique key used to authenticate with the OpenAI API. This is a paid service and you | CODE |
| HIGH⚡ | app/config/templates/function.php | 1842 | 'description' => 'A unique key used to authenticate with the OpenAI API. This is a paid service and you | CODE |
| HIGH | docs/sdks/dart/EXAMPLES.md | 11 | .setKey('<YOUR_API_KEY>'); | CODE |
| HIGH | docs/sdks/dart/EXAMPLES.md | 11 | .setKey('<YOUR_API_KEY>'); | CODE |
| HIGH | docs/sdks/dart/GETTING_STARTED.md | 9 | .setKey('<YOUR_API_KEY>'); | CODE |
| HIGH | docs/sdks/dart/GETTING_STARTED.md | 9 | .setKey('<YOUR_API_KEY>'); | CODE |
| HIGH | src/Appwrite/SDK/Specification/Format/OpenAPI3.php | 222 | 'Key' => '<YOUR_API_KEY>', | CODE |
| HIGH | src/Appwrite/SDK/Specification/Format/OpenAPI3.php | 222 | 'Key' => '<YOUR_API_KEY>', | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/config/oAuthProviders.php | 521 | ], | COMMENT |
| LOW | app/config/storage/logos.php | 21 | // // Microsoft Word | COMMENT |
| LOW | app/config/storage/logos.php | 41 | // 'application/vnd.ms-powerpoint.addin.macroEnabled.12' => __DIR__.'/logos/ppt.png', | COMMENT |
| LOW | …/Services/ProjectWebhooks/WebhooksCustomServerTest.php | 861 | $this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Project-Id'] ?? '', $this->getProject()['$id']); | COMMENT |
| LOW | …s/e2e/Services/GraphQL/TablesDB/DatabaseServerTest.php | 1861 | // * @depends testCreateDatetimeColumn | COMMENT |
| LOW | …s/e2e/Services/GraphQL/TablesDB/DatabaseServerTest.php | 1881 | // $actor = $this->client->call(Client::METHOD_POST, '/graphql', array_merge([ | COMMENT |
| LOW | …s/e2e/Services/GraphQL/TablesDB/DatabaseServerTest.php | 2161 | // $query = $this->getQuery(self::GET_CUSTOM_ENTITIES); | COMMENT |
| LOW | …s/e2e/Services/GraphQL/TablesDB/DatabaseServerTest.php | 2181 | // { | COMMENT |
| LOW | …s/e2e/Services/GraphQL/TablesDB/DatabaseServerTest.php | 2281 | $this->assertArrayNotHasKey('errors', $row['body']); | COMMENT |
| LOW | …s/e2e/Services/GraphQL/TablesDB/DatabaseServerTest.php | 2301 | // ] | COMMENT |
| LOW | …s/e2e/Services/GraphQL/TablesDB/DatabaseServerTest.php | 2341 | } | COMMENT |
| LOW | …sts/e2e/Services/GraphQL/Legacy/DatabaseServerTest.php | 1781 | // * @depends testCreateFloatAttribute | COMMENT |
| LOW | …sts/e2e/Services/GraphQL/Legacy/DatabaseServerTest.php | 1801 | // ] | COMMENT |
| LOW | …sts/e2e/Services/GraphQL/Legacy/DatabaseServerTest.php | 2081 | // * @throws Exception | COMMENT |
| LOW | …sts/e2e/Services/GraphQL/Legacy/DatabaseServerTest.php | 2101 | // /** | COMMENT |
| LOW | …sts/e2e/Services/GraphQL/Legacy/DatabaseServerTest.php | 2221 | // $projectId = $this->getProject()['$id']; | COMMENT |
| LOW | …sts/e2e/Services/GraphQL/Legacy/DatabaseServerTest.php | 2261 | $document = $this->client->call(Client::METHOD_POST, '/graphql', array_merge([ | COMMENT |
| LOW | …sts/e2e/Services/GraphQL/Legacy/DatabaseServerTest.php | 2281 | // 'id' => $data['id'], | COMMENT |
| LOW | .github/workflows/issue-triage.lock.yml | 1 | # This file was automatically generated by gh-aw. DO NOT EDIT. | COMMENT |
| LOW | .github/workflows/issue-triage.lock.yml | 21 | # pre_activation --> activation | COMMENT |
| LOW | src/Appwrite/Deployment/Deployments.php | 361 | // internal endpoint when configured, falling back to the public host. | COMMENT |
| LOW | src/Appwrite/Migration/Version/V19.php | 521 | // try { | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/issue-triage.lock.yml | 4 | # For more information: https://github.com/githubnext/gh-aw/blob/main/.github/instructions/github-agentic-workflows.inst | COMMENT |
| MEDIUM | .github/workflows/issue-triage.lock.yml | 4 | # For more information: https://github.com/githubnext/gh-aw/blob/main/.github/instructions/github-agentic-workflows.inst | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/Appwrite/Platform/Tasks/SDKs.php | 539 | $aiChangelog = ''; // Track AI-generated changelog for PR description | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/resources/swagger2.json | 1 | {"swagger":"2.0","info":{"version":"0.8.0","title":"Appwrite","description":"Appwrite backend as a service cuts up to 70 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/e2e/Services/Sites/SitesCustomServerTest.php | 1188 | // // TODO: Implement testCreateDeploymentFromCLI() later | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | mongo-init-replicaset.sh | 6 | # Check if replica set is already initialized | COMMENT |