dumbtv
dumbtv takes the ads, screen tracking and update nags out of your Fire TV over ADB. No root, none of your apps touched, every step can be undone. Free and open source.
Generate threat models from system descriptions using LLMs with iterative review
AI summary · README
SecurityPython · JavaScriptGitHub @theAstivSelf-installOwner unconfirmed
Paste into Claude or ChatGPT for installation instructions suited to your environment.
Have you tried it? One tap is enough. No sign-in needed.
Loading the full README. The saved excerpt is shown below.
Open-source, self-hosted, iterative threat modeling powered by LLMs.
Paranoid takes system descriptions (text, diagrams, or code via MCP) and produces comprehensive STRIDE + MAESTRO threat models through an LLM-powered pipeline with deterministic fallback. Configure 1–15 automated iteration passes, then review threats in a human-in-the-loop approve/reject cycle.Read the full README ↗Open-source, self-hosted, iterative threat modeling powered by LLMs.
Paranoid takes system descriptions (text, diagrams, or code via MCP) and produces comprehensive STRIDE + MAESTRO threat models through an LLM-powered pipeline with deterministic fallback. Configure 1–15 automated iteration passes, then review threats in a human-in-the-loop approve/reject cycle.
docker compose up--seeded-assets / --seeded-flows--code /path/to/repo)-d on the CLI (-d arch.png -d flow.mmd) or the API's diagrams[] field, rendered with a proper ELK layout# Install
pip install paranoid-cli
# Configure
paranoid config init
# Run (the examples are in the repo, not the package: clone it, or fetch one)
curl -fsSLO https://raw.githubusercontent.com/theAstiv/paranoid/main/examples/stride-example-api-gateway.md
paranoid run stride-example-api-gateway.md # saved to the database; add -o threats.json for a file
Docker (web UI + API):
git clone https://github.com/theAstiv/paranoid && cd paranoid
cp .env.example .env # add your API key
mkdir -p data # must be writable by uid 1000: `sudo chown 1000:1000 data` if yours differs
docker compose up --build # web UI at http://localhost:8000/app
Note: the dependency capability engine, Bedrock, model routing, multiple diagrams, CVSS and ATT&CK/ATLAS mapping need v1.6.0 or later (
pip install "paranoid-cli>=1.6.0"). The dependency engine also needs Semgrep onPATH(pip install semgrep); the Docker image includes it.
examples/arsenal-deps/ is "MediaDrop", a fictional image-upload service with 8 real npm dependencies and three diagrams of the same system. Every command below runs against it.
# 1. Dependency capabilities inside a threat model (heatmap + drift in the web UI)
paranoid run examples/arsenal-deps/description.md \
--manifest examples/arsenal-deps/package.json \
--lockfile examples/arsenal-deps/package-lock.json --deps-source both
# A reconstructed (inert) event-stream-style incident: capability delta + drift, no LLM call
python examples/arsenal-deps/inject_incident.py --source both --no-llm
# 2. Three diagrams, ATT&CK/ATLAS techniques, CVSS next to DREAD
paranoid run examples/arsenal-deps/description.md -n 2 \
-d examples/arsenal-deps/diagrams/architecture.mmd \
-d examples/arsenal-deps/diagrams/upload-flow.mmd \
-d examples/arsenal-deps/diagrams/deployment.png \
--step-model extract_assets=main --step-model extract_flows=main \
--scoring-method both
# 3. Iterations + model routing, SARIF for GitHub code scanning
paranoid run examples/arsenal-deps/description.md -n 3 -v \
--manifest examples/arsenal-deps/package.json \
--lockfile examples/arsenal-deps/package-lock.json \
--format sarif -o mediadrop.sarif
CLI runs are saved to the local database (paranoid models list); start the web UI against the same DB_PATH to open them at http://localhost:8000/app. Set ANTHROPIC_EFFORT=medium for Claude: at the default effort a run takes about three times as long. Measured costs, timings and their sample sizes are in Benchmarks.
What the dependency engine claims: capability visibility plus change and discrepancy triage: what a dependency can do, what changed in a release, and what ships in the npm tarball that isn't in the repo. It doesn't claim to catch supply-chain attacks; see what it does not catch.
Export a model as the Markdown report and give it to Claude Code, Cursor or another coding agent as security requirements:
paranoid models export <model-id> --format markdown -o threats.md
This is the ordinary Markdown report, not an agent-specific format: assets, flows and trust boundaries, then each threat with its target, description, DREAD/CVSS score and mitigations. It includes every threat whatever its review status, so remove rejected ones from the file before handing it over. A dedicated format is on the roadmap.
| Guide | Description |
|---|---|
| Getting Started | Install, configure, and run your first threat model |
| CLI Reference | All flags, subcommands, and output formats |
| Configuration | All environment variables and config options |
| Web UI Guide | Browser interface walkthrough |
| Authentication | Multi-user setup, JWT, PATs, RBAC |
| API Reference | REST API — 86 route handlers across 13 route modules, plus /health and / in main.py |
| GitHub Action | Automated threat modeling in CI/CD |
| Architecture | System design, pipeline, data model |
| Benchmarks | An 11-model comparison on AWS Bedrock, routing savings per step, multi-diagram extraction, iterations, wall time, reliability and dependency-engine gates — dated, with sample sizes and caveats |
| Deployment | Docker, PyPI, binary, production hardening |
Other docs:
Static-analysis visibility into what an npm dependency can actually do — network access, filesystem, process spawning, dynamic code, native addons, and more — compared against its declared GitHub source, so a version bump that quietly adds a capability shows up before you install it.
# What can this package do? Fetches npm tarball + GitHub source, runs Semgrep.
paranoid deps scan [email protected] --source both
# Did capabilities change between two versions? (this is the *shape* of
# checks that would have caught the real ua-parser-js/event-stream
# supply-chain compromises: a patch release quietly adding a capability
# nothing in the diff would obviously explain. These two specific versions
# are both clean — the actual malicious 0.7.29 was unpublished — this just
# shows the delta computing cleanly against real registry data.)
paranoid deps diff ua-parser-js 0.7.28 0.7.30 --source both
# Sweep every direct dependency in your project's package.json
paranoid deps scan-manifest path/to/your-project/package.json
Requires Semgrep on PATH (pip install semgrep) —
see SEMGREP_BINARY, DEPS_CACHE_DIR, DEPS_MAX_TARBALL_MB in
Configuration. Source is
always fetched read-only; nothing scanned is ever executed or installed.
What deps scan reports: a CapabilityProfile per source — categories
(network, filesystem, process, dynamic_code, native_ffi,
persistence, authentication, environment, crypto, deserialization,
build_install), each backed by file:line evidence and a real source
snippet, plus any postinstall/preinstall lifecycle hooks.
What drift signals mean: with --source both, paranoid deps scan
compares the npm tarball against the package's own GitHub source for one
version, per file. paranoid deps diff is a separate comparison — did this
package's capabilities change between two releases — computed from two
tarball scans; with --source both it additionally reports drift for the
newer version alone, using the same per-file logic described here:
cargo build.rs) produces outside of
npm run build. Can't be verified against source either way; never
contributes a strong signal.postinstall/preinstall hooks are graded separately: a
non-allowlisted addition is a strong signal on its own (the
ua-parser-js-shaped compromise, caught without needing a previous
version to diff against).What it does not catch:
fetch()s and eval()s a
remote payload at runtime shows up as a network/dynamic_code
capability — the engine flags that the capability exists, not what the
fetched code will do.require/Function, concatenated or
computed property calls, low-level process.binding, etc. — see
backend/deps/rules/js/dynamic_code.yaml), not every possible way to hide
a call. A sufficiently determined, hand-crafted obfuscation can still slip
past static analysis; this is capability visibility and drift triage, not
a guarantee of detection.Read this as "here's what changed and what looks unexplained," not "this dependency is safe" or "this dependency is malicious" — every signal is meant to be triaged by a person, not acted on automatically.
| Platform | PyPI | Docker | Binary |
|---|---|---|---|
| Ubuntu 20.04+ | ✓ | ✓ | ✓¹ |
| macOS 11+ ARM64 | ✓ | ✓ | ✓ |
| Windows 10+ | ✓ | ✓ | ✓ |
| WSL2 | ✓ | ✓ | ✓¹ |
¹ From v1.6.0 (paranoid-linux-x64). The v1.5.0 release has no Linux binary: its macOS build overwrote it, as both were named paranoid.
Full platform matrix: docs/deployment.md
v1.6.0 — dependency capability engine, multi-user collaboration (accounts, projects, roles), AWS Bedrock, per-step model routing, multiple diagrams with ELK rendering, ATT&CK/ATLAS mapping and CVSS v3.1 scoring. See the CHANGELOG.
v1.5.0 — Non-technical users can open the web app, paste an API key, link a Git repo, and get a threat model — no terminal required.
Also planned:
Apache 2.0