live · scanning repos
Scanrepo
github.com
github.com / PurpleDoubleD

PurpleDoubleD/locally-uncensored

TypeScript·5601 files·commit 5c9c444·scanned 15h ago·cached ✓
25/100
LOW RISK
Minor findings consistent with the project type. Nothing reachable from install hooks.

score capped at 25 — 3,037 stars — findings likely legitimate code patterns

verdict accurate?
43% file coverage
Partial architecture graph
Desktop app detected
threat-state: lowlive

FINDINGS ░▒▓

what this code does░▒▓

What happens when you open, install or run it, from the findings below.

  1. when runsetup.sh downloads a script from ollama.com and pipes it to the shell. setup.sh:95
  2. when runsrc-tauri/src/commands/abliterate/mod.rs and 2 other files start system processes. src-tauri/src/commands/abliterate/mod.rs, src-tauri/src/commands/computer/desk/platform/macos.rs, src-tauri/src/commands/gpu_roles.rs
  3. when runsrc-tauri/src/commands/agent.rs and 2 other files reference SSH key or cloud credential paths (such as ~/.ssh or ~/.aws/credentials). src-tauri/src/commands/agent.rs, src/lib/dev-fs-jail.ts, src/lib/voice/work-scope.ts
  4. when runsrc-tauri/plugins/lu-native/src/commands.rs and 2 other files read the clipboard. src-tauri/plugins/lu-native/src/commands.rs, src/lib/lu-native.ts, src/mobile/platform/clipboard.ts
criticaleval() usage detectedeval() executes arbitrary code and is commonly used in malware to run obfuscated payloads fetched from remote servers.scripts/mobile/ios/pruefe-geraete-paket.sh
json()    { # Datei, Pfad als JS-Ausdruck hinter dem Objekt
  node -e 'const o=JSON.parse(require("fs").readFileSync(process.argv[1],"utf8"));console.log(eval("o"+process.argv[2]))' "$1" "$2"
}
+8
criticalRust process Command usagestd::process::Command can execute arbitrary shell commands. Malware uses it to drop payloads, exfiltrate data, or establish persistence.src-tauri/src/commands/abliterate/mod.rs
        set_phase("quantize", &format!("Quantizing to {q}"));
        let mut cmd = Command::new(bin);
        cmd.arg(&converted).arg(&partial).arg(q);
        run_python(cmd, "quantize", |_| {})?;
+8
criticalRust process Command usagestd::process::Command can execute arbitrary shell commands. Malware uses it to drop payloads, exfiltrate data, or establish persistence.src-tauri/src/commands/computer/desk/platform/macos.rs
    }
    let _ = std::process::Command::new("/usr/bin/open").arg(settings_url(permission)).spawn();
}
+8
criticalRust process Command usagestd::process::Command can execute arbitrary shell commands. Malware uses it to drop payloads, exfiltrate data, or establish persistence.src-tauri/src/commands/gpu_roles.rs
pub fn env_of(selection: &GpuSelection) -> Vec<String> {
    let mut cmd = std::process::Command::new("lu-gpu-plan-never-run");
    crate::commands::gpu::apply_gpu_env(&mut cmd, selection);
    let mu...
+8
warningSuspicious Windows batch commandBatch file contains commands commonly used to download and execute remote payloads (powershell, certutil, bitsadmin, curl to pipe, etc.).setup.bat
echo.
powershell -NoProfile -Command ^
  "Write-Host '';Write-Host '   +---------------------------------------------------------------+' -F Yellow;Write-Host '   | This script starts Locally Uncens...
+5
criticalRemote script piped into a shellA shell script downloads remote content and executes it directly (e.g. `curl … | bash`). The payload is never stored or reviewable and can change server-side — a classic malware/backdoor install pattern.setup.sh
    echo "      macOS:  brew install node"
    echo "      Ubuntu: curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - && sudo apt install -y nodejs"
    echo "      Arch:   sudo pacman ...
+10
criticaleval() usage detectedeval() executes arbitrary code and is commonly used in malware to run obfuscated payloads fetched from remote servers.src-tauri/resources/voice_loop/tests/test_tools.py
    source = inspect.getsource(tools)
    for banned in ("subprocess", "os.system", "os.popen", "exec(", "eval(", "open(", "importlib", "__import__", "pty", "shutil"):
        assert banned not in sou...
+8
criticalPython dynamic code executioneval(), exec() or compile() on untrusted input can execute arbitrary code. Common in Python malware for running obfuscated payloads.src-tauri/resources/voice_loop/tests/test_tools.py
    source = inspect.getsource(tools)
    for banned in ("subprocess", "os.system", "os.popen", "exec(", "eval(", "open(", "importlib", "__import__", "pty", "shutil"):
        assert banned not in sou...
+7
infoSuspicious files are not reachable from entry pointsFlagged files exist but are not imported by any entry point. They may be dead code, tests, or attack payloads triggered by another mechanism.+2
warningHardcoded IP address in network callFetching data from hardcoded IP addresses instead of domain names is suspicious and may indicate C2 communication.src-tauri/plugins/lu-native/src/net.rs
/// app (`willPerformHTTPRedirection` is not called for it). A public address
/// answering `302 Location: https://192.168.1.1/...` would be followed. So
/// before a download is handed to the system,...
+5
warningHardcoded IP address in network callFetching data from hardcoded IP addresses instead of domain names is suspicious and may indicate C2 communication.src-tauri/src/commands/proxy.rs
/// reqwest's default policy follows up to 10 redirects and checks nothing on the
/// way, so a public URL answering `302 Location: http://169.254.169.254/…` (or
/// `http://127.0.0.1:11434/…`) reache...
+5
warningHardcoded IP address in network callFetching data from hardcoded IP addresses instead of domain names is suspicious and may indicate C2 communication.src-tauri/src/commands/web_reach.rs
        for url in [
            "http://127.0.0.1:8127/", "http://localhost/", "http://192.168.1.1/", "http://10.0.0.1/",
            "http://172.16.0.1/", "http://169.254.169.254/latest/meta-data/",...
+5
infoBase64 encoding usedatob() or Buffer.from with base64. Common in legitimate code but also used to hide malicious URLs.e2e/mobile/agent.mobile.ts
        fetched.push('/__probe-image.png')
        return route.fulfill({ status: 200, contentType: 'image/png', body: Buffer.from('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAE...
+2
criticalCryptocurrency wallet directory accessAccessing wallet directories to steal private keys, seed phrases, or wallet data.scripts/win-isa-guard.test.mjs+5
warningClipboard read accessnavigator.clipboard.readText() reads the user's clipboard. In a wallet/crypto context this is often used to steal copied seed phrases or private keys.src-tauri/plugins/lu-native/src/commands.rs
///
/// The webview cannot do this on a phone: `navigator.clipboard.readText()`
/// is refused in the Android WebView (NotAllowedError, seen on the
/// emulator), so every "Paste" button was dead ther...
+4
warningSSH/credential path accessAccessing .ssh, .aws/credentials, or .env files to steal authentication credentials.src-tauri/src/commands/agent.rs
/// bridge (`remote.rs`, `#[serde(rename = "chatId")]`), so a paired device could
/// read `~/.ssh` / `~/.aws` and write shell rc files or LaunchAgents, i.e. code
/// execution at next login without e...
+5
warningSSH/credential path accessAccessing .ssh, .aws/credentials, or .env files to steal authentication credentials.src/lib/dev-fs-jail.ts
  for (const rel of [
    '.ssh', '.aws', '.gnupg', '.kube', '.docker', '.config', '.lu',
    'Library/Keychains', 'AppData',
  ]) {
+5
warningClipboard read accessnavigator.clipboard.readText() reads the user's clipboard. In a wallet/crypto context this is often used to steal copied seed phrases or private keys.src/lib/lu-native.ts
// The clipboard of the system, asked directly. The Android WebView refuses
// `navigator.clipboard.readText()` (NotAllowedError), so "Paste" needs this.
// On iOS the system asks "Allow Paste" once f...
+4
warningSSH/credential path accessAccessing .ssh, .aws/credentials, or .env files to steal authentication credentials.src/lib/voice/work-scope.ts
 * Read from the text of the command, so it catches what a model writes when
 * it means to leave (`cat ~/.ssh/id_rsa`, `cd ..`, `ls /etc`) and not what a
 * program does once it runs. The executable ...
+5
warningClipboard read accessnavigator.clipboard.readText() reads the user's clipboard. In a wallet/crypto context this is often used to steal copied seed phrases or private keys.src/mobile/platform/clipboard.ts
    if (typeof navigator !== 'undefined' && navigator.clipboard && typeof navigator.clipboard.readText === 'function') {
      const text = await navigator.clipboard.readText()
      return text ? { s...
+4
warningExtremely long lines (>1000 chars)Very long lines in source files (not minified bundles) can hide malicious code.src/components/create/experimental/PresetWorkshop.tsx+4
warningHigh-entropy string literalsFound 85 long strings with high Shannon entropy. This is common in obfuscated payloads that hide URLs, keys, or bytecode.src/api/image-parts.ts+3
warningFlattened or dead control flowDetected switch(true), dead if branches, or deeply nested ternaries — patterns used by obfuscators to hide execution order.src/components/create/experimental/PresetWorkshop.tsx+3
warningHigh-entropy string literalsFound 4 long strings with high Shannon entropy. This is common in obfuscated payloads that hide URLs, keys, or bytecode.src/lib/constants.ts+3
warningFlattened or dead control flowDetected switch(true), dead if branches, or deeply nested ternaries — patterns used by obfuscators to hide execution order.src/lib/explicit-search.ts+3
warningHigh-entropy string literalsFound 16 long strings with high Shannon entropy. This is common in obfuscated payloads that hide URLs, keys, or bytecode.src/mobile/data/mobile-models.ts+3
warningFlattened or dead control flowDetected switch(true), dead if branches, or deeply nested ternaries — patterns used by obfuscators to hide execution order.src/mobile/policy/server-text.ts+3
infoEmbedded binary assetA 168-character base64 literal decodes to a PNG image. Inlined assets are normal in desktop and CLI UIs.e2e/create-batch-edit.spec.ts
iVBORw0KGgoAAAANSUhEUgAAAEAAAAAwCAIAAAAuKetIAAAAQ0lEQVR42u3P...
+0
warningLarge base64-encoded blobA 4232-character base64 blob was found. May hide a remote payload or encoded executable code.e2e/create-save-character.spec.ts
GkXfo59ChoEBQveBAULygQRC84EIQoKEd2VibUKHgQJChYECGFOAZwEAAAAA...
+3
infoEmbedded binary assetA 96-character base64 literal decodes to a PNG image. Inlined assets are normal in desktop and CLI UIs.e2e/gallery-download-saves-the-file.spec.ts
iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8...
+0
infoEmbedded binary assetA 96-character base64 literal decodes to a PNG image. Inlined assets are normal in desktop and CLI UIs.e2e/image-part.spec.ts
iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk...
+0
warningLarge base64-encoded blobA 4232-character base64 blob was found. May hide a remote payload or encoded executable code.e2e/mac-character-train.spec.ts
GkXfo59ChoEBQveBAULygQRC84EIQoKEd2VibUKHgQJChYECGFOAZwEAAAAA...
+3
infoSuspicious file in repoVery large source file (509KB) — could contain obfuscated payloadmobile-tests/tabelle/tabelle.json+2
infoSuspicious file in repoExecutable file (windows-signing-setup.ps1) in repositoryscripts/windows-signing-setup.ps1+2
infoSuspicious file in repoExecutable file (windows-signing-verify.ps1) in repositoryscripts/windows-signing-verify.ps1+2

Scores are heuristics. A “safe” verdict means no known-malicious patterns were found — clever malware can look boring. Wrong verdict? Flag it above; confirmed false positives become regression tests.

2431 files scanned @ 5c9c444 | 10/30/2026 | heuristic scan — always review manually

risk by category
code execution25
network & exfiltration17
file system access20
obfuscation15
supply chain15
owasp / injection0
telemetry
files 2431/5601rules hit 35engine v10commit 5c9c444

github

PurpleDoubleD/locally-uncensored

The all-in-one local AI studio for your desktop: chat, image and video generation and a coding agent in one free, open source app. Windows and Linux. No Docker, no terminal, no cloud required.

TypeScript
3037
498
220d
5601 files
2431 scanned(43%)
5c9c444

network indicators░▒▓

Hosts this code names or would connect to. Top 50 of 461, decoded and call-site destinations first. Informational, not scored.

architecture░▒▓

entry (0) flagged (56) pkg (196)
596 nodes · 835 edgesscroll to zoom · click node to jump to finding
LOW (25/100) — PurpleDoubleD/locally-uncensored — ScanRepo