AI Slop Code Risk Monitor

pocketbase/pocketbase

SlopCodeMonitor badge for pocketbase/pocketbase Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

Open Source realtime backend in 1 file

2.1 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for pocketbase/pocketbase, a Go project with 61,623 GitHub stars. SynthScan examined 185,382 lines of code across 724 source files, recording 274 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 2.1 (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.

2.1
Adjusted Signal
2.1
Raw Pattern Score
100%
Time Factor
2026-10-26
Last Push
61.6K
Stars
Go
Language
185.4K
Lines of Code
724
Files
274
Pattern Hits
2026-10-31
Scan Date
0.02
HC Hit Rate

Risk Review · Payload v1

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.

Cognitive Ownership Risk 5.9/100 · LOW

Can maintainers explain intent, assumptions, and trade-offs? 225 finding(s).

Hallucinated Dependency & Supply Chain Risk 4.5/100 · LOW

Are imports declared and package/API names verified? 49 finding(s).

Agent Over-Engineering Ratio 0.4/100 · LOW

Are wrappers, guards, and repeated structures necessary? 16 finding(s).

PR Review Velocity Impact 9.8/100 · LOW

Which changes need focused human review? 274 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

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.

Severity Breakdown

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.

CRITICAL 1HIGH 16MEDIUM 9LOW 248

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 274 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.

Over-Commented Block189 hits · 164 pts
SeverityFileLineSnippetContext
LOWui/src/records/recordsList.js561COMMENT
LOWui/src/fields/autodate/onrecordduplicate.js1// {COMMENT
LOWui/src/fields/file/onrecordduplicate.js1// {COMMENT
LOWtools/logger/batch_handler.go21var _ slog.Handler = (*BatchHandler)(nil)COMMENT
LOWtools/logger/batch_handler.go41 BatchSize intCOMMENT
LOWtools/picker/pick.go21// Fields value modifiers are also supported using the `:modifier(args)` format (see Modifiers).COMMENT
LOWtools/template/registry.go1// Package template is a thin wrapper around the standard html/templateCOMMENT
LOWtools/template/registry.go61//COMMENT
LOWtools/mailer/smtp.go161COMMENT
LOWtools/mailer/smtp.go181COMMENT
LOWtools/filesystem/filesystem.go181// Deprecated: Please use GetReader(fileKey) instead.COMMENT
LOWtools/filesystem/filesystem.go361 }COMMENT
LOWtools/filesystem/filesystem.go601// note: expects key to be in a canonical form (eg. "accept-encoding" should be "Accept-Encoding").COMMENT
LOWtools/filesystem/internal/s3blob/s3blob.go1// Package s3blob provides a blob.Bucket S3 driver implementation.COMMENT
LOWtools/filesystem/internal/s3blob/s3/uploader.go41COMMENT
LOWtools/filesystem/internal/s3blob/s3/list_objects.go21 // For directory buckets, "/" is the only supported delimiter.COMMENT
LOWtools/filesystem/internal/s3blob/s3/s3.go1// Package s3 implements a lightweight client for interacting with theCOMMENT
LOWtools/filesystem/internal/fileblob/attrs.go1package fileblobCOMMENT
LOWtools/filesystem/internal/fileblob/fileblob.go1// Package fileblob provides a blob.Bucket driver implementation.COMMENT
LOWtools/filesystem/internal/fileblob/fileblob.go21//COMMENT
LOWtools/filesystem/internal/fileblob/fileblob.go41// `MetadataDontWrite` or its equivalent "metadata=skip" in the URL for the opener.COMMENT
LOWtools/filesystem/blob/bucket.go1// Package blob defines a lightweight abstration for interacting withCOMMENT
LOWtools/filesystem/blob/bucket.go61 // Delimiter sets the delimiter used to define a hierarchical namespace,COMMENT
LOWtools/filesystem/blob/bucket.go81 // PageToken may be filled in with the NextPageToken from a previousCOMMENT
LOWtools/filesystem/blob/bucket.go201var FirstPageToken = []byte("first page")COMMENT
LOWtools/filesystem/blob/bucket.go301COMMENT
LOWtools/filesystem/blob/bucket.go481 //COMMENT
LOWtools/filesystem/blob/bucket.go501 // displayed inline or as an attachment.COMMENT
LOWtools/filesystem/blob/bucket.go521 // When true, if ContentType is the empty string, it will stay the emptyCOMMENT
LOWtools/filesystem/blob/bucket.go541// NewWriter returns a Writer that writes to the blob stored at key.COMMENT
LOWtools/filesystem/blob/writer.go21// https://www.apache.org/licenses/LICENSE-2.0COMMENT
LOWtools/filesystem/blob/reader.go41 savedOffset int64 // Last relativeOffset for r, saved after relativeOffset is changed in Seek, or -1 if no Seek.COMMENT
LOWtools/filesystem/blob/hex.go1package blobCOMMENT
LOWtools/filesystem/blob/hex.go21// distributed under the License is distributed on an "AS IS" BASIS,COMMENT
LOWtools/filesystem/blob/driver.go41COMMENT
LOWtools/filesystem/blob/driver.go61 // NewTypedWriter returns Writer that writes to an object associated with key.COMMENT
LOWtools/filesystem/blob/driver.go81 // Copy copies the object associated with srcKey to dstKey.COMMENT
LOWtools/subscriptions/client.go21}COMMENT
LOWtools/search/simple_field_resolver.go21// ResolverResult defines a single FieldResolver.Resolve() successfully parsed result.COMMENT
LOWtools/search/filter.go21//COMMENT
LOWtools/search/token_functions.go61 }, nilCOMMENT
LOWtools/hook/hook.go21 //COMMENT
LOWtools/hook/hook.go41// hook.EventCOMMENT
LOWtools/cron/schedule.go81//COMMENT
LOWtools/store/store.go161COMMENT
LOWtools/router/rereadable_read_closer.go21// NB! Make sure to call Close after done working with the reader.COMMENT
LOWtools/router/event.go181const jsonFieldsParam = "fields"COMMENT
LOWtools/router/event.go341// dst must be either a struct pointer or map[string]any.COMMENT
LOWtools/router/event.go361//COMMENT
LOWtools/router/unmarshal_request_data.go21//COMMENT
LOWtools/router/unmarshal_request_data.go41//COMMENT
LOWtools/router/router.go21// Optionally return a clean up function that will be invoked right after the route execution.COMMENT
LOWapis/record_auth_with_oauth2_redirect.go121 // fallback if UI is not bundledCOMMENT
LOWapis/serve.go41 //COMMENT
LOWapis/record_crud.go101 return firstApiError(err, e.InternalServerError("Failed to enrich records", err))COMMENT
LOWapis/middlewares_gzip.go41 //COMMENT
LOWapis/middlewares_gzip.go221 }COMMENT
LOWapis/middlewares_cors.go1package apisCOMMENT
LOWapis/middlewares_cors.go41 // validate any logic. Remember that attackers may register hostile domain names.COMMENT
LOWapis/middlewares_cors.go61 // AllowMethods determines the value of the Access-Control-Allow-MethodsCOMMENT
129 more matches not shown…
Cross-Language Confusion (JS/TS)16 hits · 120 pts
SeverityFileLineSnippetContext
HIGH⚡ui/src/apiPreview/docsAuthWithOAuth2.js135 print(pb.authStore.isValid);CODE
HIGH⚡ui/src/apiPreview/docsAuthWithOAuth2.js136 print(pb.authStore.token);CODE
HIGH⚡ui/src/apiPreview/docsAuthWithOAuth2.js137 print(pb.authStore.record.id);CODE
HIGH⚡ui/src/apiPreview/docsAuthRefresh.js113 print(pb.authStore.isValid);CODE
HIGH⚡ui/src/apiPreview/docsAuthRefresh.js114 print(pb.authStore.token);CODE
HIGH⚡ui/src/apiPreview/docsAuthRefresh.js115 print(pb.authStore.record.id);CODE
HIGH⚡ui/src/apiPreview/docsAuthWithPassword.js114 print(pb.authStore.isValid);CODE
HIGH⚡ui/src/apiPreview/docsAuthWithPassword.js115 print(pb.authStore.token);CODE
HIGH⚡ui/src/apiPreview/docsAuthWithPassword.js116 print(pb.authStore.record.id);CODE
HIGH⚡ui/src/apiPreview/docsAuthWithOTP.js98 print(pb.authStore.isValid);CODE
HIGH⚡ui/src/apiPreview/docsAuthWithOTP.js99 print(pb.authStore.token);CODE
HIGH⚡ui/src/apiPreview/docsAuthWithOTP.js100 print(pb.authStore.record.id);CODE
HIGH⚡ui/src/apiPreview/docsRealtime.js108 print(e.action);CODE
HIGH⚡ui/src/apiPreview/docsRealtime.js109 print(e.record);CODE
HIGH⚡ui/src/apiPreview/docsRealtime.js114 print(e.action);CODE
HIGH⚡ui/src/apiPreview/docsRealtime.js115 print(e.record);CODE
Fake / Example Data32 hits · 40 pts
SeverityFileLineSnippetContext
LOWCHANGELOG_16_22.md647 app.Logger().Info("Example message", "total", 123, "details", "lorem ipsum...")CODE
LOWCHANGELOG_16_22.md650 $app.logger().info("Example message", "total", 123, "details", "lorem ipsum...")CODE
LOWCHANGELOG_16_22.md1125 app.Dao().FindRecordsByFilter("posts", "title ~ 'lorem ipsum' && visible = true", "-created", 10)CODE
LOW⚡ui/public/libs/tinymce/tinymce.min.js13!function(){"use strict";var e=function(e){if(null===e)return"null";if(void 0===e)return"undefined";var t=typeof e;returCODE
LOWui/public/libs/tinymce/themes/silver/theme.min.js1!function(){"use strict";const e=Object.getPrototypeOf,t=(e,t,o)=>{var n;return!!o(e,t.prototype)||(null===(n=e.construcCODE
LOWui/src/fields/editor/init.js17 return "Lorem ipsum dolor sit amet...";CODE
LOWui/src/fields/editor/init.js17 return "Lorem ipsum dolor sit amet...";CODE
LOWui/src/apiPreview/docsAuthWithOAuth2.js21 "name": "John Doe",CODE
LOWui/src/base/select.js247 { rid: "selected-placeholder", className: "placeholder" },CODE
LOWtools/logger/batch_handler.go59// l.Info("Example message", "title", "lorem ipsum")COMMENT
LOWtools/inflector/inflector_test.go128 {"John Doe", "john_doe"},CODE
LOWtools/mailer/html2text_test.go74 <p>Lorem ipsum</p>CODE
LOWtools/mailer/html2text_test.go75 <p>Dolor sit amet</p>CODE
LOWtools/mailer/html2text_test.go117 "Lorem ipsum \r\nDolor sit amet \r\n[Verify](a/b/c) \r\n[Verify2.1 Verify2.2](a/b/c) \r\n\r\n- ul.test1 \r\n- ul.teCODE
LOWtools/mailer/html2text_test.go117 "Lorem ipsum \r\nDolor sit amet \r\n[Verify](a/b/c) \r\n[Verify2.1 Verify2.2](a/b/c) \r\n\r\n- ul.test1 \r\n- ul.teCODE
LOW⚡tools/mailer/mailer_test.go21 []mail.Address{{Name: "John Doe", Address: "test1@example.com"}, {Name: "Jane Doe", Address: "test2@example.com"}},CODE
LOW⚡tools/mailer/mailer_test.go21 []mail.Address{{Name: "John Doe", Address: "test1@example.com"}, {Name: "Jane Doe", Address: "test2@example.com"}},CODE
LOW⚡tools/mailer/mailer_test.go22 []string{`"John Doe" <test1@example.com>`, `"Jane Doe" <test2@example.com>`},CODE
LOW⚡tools/mailer/mailer_test.go22 []string{`"John Doe" <test1@example.com>`, `"Jane Doe" <test2@example.com>`},CODE
LOW⚡tools/mailer/mailer_test.go26 []mail.Address{{Name: "John Doe", Address: "test1@example.com"}, {Address: "test2@example.com"}},CODE
LOW⚡tools/mailer/mailer_test.go27 []string{`"John Doe" <test1@example.com>`, `test2@example.com`},CODE
LOW⚡tools/mailer/mailer_test.go31 []mail.Address{{Name: "John Doe", Address: "test1@example.com"}, {Name: "Jane Doe", Address: "test2@example.com"}},CODE
LOW⚡tools/mailer/mailer_test.go31 []mail.Address{{Name: "John Doe", Address: "test1@example.com"}, {Name: "Jane Doe", Address: "test2@example.com"}},CODE
LOWtools/filesystem/filesystem.go378// content := strings.NewReader("Lorem ipsum dolor sit amet...")COMMENT
LOWtools/filesystem/filesystem.go378// content := strings.NewReader("Lorem ipsum dolor sit amet...")COMMENT
LOWcore/record_query.go364// dbx.Params{"title": "lorem ipsum", "visible": true}COMMENT
LOWcore/app.go634 // dbx.Params{"title": "lorem ipsum", "visible": true}COMMENT
LOWplugins/jsvm/binds_test.go930 if (result.name != "John Doe") {CODE
LOWplugins/jsvm/binds_test.go931 throw new Error("Expected result.name 'John Doe', got " + result.name)CODE
LOWplugins/jsvm/binds_test.go942 if (result.name != "John Doe") {CODE
LOWplugins/jsvm/binds_test.go943 throw new Error("Expected result.name 'John Doe', got " + result.name)CODE
LOWplugins/jsvm/internal/types/types.go391 * title: "Lorem ipsum"COMMENT
Hyper-Verbose Identifiers16 hits · 16 pts
SeverityFileLineSnippetContext
LOWui/src/records/recordUpsertModal.js869function resetTokenKeyDropdownItem(collection, data, modalSettings) {CODE
LOWui/src/records/recordUpsertModal.js938function sendPasswordResetEmailDropdownItem(collection, data, modalSettings) {CODE
LOWui/src/records/recordUpsertModal.js983function sendVerificationDropdownItem(collection, data, modalSettings) {CODE
LOWui/src/records/recordSummary.js117function hideRecordSummaryDropdown(target, delay = 150) {CODE
LOWui/src/records/recordSummary.js134function showRecordSummaryDropdown(target, record, delay = 150) {CODE
LOWui/src/auth/pageRequestSuperuserPasswordReset.js1export function pageRequestSuperuserPasswordReset(route) {CODE
LOWui/src/apiPreview/docsCreate.js375export function replaceDummyPayloadPlaceholder(payloadStr) {CODE
LOWui/src/collections/collectionsOverviewModal.js125 function sortSystemUnderscoredLast(a, b) {CODE
LOWui/src/collections/collectionUpsertModal.js727function syncFieldsAndIndexesWithScaffold(collection) {CODE
LOW…/src/collections/collectionChangesConfirmationModal.js109 async function detectConflictingOIDCProviders() {CODE
LOWui/src/collections/autocomplete.utils.js67function collectionFieldsAutocomplete(word, collections, collection, prefix = "", level = 0) {CODE
LOWui/src/collections/autocomplete.utils.js156function requestFieldsAutocomplete(word, collections, baseCollection) {CODE
LOWui/src/collections/autocomplete.utils.js216function collectionJoinAutocomplete(word, collections) {CODE
LOWui/src/collections/oauth2/appleOptions.js47function appleSecretGeneratorModal(modalSettings = {}) {CODE
LOWui/src/base/tinymce.js88 function triggerOnchangeWithDebounce(debounce = 150) {CODE
LOWui/src/base/codeEditor.js110 function closeAutocompleteDropdown() {CODE
Modern AI Meta-Vocabulary5 hits · 15 pts
SeverityFileLineSnippetContext
MEDIUMui/src/collections/collectionUpsertModal.js338 // merge with the scaffold to ensure that the minimal props are setCOMMENT
MEDIUMui/src/collections/collectionUpsertModal.js766 // remove old scaffold indexesCOMMENT
MEDIUMui/src/collections/collectionUpsertModal.js788 // merge new scaffold indexesCOMMENT
MEDIUMapis/collection.go88 // create scaffoldCOMMENT
MEDIUMapis/collection.go91 // merge the scaffold with the submitted request dataCOMMENT
Example Usage Blocks9 hits · 14 pts
SeverityFileLineSnippetContext
LOWcore/mfa_model.go34// Example usage:COMMENT
LOWcore/auth_origin_model.go29// Example usage:COMMENT
LOWcore/external_auth_model.go28// Example usage:COMMENT
LOWcore/otp_model.go28// Example usage:COMMENT
LOWcore/record_model.go1368// Example usage:COMMENT
LOWplugins/migratecmd/migratecmd.go6// Example usage:COMMENT
LOWplugins/migratecmd/migratecmd.go51// Example usage:COMMENT
LOWplugins/ghupdate/ghupdate.go7// Example usage:COMMENT
LOWplugins/jsvm/jsvm.go114// Example usage:COMMENT
AI Slop Vocabulary4 hits · 12 pts
SeverityFileLineSnippetContext
MEDIUM⚡ui/public/libs/tinymce/tinymce.min.js13!function(){"use strict";var e=function(e){if(null===e)return"null";if(void 0===e)return"undefined";var t=typeof e;returCODE
MEDIUM⚡ui/public/libs/tinymce/tinymce.min.js13!function(){"use strict";var e=function(e){if(null===e)return"null";if(void 0===e)return"undefined";var t=typeof e;returCODE
MEDIUMui/src/records/recordsList.js132 // no explicit presentable -> try to utilize the first found implicit presentable fieldCOMMENT
MEDIUMplugins/jsvm/jsvm.go5// can utilize them as part of their own custom goja runtime setup.COMMENT
Hallucination Indicators1 hit · 10 pts
SeverityFileLineSnippetContext
CRITICALui/public/libs/tinymce/themes/silver/theme.min.js1!function(){"use strict";const e=Object.getPrototypeOf,t=(e,t,o)=>{var n;return!!o(e,t.prototype)||(null===(n=e.construcCODE
Slop Phrases2 hits · 3 pts
SeverityFileLineSnippetContext
LOWtools/filesystem/internal/s3blob/s3/s3.go112// Note: Don't forget to call resp.Body.Close() after done with the result.COMMENT
LOWtools/search/provider_test.go749// NB! Don't forget to call `db.Close()` at the end of the test.COMMENT