Code
Threat model a system
STRIDE against a real data-flow diagram, with mitigations ranked by exposure.
Fill it in
Components, data flows, and where the trust boundaries are.
A data-flow diagram, in code.
So the list is actionable rather than exhaustive.
Your prompt
Threat model this system. [the system] Draw the data-flow diagram first, in code, with the trust boundaries marked. Half the value of threat modelling is the argument that happens while drawing it, because that is when someone says "wait, that talks directly to the database". Walk STRIDE per element, not per system. Applied to the whole application it produces generic findings; applied to one data flow it produces "the webhook endpoint accepts unsigned payloads". Rank by exposure and impact, and cut anything you would not act on. An exhaustive threat model is read once and filed; twelve ranked items with mitigations get done. Name the assumptions the model depends on. Those are what change.
Use Threat model a systemOpens with everything above already filled in.
Why this works
STRIDE applied to a whole application produces generic findings. Applied per data flow it produces "the webhook endpoint accepts unsigned payloads". Half the value is the argument that happens while drawing the diagram, so it draws one.