Sandstorm is a self-hostable web productivity suite. It's implemented as a security-hardened web app package manager.
This report summarizes scanner evidence for sandstorm-io/sandstorm, a JavaScript project with 7,080 GitHub stars. SynthScan examined 99,548 lines of code across 457 source files, recording 431 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 5.3 (Moderate 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.
Can maintainers explain intent, assumptions, and trade-offs? 302 finding(s).
Are imports declared and package/API names verified? 128 finding(s).
Are wrappers, guards, and repeated structures necessary? 22 finding(s).
Which changes need focused human review? 431 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 431 distinct pattern matches across 11 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 | install.sh | 1 | #! /bin/bash | COMMENT |
| LOW | install.sh | 21 | # The script will ask you whether you're OK with giving it root privileges. | COMMENT |
| LOW | install.sh | 181 | # | COMMENT |
| LOW | install.sh | 641 | fi | COMMENT |
| LOW | install.sh | 761 | COMMENT | |
| LOW | install.sh | 1161 | # OK! Let's proceed. | COMMENT |
| LOW | install.sh | 1381 | fail "E_BAD_PACKAGE" "Bad package -- did not contain $BUILD_DIR directory." | COMMENT |
| LOW | install.sh | 1401 | # pinned Meteor version holds everything else back. | COMMENT |
| LOW | install.sh | 1581 | # WARNING: This function should only be run if we already know | COMMENT |
| LOW | make-bundle.sh | 1 | #! /bin/bash | COMMENT |
| LOW | find-meteor-dev-bundle.sh | 1 | #! /bin/bash | COMMENT |
| LOW | find-meteor-dev-bundle.sh | 21 | # users install them separately. | COMMENT |
| LOW | shell/server/main.ts | 1 | // Sandstorm - Personal Cloud Sandbox | COMMENT |
| LOW | shell/server/main.ts | 21 | // This file exists to reify load order as we try to move everything to modern | COMMENT |
| LOW | shell/imports/constants.js | 1 | // Sandstorm - Personal Cloud Sandbox | COMMENT |
| LOW | shell/imports/db-deprecated.js | 1 | // Sandstorm - Personal Cloud Sandbox | COMMENT |
| LOW | shell/imports/demo.js | 1 | // Sandstorm - Personal Cloud Sandbox | COMMENT |
| LOW | shell/imports/tapi18n.js | 1 | // This file is an indirection that re-exports the tap:i18n API for use | COMMENT |
| LOW | shell/imports/dates.js | 1 | // Sandstorm - Personal Cloud Sandbox | COMMENT |
| LOW | shell/imports/install.js | 1 | // Sandstorm - Personal Cloud Sandbox | COMMENT |
| LOW | shell/imports/blackrock-payments/constants.js | 1 | // Sandstorm Blackrock | COMMENT |
| LOW | …l/imports/blackrock-payments/server/payments-server.js | 1 | // Sandstorm Blackrock | COMMENT |
| LOW | …l/imports/blackrock-payments/server/payments-server.js | 41 | const HOSTNAME = Url.parse(ROOT_URL).hostname; | COMMENT |
| LOW | …l/imports/blackrock-payments/server/payments-server.js | 321 | data.subscriptions.data[0].id); | COMMENT |
| LOW | …ports/blackrock-payments/server/payments-api-server.js | 1 | // Sandstorm Blackrock | COMMENT |
| LOW | …l/imports/blackrock-payments/client/payments-client.js | 1 | // Sandstorm Blackrock | COMMENT |
| LOW | …l/imports/blackrock-payments/client/billingSettings.js | 1 | // Sandstorm Blackrock | COMMENT |
| LOW | …ports/blackrock-payments/client/payments-api-client.js | 1 | // Sandstorm Blackrock | COMMENT |
| LOW | …ell/imports/blackrock-payments/client/billingPrompt.js | 1 | // Sandstorm Blackrock | COMMENT |
| LOW | shell/imports/sandstorm-ui-topbar/topbar.js | 1 | // Sandstorm - Personal Cloud Sandbox | COMMENT |
| LOW | shell/imports/sandstorm-ui-topbar/topbar.js | 421 | // Like `startOpen`, but indicates that the initial state of the popup should be "modal", i.e. | COMMENT |
| LOW | shell/imports/sandstorm-db/profile.js | 1 | // Sandstorm - Personal Cloud Sandbox | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 1 | // Sandstorm - Personal Cloud Sandbox | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 41 | } else { | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 61 | // A credential identifies a method for authenticating a user, such as an attached Google or Github | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 81 | // being a demo user. | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 101 | // invariant that a credetial only be a login credetial for a single account. | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 121 | // terms of service. | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 141 | // reliably determining which users's names are safe to display. | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 161 | Meteor.users.ensureIndexOnServer("services.oidc.id", { sparse: 1 }); | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 181 | // isAutoUpdated: This package was downloaded as part of an auto-update. We shouldn't clean it up | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 201 | // appId: The app ID this package is intended to override (as with Packages.appId). | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 221 | // appMarketingVersion: Human-readable presentation of the app version, e.g. "2.9.17" | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 241 | // do not observe global user IDs, but rather grain-local user IDs, generated when each user | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 261 | // The following fields *might* also exist. These are temporary hacks used to implement e-mail and | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 281 | // Contacts are not symmetric. Bob might be one of Alice's contacts even if Alice is not one of | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 301 | // _id: String generated as a SHA256 hash of the grain ID, the user ID, a salt generated by the | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 321 | // token: For a non-UiView capability, the API token that can be used to restore this | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 341 | // hasLoaded: Marked as true by the proxy when the underlying UiSession has responded to its first | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 361 | // Each contains: | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 381 | COMMENT | |
| LOW | shell/imports/sandstorm-db/db.js | 401 | // timestamp: File creation time. Used to figure out when the token and file should be wiped. | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 421 | // grainId: The grain servicing this API. (Not present if the API isn't serviced by a grain.) | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 441 | // treated as type AnyPointer, and so encoded as a raw Cap'n Proto message. | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 461 | // verifiedEmail: An VerifiedEmail capability that is implemented by the frontend. | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 481 | // parentToken: If present, then this token represents exactly the capability represented by | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 501 | // so treat this token the same as "trashed". It is denormalized out of Users for | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 521 | // illustrate, here is an approximate definition of ApiToken in pseudo Cap'n Proto schema language: | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 541 | // emailVerifier :group { | COMMENT |
| LOW | shell/imports/sandstorm-db/db.js | 561 | // child :group { | COMMENT |
| 211 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | shell/i18n/fi.i18n.json | 312 | "placeholder": "etsi" | CODE |
| LOW | shell/i18n/fi.i18n.json | 393 | "placeholder": "Kirjoita sähköposti osoitteet tai nimet" | CODE |
| LOW | shell/i18n/fi.i18n.json | 477 | "placeholder": "https://example.com", | CODE |
| LOW | shell/i18n/fi.i18n.json | 517 | "placeholder": "alice@example.com", | CODE |
| LOW | shell/i18n/fi.i18n.json | 641 | "placeholder": "-----BEGIN CERTIFICATE-----\nMIID...\n-----END CERTIFICATE-----", | CODE |
| LOW⚡ | shell/i18n/fi.i18n.json | 658 | "placeholder": "https://YOUR_SAML_PROVIDER.com/sso/saml" | CODE |
| LOW⚡ | shell/i18n/fi.i18n.json | 662 | "placeholder": "https://YOUR_SAML_PROVIDER.com/sso/saml/SingleLogoutService" | CODE |
| LOW⚡ | shell/i18n/fi.i18n.json | 666 | "placeholder": "base64 encoded cert (e.g. MIID...8F==)" | CODE |
| LOW | shell/i18n/fi.i18n.json | 810 | "placeholder": "https://example.com/tos", | CODE |
| LOW | shell/i18n/fi.i18n.json | 815 | "placeholder": "https://example.com/privacy", | CODE |
| LOW | shell/i18n/fi.i18n.json | 948 | "placeholder": "etsi" | CODE |
| LOW | shell/i18n/fi.i18n.json | 1093 | "placeholder": "alice@email.com\nbob@example.com", | CODE |
| LOW | shell/i18n/fi.i18n.json | 1338 | "placeholder": "etsi" | CODE |
| LOW | shell/i18n/fi.i18n.json | 1438 | "placeholder": "koko nimi", | CODE |
| LOW | shell/i18n/fi.i18n.json | 1443 | "placeholder": "nimimerkki", | CODE |
| LOW | shell/i18n/fi.i18n.json | 1608 | "placeholder": "kirjoita sähköpostiosoite", | CODE |
| LOW | shell/i18n/fi.i18n.json | 1615 | "placeholder": "kirjoita kirjautumiskoodisi", | CODE |
| LOW | shell/i18n/zh-TW.i18n.json | 303 | "placeholder": "搜尋 " | CODE |
| LOW | shell/i18n/zh-TW.i18n.json | 347 | "placeholder": "輸入電郵信箱或姓名" | CODE |
| LOW | shell/i18n/zh-TW.i18n.json | 431 | "placeholder": "https://example.com", | CODE |
| LOW | shell/i18n/zh-TW.i18n.json | 471 | "placeholder": "alice@example.com", | CODE |
| LOW | shell/i18n/zh-TW.i18n.json | 595 | "placeholder": "-----BEGIN CERTIFICATE-----\nMIID...\n-----END CERTIFICATE-----", | CODE |
| LOW⚡ | shell/i18n/zh-TW.i18n.json | 612 | "placeholder": "https://YOUR_SAML_PROVIDER.com/sso/saml" | CODE |
| LOW⚡ | shell/i18n/zh-TW.i18n.json | 616 | "placeholder": "https://YOUR_SAML_PROVIDER.com/sso/saml/SingleLogoutService" | CODE |
| LOW⚡ | shell/i18n/zh-TW.i18n.json | 620 | "placeholder": "base64 encoded cert (e.g. MIID...8F==)" | CODE |
| LOW | shell/i18n/zh-TW.i18n.json | 764 | "placeholder": "https://example.com/tos", | CODE |
| LOW | shell/i18n/zh-TW.i18n.json | 769 | "placeholder": "https://example.com/privacy", | CODE |
| LOW | shell/i18n/zh-TW.i18n.json | 897 | "placeholder": "搜尋" | CODE |
| LOW | shell/i18n/zh-TW.i18n.json | 1042 | "placeholder": "alice@email.com\nbob@example.com", | CODE |
| LOW | shell/i18n/zh-TW.i18n.json | 1286 | "placeholder": "搜尋" | CODE |
| LOW | shell/i18n/zh-TW.i18n.json | 1386 | "placeholder": "全名", | CODE |
| LOW | shell/i18n/zh-TW.i18n.json | 1391 | "placeholder": "網名", | CODE |
| LOW | shell/i18n/zh-TW.i18n.json | 1555 | "placeholder": "輸入電郵地址", | CODE |
| LOW | shell/i18n/zh-TW.i18n.json | 1562 | "placeholder": "輸入您的認證碼", | CODE |
| LOW | shell/i18n/en.i18n.json | 343 | "placeholder": "search" | CODE |
| LOW | shell/i18n/en.i18n.json | 426 | "placeholder": "Enter email addresses or names" | CODE |
| LOW | shell/i18n/en.i18n.json | 510 | "placeholder": "https://example.com", | CODE |
| LOW | shell/i18n/en.i18n.json | 550 | "placeholder": "alice@example.com", | CODE |
| LOW | shell/i18n/en.i18n.json | 674 | "placeholder": "-----BEGIN CERTIFICATE-----\nMIID...\n-----END CERTIFICATE-----", | CODE |
| LOW⚡ | shell/i18n/en.i18n.json | 711 | "placeholder": "https://YOUR_SAML_PROVIDER.com/sso/saml" | CODE |
| LOW⚡ | shell/i18n/en.i18n.json | 715 | "placeholder": "https://YOUR_SAML_PROVIDER.com/sso/saml/SingleLogoutService" | CODE |
| LOW⚡ | shell/i18n/en.i18n.json | 719 | "placeholder": "base64 encoded cert (e.g. MIID...8F==)" | CODE |
| LOW | shell/i18n/en.i18n.json | 867 | "placeholder": "https://example.com/tos", | CODE |
| LOW | shell/i18n/en.i18n.json | 872 | "placeholder": "https://example.com/privacy", | CODE |
| LOW | shell/i18n/en.i18n.json | 1006 | "placeholder": "search" | CODE |
| LOW | shell/i18n/en.i18n.json | 1151 | "placeholder": "alice@email.com\nbob@example.com", | CODE |
| LOW | shell/i18n/en.i18n.json | 1396 | "placeholder": "search" | CODE |
| LOW | shell/i18n/en.i18n.json | 1496 | "placeholder": "full name", | CODE |
| LOW | shell/i18n/en.i18n.json | 1501 | "placeholder": "handle", | CODE |
| LOW | shell/i18n/en.i18n.json | 1666 | "placeholder": "enter email address", | CODE |
| LOW | shell/i18n/en.i18n.json | 1673 | "placeholder": "enter your token", | CODE |
| LOW | shell/i18n/zh-CN.i18n.json | 312 | "placeholder": "搜索" | CODE |
| LOW | shell/i18n/zh-CN.i18n.json | 393 | "placeholder": "输入电邮地址或姓名" | CODE |
| LOW | shell/i18n/zh-CN.i18n.json | 477 | "placeholder": "https://example.com", | CODE |
| LOW | shell/i18n/zh-CN.i18n.json | 517 | "placeholder": "alice@example.com", | CODE |
| LOW | shell/i18n/zh-CN.i18n.json | 641 | "placeholder": "-----BEGIN CERTIFICATE-----\nMIID...\n-----END CERTIFICATE-----", | CODE |
| LOW⚡ | shell/i18n/zh-CN.i18n.json | 658 | "placeholder": "https://YOUR_SAML_PROVIDER.com/sso/saml" | CODE |
| LOW⚡ | shell/i18n/zh-CN.i18n.json | 662 | "placeholder": "https://YOUR_SAML_PROVIDER.com/sso/saml/SingleLogoutService" | CODE |
| LOW⚡ | shell/i18n/zh-CN.i18n.json | 666 | "placeholder": "base64 encoded cert (e.g. MIID...8F==)" | CODE |
| LOW | shell/i18n/zh-CN.i18n.json | 810 | "placeholder": "https://example.com/tos", | CODE |
| 59 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | shell/imports/sandstorm-db/db.js | 3152 | const result = this.connection.sandstormDb.collections.userActions.findAndModify({ | CODE |
| CRITICAL | shell/imports/server/transfers-server.js | 49 | this.connection.sandstormDb.collections.incomingTransfers.find({userId: this.userId}, | CODE |
| CRITICAL | shell/imports/server/transfers-server.js | 51 | this.connection.sandstormDb.collections.outgoingTransfers.find({userId: this.userId}) | CODE |
| CRITICAL | shell/imports/server/admin-server.js | 149 | this.connection.sandstormDb.collections.settings.upsert({ _id: "organizationMembership" }, { value: params.membershi | CODE |
| CRITICAL | shell/imports/server/admin-server.js | 150 | this.connection.sandstormDb.collections.settings.upsert({ _id: "organizationSettings" }, { value: params.settings }) | CODE |
| CRITICAL | shell/imports/server/admin-server.js | 366 | this.connection.sandstormDb.collections.setupSession.upsert({ | CODE |
| CRITICAL | shell/imports/client/grain/grainlist-client.js | 475 | const myGrainsCursor = instance.data._db.collections.grains.find({ | CODE |
| CRITICAL | shell/imports/client/grain/grainlist-client.js | 482 | const myTokens = instance.data._db.collections.apiTokens.find({ | CODE |
| CRITICAL | …torm_readthedocs_modified_theme/js/jquery-2.1.1.min.js | 4 | },removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.matc | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | meteor-bundle-main.js | 36 | function monkeypatchHttpForGateway() { | CODE |
| LOW | shell/imports/sandstorm-db/db.js | 2375 | function appShortDescriptionFromPackage(pkg) { | CODE |
| LOW | shell/imports/sandstorm-db/db.js | 2381 | function nounPhraseForActionAndAppTitle(action, appTitle) { | CODE |
| LOW | shell/imports/sandstorm-identicons/helpers.js | 112 | function iconSrcForDenormalizedGrainMetadata(metadata, usage, staticPrefix) { | CODE |
| LOW | shell/imports/server/observe-helpers.js | 17 | function fillUndefinedForChangedDoc(newDoc, oldDoc) { | CODE |
| LOW | shell/imports/server/gateway-router.js | 665 | function storeReferralProgramInfoApiTokenCreated(db, accountId, apiTokenAccountId) { | CODE |
| LOW | shell/imports/server/gateway-router.js | 692 | function referralProgramLogSharingTokenUse(db, bobAccountId) { | CODE |
| LOW | shell/imports/server/gateway-router.js | 750 | function parsePowerboxDescriptorList(list) { | CODE |
| LOW | shell/imports/server/migrations.js | 744 | function backgroundFillInGrainSizes(db, backend) { | CODE |
| LOW | shell/imports/server/migrations.js | 858 | function onePersonaPerAccountPreCleanup(db, _backend) { | CODE |
| LOW | shell/imports/server/migrations.js | 1129 | function onePersonaPerAccountPostCleanup(db, _backend) { | CODE |
| LOW⚡ | shell/imports/server/migrations.js | 1166 | function cleanupBadExpiresIfUnused(db, _backend) { | CODE |
| LOW⚡ | shell/imports/server/migrations.js | 1172 | function deleteReferralNotifications(db, _backend) { | CODE |
| LOW⚡ | shell/imports/server/migrations.js | 1181 | function deleteHackSessionHttpSetting(db, _backend) { | CODE |
| LOW⚡ | shell/imports/server/acme.js | 204 | function notifyAdminOfCertificateExpiration(expirationDate) { | CODE |
| LOW⚡ | shell/imports/server/acme.js | 208 | function removeAllCertificateExpirationNotifications() { | CODE |
| LOW⚡ | shell/imports/server/acme.js | 214 | function renewCertificateWhenNeeded(certChain) { | CODE |
| LOW | shell/imports/server/drivers/external-ui-view.js | 112 | function registerHttpApiFrontendRef(registry) { | CODE |
| LOW | shell/imports/sandstorm-ui-powerbox/powerbox-server.js | 194 | function registerUiViewQueryHandler(frontendRefRegistry) { | CODE |
| LOW | shell/imports/client/accounts/account-settings-ui.js | 1 | function SandstormAccountSettingsUi(topbar, db, staticHost) { | CODE |
| LOW | tests/tests/backup-restore.js | 56 | function makeCleanDownloadsDirSync() { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …l/imports/blackrock-payments/server/payments-server.js | 519 | // more robust for us to search for all changes since the last we know about. | COMMENT |
| MEDIUM | shell/imports/sandstorm-ui-topbar/topbar.js | 430 | // right, the highest-priority will be *rightmost*. Essentially, higher-priority items tend | COMMENT |
| MEDIUM | shell/imports/server/accounts/saml-utils.js | 316 | // we would probably need to stuff it in Mongo to make it robust across multiple | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | shell/imports/sandstorm-ui-powerbox/powerbox-server.js | 376 | // others, and prefer the most-specific match. For now, though, I've implemented a heuristic: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | install.sh | 2057 | -new `# Create a new certificate/request.` \ | CODE |
| MEDIUM | install.sh | 2058 | -newkey rsa:4096 `# Create a new RSA key of length 4096 bits.` \ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | install.sh | 574 | # ======================================================================================== | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | install.sh | 1542 | # WARNING: This function should only be run if we already know | COMMENT |
| LOW | install.sh | 1581 | # WARNING: This function should only be run if we already know | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | installer-tests/prepare-for-tests.sh | 38 | # Check if Vagrant has plugins we need; if not, we install them. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | shell/i18n/sync-langs.py | 45 | CODE |