Trawl ships as a desktop application, a headless server, and a set of container images. Pick the one that matches how you intend to run it.
brew install --cask adedayo/tap/trawlThe cask verifies the download's SHA-256 and clears the quarantine flag for you, so the app opens normally. If you install this way you can skip the rest of this section.
Or download Trawl-macos-universal.dmg from the
latest release. The build
is universal, so one download works on both Apple Silicon and Intel.
Trawl is ad-hoc signed, not Developer ID signed. Apple only issues Developer ID certificates to members of its Developer Program, which costs $99 a year. Trawl is free software given away for the community's benefit, and it is not going to charge you - directly or indirectly - to fund a rent to Apple for permission to do that. So on first launch macOS will say the app "cannot be opened because Apple cannot check it for malicious software."
That message is about provenance, not about the file being damaged or dangerous. Apple has not checked it because we have not paid Apple to check it. Establish provenance yourself instead - this is stronger evidence than notarisation, because it ties the artefact to the public build that produced it:
# 1. Confirm the bytes are the bytes we published.
shasum -a 256 -c SHA256SUMS --ignore-missing
# 2. Confirm we published them, from our release workflow. (See "Verifying a
# download" below for cosign.)Then clear the quarantine attribute on the file you just verified:
xattr -d com.apple.quarantine ~/Downloads/Trawl-macos-universal.dmg
# after dragging to /Applications:
xattr -dr com.apple.quarantine /Applications/Trawl.appThis is deliberately narrow. It removes a flag from one file you have just verified. It is not
sudo spctl --master-disable, which turns Gatekeeper off for everything you will ever download, and which you should not run for this or any other application. If you would rather not touch the terminal, System Settings → Privacy & Security → Open Anyway grants the same per-application exception through the UI.
Download Trawl-windows-amd64-installer.exe (or -arm64-) and run it. The
installer is per-user and does not request administrator rights - Trawl writes
only to your own profile, and a security tool that asks for elevation it does
not need trains you to grant it to things that do.
Trawl is not distributed through winget. Doing so requires a manifest in Microsoft's central repository, and keeping that current is ongoing work for a channel most people reach past on their way to the Releases page.
The installer is not code-signed, so SmartScreen will report an
unrecognised publisher; choose More info → Run anyway. Code-signing
certificates are a recurring cost this project does not currently carry. What
it offers instead is verifiable provenance: every artefact is signed with
Sigstore and listed in SHA256SUMS, so you can confirm the file came from this
pipeline rather than trusting a certificate that says someone paid a
certificate authority. See Verifying a download.
| Format | Use when |
|---|---|
.deb |
Debian, Ubuntu and derivatives - declares its GTK/WebKit dependencies |
.rpm |
Fedora, RHEL, openSUSE |
.AppImage |
Your distribution's WebKit is the wrong vintage, or you want no install at all |
.tar.gz |
You want to unpack it somewhere and manage dependencies yourself |
sudo apt install ./trawl_1.2.3_amd64.deb
# or
sudo dnf install ./trawl-1.2.3.x86_64.rpm
# or
chmod +x Trawl-linux-amd64.AppImage && ./Trawl-linux-amd64.AppImageThe tarball contains a bare binary. It will not start without
libgtk-3-0 and libwebkit2gtk-4.1-0; the .deb and .rpm declare those,
which is the reason to prefer them.
brew install adedayo/tap/trawl-cli
trawl serverHomebrew installs a service definition, so brew services start trawl-cli
runs it under launchd or systemd.
Or build from source:
go install github.com/adedayo/trawl/cmd/trawl@latestA go install-ed binary is not stamped by our release pipeline, but it still
reports a real version - pkg/version falls back to the module version and
VCS stamp the Go toolchain embeds.
Two images, linux/amd64 and linux/arm64:
| Image | Role |
|---|---|
ghcr.io/adedayo/trawl-server |
Ingest target, job broker, read API |
ghcr.io/adedayo/trawl-dashboard |
nginx serving the Angular bundle |
Asset discovery and repository secret scanning run in-process inside the engine - discovery through embedded subfinder and vantage's certificate-transparency expansion, secret scanning through checkmate as a linked library - so they are available to the desktop application and the server alike, rather than only to a Compose deployment.
Port, HTTP and vulnerability scanning are not currently available. The worker
image that carried naabu, httpx and nuclei has been retired; linking
those tools into the engine is planned. See docs/development.md.
They are separate rather than one image with a mode flag because the roles have genuinely different dependencies - the server is a static Go binary, the scan worker carries a scanning toolchain - and collapsing them would mean every operator pulls the scanner to run the API.
cd deploy/compose
TRAWL_VERSION=v1.2.3 docker compose up -dTags are vX.Y.Z, vX.Y, sha-<short> and latest. latest is a
convenience for evaluation. Pin TRAWL_VERSION for anything you depend on.
Every asset is checksummed and signed. Neither requires trusting this repository's secrets: Sigstore signing is keyless, against the workflow's own OIDC identity.
# Integrity
sha256sum -c SHA256SUMS --ignore-missing
# Provenance - proves this artefact was built by this workflow, in this repo
cosign verify-blob \
--certificate Trawl-macos-universal.dmg.pem \
--signature Trawl-macos-universal.dmg.sig \
--certificate-identity-regexp '^https://github.com/adedayo/trawl/' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
Trawl-macos-universal.dmgFor container images:
gh attestation verify oci://ghcr.io/adedayo/trawl-server:v1.2.3 --owner adedayo
docker buildx imagetools inspect ghcr.io/adedayo/trawl-server:v1.2.3 \
--format '{{ json .SBOM }}'Each release also carries an SPDX SBOM. An image nobody can enumerate the contents of is an image nobody can tell you is vulnerable.
Release builds build the repository exactly as committed. No dependency is
resolved to a moving reference, no go.mod is rewritten mid-build, and every
base image and scanner tool is pinned to a version. This is what makes an SBOM
or a provenance statement mean anything: without it, an attestation describes a
dependency graph that existed only during one CI run.
Renovate proposes upgrades to those pins. Taking one is a reviewed change, not a side effect of rebuilding.