Help Center
Everything you need to model threats in ThreatTree — from your first forest to a signed-off risk register. Every section below walks through the real UI, with a worked example you can follow along with.
Getting Started
ThreatTree organizes your work into Forests. A forest is a container for one system, product, or engagement — inside it you build Data Flow Diagrams (DFDs) to map architecture, and Attack Trees to decompose specific threats against that architecture. Findings roll up automatically into a Risk Register, which you can export as a PDF report.
The core ThreatTree workflow: everything lives inside a forest and rolls up to a report.
1. Create your first forest
- From your Dashboard, click New Forest (top right).
- Give it a Name — e.g. "Acme Corp Threat Model" — and an optional Description (scope, system under analysis).
- Click Create Forest. You're dropped into the empty forest, ready to add your first diagram.
2. Add a diagram
Inside a forest, click New DFD or New Attack Tree (or use the generic Add Tree flow, which opens a modal where you name the tree and pick its type: Data Flow Diagram — "Map system components and trust boundaries" — or Attack Tree — "Decompose a threat with AND/OR logic"). If you choose Attack Tree, you can optionally link it to an existing DFD right there, or do it later — see Linking DFDs & Attack Trees.
3. Which one do I build first?
Most engagements start with a DFD to establish what the system actually looks like — its processes, data stores, trust boundaries, and external actors — and then build one or more Attack Trees against specific goals an attacker might pursue within that architecture (e.g. "Exfiltrate customer PII", "Achieve unauthorized admin access"). You don't have to link them, but doing so keeps your threat model traceable back to the architecture it's describing.
Plan limits
The Free plan is fully-featured but capped in size; Pro adds unlimited forests, collaboration, backup & restore, full compliance standards mapping, audit logs, STIX 2.1 export, and Industry Modules, and Enterprise adds SSO/SAML, IP allowlisting, and custom integrations on top of that. Core threat-elicitation frameworks (STRIDE, LINDDUN, OWASP Top 10, CAPEC), encryption, and the Risk Register PDF export are available on every plan.
| Plan | Forests | DFDs / forest | Attack Trees / DFD | Price |
|---|---|---|---|---|
| Free | 3 | 3 | 5 | $0 |
| Pro | Unlimited | Unlimited | Unlimited | $29/user/mo |
| Enterprise | Unlimited | Unlimited | Unlimited | Quote on request |
ℹ️ Members of an Organization aren't capped
If you belong to a company Organization (see Collaboration & Organizations), the Free-plan quota doesn't apply to you even if your own personal plan shows as Free — organization membership already implies Pro/Enterprise-level access to the forests you work in.
Feature comparison
| Feature | Free | Pro | Enterprise |
|---|---|---|---|
| DFDs, Attack Trees, MITRE ATT&CK alignment, Risk register | ✓ | ✓ | ✓ |
| Core frameworks (STRIDE, LINDDUN, OWASP Top 10, CAPEC) | ✓ | ✓ | ✓ |
| Full compliance standards mapping (ISO 27001, NIST, CIS Controls, ASVS, PCI DSS, SOC 2) | — | ✓ | ✓ |
| Forest encryption (AES-256-GCM) | ✓ | ✓ | ✓ |
| Team collaboration (invite members to a forest) | — | ✓ | ✓ |
| Company Organizations (domain-wide access) | — | ✓ | ✓ |
| Risk Register PDF export | ✓ | ✓ | ✓ |
| Board-ready forest PDF report | — | ✓ | ✓ |
| Forest Backup & Restore | — | ✓ | ✓ |
| Audit logs | — | ✓ | ✓ |
| STIX 2.1 export | — | ✓ | ✓ |
| Industry Modules (Fintech, Healthcare, Automotive, Medical, Critical Infra) | — | ✓ | ✓ |
| Self-serve seat management (add/remove seats) | — | ✓ | ✓ |
| SSO / SAML | — | — | ✓ |
| SCIM provisioning with IdP groups and role mapping | — | — | ✓ |
| IP allowlisting for sign-in | — | — | ✓ |
| Import DFDs from OpenAPI, CloudFormation or Terraform | — | — | ✓ |
| Ticketing sync — Jira, ServiceNow, Linear, Azure DevOps (two-way) | — | — | ✓ |
| SIEM feed (Splunk) | — | — | ✓ |
| GRC evidence sync (Vanta, Drata) | — | — | ✓ |
| Live diagram embeds in Confluence and Notion | — | — | ✓ |
| Configurable data retention | — | — | ✓ |
See the full breakdown and current pricing on the Membership & Pricing page.
Data Flow Diagrams
A DFD maps what your system is made of and how data moves through it: processes, data stores, external actors, and the trust boundaries between them. It's the architecture layer your Attack Trees get built against.
The palette
The left-hand palette holds every element you can drag onto the canvas, split into two groups. Every item also works from the keyboard: Tab to it and press Enter or Space to place it at the canvas centre, no mouse required. Use the search box at the top of the palette to filter by name if you're hunting for one specific element.
Standard notation ("Elements" group)
| Element | Shape | Represents |
|---|---|---|
| Process | Circle | Something that transforms data — an application, a service, a function. |
| External Entity | Rectangle | An actor outside your system's control — a user, a third-party service, another company's system. |
| Data Store | Open-ended lines | Data at rest — a database, a file store, a cache. Has extra fields for Database System (20 options across SQL/NoSQL, each with its own icon and color) and Data Classification (Public / Internal / Confidential / Restricted). |
| Trust Boundary | Dashed rounded rectangle | A line across which trust level changes — a network segment, a process boundary, a cloud account edge. See below for its sub-type and cloud-branding options. |
Non-Standard group — infrastructure elements
These aren't part of classic DFD notation, but they let you be specific about the infrastructure sitting behind a Process without inventing a workaround. Each renders as a colored box with a two/three-letter badge.
| Element | Badge | Typical use |
|---|---|---|
| Firewall | — | Network or application-layer traffic filtering. |
| Router | — | Network routing between segments. |
| Load Balancer | — | Distributes traffic across multiple instances of a process. |
| Networking Device | ND | Switches, generic network appliances. |
| WAF | WAF | Web Application Firewall. |
| CDN | CDN | Content Delivery Network edge. |
| Storage Array | SA | Block/object storage infrastructure (as distinct from a logical Data Store). |
| Storage Server | SS | A dedicated file/storage server. |
| API Gateway | AG | Centralized API entry point — auth, rate limiting, routing. |
| Message Queue | MQ | Async messaging infrastructure (queues, brokers, event buses). |
| Identity Provider | ID | Auth/identity system — internal IdP or a federated one. |
| Cache | CH | In-memory or distributed caching layer. |
| DNS Server | DNS | Name resolution infrastructure. |
Trust boundaries in detail
A Trust Boundary has a Kind: Logical (default — a conceptual boundary with no further classification) or Physical. Physical boundaries unlock a Sub-type dropdown:
- Trusted Network, Untrusted Network, Internet, On-Premise — each renders with a distinct fill/stroke color so boundary types are visually distinguishable at a glance.
- Cloud Provider — unlocks a further Cloud Provider dropdown with 16 options (AWS, Azure, GCP, OCI, Alibaba Cloud, IBM Cloud, DigitalOcean, Linode/Akamai, Hetzner, Vultr, Scaleway, OVHcloud, Huawei Cloud, Tencent Cloud, Cloudflare Workers, Other). AWS, Azure, GCP, and OCI get their real brand colors on the boundary; the rest use a generic cloud style.
Drawing data flows (connections)
Select a node, then click Draw connection in the right-hand properties panel (it toggles to Cancel connection while active) — then click the node you want to connect to. You can also press C as a shortcut to start/cancel a connection on the selected node.
Canvas tools
- Minimap — bottom-right overview of the whole canvas once your diagram is larger than the visible area; click anywhere on it to jump there.
- Fit Labels — resizes every node so its shape fits its label text, useful after renaming several elements to something longer or shorter.
- Standard zoom/pan — see Keyboard Shortcuts for the full list (+/- to zoom, F to fit the view, Space+drag to pan).
Linking to Attack Trees
An Attack Trees badge in the toolbar shows how many attack trees are currently linked to this DFD, with a dropdown to jump to any of them. See Linking DFDs & Attack Trees for how the link is made.
Worked example: a simple 3-tier web app
Let's map a small SaaS backend: a customer's browser talks to a web application running inside an AWS account, which reads and writes to a PostgreSQL database.
- Drag an External Entity onto the canvas, label it Customer.
- Drag a Trust Boundary onto the canvas around where your app will sit. Open its properties, set Kind → Physical, Sub-type → Cloud Provider, Cloud Provider → AWS. Rename it AWS Account — prod.
- Inside that boundary, drag a Process, label it Web App (Node.js).
- Also inside the boundary, drag a Data Store, label it Customer DB. Set Database System → PostgreSQL and Data Classification → Confidential.
- Select Customer, click Draw connection, click Web App — label the flow HTTPS request.
- Repeat in the other direction for the response, and between Web App and Customer DB for the query/result.
- Click Fit Labels to tidy up node sizing, then save.
The finished diagram — an External Entity, a cloud-branded Trust Boundary, a Process, and a Data Store, connected by four labeled data flows.
Import a DFD from code Enterprise
Instead of drawing a DFD by hand, generate one from the configuration that already describes your system. On a forest's page, click Import from code, then upload a file or paste it in. The format is detected automatically:
| Source | What you get |
|---|---|
| OpenAPI 3 / Swagger 2 (JSON or YAML) | An API consumers external entity on the internet side, and the API as a trust boundary with one process per tag (or per first path segment, if operations aren't tagged). Each data flow lists its HTTP methods and endpoint count, and calls out unauthenticated endpoints and plain-HTTP servers. OAuth 2 / OpenID Connect adds an identity provider. |
CloudFormation / SAM (JSON or YAML, including !Ref-style tags) | Your AWS resources as AWS elements (EC2, Lambda, RDS, S3, DynamoDB, API Gateway, load balancers, queues, KMS…), placed inside their VPC and subnet trust boundaries. References between resources become data flows, and internet-facing entry points get an Internet users entity. |
Terraform (.tf files, or terraform show -json output) | The same for AWS, Azure and Google Cloud resources: VPCs/VNets and subnets as nested boundaries, resources inside them, references as data flows. For a configuration built from modules, import terraform show -json output, since modules in .tf files aren't expanded. |
Before anything is created you get a preview: a small drawing of the diagram, a list of every element with where it came from, and warnings about anything the import couldn't know (for example, resources that aren't diagram elements, like IAM roles). Untick anything you don't want. Unticking a boundary keeps what's inside it. Then name the diagram and click Create diagram. The result is always a new DFD, laid out and ready to edit; it never changes an existing one.
ℹ️ Treat it as a strong first draft
Data flows are inferred from references in the file, so traffic that only exists in application code won't appear. An API spec describes the API surface, not the databases behind it. Check the flows, add what's missing, then threat-model as usual. Re-importing after the configuration changes produces a fresh DFD to compare against, which is a quick way to spot drift. Files up to 2 MB and 300 elements are supported; encrypted forests can't be imported into.
Attack Trees
An Attack Tree decomposes one attacker goal into the specific ways it could be achieved, using AND/OR logic — then lets you score, categorize, and plan a response for each concrete threat at the leaves.
The four node types
| Node | Meaning | Has scoring/framework fields? |
|---|---|---|
| Goal | The attacker's top-level objective — e.g. "Exfiltrate customer PII". One per tree; the palette disables the Goal item once one exists on the canvas. | Yes |
| OR Gate | The goal (or parent node) is achieved if any one of its children succeeds. Use this for "there are several independent ways in". | No — purely structural |
| AND Gate | The parent is only achieved if all of its children succeed together. Use this when an attack needs multiple conditions to line up. | No — purely structural |
| Leaf Node | A concrete, atomic threat or technique — the bottom of the decomposition. This is where the real risk data lives. | Yes |
ℹ️ Gates are pure logic, not risk items
OR and AND gates only have a Label, a Label Color, and a Description — no likelihood/impact, framework tags, MITRE mapping, treatment plan, or standards controls. Those fields only appear on Goal and Leaf nodes, since a gate doesn't represent a single scoreable threat — it just describes how its children combine.
Likelihood, Impact, and risk score
On a Goal or Leaf node, set Likelihood and Impact on a 1–5 scale. The risk score is simply Likelihood × Impact (range 1–25), and the editor shows a colored severity badge automatically:
| Score range | Severity |
|---|---|
| 1 – 4 | Low |
| 5 – 9 | Medium |
| 10 – 15 | High |
| 16 – 25 | Critical |
For example, a leaf scored Likelihood 4 × Impact 4 = 16 → Critical; Likelihood 2 × Impact 3 = 6 → Medium.
"Include in risk register"
Every scoreable node has an Include in risk register checkbox. Its default depends on the node:
- A Leaf node with no children (a true terminal point in the tree) defaults to checked — it's assumed to be a concrete, reportable risk.
- Any other node (a Goal, or a Leaf that has further nodes hanging off it) defaults to unchecked.
You can always override the default in either direction — the checkbox reflects your explicit choice once you've touched it, not just the terminal-leaf heuristic.
Threat frameworks All plans
Tag a Goal or Leaf with one or more categories from six threat-classification frameworks. Pick a framework from the dropdown, then a category within it — each tag shows as a colored chip on the node.
| Framework | Use it for | Example categories |
|---|---|---|
| STRIDE | General-purpose software threat classification | Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service, Elevation of Privilege |
| LINDDUN | Privacy-specific threats | Linkability, Identifiability, Detectability, Disclosure of Information… |
| OWASP Top 10 | Web application risk (2021 edition) | A01 Broken Access Control, A03 Injection, A10 SSRF… |
| OWASP Top 10 for LLM Applications | LLM-specific threats (2025 edition) | LLM01 Prompt Injection, LLM04 Data and Model Poisoning… |
| OWASP Top 10 for Agentic Applications | Agentic/multi-agent AI system threats | Memory Poisoning, Tool Misuse, Rogue Agents in Multi-Agent Systems… |
| CAPEC | Concrete, technique-level attack patterns | CAPEC-66 SQL Injection, CAPEC-62 CSRF, CAPEC-600 Credential Stuffing… |
ℹ️ MITRE ATLAS appears automatically for AI frameworks
As soon as a node is tagged with OWASP Top 10 for LLM Applications or OWASP Top 10 for Agentic Applications, a second MITRE ATLAS technique field appears alongside MITRE ATT&CK — ATLAS is MITRE's adversarial-ML/AI-specific technique catalog, the AI-world counterpart to ATT&CK.
MITRE ATT&CK / ATLAS technique mapping
Type one or more technique IDs into the MITRE ATT&CK field (comma-separated, e.g. T1078, T1110.003) or the MITRE ATLAS field (e.g. AML.T0051). Valid-format IDs render as clickable chips that link straight to the official MITRE technique page. This is free-text entry — you look up the technique ID yourself on attack.mitre.org / atlas.mitre.org and paste it in.
Treatment Plan
Record how you're responding to a leaf's risk. Each entry has a type and free-text description:
| Type | Meaning |
|---|---|
| Mitigate | Reduce the likelihood or impact with a control. |
| Avoid | Eliminate the risk by removing the feature/component that causes it. |
| Transfer | Shift the risk elsewhere — insurance, a third-party contract, a managed service. |
| Accept | Consciously decide to live with the risk as-is. |
Standards Controls Pro+
Map a node to specific controls from compliance/security standards — useful for showing an auditor exactly which control addresses which threat. Pick + Add standard, then search within it for the specific control to attach.
| Standard | Example control |
|---|---|
| ISO 27001:2022 | A.8.24 Use of cryptography |
| NIST SP 800-53 Rev 5 | AC-6 Least Privilege |
| NIST CSF 2.0 | PR.AA-03 Users, services, and hardware authenticated |
| CIS Controls v8 | CIS 6.3 Require MFA for Externally-Exposed Applications |
| OWASP ASVS 4.0 | V5.3 Output Encoding and Injection Prevention |
| PCI DSS v4.0 | Req 8.4 MFA implemented to secure access into the CDE |
| SOC 2 | CC6.1 Logical access security software, infrastructure, and architectures |
Canvas tools
- Auto Layout — automatically re-arranges the whole tree into a clean top-down layout. Handy after freehand-building a tree that's gotten tangled.
- Fit Labels — resizes nodes to fit their current label text.
- Draw connection — same mechanism as the DFD editor: select the parent, click Draw connection (or press C), then click the child.
Worked example: "Compromise customer accounts"
A goal with two independent paths in (OR logic), one of which itself needs two things to line up (AND logic):
- Drag a Goal node, label it Compromise customer accounts.
- Drag an OR Gate underneath it, connect Goal → OR Gate. Label it Account takeover vector (any one path below is sufficient).
- Drag a Leaf under the OR Gate: Credential stuffing using leaked passwords. Set Likelihood 4, Impact 4 (→ 16, Critical). Tag STRIDE → Spoofing. MITRE ATT&CK:
T1110.004. Treatment: Mitigate — "Rate-limit login attempts; enforce breached-password check on signup." - Drag a second Leaf under the OR Gate: Phishing email harvests login credentials. Likelihood 3, Impact 4 (→ 12, High). STRIDE → Spoofing. MITRE ATT&CK:
T1566.001. Treatment: Mitigate — "Enforce MFA so a stolen password alone isn't sufficient." - Drag an AND Gate as a third child of the OR Gate, label it Session hijacking via XSS (this path needs both children below to be true).
- Under the AND Gate, add Leaf Stored XSS in user-generated content (Likelihood 2, Impact 5 → 10, High; OWASP Top 10 → A03 Injection; CAPEC-86) and Leaf Session token readable by JavaScript (no httpOnly flag) (Likelihood 5, Impact 3 → 15, High; OWASP ASVS → V3.4 Cookie-based Session Management).
The finished tree — an OR gate covering three independent attack paths, one of which (session hijacking) itself requires two conditions via an AND gate.
Linking DFDs & Attack Trees
Linking ties an Attack Tree back to the architecture diagram it's threatening — so your threat model stays traceable to what it's actually describing, not a set of orphaned trees.
How to link
Linking is one-directional in setup but shows on both sides. There are two ways to create the link:
- From the Attack Tree editor — if the tree isn't linked yet, a Link to DFD ▾ button appears in the toolbar. Click it and pick a DFD tree from the same forest.
- At creation time — when you create a new tree via Add Tree and choose Attack Tree as the type, an optional Link to DFD dropdown appears right in that modal.
Where the link shows up
- In the DFD editor, an Attack Trees badge in the toolbar shows a count of every attack tree linked to that DFD, with a dropdown to jump straight to any of them.
- An attack tree can be linked to at most one DFD at a time; unlink it the same way you'd change the link, or leave it unlinked if it's exploratory and not tied to a specific architecture yet.
ℹ️ Linking is optional
You can build and score attack trees with no DFD at all — useful for a quick "what-if" exercise, or when you're modeling a threat conceptually before the architecture is finalized. Link it later once you have a DFD to attach it to.
Risk Register
The Risk Register is a forest-wide, auto-populated table of every scoreable finding across every attack tree in the forest — no separate data entry required.
How it's populated
Every Goal/Leaf node across every Attack Tree in the forest with Include in risk register checked (see Attack Trees for the default logic — terminal leaves default to included) shows up here automatically as soon as you save the node. There's nothing to separately "add" to the register.
Columns
| Column | Meaning |
|---|---|
| Risk | The calculated score and severity badge (Low/Medium/High/Critical). |
| Node | The node's label — the threat itself. |
| Type | Goal or Leaf. |
| L / I | Likelihood and Impact, 1–5 each. |
| Attack Tree | Which tree the node belongs to. |
| MITRE | Any MITRE ATT&CK / ATLAS technique chips attached to the node. |
| Mitigations | Count of Treatment Plan entries recorded on the node. |
| Status Enterprise | With ticketing sync connected: links to the node's tickets, In progress while any is open, and Mitigated once every linked ticket is closed. Set by the sync only; not editable by hand. |
| Owner / Collaborator | Free-text assignment fields, editable directly in the register (with autocomplete against forest members) — who's responsible for this risk and who else is working it. These are set here, not in the tree editor. |
Filtering
Four filters at the top of the register, combinable: Filter by tree (narrow to one Attack Tree), Min risk (hide anything below a score threshold), Owner (narrow to a specific assignee), and Status (Mitigated / Not mitigated).
Example
Continuing the worked example from Attack Trees: as soon as those four leaves are saved, the register shows all four rows — Credential stuffing (16, Critical), Phishing email (12, High), Stored XSS in UGC (10, High), and No httpOnly flag (15, High) — each linked back to the "Compromise customer accounts" tree. Set Min risk to 13 and only the Critical entry remains; assign an Owner to each so it's clear who's tracking the fix.
Exporting & Reporting
Four different exports exist, each for a different purpose — a raw diagram export, a machine-readable threat-intel format, and two polished PDF reports for stakeholders.
Risk Register PDF All plans
From the Risk Register page, Export PDF generates a structured, landscape A4 report of the register as it's currently filtered — cover page with severity-count summary, then the full table (threat, attack tree, type, likelihood/impact, risk score & severity, MITRE technique, mitigation count, owner, collaborator). Unlike the forest-level report below, this one is available on every plan, including Free.
From inside an editor (per-diagram)
Open the Export menu in either the DFD or Attack Tree editor:
| Option | What you get | Plan |
|---|---|---|
| Download JSON | The raw diagram data (nodes, edges, properties) as JSON — for backup, scripting, or moving data outside ThreatTree. | All plans |
| Download STIX 2.1 | The diagram re-expressed as a STIX 2.1 bundle (attack-pattern / relationship objects, with MITRE ATT&CK external_references and risk score as custom x_threattree_* properties) — for feeding into a SIEM, TIP, or other STIX-consuming tool. | Pro+ |
| Download PDF | A single-diagram PDF snapshot of just that tree. | Pro+ |
Forest-level PDF report
From a forest, open Generate Report (available on Pro and Enterprise) to build a full executive-ready PDF covering the whole forest, not just one diagram. Before generating, you set a Report title, a Classification (Confidential / Internal / Public), a Version string, and optional Version notes — all of which land in the report's Document Control section. The generated PDF includes:
- Cover page & document metadata
- Executive summary & risk posture
- Ranked risk register
- Threat analysis, per Attack Tree
- Architecture overview, per DFD
- Controls & standards mapping
- Contributors & activity log
- Appendix & forest metadata
If you've set an organization logo in Settings → Branding, it appears on the report cover — otherwise the report page shows a reminder link to add one.
All exports are server-side enforced
Every export option is gated on the server, not just hidden in the UI for lower plans — calling the export endpoint directly without the right plan returns an error rather than a file, so there's no way to bypass the STIX/PDF plan requirements from outside the app either.
Live embeds in Confluence and Notion Enterprise
Instead of exporting a PNG and pasting it into your documentation every time a diagram changes, you can embed the diagram itself. An embed is a read-only link that always shows the diagram as it is right now: edit it in ThreatTree and the next time someone opens the Confluence or Notion page, they see the new version.
- In the forest, click the </> (Embed) icon next to a DFD or Attack Tree, then Create embed link and Copy. Forest owners and editors can do this.
- Notion: on the page, type
/embed, paste the link and choose Embed link. Drag the block's corner to resize it. - Confluence Cloud: type
/iframeto insert the iFrame macro, paste the link as the URL and set a height (600–800 px works for most diagrams). Confluence Data Center: use the HTML macro (your Confluence admin has to enable it) with<iframe src="LINK" width="100%" height="700"></iframe>.
The embed shows the diagram, its name and when it was last changed. Viewers don't need a ThreatTree account and can't edit anything or see the rest of the forest.
ℹ️ Good to know
Anyone who has the link can see that diagram, so share it only in pages with the right audience. The Embed window lists each link with how often it has been viewed, and Revoke stops a link immediately (pages using it show "Diagram unavailable"). A link also stops working by itself if the forest is encrypted, if the person who created it loses edit access to the forest, or if the plan is no longer Enterprise. Deleting a diagram deletes its links. Encrypted forests can't be embedded, because ThreatTree can't read them.
Backup & Restore Pro+
Point-in-time snapshots of a whole forest — every tree, node, edge, and DFD link — that the forest owner can create on demand and roll back to later.
Creating a snapshot
From a forest, the owner-only Backup & Restore button opens the Backup & Recovery panel. Give the snapshot an optional label and click Create snapshot. Manual snapshots are capped at 5 per hour per forest to stop runaway backup creation, and the oldest snapshots are pruned automatically once a forest passes 20 total (manual and automatic combined).
ℹ️ Fintech Industry Module: release version tagging
If your organization has the Fintech Industry Module enabled (see Billing & Seats), snapshots can also carry a release version string, so a snapshot can be tied back to a specific release for compliance traceability.
Restoring
Click Restore next to any snapshot in the list. Because this replaces everything currently in the forest, you're asked to re-enter your password to confirm before anything happens. ThreatTree also takes an automatic safety snapshot of the forest's current state immediately before restoring — so a restore is never a one-way trip, even from a snapshot you didn't mean to pick.
Restore is owner-only, and replaces everything
Only the forest owner can restore — Editors and Viewers won't see the button. Restoring doesn't merge or selectively apply the snapshot; it replaces all current trees, nodes, and edges in the forest with the snapshot's contents wholesale.
Encryption All plans
Forest encryption is genuine client-side, zero-knowledge encryption — ThreatTree's server never sees your plaintext data, and never sees the key either — unless you choose to email yourself a copy (see below).
What "lock a forest" actually does
From a forest's Forest Settings, click Lock & encrypt forest. Your browser then, entirely locally:
- Generates a fresh AES-256-GCM key using the Web Crypto API (
crypto.subtle) — never sent anywhere. - Encrypts every diagram name, node label, node property blob, and edge label, tree by tree.
- Uploads only the resulting ciphertext to the server — replacing the plaintext there.
- Downloads the key as a
.jsonfile to your device. If you ticked Also email me a copy of the key, it's also emailed to your account's address — convenient as a second copy, but that copy passes through ThreatTree's server and your email provider, and anyone who can read that mailbox can decrypt the forest. Leave it unticked for true zero-knowledge encryption. - Marks the forest
encrypted— every member now sees a lock screen instead of the forest's contents, until someone unlocks it.
What encryption does and doesn't cover
Encrypted: the forest's name and description, every diagram name, node label, node property (likelihood, impact, mitigations, notes and so on) and edge label. Not encrypted, because the diagrams need them to render: the number and types of nodes, their positions, which nodes are connected, and timestamps. Someone with access to the database could see a diagram's shape, but not what any of it says.
Each encrypted value is protected with its own random nonce and authenticated (AES-GCM), so it can't be read or altered without the key. It isn't tied to the node it belongs to, though: someone with database access couldn't read or forge values, but could swap one encrypted label for another. Treat the key file like a password, and keep the forest's regular access controls tight as well.
Unlocking
Anyone who has the key can unlock — either upload the .json key file or paste the base64 key string directly. Unlocking is a one-time action: your browser decrypts the data, uploads the plaintext, and turns encryption off for the whole forest — it's not a personal, per-session unlock. Once unlocked, the forest behaves normally again until someone re-locks it (which generates a brand new key).
If the key is lost, the data is gone — permanently
There is no server-side recovery path, by design — that's what makes it real zero-knowledge encryption. An encrypted forest also cannot be deleted until it's decrypted first, so a lost key leaves the forest permanently locked and stuck. Keep the downloaded key file (and the email copy, if you chose one) somewhere durable before you rely on this.
Want an email copy after all? On the lock screen, load or paste the key, then use Email this key to me — the same trade-off applies: the key passes through ThreatTree's server and your email provider. This only works if you already have a valid copy of the key; it can't regenerate a lost one.
Collaboration & Organizations
There are two independent ways to share access: inviting individuals to one specific forest, or creating a company Organization that gives everyone on your domain access to every forest owned by the org.
Inviting members to a forest Pro / Enterprise
- Inside a forest, open Invite Member.
- Enter their Email address and pick a Role.
- Click Send invite — they receive an email invitation and appear as "pending" until they accept.
| Role | Can do |
|---|---|
| Owner | Full control — implicitly held by whoever created the forest. Only an Owner can invite/remove members, change roles, delete the forest, or lock/unlock encryption. |
| Editor | Can view and edit diagrams — create/edit/delete trees, nodes, and edges — but can't manage membership or delete the forest. |
| Viewer | Read-only access to everything in the forest. |
Organizations Pro / Enterprise
An Organization is a bigger, domain-wide alternative to inviting people one forest at a time. Register your company's email domain once, and every forest owned by any member of the organization automatically grants Editor-level access to every other member — no per-forest invites needed.
To give one org member less than Editor on a particular forest, invite them to that forest directly with the Viewer role. A role set on the forest itself replaces the automatic organization access for that forest, so they can still see it but not change it.
- In Settings → Team, Create your organization using your own company email domain (personal email providers like Gmail/Outlook aren't eligible).
- Invite teammates by email — they must share the same verified domain.
- Organizations are seat-limited (set by your plan); the Team panel shows seats used vs. purchased and blocks new invites once you're at capacity.
ℹ️ Org membership overrides personal plan limits
If your organization is on Pro/Enterprise, every member gets that access level for forests within the org context — regardless of what plan shows on their own individual account.
Organization roles
Every member has one of three roles. The owner can delegate day-to-day team management without handing over the whole organization:
| Role | Can do |
|---|---|
| Owner | Everything below, plus can promote/demote members to and from Admin, and is the only role that can act on another Admin (remove them, etc.). One per organization — implicitly whoever created it. |
| Admin | Can invite and remove Members, but can't invite someone directly as an Admin, remove another Admin, or change anyone's role — those stay owner-only, so an org can't grow its admin group without the owner's involvement. |
| Member | Gets the org's automatic forest access; can't manage other members. |
SSO / SAML Enterprise
Enterprise organizations can configure SAML 2.0 single sign-on so members authenticate through your company's identity provider instead of a ThreatTree password. From Settings → Organization Settings, the organization owner configures the IdP's Entity ID, SSO URL, and x509 certificate, and is given the SP metadata/ACS URL to hand to the IdP admin. Once enabled, a Sign in with SSO option appears on the login page — signing in there looks up your email's domain, redirects to your company's IdP, and provisions/links your ThreatTree account automatically on first login.
Your IdP must send the Name ID as an email address
ThreatTree identifies the signed-in user from the SAML Name ID and requires it to be a real email address on your organization's verified domain — not an opaque user ID or a UPN on a different domain. Every walkthrough below covers the exact setting to check. If this is misconfigured, sign-in fails with "Your identity provider account does not match this organization."
Microsoft Entra ID (Azure AD)
- In the Entra admin center: Enterprise applications → New application → Create your own application, then choose "Integrate any other application you don't find in the gallery (Non-gallery)."
- Open the new app → Single sign-on → SAML.
- Under Basic SAML Configuration, set Identifier (Entity ID) and Reply URL (Assertion Consumer Service URL) to the SP Entity ID and ACS URL shown in ThreatTree's Settings → Organization Settings → SSO.
- Under Attributes & Claims, edit the Unique User Identifier (Name ID) claim: set the format to Email address and the source attribute to
user.mail(oruser.userprincipalnameif that's what carries your users' real email address). - From the SAML Certificates section, download the Certificate (Base64) and copy the Login URL and Microsoft Entra Identifier.
- Paste those three values into ThreatTree's IdP Entity ID / IdP SSO URL / IdP x509 certificate fields, check Enable SSO for this organization, and save.
- Under Users and groups, assign whoever should have access — Entra won't let unassigned users through even with a valid domain match.
Okta
- In the Okta Admin Console: Applications → Create App Integration → SAML 2.0, and name the app (e.g. "ThreatTree").
- Under Configure SAML, set Single sign-on URL to ThreatTree's ACS URL and Audience URI (SP Entity ID) to ThreatTree's SP Entity ID.
- Set Name ID format to EmailAddress, and confirm the application username maps to the user's real email.
- On the app's Sign On tab, click View Setup Instructions to get the Identity Provider Issuer, Identity Provider Single Sign-On URL, and download the X.509 Certificate.
- Paste those into ThreatTree's IdP fields, enable SSO, and save.
- On the app's Assignments tab, assign the people or groups who should get access.
Google Workspace
- In the Google Admin console: Apps → Web and mobile apps → Add app → Add custom SAML app, and name it (e.g. "ThreatTree").
- Google shows its own SSO URL, Entity ID, and Certificate on this screen — copy those into ThreatTree's IdP fields.
- On the Service provider details screen, set ACS URL and Entity ID to the values from ThreatTree's Settings → Organization Settings → SSO.
- Set Name ID format to EMAIL and Name ID to Basic Information > Primary email.
- Finish setup, then turn the app ON for everyone or scope it to specific organizational units/groups under User access.
- Back in ThreatTree, paste Google's values, check Enable SSO for this organization, and save.
ℹ️ Testing before you roll it out
Save your IdP configuration, then open a private/incognito window and sign in at the login page using Sign in with SSO instead with your own work email. A successful first sign-in auto-provisions your ThreatTree account into the organization — no separate invite required. If it fails, double-check the Name ID format first; that's the most common misconfiguration across all three providers above.
SCIM provisioning and IdP groups Enterprise
With SCIM, your identity provider (Okta or Microsoft Entra ID) creates ThreatTree accounts for the people you assign, keeps their names up to date, and removes them from the organization when they're unassigned or deactivated. It can also push groups, so that who can see which forests, and who is an organization Admin, follows group membership in your IdP instead of being re-done by hand in ThreatTree.
The organization owner turns it on in Settings → Organization Settings → SCIM provisioning. Enabling it shows the SCIM base URL and an API token. The token is shown only once, so copy it straight into your IdP. New token issues a replacement and the old one stops working immediately.
Provisioned accounts must use an email address on your organization's domain, and each one takes a seat. People join as Members unless a group mapping (below) makes them Admins.
How pushed groups work
- Each group your IdP pushes appears under Settings → Team → Groups with a From your IdP label. Its name and members are managed in the IdP, so they can't be edited in ThreatTree.
- Give the group access to forests the usual way, from each forest's Members panel. Anyone the IdP adds to the group gets that access; anyone it removes loses it.
- The owner can set Organization role for its members to Admin on a pushed group. Every IdP-provisioned member of that group becomes an organization Admin, and goes back to Member when they leave all Admin-mapped groups. People you invited by hand, and the owner, are never changed by a mapping.
- If a group with the same name already exists in ThreatTree, your IdP can link to it rather than create a new one (Okta's "link group" option). From then on it's managed by the IdP.
- Deleting a pushed group in your IdP deletes it in ThreatTree and removes the forest access it gave.
Okta
- In your ThreatTree app integration, open General → Edit and set Provisioning to SCIM.
- On the Provisioning → Integration tab, set SCIM connector base URL to ThreatTree's SCIM base URL, Unique identifier field for users to
userName, tick Push New Users, Push Profile Updates and Push Groups, and choose HTTP Header authentication with the API token. Test and save. - On Provisioning → To App, enable Create Users, Update User Attributes and Deactivate Users.
- Assign people on the Assignments tab, then on Push Groups choose the groups to send to ThreatTree.
Microsoft Entra ID
- In your ThreatTree enterprise application, open Provisioning and set Provisioning Mode to Automatic.
- Under Admin Credentials, set Tenant URL to ThreatTree's SCIM base URL and Secret Token to the API token, then Test Connection and save.
- Under Mappings, make sure Provision Microsoft Entra ID Groups is enabled if you want groups pushed.
- Assign users and groups to the application under Users and groups, then turn Provisioning Status on. Entra provisions in cycles, so changes can take up to about 40 minutes to reach ThreatTree.
ℹ️ Good to know
Only groups assigned to the application are pushed, and nested groups aren't expanded: add people to the pushed group directly. Changing an IdP-provisioned person's role by hand in ThreatTree lasts only until their group membership next changes in the IdP, while any group is mapped to Admin. If your plan lapses, your IdP can still deactivate people, so leavers are still removed.
IP allowlisting for sign-in Enterprise
Once SSO covers who can sign in, IP allowlisting adds where from: restrict authentication to specific IP addresses or CIDR ranges, on top of password login and SSO alike. From Settings → Organization Settings, the organization owner lists the allowed IPs/ranges (one per line) and enables the restriction. Sign-in attempts from outside the list are rejected — even with the correct password or a valid SSO assertion.
Don't lock yourself out
Settings → Organization Settings shows your own current IP address next to an Add my IP shortcut. If you try to save a list that doesn't cover the IP you're saving from, ThreatTree warns you before saving — since that save would lock you (and everyone else outside the list) out, with no self-service way back in. If you do get locked out, contact ThreatTree support — staff access is a separate sign-in system not subject to any organization's allowlist.
Data retention Enterprise
By default ThreatTree keeps your organization's records for as long as the account exists. Enterprise organizations can instead choose how long each kind of record is kept; anything older is permanently deleted in a daily clean-up. The organization owner sets this in Settings → Organization Settings → Data retention.
| Record | What it covers | Options |
|---|---|---|
| Activity logs | The organization activity log, and the activity log of every forest owned by a member of the organization. | Keep forever, 90 days, 1, 3 or 7 years |
| Sign-in history | Members' sign-in records, including IP address, browser and country. | Keep forever, 30 or 90 days, 1 year |
| Forest snapshots | Backups and snapshots of members' forests. The limit of 20 per forest still applies on top. | Keep forever, 30 or 90 days, 1 year |
Before you save, the form shows exactly how many records the next clean-up would delete, and asks you to confirm if there are any. Each clean-up that deletes something is recorded in the organization activity log with the number of records removed. Deleted forests and diagrams don't need a setting: they're removed straight away when you delete them.
ℹ️ Good to know
Deleted records can't be recovered, including from snapshots. The shortest windows are long enough for the features that read this data: weekly digests, GRC evidence and the activity views keep working. With a short sign-in history, a device you haven't used for longer than the window counts as new again, so you may get a "new sign-in" email for it. If the owner's plan lapses off Enterprise, clean-ups stop and nothing more is deleted.
Ticketing sync Enterprise
Enterprise organizations can connect Jira, ServiceNow, Linear, or Azure DevOps so remediation work is tracked where your engineers already work, without a second copy in ThreatTree to keep up to date. Sync works in both directions:
- ThreatTree → ticket: whenever a node is scored High or Critical risk, a ticket is opened in every connected system. This is the same trigger that sends the email alert and, if configured, the Slack/Teams message. The ticket includes the forest name, the node's label, the risk score, and a link back into ThreatTree. If a risk dips below High and comes back while its ticket is still open, no duplicate ticket is created.
- Ticket → ThreatTree: when the ticket is closed, the risk is marked Mitigated in the Risk Register. If the ticket is reopened, the risk goes back to open. If a mitigated risk is later scored High or Critical again, a new ticket is opened.
Set it up from Settings → Integrations → Ticketing sync (organization owner only). Click Connect next to a provider, fill in its fields, tick Create tickets and sync their status, and save. Saving tests the connection against the live system first, so a mistyped token or project is caught immediately, not later when a real risk silently fails to open a ticket. Credentials are stored encrypted and never shown again after saving; leave the credential field blank on later saves to keep the stored one.
| Provider | What you need | "Closed" means |
|---|---|---|
| Jira Cloud | Site URL (https://yourcompany.atlassian.net), the account email, an API token from Atlassian account → Security → API tokens, and a project key. Issue type defaults to Task. | Any status in Jira's Done category, whatever your workflow calls it. |
| ServiceNow | Instance URL, a dedicated integration user with the itil role (or write access to the table), and its password. Table defaults to incident; any task-based table works. | The record is no longer Active. For incidents, Resolved also counts. |
| Linear | A personal API key from Settings → Security & access, and the team key issues go into (e.g. SEC). | The issue is in a Completed or Canceled state. |
| Azure DevOps | Organization URL (https://dev.azure.com/yourcompany), project name, and a personal access token with Work Items (Read & Write) scope. Work item type defaults to Task. | State is Done, Closed, Resolved, Completed, or Removed. A custom process that renames these isn't recognized. |
How status gets back to ThreatTree
ThreatTree checks linked tickets' statuses automatically about every 15 minutes, with no setup on your side. Each round checks up to 100 tickets per connected system, starting with the ones checked least recently, so a very large backlog is covered over a few rounds. Each provider row in Settings also has a Sync now button that checks every ticket straight away and reports how many changed.
For instant updates, you can also point your ticketing system at the status webhook URL shown after you first save a provider:
- Jira: Settings → System → WebHooks → Create a WebHook. Paste the URL and tick Issue → updated. Optionally, add a JQL filter such as
labels = threattree, since every ticket ThreatTree opens carries that label. - Linear: Settings → API → Webhooks → New webhook. Paste the URL and select Issues.
- Azure DevOps: Project settings → Service hooks → + → Web Hooks, trigger Work item updated. Paste the URL.
- ServiceNow has no built-in outbound webhook. Add a Business Rule on the table (When: after, Update; Advanced ticked; condition Active changes or State changes) with this script:
(function executeRule(current, previous) {
var r = new sn_ws.RESTMessageV2();
r.setEndpoint('PASTE_THE_WEBHOOK_URL_HERE');
r.setHttpMethod('post');
r.setRequestHeader('Content-Type', 'application/json');
r.setRequestBody(JSON.stringify({ sys_id: current.getUniqueValue(), number: current.getValue('number') }));
r.executeAsync();
})(current, previous);
The webhook only tells ThreatTree which ticket changed. ThreatTree then reads that ticket's real status back from your ticketing system with the saved credential, so a forged or replayed webhook call can't mark anything mitigated. Even so, treat the URL like a password: if it leaks, use Regenerate to invalidate it, then paste the new one into your ticketing system.
ℹ️ Good to know
The ticket link and the Mitigated status are set by the sync only. They show in the Risk Register's Status column, in the Attack Tree editor's properties panel, and on the PDF risk register, but can't be edited by hand. If more than one system is connected, a risk counts as mitigated only once every linked ticket is closed. Restoring a forest snapshot keeps each node's ticket links. Only plaintext forests are synced; encrypted forests' risk scores are never visible to the server, so they never open tickets. Disconnect deletes the stored credential and unlinks every ticket from its risk (the tickets themselves stay in your ticketing system). If an owner's plan lapses off Enterprise, ticket creation and status sync stop straight away.
SIEM feed Enterprise
Enterprise organizations can push a STIX 2.1 feed of every forest with an attack tree to Splunk, so a security team's SIEM stays continuously up to date instead of relying on someone remembering to re-run the manual "Download STIX 2.1" export. From Settings → Integrations, the organization owner enters a Splunk HTTP Event Collector (HEC) URL and token. Saving tests the connection immediately, and once enabled the feed is pushed automatically about once an hour. A Push now button sends an immediate feed, so you can confirm it's working right away rather than waiting for the next hourly push. The Last pushed time under the form shows when the most recent push happened.
Currently Splunk only — Microsoft Sentinel isn't yet supported, since its ingestion APIs need a full Microsoft Entra ID app registration rather than a simple token. Each push sends one STIX 2.1 bundle per forest as a single event, covering every attack tree in that forest; forests with no attack tree yet are skipped. Create your HEC token from Splunk's Settings → Data Inputs → HTTP Event Collector.
GRC evidence sync Enterprise
Enterprise organizations can send their threat-model evidence to Vanta or Drata on a schedule, instead of exporting PDFs by hand before every audit. ThreatTree attaches one dated PDF per push to a document in Vanta or a control in Drata. It contains:
- every forest owned by a member of your organization, with its owner and whether it's client-side encrypted;
- the risk register of each forest: threat, likelihood, impact, risk score, status (Mitigated when every ticket linked through ticketing sync is closed), mitigations, mapped standards controls (ISO 27001, SOC 2…) and risk owner;
- the organization's audit-log events since the previous push (the last 30 days for the first one), up to the 1,000 most recent.
Encrypted forests are listed but their contents aren't included: they're encrypted in your browser, so ThreatTree can't read them. The organization owner sets this up in Settings → Integrations → GRC evidence sync. Saving tests the connection straight away. Evidence is then sent weekly or monthly, whichever you pick, and Push now sends a file immediately. If a scheduled push fails, ThreatTree tries again about an hour later, and the error is shown under the form.
Vanta:
- In Vanta, open the document (evidence request) the file should go to, for example a custom document called "Threat model and risk assessment", and copy its ID.
- In Vanta's Developer Console, create a Manage Vanta application and copy its client ID and client secret. ThreatTree requests the
vanta-api.all:read,vanta-api.all:writeandvanta-api.documents:uploadscopes. - In ThreatTree, choose Vanta, paste the client ID, client secret and document ID, tick Enable and save.
Each push uploads the PDF to that document and submits it, so it's visible to your auditor.
Drata:
- In Drata, create an API key under Settings → API Keys with read access to controls and write access to control evidence.
- Find the numeric ID of your workspace and of the control the evidence belongs to (for example your risk-assessment control). Use the control's numeric ID, not its code.
- In ThreatTree, choose Drata, paste the API key, workspace ID and control ID, tick Enable and save.
Each push adds the PDF to the control as external evidence. Its renewal date is set one month ahead for weekly pushes and two months ahead for monthly ones, so it never shows as expired between pushes. Drata's US-hosted API (public-api.drata.com) is used.
ℹ️ Good to know
The client secret or API key is encrypted at rest and never shown again after saving. Leave the field blank to keep it when you change other settings. Disconnect deletes the stored credential; evidence already sent stays in Vanta or Drata. OneTrust isn't supported. If the owner's plan lapses off Enterprise, pushes stop straight away.
Audit logs Pro+
Pro and Enterprise forests keep an audit trail of member activity — invites, role changes, tree/node/edge creation and deletion, encryption lock/unlock, and more — viewable per forest, filterable by category.
Settings & Account
Everything about your own account and org-wide branding lives under the avatar menu → Settings, split into eight tabs.
| Tab | What's there |
|---|---|
| Profile | Display name and (read-only) email address. |
| Security | Change password, set up two-factor authentication and backup codes, set a session inactivity timeout (Never / 5m / 15m / 30m / 1h / 4h / 8h), view active sessions and past login activity, and a Danger Zone to permanently delete your account (password re-confirmation required). |
| Membership & Billing | Current plan badge, usage against Free-plan limits, self-serve upgrade/downgrade and seat management, a link to the Stripe billing portal, and (Pro/Enterprise org owners) Industry Modules — see Billing & Seats. |
| Preferences | Theme (Light / Dark / System default), default diagram type for new trees, and email notification toggles (product updates, security alerts, weekly activity digest). The digest goes out on Monday mornings (from 08:00 UTC) and summarizes the past week's activity across your forests; weeks with no activity send nothing. |
| Branding Pro+ | Organization name, website URL, and report footer tagline (shown on PDF report cover/footer), plus logo upload (PNG/JPG/SVG/WebP, max 2MB) for the report cover page. |
| Team Pro+ | Create/view your Organization, and manage members, groups, and seats — see Collaboration & Organizations. |
| Organization Settings Pro+ | Activity log, organization data export (password re-confirmation required), ownership transfer, and (Enterprise, owner-only) SSO, SCIM provisioning, IP allowlisting and data retention. |
| Integrations Pro+ | Slack/Teams critical-risk alerts, and (Enterprise, owner-only) ticketing sync with Jira, ServiceNow, Linear, or Azure DevOps, plus the SIEM feed and GRC evidence sync. |
Two-factor authentication
Settings → Security lets you require a second step at sign-in, on top of your password. Two methods are available, and only one can be active at a time:
| Method | How it works |
|---|---|
| Email code | A 6-digit code is emailed to you at every sign-in. Simple, but only as secure as your email account. |
| Authenticator app | Scan a QR code once with an app like Google Authenticator, Authy, 1Password, or Microsoft Authenticator. The app then generates a new 6-digit code every 30 seconds, without needing email access. |
- In Settings → Security, click Enable next to the method you want and confirm your password.
- For the authenticator app: scan the QR code (or type the key shown below it into your app manually), then enter the 6-digit code your app generates to confirm setup.
- The first time you turn on either method, you're shown 10 backup codes — save them somewhere safe. Each works once, as a way back into your account if you lose your phone or email access. Use Regenerate any time to invalidate the old set and get a fresh 10.
Backup codes are shown once
They're stored only as a hash, the same way your password is — nobody, including ThreatTree, can look them up after the fact. If you lose them without saving a copy, regenerate a new set while you still have your normal method available.
ℹ️ Theme applies instantly across the whole app
Switching theme in Preferences previews immediately and applies everywhere — every page (including this Help Center) reads the same stored preference.
Billing & Seats
Everything about paying for ThreatTree is self-serve, from Settings → Membership & Billing (or the plans page).
- Upgrading — pick Pro, choose how many seats you're buying (1 if it's just you), and you're taken to a Stripe Checkout page. If you buy more than one seat, a company Organization is created for you automatically once payment succeeds — see Organizations.
- Managing payment — Manage billing opens Stripe's hosted billing portal to update your card, view past invoices, or cancel.
- Changing seat count — the organization owner can raise or lower the seat count at any time. Before confirming an increase, ThreatTree shows the exact prorated amount Stripe is about to charge; if that charge fails (e.g. insufficient funds), the seat count is left unchanged rather than granting seats that weren't paid for. Lowering seats can't drop below the number of seats currently in use.
ℹ️ Industry Modules
Also on the Membership & Billing tab (Pro/Enterprise organization owners): toggle industry-specific frameworks — Fintech (PCI DSS v4.0 & Secure SLC), Healthcare (HIPAA Security Rule), SaaS & Startups (SOC 2), Automotive (ISO/SAE 21434), Medical Devices (FDA premarket cybersecurity), Critical Infrastructure (IEC 62443 & NERC CIP), and AI & ML Systems. Enabling one surfaces extra industry-specific fields and mapped controls in the DFD and Attack Tree editors for the whole organization.
Account lockout after failed sign-ins
After 5 consecutive failed password attempts against your account, sign-in is temporarily blocked for 15 minutes — even if a later attempt uses the correct password. This protects against someone repeatedly guessing your password, and applies per account regardless of which device or network the attempts come from.
The lockout clears itself automatically 15 minutes after the last failed attempt; there's no manual unlock needed. A single successful sign-in also resets the count immediately.
⌨️ Keyboard Shortcuts
Both the DFD and Attack Tree editors share the same shortcut set — also available any time from the ? button next to the zoom controls.
| Shortcut | Action |
|---|---|
| Del / Backspace | Delete the selected node(s)/edge |
| Ctrl+Z / Ctrl+Y | Undo / redo |
| Ctrl+S | Save |
| Ctrl+A | Select all |
| F | Fit view to canvas contents |
| + / - | Zoom in / out |
| C | Draw / cancel connection on the selected node |
| Space+drag | Pan the canvas |
| Escape | Deselect / cancel current action |