PATHSCOPE 0.1.9 · Last updated: 2026-10-17

PathScope User Manual

This manual walks through the screens in order, from finding the weak spots of this machine with PathScope to working out where to start fixing them. The screen instructions avoid technical jargon where possible, and the commands are collected in the chapter “Using the command line”.

1. What PathScope is

PathScope finds the “paths” by which an ordinary user on this machine can reach root (administrator privileges) or sensitive data, and shows, with priorities, where fixing is most effective. It is meant for checking machines you manage yourself and test environments.

The analysis is read-only. It does not change settings or files, and it does not apply fixes automatically. Example fix commands are shown, but whether to run them is up to you.

Supported OS and where it is included
It runs on Mac (macOS 12 or later) and Linux. On Mac it is bundled in the RoamSwitch distribution file (DMG); on Linux it is bundled in the RoamSwitch client packages (.deb, .rpm, AUR), and both the app window and the command are available. The RoamSwitch Linux server packages include only the command (pathscope). PathScope is a separate app from RoamSwitch and is licensed under the Apache License 2.0. It is not covered by the RoamSwitch license agreement (EULA).

2. Installing and launching

PathScope is installed as a separate app with its own icon. Here is how to start it.

EnvironmentHow to start
MacOpen PathScope.app from the distribution file (DMG) and click “Analyze”.
LinuxOpen “PathScope” from the application list and click “Analyze”. From a terminal, run pathscope-gui. The window needs WebKitGTK 4.1, which is installed automatically with deb and rpm. On Arch (AUR), install webkit2gtk-4.1 as an optional dependency.
Command lineRun pathscope in a terminal. On Mac it is PathScope.app/Contents/MacOS/pathscope.

When it starts, a window opens with the buttons “Analyze”, “History”, “LLM assist”, “Explain with LLM” and “Settings” along the top. “Explain with LLM” cannot be pressed until a result is shown. PathScope does not open a listening port, and its window does not load external sites.

3. Running an analysis and reading the result

When you click “Analyze”, PathScope gathers the state of this machine, starting from the current user, and analyzes it. It can take from a few seconds to several tens of seconds. When it finishes, the result is saved automatically as one entry in the history.

Steps

  1. Click “Analyze”.
  2. In “Path diagram” and “Path list”, see which user reaches root or sensitive data by which steps. Circles and squares are users and destinations, and each line is one step that raises privileges. The number on a line corresponds to the “reason the step works” in the table below the diagram.
  3. In “Fix points (in the order to fix them)”, check the places where fixing has the biggest effect. Each item shows its priority (critical, high, medium or low, with a score), the number of paths affected, a suggested fix, and the nearest MITRE ATT&CK technique.
  4. Click “If I fix this?” to re-analyze, as a trial, the paths you would have if that fix point were fixed as suggested. “If I fix them all?” does the same for all the fix points shown. Neither changes this machine.
  5. Read the list of areas that could not be checked, shown below the fix points.
Areas that could not be checked are not “safe”
These are areas that could not be checked because of missing privileges or because the referenced target does not exist. It does not mean that no danger was confirmed, and it does not mean there is danger. Items marked “may be checkable when run with root privileges” can sometimes be checked by running as root.

What kinds of paths it finds

Known vulnerabilities are checked against data bundled with the app. The targets are macOS and the versions of Debian, Ubuntu, RHEL family, SUSE, Arch and Alpine for which data exists; anything else (Debian 11 and earlier, Fedora and so on) is shown as “unchecked”. It is not a feature for examining vulnerabilities exhaustively.

4. History, export, recurring checks

Analysis results are kept automatically as a history on this machine. Click “History” to open the list, where you can open an entry, give it a label (for example, before the fix), or delete it. Select two entries and click “Compare the two selected” to see the paths that disappeared and appeared and the changes in fix points. Use this to compare the situation before and after a fix.

Analysis results saved in JSON format on another machine can be brought into the history with “Import results”. Select two or more entries in the history and click “Summarize selected” to see which machines are most at risk and which weaknesses are shared by several machines.

The result on screen can be saved as “Analysis result (JSON)”, “Watch list (JSON)” or “auditd rules (for the Linux audit feature)”. You choose the destination in the save dialog. It only writes files; it does not apply any settings or change this machine.

This writes a configuration file that analyzes periodically and notifies you when paths have increased since last time.

  1. Show an analysis result and click “Save as the result to compare against”.
  2. Set the “Interval (minutes)” (from 5 to 10080).
  3. On Mac click “Save launchd settings…”, on Linux click “Save systemd settings…”, and choose where to save.
  4. Check the written content, then register it yourself (for example with launchctl load). PathScope does not register it.

5. Features that use an LLM (optional)

Off by default
The features that use an LLM do not work until you enable them in the settings. Once enabled and used, part of the analysis content is passed to the command of the LLM you chose and to the service behind it. This communication is not covered by RoamSwitch’s “Zero Telemetry”. If you leave it off, PathScope does not send any of the analysis content outside this machine.

Getting it ready

  1. Check “Enable LLM”.
  2. Choose the “LLM to use”. The choices are the commands claude, opencode, codex and agy, and those whose “Status” is “Installed” can be used. If it says “Not found”, install that command first.
  3. Choose “What to send to the LLM when reading settings” (see the table below).
  4. Click “Save”.

In the list, the “Model” and “Timeout (seconds)” can be changed for each LLM. claude is started with command execution and file reading switched off. opencode, codex and agy are treated as ones that cannot be switched off, and cannot be used unless you check “I understand that this LLM cannot be stopped from running commands or reading files”. An LLM that cannot be restricted may read files on its own judgment along the way, and their contents may be sent to the LLM’s service.

Explain with LLM

With a result shown, click “Explain with LLM” to have the LLM write an overall assessment, the order and reasons for fixing, what the areas that could not be checked mean, and similar points. Only a summary of the paths, fix points and unchecked areas is passed; the raw collected information (such as lists of file owners and permissions) is not. The summary does, however, contain the user names and file paths that appear in the paths. The LLM’s reply is for reference. People check it and decide what to do, and nothing changes automatically on the basis of the reply.

LLM assist (reading configuration files)

Configuration files such as sudoers, cron and scripts are written in all sorts of ways, and a program alone sometimes cannot read them. LLM assist has an LLM read such files and look for descriptions that involve root privileges.

  1. Click “LLM assist”. Candidate files to be read are listed with the reason for each (all are selected at first). Candidates include sudoers, cron, systemd and launchd settings, and executables loaded by services that run as root. Uncheck any you do not want to send.
  2. Click “Send the ○ selected to the LLM”. A confirmation of what will be sent appears; read it, then click “Send (confirmed)”.
  3. Check “Items found”, “Files read” and “Files not read (these stay unchecked)” in the result.
  4. Click “Apply and analyze again” to add the items found to the analysis. If you no longer want to use them, delete them from “Saved”.

Only the items the LLM listed that were confirmed to be actually present as a line in the original file are used. Items that could not be confirmed appear only under “For reference” and are not used in the analysis. The confirmation is repeated at every analysis, so an item whose original line has disappeared is no longer used.

What is sentDetails
StandardValues that look like passwords or keys are replaced with “[REDACTED]” before sending. Files such as private keys are not sent. For a large file, only the lines that contain paths or commands are sent.
UnrestrictedA setting for cases where the content does not leave your machine, such as a local LLM (at your own risk). Password hashes and the like are also sent.
What is never sent in either mode
A file that contains a private key is not sent even if it has a different name. Keys in known formats, and values whose names indicate a secret, such as a password or token, are replaced and then sent regardless of the setting. Because these are found by name and by form, please keep in mind that some secrets may not be found.

6. Using the command line

The same analysis as in the window can be run with the pathscope command. Run with no options, it analyzes the paths from the current user to root. Collection is read-only and does not change the state of the machine.

pathscope
pathscope --json-out=report.json
pathscope --what-if-fix=all
pathscope --baseline=base.json --fail-on=new --notify
pathscope --print-schedule=systemd --interval-min=60
pathscope --export-watch=watch.json --export-auditd=pathscope.rules
pathscope --plain
pathscope --version
pathscope --lang=en
OptionDetails
--json-out=<file>Saves the result as JSON.
--what-if-fix=allRe-analyzes, as a trial, the paths you would have if everything were fixed as suggested. With a number, only that fix point.
--baseline=<file> --fail-on=newCompares with a previous JSON and exits with code 1 if paths have increased. With --notify, a desktop notification (count only) is also shown.
--fail-on=any|new|critical|high|mediumany exits with code 1 when there is at least one path; critical, high and medium do so when there is a fix point at or above that priority.
--print-schedule=launchd|systemdPrints an example of a periodic-run configuration. It does not register it. Use --interval-min to set the interval in minutes.
--plainPrints the older plain-text layout instead of Markdown. The assumptions of the analysis then go to standard error instead of into the result.
--help / --version--help (-h) shows a description of every option, the exit codes and examples. --version (-V) shows the version.

The output is Markdown. Under the heading “PathScope result” come a summary table, the paths, the fix points (a table of priority, step, reason and paths affected, then, for each number, a detail section with the ATT&CK mapping, the fix commands and a caution), the coverage, and the assumptions, in that order. The fix points appear only when paths were found, and the assumptions only when there is something to state. With --what-if-* a list titled “If these changes were made” follows, and with --baseline a list of the changes since the previous run. You can paste it straight into a note or a ticket. To get the older plain-text layout, add --plain.

The exit code is 0 for normal, 1 when a --fail-on condition was met, and 2 for a usage or input/output error. When run as root, it also collects the listeners that root is waiting on directly. Results of reading settings that were saved with LLM assist are also included in the command’s analysis.

7. Where data is stored, and updates

ItemLocation
Analysis historyOn Mac, ~/Library/Application Support/net.lafine.pathscope/history.sqlite3; on Linux, ~/.local/share/net.lafine.pathscope/history.sqlite3
LLM settings~/.config/pathscope/settings.json (saved so that only you can read and write it)
Content saved by LLM assist~/.local/share/pathscope/facts.json
The “result to compare against” for recurring checks~/.local/share/pathscope/baseline.json

The history can be erased with “Delete all” on the history screen. Analysis results contain sensitive information about how this machine is configured (user names, file paths, permissions), so please limit where they are kept and shared. To use a command that is not in the LLM list, add it by hand to profiles in the settings file. It cannot be changed from the window.

Updating the app

PathScope on Mac updates itself, separately from RoamSwitch. It connects to lafine.net, to get the latest version information, only when you click “Check for updates” (no information about this machine or the analysis results is sent). If a new version is available, click “Install v○○”, and when it finishes click “Restart to apply”. A downloaded update is replaced in only after its signature has been verified to show it has not been tampered with and passes.

On Linux it is part of the RoamSwitch package, so it is updated by updating that package. The “Updates” tab also says so.

The data used for analysis, such as known vulnerabilities, is bundled with the app. Anything found after that is not checked until you update PathScope. When the bundled data has become old, the analysis result says so.

8. What it does not do

9. Troubleshooting

SymptomWhat to do
On Mac, “Privacy settings data (TCC.db)” appears among the areas that could not be checkedIn the “Permissions” tab of “Settings”, click “Open the Full Disk Access settings”, turn PathScope on in System Settings, then restart PathScope and analyze again. The other analyses work even if you do not allow it.
“The LLM cannot be used” appears, or the settings cannot be savedEnable it under “LLM integration” in “Settings” and choose the LLM to use. If the list says “Not found”, install the command. When you choose opencode, codex or agy, the confirmation checkbox is also required.
An LLM stops with “Timed out”In the list under “LLM integration” in “Settings”, make that LLM’s “Timeout (seconds)” longer (from 1 to 900), then save.
“If I fix this?” cannot be usedIt cannot be used on a result opened from the history. Click “Analyze” again, then use it.
In-app updating cannot be usedIf you installed it from a RoamSwitch package on Linux, update it by updating the package. If you did not install it from a package (.deb, .rpm or AppImage), in-app updating cannot be used, so please reinstall from the distributed package.
← PathScope product page User Manual for Linux →