The local-first database that runs on every JS runtime and replicates with your existing backend - no vendor, no lock-in - https://rxdb.info/
This report summarizes scanner evidence for pubkey/rxdb, a TypeScript project with 23,421 GitHub stars. SynthScan examined 225,610 lines of code across 1223 source files, recording 232 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 1.2 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 231 finding(s).
Are imports declared and package/API names verified? 1 finding(s).
Are wrappers, guards, and repeated structures necessary? 143 finding(s).
Which changes need focused human review? 232 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 232 distinct pattern matches across 9 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. 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 configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/react-ssr.test.ts | 231 | function UseReplicationStatusComponent() { | CODE |
| LOW | test/replication-firestore.test.ts | 111 | function makeFirestoreHumanDocument(human: HumanDocumentType) { | CODE |
| LOW | test/unit/rx-collection.test.ts | 396 | async function ensurePrimaryKeyInsertThrows(id: string) { | CODE |
| LOW | test/unit/replication-protocol.test.ts | 64 | function ensureReplicationHasNoErrors(replicationState: RxStorageInstanceReplicationState<any>) { | CODE |
| LOW | test/unit/attachments.test.ts | 62 | async function createEncryptedAttachmentsCollection( | CODE |
| LOW | test/unit/attachments-compression.test.ts | 47 | async function createCompressedAttachmentsCollection( | CODE |
| LOW | test/unit/encryption.test.ts | 44 | async function createEncryptedCollection( | CODE |
| LOW | test/unit/query-planner.test.ts | 32 | function getHumanSchemaWithIndexes( | CODE |
| LOW | test/unit/migration-schema.test.ts | 2819 | function wrapStorageWithLoopDetection( | CODE |
| LOW | test/unit/rx-storage-sqlite.test.ts | 40 | function getConcurrencyTrackingBasics( | CODE |
| LOW | test/unit/rx-storage-implementations.test.ts | 3712 | async function getMultiInstanceRxStorageInstance(): Promise<{ | CODE |
| LOW | test/unit/rx-storage-implementations.test.ts | 3753 | async function closeMultiInstanceRxStorageInstance(instances: MultiInstanceInstances) { | CODE |
| LOW | test/unit/internal-indexes.test.ts | 19 | async function createCollectionWithInternalIndexes(internalIndexes: string[][], docsAmount: number = 0) { | CODE |
| LOW | test/helper/ajv-standalone.ts | 23 | export async function compileAjvStandaloneValidators( | CODE |
| LOW | test/helper/graphql-server.ts | 39 | function sortByUpdatedAtAndPrimary( | CODE |
| LOW | examples/angular/src/app/typings-test.ts | 18 | function checkDocumentDoubleDollar(doc: RxHeroDocument): Signal<RxHeroDocument> { | CODE |
| LOW | examples/angular/src/app/typings-test.ts | 22 | function checkDocumentDeletedDoubleDollar(doc: RxHeroDocument): Signal<boolean> { | CODE |
| LOW | examples/graphql/server/index.js | 38 | function sortByUpdatedAtAndPrimary(a, b) { | CODE |
| LOW | docs-src/docs/adapters.md | 276 | export function awaitCapacitorDeviceReady(): Promise<void> { | CODE |
| LOW | docs-src/docs/articles/javascript-vector-database.md | 222 | export async function getVectorFromTextWithWorker(text: string): Promise<number[]> { | CODE |
| LOW | docs-src/docs/articles/javascript-vector-database.md | 408 | async function vectorSearchIndexSimilarity(searchEmbedding: number[]) { | CODE |
| LOW | docs-src/src/components/trigger-event.tsx | 71 | function getOrMintClientId(): string { | CODE |
| LOW | docs-src/src/theme/Root.tsx | 393 | function triggerClickEventWhenFromCode() { | CODE |
| LOW | docs-src/src/theme/Root.tsx | 408 | function triggerClickEventWhenFromDiscord() { | CODE |
| LOW | docs-src/src/theme/SearchBar/index.tsx | 70 | function importDocSearchModalIfNeeded() { | CODE |
| LOW | docs-src/src/theme/SearchBar/index.tsx | 167 | function useResultsFooterComponent({ | CODE |
| LOW | …cs-src/src/theme/Navbar/MobileSidebar/Layout/index.tsx | 44 | export default function NavbarMobileSidebarLayout({ | CODE |
| LOW | …src/theme/Navbar/MobileSidebar/SecondaryMenu/index.tsx | 20 | export default function NavbarMobileSidebarSecondaryMenu(): ReactNode { | CODE |
| LOW | …cs-src/src/theme/Navbar/MobileSidebar/Header/index.tsx | 25 | export default function NavbarMobileSidebarHeader(): ReactNode { | CODE |
| LOW | …s-src/src/theme/ThemeProvider/TitleFormatter/index.tsx | 45 | export default function ThemeProviderTitleFormatter({ | CODE |
| LOW | docs-src/src/theme/DocSidebarItem/Category/index.tsx | 32 | function useAutoExpandActiveCategory({ | CODE |
| LOW | docs-src/src/theme/DocSidebarItem/Category/index.tsx | 57 | function useCategoryHrefWithSSRFallback(item) { | CODE |
| LOW | docs-src/src/theme/DocSidebarItem/Category/index.tsx | 126 | function DocSidebarItemCategoryEmpty({item, ...props}: any) { | CODE |
| LOW | docs-src/src/theme/DocSidebarItem/Category/index.tsx | 139 | function DocSidebarItemCategoryCollapsible({ | CODE |
| LOW | docs-src/src/pages/index.tsx | 39 | function startLandingpageAnimation() { | CODE |
| LOW | src/event-reduce.ts | 46 | export function defaultResultWindowBuffer(query: FilledMangoQuery<any>): { skip: number; limit: number; } { | CODE |
| LOW | src/plugin-helpers.ts | 55 | export function wrappedValidateStorageFactory( | CODE |
| LOW | src/rx-error.ts | 170 | export function rxStorageWriteErrorToRxError(err: RxStorageWriteError<any>): RxError { | CODE |
| LOW | src/rx-query.ts | 637 | function getLiveQueryUpdateThrottleTime(collection: RxCollection<any>): number { | CODE |
| LOW | src/rx-document.ts | 444 | export function createRxDocumentConstructor(proto = basePrototype) { | CODE |
| LOW | src/rx-document.ts | 540 | function getNestedDocumentProperty(doc: RxDocument, objPath: string, valueObj: any): any | null { | CODE |
| LOW | src/rx-document.ts | 550 | function createDocumentPropertyValue(doc: RxDocument, objPath: string, valueObj: any): any { | CODE |
| LOW | src/rx-query-helper.ts | 294 | function shouldNormalizeElemMatchSelector(elemMatch: any): boolean { | CODE |
| LOW | src/rx-query-helper.ts | 314 | function normalizeQuerySelectorShorthands(selector: any): void { | CODE |
| LOW | src/rx-database-internal-store.ts | 102 | export function getPrimaryKeyOfInternalDocument( | CODE |
| LOW | src/rx-database-internal-store.ts | 119 | export async function getAllCollectionDocuments( | CODE |
| LOW | src/rx-database-internal-store.ts | 247 | export function isDatabaseStateVersionCompatibleWithDatabaseCode( | CODE |
| LOW | src/rx-database-internal-store.ts | 276 | export async function addConnectedStorageToCollection( | CODE |
| LOW | src/rx-database-internal-store.ts | 337 | export async function removeConnectedStorageFromCollection( | CODE |
| LOW | src/rx-storage-multiinstance.ts | 59 | export function getBroadcastChannelReference( | CODE |
| LOW | src/rx-storage-multiinstance.ts | 82 | export function removeBroadcastChannelReference( | CODE |
| LOW | src/query-planner.ts | 244 | export function isSelectorSatisfiedByIndex( | CODE |
| LOW | src/custom-index.ts | 214 | export function getStringLengthOfIndexNumber( | CODE |
| LOW | src/custom-index.ts | 263 | export function getPrimaryKeyFromIndexableString( | CODE |
| LOW | src/custom-index.ts | 318 | export function getStartIndexStringFromLowerBound( | CODE |
| LOW | src/custom-index.ts | 393 | export function getStartIndexStringFromUpperBound( | CODE |
| LOW | src/custom-index.ts | 464 | export function changeIndexableStringByOneQuantum(str: string, direction: 1 | -1): string { | CODE |
| LOW | src/rx-storage-helper.ts | 81 | export function registerMutableWriteContext(context: string): void { | CODE |
| LOW | src/rx-storage-helper.ts | 526 | export function attachmentWriteDataToNormalData(writeData: RxAttachmentData | RxAttachmentWriteData): RxAttachmentData { | CODE |
| LOW | src/rx-storage-helper.ts | 861 | export function ensureRxStorageInstanceParamsAreCorrect( | CODE |
| 83 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/unit/rx-pipeline.test.ts | 101 | */ | COMMENT |
| LOW | test/unit/rx-pipeline.test.ts | 121 | // identifier: randomToken(10) | COMMENT |
| LOW | examples/react-native/initializeDb.js | 81 | const doc = await db[HeroesCollectionName].upsert({ name: 'Alice', color: 'green' }); | COMMENT |
| LOW | examples/flutter/pubspec.yaml | 1 | name: my_app | COMMENT |
| LOW | examples/flutter/pubspec.yaml | 61 | # The following section is specific to Flutter packages. | COMMENT |
| LOW | examples/flutter/pubspec.yaml | 81 | # list giving the asset and other descriptors for the font. For | COMMENT |
| LOW | examples/flutter/analysis_options.yaml | 1 | # This file configures the analyzer, which statically analyzes Dart code to | COMMENT |
| LOW | examples/flutter/analysis_options.yaml | 21 | # section below, it can also be suppressed for a single line of code | COMMENT |
| LOW | …es/flutter/linux/flutter/generated_plugin_registrant.h | 1 | // | COMMENT |
| LOW | examples/flutter/windows/runner/utils.h | 1 | #ifndef RUNNER_UTILS_H_ | COMMENT |
| LOW | examples/flutter/windows/runner/resource.h | 1 | //{{NO_DEPENDENCIES}} | COMMENT |
| LOW | …/flutter/windows/flutter/generated_plugin_registrant.h | 1 | // | COMMENT |
| LOW | examples/electron/main.js | 61 | storage, | COMMENT |
| LOW | .github/workflows/release.yml | 161 | # @link https://github.com/marketplace/actions/actions-for-discord | COMMENT |
| LOW | .github/workflows/cloudflare-pages.yml | 21 | # accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} | COMMENT |
| LOW | .github/workflows/main.yml | 901 | BROWSER_PATH: ${{ steps.chrome.outputs.chrome-path }} | COMMENT |
| LOW | .github/workflows/main.yml | 921 | # uses: actions/cache@v4 | COMMENT |
| LOW | .github/workflows/main.yml | 941 | # npm install --legacy-peer-deps | COMMENT |
| LOW | .github/workflows/main.yml | 981 | # uses: actions/setup-node@v4 | COMMENT |
| LOW | .github/workflows/main.yml | 1001 | # # We start the download while building RxDB to make the CI faster | COMMENT |
| LOW | .github/workflows/main.yml | 1021 | # working-directory: config/appwrite | COMMENT |
| LOW | docs-src/docs/replication-graphql.md | 341 | queryBuilder: pullQueryBuilder, | COMMENT |
| LOW | docs-src/src/components/a-b-tests.tsx | 1 | import { randomOfArray } from '../../../plugins/utils'; | COMMENT |
| LOW | docs-src/src/components/a-b-tests.tsx | 81 | export function ABTestContent( | COMMENT |
| LOW | docs-src/src/components/salaries.ts | 21 | /** | COMMENT |
| LOW | docs-src/src/components/salaries.ts | 41 | { 'name': 'Bahamas', 'code': 'BS', salary: 62024 }, | COMMENT |
| LOW | docs-src/src/components/salaries.ts | 61 | { 'name': 'Cambodia', 'code': 'KH', salary: 18000 }, | COMMENT |
| LOW | docs-src/src/components/salaries.ts | 81 | { 'name': 'Czech Republic', 'code': 'CZ', salary: 33760 }, | COMMENT |
| LOW | docs-src/src/components/salaries.ts | 101 | // { 'name': 'Gabon', 'code': 'GA', salary: false }, | COMMENT |
| LOW | docs-src/src/components/salaries.ts | 141 | // { 'name': 'Jordan', 'code': 'JO', salary: false }, | COMMENT |
| LOW | docs-src/src/components/salaries.ts | 161 | // { 'name': 'Maldives', 'code': 'MV', salary: false }, | COMMENT |
| LOW | docs-src/src/components/salaries.ts | 181 | { 'name': 'Netherlands', 'code': 'NL', salary: 62661 }, | COMMENT |
| LOW | docs-src/src/components/salaries.ts | 201 | // { 'name': 'Pitcairn Islands', 'code': 'PN', salary: false }, | COMMENT |
| LOW | docs-src/src/components/salaries.ts | 221 | // { 'name': 'Seychelles', 'code': 'SC', salary: false }, | COMMENT |
| LOW | docs-src/src/components/salaries.ts | 241 | // { 'name': 'Tanzania, United Republic of', 'code': 'TZ', salary: false }, | COMMENT |
| LOW | docs-src/src/components/salaries.ts | 261 | // { 'name': 'Vanuatu', 'code': 'VU', salary: false }, | COMMENT |
| LOW | docs-src/src/theme/Root.tsx | 601 | // DISABLED because it kill the google metric "Page prevented back/forward cache restoration" | COMMENT |
| LOW | docs-src/src/theme/Root.tsx | 621 | // console.log(' window.location.hostname: ' + window.location.hostname); | COMMENT |
| LOW | docs-src/src/theme/Root.tsx | 641 | COMMENT | |
| LOW | docs-src/src/theme/Root.tsx | 661 | // }, reloadWait); | COMMENT |
| LOW | docs-src/src/theme/PaginatorNavLink/index.tsx | 21 | }}>{isNext ? 'Next' : 'Previous'}</span><br />{isNext ? '' : '« '}{title}{isNext ? ' »' : ''}</Button>; | COMMENT |
| LOW | docs-src/src/pages/sem/gawmdb1.tsx | 41 | // <>No hand-written sync code</>, | COMMENT |
| LOW | docs-src/src/pages/sem/gaidxdb1.tsx | 41 | // <>JSON schemas and migrations</>, | COMMENT |
| LOW | docs-src/src/pages/sem/indexeddb-database-2.tsx | 21 | // <Trophy | COMMENT |
| LOW | docs-src/src/pages/sem/indexeddb-database-2.tsx | 41 | // <th>IndexedDB</th> | COMMENT |
| LOW | docs-src/src/pages/sem/indexeddb-database-2.tsx | 61 | // <tr> | COMMENT |
| LOW | docs-src/src/pages/sem/indexeddb-database-2.tsx | 81 | // <tr> | COMMENT |
| LOW | docs-src/src/pages/sem/indexeddb-database-2.tsx | 101 | // </tbody> | COMMENT |
| LOW | src/plugins/flutter/dart/analysis_options.yaml | 1 | # This file configures the static analysis results for your project (errors, | COMMENT |
| LOW | src/plugins/flutter/dart/analysis_options.yaml | 21 | COMMENT | |
| LOW | …plugins/storage-mongodb/rx-storage-instance-mongodb.ts | 141 | // const eventBulk: EventBulk<RxStorageChangeEvent<RxDocumentData<RxDocType>>, RxStorageDefaultCheck | COMMENT |
| LOW | src/plugins/storage-dexie/dexie-query.ts | 201 | // apply skip and limit boundaries. | COMMENT |
| LOW | …ns/replication-webrtc/connection-handler-webtorrent.ts | 1 | // /** | COMMENT |
| LOW | …ns/replication-webrtc/connection-handler-webtorrent.ts | 21 | // export const P2PT_DEFAULT_TRACKERS = [ | COMMENT |
| LOW | …ns/replication-webrtc/connection-handler-webtorrent.ts | 41 | // infoHash: sha1.sync(options.topic).toLowerCase(), | COMMENT |
| LOW | …ns/replication-webrtc/connection-handler-webtorrent.ts | 61 | // // a tracker was unavailable or sent bad data to the client. you can probably ignore it | COMMENT |
| LOW | …ns/replication-webrtc/connection-handler-webtorrent.ts | 81 | // peer.on('data', (data: Buffer) => { | COMMENT |
| LOW | …ns/replication-webrtc/connection-handler-webtorrent.ts | 101 | // client.update(); | COMMENT |
| LOW | …ns/replication-webrtc/connection-handler-webtorrent.ts | 121 | // disconnect$.complete(); | COMMENT |
| LOW | …plugins/replication-webrtc/connection-handler-p2pcf.ts | 1 | // import { Subject } from 'rxjs'; | COMMENT |
| 3 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/unit/rx-collection.test.ts | 568 | // Step 1: Insert all N documents | COMMENT |
| LOW | test/unit/rx-collection.test.ts | 582 | // Step 2: Delete all N documents | COMMENT |
| LOW | test/unit/rx-collection.test.ts | 596 | // Step 3: Re-insert the same N documents (reviving soft-deleted entries) | COMMENT |
| LOW | test/unit/rx-collection.test.ts | 609 | // Step 4: Verify all documents are present (this is where the bug manifests) | COMMENT |
| LOW⚡ | test/unit/rx-document.test.ts | 1568 | // Step 1: Create the observable reference (captures startWith value eagerly) | COMMENT |
| LOW⚡ | test/unit/rx-document.test.ts | 1571 | // Step 2: Update the document AFTER creating the observable but BEFORE subscribing | COMMENT |
| LOW⚡ | test/unit/rx-document.test.ts | 1574 | // Step 3: Subscribe to the previously created observable | COMMENT |
| LOW | docs-src/docs/fulltext-search.md | 58 | ### Step 1: Add the `RxDBFlexSearchPlugin` to RxDB. | COMMENT |
| LOW | docs-src/docs/fulltext-search.md | 66 | ### Step 2: Create a `RxFulltextSearch` instance on top of a collection with the `addFulltextSearch()` function. | COMMENT |
| LOW | docs-src/docs/fulltext-search.md | 105 | ### Step 3: Run a search operation: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/unit/rx-collection.test.ts | 568 | // Step 1: Insert all N documents | COMMENT |
| LOW | test/unit/rx-collection.test.ts | 582 | // Step 2: Delete all N documents | COMMENT |
| LOW | test/unit/rx-collection.test.ts | 596 | // Step 3: Re-insert the same N documents (reviving soft-deleted entries) | COMMENT |
| LOW | test/unit/rx-collection.test.ts | 609 | // Step 4: Verify all documents are present (this is where the bug manifests) | COMMENT |
| LOW⚡ | test/unit/rx-document.test.ts | 1568 | // Step 1: Create the observable reference (captures startWith value eagerly) | COMMENT |
| LOW⚡ | test/unit/rx-document.test.ts | 1571 | // Step 2: Update the document AFTER creating the observable but BEFORE subscribing | COMMENT |
| LOW⚡ | test/unit/rx-document.test.ts | 1574 | // Step 3: Subscribe to the previously created observable | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | test/replication-couchdb.test.ts | 412 | // But in production it is pretty random, I've added 3 edits just in case | COMMENT |
| HIGH | docs-src/docs/rx-server.md | 313 | When you have fields that should only be modified by the server, but not by the client, you can ensure that by comparing | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | examples/flutter/pubspec.yaml | 64 | # included with your application, so that you can use the icons in | COMMENT |
| MEDIUM | src/plugins/flutter/dart/analysis_options.yaml | 9 | # If you want a smaller set of lints you can change this to specify | COMMENT |
| MEDIUM | …s/replication-webrtc/connection-handler-simple-peer.ts | 196 | 'This server is made for demonstration purposes and tryouts. It is not reliable and might be offline at | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | examples/flutter/pubspec.yaml | 61 | # The following section is specific to Flutter packages. | COMMENT |
| MEDIUM | scripts/start-foundationdb-docker.sh | 24 | # Create the cluster file directory on the host | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …cles/alternatives/aws-amplify-datastore-alternative.md | 237 | 'x-api-key': 'your-api-key' | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | config/appwrite/restore.bash | 35 | # Verify if tables exist to confirm import success | COMMENT |