@memohai/desktop
Memoh Electron desktop application (self-managed bootstrap reusing @memohai/web components)
Supply chain provenance
Status for the latest visible version.
Without SLSA provenance there is no cryptographic link between this tarball and the public source — the axios compromise (March 2026) relied on exactly this gap.
Maintainers
Accepted risks
Findings the reviewer chose to accept rather than block on.
| Source | Rule | Reason | Accepted by | When |
|---|---|---|---|---|
| phantom-deps | phantom-dep:@memohai/ui | AI (phantom-deps): Same-org sibling dep, likely re-exported through @memohai/web; stable FP. | ai | |
| phantom-deps | phantom-dep:@memohai/sdk | AI (phantom-deps): Same-org sibling dep, likely consumed transitively; stable FP. | ai | |
| phantom-deps | phantom-dep:@memohai/icon | AI (phantom-deps): Same-org sibling dep, likely consumed transitively; stable FP. | ai | |
| semgrep | semgrep:shady-links-raw-ip | AI (semgrep): Raw IP is 127.0.0.1 (localhost) for a local server — not an external exfiltration endpoint. | ai | |
| semgrep | semgrep:env-spread | AI (semgrep): env-spread is in a build script (scripts/build.mjs), not runtime code; standard pattern for passing env to child build processes. | ai | |
| semgrep | semgrep:silent-process-exec | AI (semgrep): Detached spawn is for a local background server (Qdrant/GStreamer); expected pattern for Electron desktop apps. | ai | |
| semgrep | semgrep:silent-process-exec-var | AI (semgrep): Same spawn call as silent-process-exec; local server management, not malicious. | ai |
Versions (showing 6 of 6)
| Version | Deps | Published |
|---|---|---|
| 0.9.0 | 2 / 30 | |
| 0.8.3 | 2 / 32 | |
| 0.8.2 | 2 / 32 | |
| 0.8.1 | 2 / 32 | |
| 0.8.0 | 6 / 24 | |
| 0.7.3 | 6 / 24 |
v0.9.0
11 findingsSpreading entire process.env into an object — may capture all secrets 61 | cwd: desktopRoot, 62 | stdio: 'inherit', > 63 | env: { 64 | ...process.env, 65 | ...extraEnv,
Spreading entire process.env into an object — may capture all secrets 10 | const child = spawn(pnpm, ['install', '--ignore-workspace'], { 11 | cwd: iconToolsDir, > 12 | env: { 13 | ...process.env, 14 | SHARP_IGNORE_GLOBAL_LIBVIPS: '1',
Spreading entire process.env into an object — may capture all secrets 742 | 743 | function runtimeEnv(targetDir, spec) { > 744 | return { 745 | ...process.env, 746 | PATH: `${resolve(targetDir, 'bin')}${process.platform === 'win32' ? ';' : ':'}${process.env.PATH ?? ''}`,
Spreading entire process.env into an object — may capture all secrets 49 | cwd: repoRoot, 50 | stdio: 'inherit', > 51 | env: { 52 | ...process.env, 53 | ...env,
Spreading entire process.env into an object — may capture all secrets 117 | ], { 118 | stdio: 'inherit', > 119 | env: { 120 | ...process.env, 121 | MEMOH_QDRANT_ARCHIVE: archivePath,
Spreading entire process.env into an object — may capture all secrets 346 | cwd: root, 347 | stdio: 'inherit', > 348 | env: { 349 | ...process.env, 350 | GOOS: 'linux',
Silent detached process — runs invisibly in the background (reverse shells, miners) 438 | } 439 | runMigrations(command) > 440 | const child = spawn(command.command, command.args, { 441 | cwd: command.cwd, 442 | detached: true,
Silent detached process — runs invisibly in the background (reverse shells, miners) 438 | } 439 | runMigrations(command) > 440 | const child = spawn(command.command, command.args, { 441 | cwd: command.cwd, 442 | detached: true,
Spreading entire process.env into an object — may capture all secrets 503 | 504 | function serverEnv(command: { configPath: string }): NodeJS.ProcessEnv { > 505 | return { 506 | ...process.env, 507 | ...bundledGStreamerEnv(),
Spreading entire process.env into an object — may capture all secrets 253 | stdio: ['ignore', logFd, logFd], 254 | windowsHide: process.platform === 'win32', > 255 | env: { 256 | ...process.env, 257 | QDRANT__TELEMETRY_DISABLED: 'true',
Package was published without Sigstore provenance. Only ~12% of npm packages have provenance, so this is common but not ideal.
v0.8.3
1 findingPackage was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.
v0.8.2
10 findingsSpreading entire process.env into an object — may capture all secrets 61 | cwd: desktopRoot, 62 | stdio: 'inherit', > 63 | env: { 64 | ...process.env, 65 | ...extraEnv,
Spreading entire process.env into an object — may capture all secrets 522 | 523 | function runtimeEnv(targetDir, spec) { > 524 | return { 525 | ...process.env, 526 | PATH: `${resolve(targetDir, 'bin')}${process.platform === 'win32' ? ';' : ':'}${process.env.PATH ?? ''}`,
Spreading entire process.env into an object — may capture all secrets 27 | cwd: repoRoot, 28 | stdio: 'inherit', > 29 | env: { 30 | ...process.env, 31 | ...env,
Spreading entire process.env into an object — may capture all secrets 117 | ], { 118 | stdio: 'inherit', > 119 | env: { 120 | ...process.env, 121 | MEMOH_QDRANT_ARCHIVE: archivePath,
Spreading entire process.env into an object — may capture all secrets 244 | cwd: root, 245 | stdio: 'inherit', > 246 | env: { 247 | ...process.env, 248 | GOOS: 'linux',
Silent detached process — runs invisibly in the background (reverse shells, miners) 336 | } 337 | runMigrations(command) > 338 | const child = spawn(command.command, command.args, { 339 | cwd: command.cwd, 340 | detached: true,
Silent detached process — runs invisibly in the background (reverse shells, miners) 336 | } 337 | runMigrations(command) > 338 | const child = spawn(command.command, command.args, { 339 | cwd: command.cwd, 340 | detached: true,
Spreading entire process.env into an object — may capture all secrets 399 | 400 | function serverEnv(command: { configPath: string }): NodeJS.ProcessEnv { > 401 | return { 402 | ...process.env, 403 | ...bundledGStreamerEnv(),
Spreading entire process.env into an object — may capture all secrets 252 | detached: true, 253 | stdio: ['ignore', logFd, logFd], > 254 | env: { 255 | ...process.env, 256 | QDRANT__TELEMETRY_DISABLED: 'true',
Package was published without Sigstore provenance. Only ~12% of npm packages have provenance, so this is common but not ideal.
v0.8.1
1 findingPackage was published without Sigstore provenance. Only ~12% of npm packages have provenance, so this is common but not ideal.
v0.8.0
1 findingPackage was published without Sigstore provenance. Only ~12% of npm packages have provenance, so this is common but not ideal.
v0.7.3
1 findingPackage was published without Sigstore provenance. Only ~12% of npm packages have provenance, so this is common but not ideal.