Perkeep (née Camlistore) is your personal storage system for life: a way of storing, syncing, sharing, modelling and backing up content.
This report summarizes scanner evidence for perkeep/perkeep, a Go project with 7,257 GitHub stars. SynthScan examined 369,829 lines of code across 1493 source files, recording 372 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 1.7 (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? 338 finding(s).
Are imports declared and package/API names verified? 34 finding(s).
Are wrappers, guards, and repeated structures necessary? 11 finding(s).
Which changes need focused human review? 372 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
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 372 distinct pattern matches across 10 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 | misc/docker/synology/build_syno.go | 81 | // Which is why we run it as the last step, and in privileged mode. | COMMENT |
| LOW | clients/web/embed/closure/lib/closure/goog/deps.js | 1 | // Copyright 2017 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | clients/web/embed/closure/lib/closure/goog/base.js | 1 | // Copyright 2006 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | clients/web/embed/closure/lib/closure/goog/base.js | 641 | // | COMMENT |
| LOW | clients/web/embed/closure/lib/closure/goog/base.js | 1021 | } | COMMENT |
| LOW | clients/web/embed/closure/lib/closure/goog/base.js | 1721 | } | COMMENT |
| LOW | clients/web/embed/closure/lib/closure/goog/base.js | 1741 | // most array functions will still work because the array is still | COMMENT |
| LOW | clients/web/embed/closure/lib/closure/goog/base.js | 1761 | COMMENT | |
| LOW | …/embed/closure/lib/closure/goog/labs/useragent/util.js | 1 | // Copyright 2013 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …mbed/closure/lib/closure/goog/labs/useragent/engine.js | 1 | // Copyright 2013 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ed/closure/lib/closure/goog/labs/useragent/platform.js | 1 | // Copyright 2013 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …bed/closure/lib/closure/goog/labs/useragent/browser.js | 1 | // Copyright 2013 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ients/web/embed/closure/lib/closure/goog/ui/control.js | 1 | // Copyright 2007 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ents/web/embed/closure/lib/closure/goog/ui/registry.js | 1 | // Copyright 2008 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ents/web/embed/closure/lib/closure/goog/ui/decorate.js | 1 | // Copyright 2008 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …b/embed/closure/lib/closure/goog/ui/controlrenderer.js | 1 | // Copyright 2008 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …eb/embed/closure/lib/closure/goog/ui/controlcontent.js | 1 | // Copyright 2009 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …nts/web/embed/closure/lib/closure/goog/ui/component.js | 1 | // Copyright 2007 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …nts/web/embed/closure/lib/closure/goog/ui/component.js | 1061 | // Render the child into the parent at the appropriate location. Note that | COMMENT |
| LOW | …s/web/embed/closure/lib/closure/goog/ui/idgenerator.js | 1 | // Copyright 2008 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …/embed/closure/lib/closure/goog/useragent/useragent.js | 1 | // Copyright 2006 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ents/web/embed/closure/lib/closure/goog/net/xhrlike.js | 1 | // Copyright 2013 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …b/embed/closure/lib/closure/goog/net/xmlhttpfactory.js | 1 | // Copyright 2010 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ents/web/embed/closure/lib/closure/goog/net/xmlhttp.js | 1 | // Copyright 2006 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …/closure/lib/closure/goog/net/wrapperxmlhttpfactory.js | 1 | // Copyright 2010 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ts/web/embed/closure/lib/closure/goog/net/errorcode.js | 1 | // Copyright 2007 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …s/web/embed/closure/lib/closure/goog/net/httpstatus.js | 1 | // Copyright 2011 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | clients/web/embed/closure/lib/closure/goog/net/xhrio.js | 1 | // Copyright 2006 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ts/web/embed/closure/lib/closure/goog/net/eventtype.js | 1 | // Copyright 2006 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | clients/web/embed/closure/lib/closure/goog/iter/iter.js | 1 | // Copyright 2007 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …embed/closure/lib/closure/goog/bootstrap/webworkers.js | 1 | // Copyright 2010 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …web/embed/closure/lib/closure/goog/bootstrap/nodejs.js | 1 | // Copyright 2013 The Closure Library Authors. | COMMENT |
| LOW | …ents/web/embed/closure/lib/closure/goog/array/array.js | 1 | // Copyright 2006 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ients/web/embed/closure/lib/closure/goog/crypt/sha1.js | 1 | // Copyright 2005 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ents/web/embed/closure/lib/closure/goog/crypt/crypt.js | 1 | // Copyright 2008 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ients/web/embed/closure/lib/closure/goog/crypt/hash.js | 1 | // Copyright 2011 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ients/web/embed/closure/lib/closure/goog/crypt/sha2.js | 1 | // Copyright 2012 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …nts/web/embed/closure/lib/closure/goog/crypt/sha224.js | 1 | // Copyright 2012 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ents/web/embed/closure/lib/closure/goog/timer/timer.js | 1 | // Copyright 2006 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ents/web/embed/closure/lib/closure/goog/timer/timer.js | 201 | COMMENT | |
| LOW | …/web/embed/closure/lib/closure/goog/reflect/reflect.js | 1 | // Copyright 2009 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | clients/web/embed/closure/lib/closure/goog/async/run.js | 1 | // Copyright 2013 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …/web/embed/closure/lib/closure/goog/async/workqueue.js | 1 | // Copyright 2015 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …s/web/embed/closure/lib/closure/goog/async/nexttick.js | 1 | // Copyright 2013 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …s/web/embed/closure/lib/closure/goog/async/freelist.js | 1 | // Copyright 2015 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …s/web/embed/closure/lib/closure/goog/async/throttle.js | 1 | // Copyright 2007 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ed/closure/lib/closure/goog/html/trustedresourceurl.js | 1 | // Copyright 2013 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …nts/web/embed/closure/lib/closure/goog/html/safeurl.js | 1 | // Copyright 2013 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …s/web/embed/closure/lib/closure/goog/html/safestyle.js | 1 | // Copyright 2014 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …/closure/lib/closure/goog/html/uncheckedconversions.js | 1 | // Copyright 2013 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …/embed/closure/lib/closure/goog/html/safestylesheet.js | 1 | // Copyright 2014 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ts/web/embed/closure/lib/closure/goog/html/safehtml.js | 1 | // Copyright 2013 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ts/web/embed/closure/lib/closure/goog/html/safehtml.js | 641 | // | COMMENT |
| LOW | …/web/embed/closure/lib/closure/goog/html/safescript.js | 1 | // Copyright 2014 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ents/web/embed/closure/lib/closure/goog/style/style.js | 1 | // Copyright 2006 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | …ents/web/embed/closure/lib/closure/goog/style/style.js | 461 | COMMENT | |
| LOW | …ents/web/embed/closure/lib/closure/goog/style/style.js | 621 | // How much the element can move in the container, i.e. the difference between | COMMENT |
| LOW | …ents/web/embed/closure/lib/closure/goog/style/style.js | 1881 | // ignores them when rendering. Interestingly enough, when we force the | COMMENT |
| LOW | clients/web/embed/closure/lib/closure/goog/math/rect.js | 1 | // Copyright 2006 The Closure Library Authors. All Rights Reserved. | COMMENT |
| LOW | clients/web/embed/closure/lib/closure/goog/math/size.js | 1 | // Copyright 2007 The Closure Library Authors. All Rights Reserved. | COMMENT |
| 253 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …ients/web/embed/closure/lib/closure/goog/ui/control.js | 537 | goog.ui.Control.superClass_.enterDocument.call(this); | CODE |
| CRITICAL | …ients/web/embed/closure/lib/closure/goog/ui/control.js | 640 | goog.ui.Control.superClass_.exitDocument.call(this); | CODE |
| CRITICAL | …ients/web/embed/closure/lib/closure/goog/ui/control.js | 652 | goog.ui.Control.superClass_.disposeInternal.call(this); | CODE |
| CRITICAL | …ients/web/embed/closure/lib/closure/goog/ui/control.js | 741 | goog.ui.Control.superClass_.setRightToLeft.call(this, rightToLeft); | CODE |
| CRITICAL | …nts/web/embed/closure/lib/closure/goog/ui/component.js | 590 | goog.ui.Component.superClass_.setParentEventTarget.call(this, parent); | CODE |
| CRITICAL | …nts/web/embed/closure/lib/closure/goog/ui/component.js | 612 | goog.ui.Component.superClass_.setParentEventTarget.call(this, parent); | CODE |
| CRITICAL | …nts/web/embed/closure/lib/closure/goog/ui/component.js | 869 | goog.ui.Component.superClass_.disposeInternal.call(this); | CODE |
| CRITICAL | …b/embed/closure/lib/closure/goog/structs/simplepool.js | 194 | goog.structs.SimplePool.superClass_.disposeInternal.call(this); | CODE |
| CRITICAL | …b/embed/closure/lib/closure/goog/events/eventtarget.js | 208 | goog.events.EventTarget.superClass_.disposeInternal.call(this); | CODE |
| CRITICAL | …eb/embed/closure/lib/closure/goog/events/keyhandler.js | 511 | goog.events.KeyHandler.superClass_.disposeInternal.call(this); | CODE |
| CRITICAL | …/embed/closure/lib/closure/goog/events/eventhandler.js | 467 | goog.events.EventHandler.superClass_.disposeInternal.call(this); | CODE |
| CRITICAL | …/embed/closure/lib/closure/goog/events/browserevent.js | 399 | goog.events.BrowserEvent.superClass_.stopPropagation.call(this); | CODE |
| CRITICAL | …/embed/closure/lib/closure/goog/events/browserevent.js | 412 | goog.events.BrowserEvent.superClass_.preventDefault.call(this); | CODE |
| CRITICAL⚡ | app/pdfcabinet/ui/jquery-ui.min.js | 6 | (function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e= | CODE |
| CRITICAL⚡ | app/pdfcabinet/ui/jquery-ui.min.js | 9 | }},_updateDatepicker:function(e){this.maxRows=4,m=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e | CODE |
| CRITICAL | app/pdfcabinet/ui/jquery.min.js | 4 | marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:" | CODE |
| CRITICAL | app/publisher/jquery.js | 7237 | jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { | CODE |
| CRITICAL⚡ | app/scanningcabinet/ui/jquery-ui.min.js | 6 | (function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e= | CODE |
| CRITICAL⚡ | app/scanningcabinet/ui/jquery-ui.min.js | 9 | }},_updateDatepicker:function(e){this.maxRows=4,m=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e | CODE |
| CRITICAL | app/scanningcabinet/ui/jquery.min.js | 4 | marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …/web/embed/closure/lib/closure/goog/a11y/aria/roles.js | 20 | * This is auto-generated code. Do not manually edit! For more details | COMMENT |
| HIGH | …embed/closure/lib/closure/goog/a11y/aria/attributes.js | 21 | * This is auto-generated code. Do not manually edit! For more details | COMMENT |
| HIGH | …embed/closure/lib/closure/goog/a11y/aria/datatables.js | 21 | * This is auto-generated code. Do not manually edit! | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | clients/web/embed/closure/lib/closure/goog/base.js | 2380 | * var MSG_NAME = goog.getMsg('Hello {$placeholder}', {'placeholder': 'world'}); | COMMENT |
| LOW | clients/curl/test_data.txt | 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque at tortor in tellus accumsan euismod. Quisque scelerisq | CODE |
| LOW | clients/curl/test_data.txt | 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque at tortor in tellus accumsan euismod. Quisque scelerisq | CODE |
| LOW⚡ | app/pdfcabinet/ui/jquery-ui.min.js | 6 | (function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e= | CODE |
| LOW⚡ | app/scanningcabinet/ui/jquery-ui.min.js | 6 | (function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e= | CODE |
| LOW⚡ | website/testdata/sample.md | 1 | # Lorem Ipsum | COMMENT |
| LOW⚡ | website/testdata/sample.md | 3 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do | CODE |
| LOW⚡ | website/testdata/sample.md | 3 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do | CODE |
| LOW | website/static/godocs.js | 39 | search.value = search.getAttribute("placeholder"); | CODE |
| LOW | website/static/mock.html | 100 | <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam | CODE |
| LOW | website/static/mock.html | 100 | <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam | CODE |
| LOW | website/static/mock.html | 120 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam elementum auctor faucibus. Morbi nec nulla a magna sempe | CODE |
| LOW | website/static/mock.html | 120 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam elementum auctor faucibus. Morbi nec nulla a magna sempe | CODE |
| LOW | website/pk-web/pkweb_test.go | 109 | "<title>Lorem Ipsum - Perkeep</title>"}, | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | clients/web/embed/less/less.js | 201 | //TODO - could do with adding more robust error handling | COMMENT |
| MEDIUM | clients/web/embed/react/react-dom.min.js | 10 | !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e(require("react"));else if("functio | CODE |
| LOW | clients/web/embed/react/react-with-addons.min.js | 10 | !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof defin | CODE |
| MEDIUM | …id/app/src/main/java/org/camlistore/UploadService.java | 293 | // Definitely don't need to upload thumbnails, but | COMMENT |
| MEDIUM | app/publisher/jquery.js | 9795 | // understands anonymous AMD modules. A named AMD is safest and most robust | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | clients/web/embed/closure/lib/closure/goog/base.js | 2853 | function addNewerLanguageTranspilationCheck(modeName, isSupported) { | CODE |
| LOW | clients/web/embed/less/less.js | 4713 | function tryConditionFollowedByParenthesis(me) { | CODE |
| LOW | clients/web/embed/less/less.js | 8151 | function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) { | CODE |
| LOW | clients/web/embed/less/less.js | 8160 | function mergeElementsOnToSelectors(elements, selectors) { | CODE |
| LOW | app/publisher/jquery.js | 8053 | function addToPrefiltersOrTransports( structure ) { | CODE |
| LOW | app/publisher/jquery.js | 8087 | function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { | CODE |
| LOW | …site/talks/2011-05-07-Camlistore-Sao-Paolo/prettify.js | 337 | function allowAnywhereFoldCaseAndRenumberGroups(regex) { | CODE |
| LOW | …site/talks/2011-05-07-Camlistore-Sao-Paolo/prettify.js | 1017 | function recombineTagsAndDecorations(job) { | CODE |
| LOW | server/perkeepd/ui/index.js | 584 | function createPermanodeIfNotExists(results) { | CODE |
| LOW | server/perkeepd/ui/index.js | 617 | function checkExistingCamliMembership(results) { | CODE |
| LOW | server/perkeepd/ui/index.js | 630 | function createPermanodeAssociations(results) { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | pkg/search/query.go | 1906 | // TODO(mpl): I've added c.BlobRefPrefix, so that c.ParentDir can be directly | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | internal/searchtypes/query.go | 174 | EXIF *EXIFConstraint `json:"exif,omitempty"` // TODO: implement | CODE |
| LOW | internal/searchtypes/query.go | 222 | // TODO: implement. | COMMENT |
| LOW | pkg/search/query.go | 1997 | // TODO: implement FileCount and FileSize. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | cmd/pk-mount/doc.go | 41 | # Creating a Root Node | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | server/perkeepd/ui/blob_item_container_react.js | 379 | // NOTE: This method causes the URL bar to throb for a split second (at least on Chrome), so it should not be called co | COMMENT |