# portswigger/js-link-finder architecture

> Architecture diagram of the GitHub repository portswigger/js-link-finder, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/portswigger/js-link-finder
- Repository: https://github.com/portswigger/js-link-finder

## Overview

BurpJSLinkFinder is a Burp Suite passive-scanning extension that examines eligible JavaScript responses, extracts endpoint-like links, displays them in its tab, and reports an informational scan issue. The README also documents excluding selected JS URLs and exporting the log. The source excerpt confirms scanner registration, filtering, UI setup, and issue creation; the extraction routine is truncated, so its internal response-to-parser wiring is shown only where supported.

Main entry points: [`FransLinkfinder.py`](https://github.com/portswigger/js-link-finder/blob/master/FransLinkfinder.py) (JS URL filter)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_scan["Passive scanning"]
  node_extender["Extension callbacks<br/>[FransLinkfinder.py]"]
  node_jsfilter["JS URL filter<br/>[FransLinkfinder.py]"]
end

subgraph group_extract["Link analysis"]
  node_analyser["URL analyser<br/>[FransLinkfinder.py]"]
  node_parser["Regex parser<br/>[FransLinkfinder.py]"]
  node_links["Extracted links"]
end

subgraph group_report["UI and reporting"]
  node_tab["Extension tab<br/>[FransLinkfinder.py]"]
  node_log["Results log<br/>[FransLinkfinder.py]"]
  node_issue["Scan issue<br/>[FransLinkfinder.py]"]
end

node_burp(("Burp Suite"))
node_response["HTTP response"]
node_user(("Extension user"))
node_textfile["Exported text file"]

node_burp -->|"registers scanner"| node_extender
node_burp -->|"submits response"| node_jsfilter
node_jsfilter -->|"accepts eligible JS"| node_analyser
node_jsfilter -->|"checks URL"| node_response
node_analyser -->|"reads response"| node_response
node_analyser --> node_parser
node_parser -->|"extracts links"| node_links
node_jsfilter -->|"appends results"| node_log
node_analyser -->|"returns links"| node_log
node_jsfilter -->|"creates issue"| node_issue
node_issue -->|"returns issue"| node_burp
node_extender -->|"adds suite tab"| node_tab
node_user -->|"uses controls"| node_tab
node_user -->|"requests export"| node_log
node_log -->|"exports log"| node_textfile

click node_extender "https://github.com/portswigger/js-link-finder/blob/master/FransLinkfinder.py"
click node_jsfilter "https://github.com/portswigger/js-link-finder/blob/master/FransLinkfinder.py"
click node_analyser "https://github.com/portswigger/js-link-finder/blob/master/FransLinkfinder.py"
click node_parser "https://github.com/portswigger/js-link-finder/blob/master/FransLinkfinder.py"
click node_tab "https://github.com/portswigger/js-link-finder/blob/master/FransLinkfinder.py"
click node_log "https://github.com/portswigger/js-link-finder/blob/master/FransLinkfinder.py"
click node_issue "https://github.com/portswigger/js-link-finder/blob/master/FransLinkfinder.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_extender,node_jsfilter,node_user toneBlue
class node_analyser,node_parser,node_links toneAmber
class node_tab,node_log,node_issue toneMint
class node_burp,node_response,node_textfile toneIndigo
```

## Components

### Passive scanning

- [Extension callbacks](https://github.com/portswigger/js-link-finder/blob/master/FransLinkfinder.py): `FransLinkfinder.py`
- [JS URL filter](https://github.com/portswigger/js-link-finder/blob/master/FransLinkfinder.py): `FransLinkfinder.py`

### Link analysis

- [URL analyser](https://github.com/portswigger/js-link-finder/blob/master/FransLinkfinder.py): `FransLinkfinder.py`
- [Regex parser](https://github.com/portswigger/js-link-finder/blob/master/FransLinkfinder.py): `FransLinkfinder.py`
- **Extracted links**

### UI and reporting

- [Extension tab](https://github.com/portswigger/js-link-finder/blob/master/FransLinkfinder.py): `FransLinkfinder.py`
- [Results log](https://github.com/portswigger/js-link-finder/blob/master/FransLinkfinder.py): `FransLinkfinder.py`
- [Scan issue](https://github.com/portswigger/js-link-finder/blob/master/FransLinkfinder.py): `FransLinkfinder.py`

### Other components

- **Burp Suite**
- **HTTP response**
- **Extension user**
- **Exported text file**

## Connections

- Burp Suite → Extension callbacks: registers scanner
- Burp Suite → JS URL filter: submits response
- JS URL filter → URL analyser: accepts eligible JS
- JS URL filter → HTTP response: checks URL
- URL analyser → HTTP response: reads response
- URL analyser → Regex parser
- Regex parser → Extracted links: extracts links
- JS URL filter → Results log: appends results
- URL analyser → Results log: returns links
- JS URL filter → Scan issue: creates issue
- Scan issue → Burp Suite: returns issue
- Extension callbacks → Extension tab: adds suite tab
- Extension user → Extension tab: uses controls
- Extension user → Results log: requests export
- Results log → Exported text file: exports log
