Self-Hosting a Free Pentest Reporting Tool
Install our free, open-source reporting tool with one command, share it with your team over Tailscale or your own domain, and keep it up to date and backed up.
Our reporting tool is Pental’s reporting on its own: findings and sections your way, AI on your own key, the built-in PDF and your own Word templates. It is free and open source under the GNU AGPL-3.0, and it runs on a computer of yours beside its own PostgreSQL database, so nothing is sent to Pental. This guide installs it, shares it with your team, and keeps it up to date and backed up. The reporting tool’s page shows it, and from finding to Word report takes a whole engagement through it.
What you need
Docker. On a Mac or a Windows PC that is Docker Desktop, opened once before you install and taken on to its main screen: it does not start until you accept its terms and skip signing in or create an account. On Linux it is Docker Engine, and where it is missing the installer offers to set it up with Docker’s own installer. One computer is enough for one person; for a team, use one that stays on, such as an office machine or a small server.
Install it
irm https://pental.io/report/install.ps1 | iexcurl -fsSL https://pental.io/report/install.sh | shThe installer checks Docker, downloads the latest release, makes your settings with new secrets and starts the app beside its own PostgreSQL. On a desktop it then opens your browser on the first-run page with the setup code filled in; on a server it prints the address and the code. The code is also SETUP_TOKEN in the .env file in the folder it installed to: ~/pental-report, or /opt/pental-report when run as root, unless you chose another with --dir.
On the first-run page you name your firm, make the first administrator account and set up your authenticator app, and you are in. Your logo, colours and theme are under Settings, Branding.
Share it with your team
As installed, it is for the computer it runs on. Two installer options share it with your team, each over HTTPS:
| Option | What your team gets |
|---|---|
--tailscale, or -Tailscale on Windows | The app at the computer’s address on your Tailscale network, such as https://reports-box.your-tailnet.ts.net, with a certificate Tailscale issues. Nothing is opened to the internet, and there is no domain or DNS to set up. Your team needs to be on your tailnet, and the computer needs to stay on. |
--domain reports.yourfirm.com, or -Domain on Windows | The app at your own domain, served by Caddy with a certificate it fetches and renews itself. Point the domain at the server first, with ports 80 and 443 open. |
& ([scriptblock]::Create((irm https://pental.io/report/install.ps1))) -Tailscalecurl -fsSL https://pental.io/report/install.sh | sh -s -- --tailscaleSign the computer in to Tailscale first; on Linux the installer does it for you. The first time, Tailscale may ask you to turn on HTTPS for your tailnet, and shows the link. Already installed for one computer? Run the same command and it is shared, with your data as it is. Either way, the address your team types is PUBLIC_URL in .env: the links the app hands out to set a password are made with it, and a security key works only at that one address.
Add your team
Under Team, Add User adds a colleague, who chooses a password from a setup link and sets up a second factor: an authenticator app, or a security key or passkey once the app is served over HTTPS. There are three roles, administrators, senior testers and testers, and row-level security in PostgreSQL checks every read and write against the person’s role and a recent second factor. Under Settings, Security you choose which second factors are allowed or require both, when people prove it again and how long a session lasts, and see the active sessions.
Keeping it up to date
On macOS and Linux the installer asks whether to keep the app up to date by itself, and yes is the answer it takes if you just press Enter. It sets up a small updater on that computer, run by a systemd timer on Linux and a launchd agent on macOS, which asks the app every minute whether there is anything to install. A new release then installs overnight, between 1am and 6am on that computer’s clock, or straight away when an administrator presses Update Now.
- Before each update the updater copies the database to
backups/in the app’s folder, and keeps the last three. - It installs the release from its own tag on GitHub, and if the new version does not start, it puts the one before it back.
- What it did is in
update.log, and in Settings, Updates, where automatic updates can be turned off: a release then installs only when you press Update Now.
On Windows, or installed with --no-auto-update, there is no updater. The app tells its administrators when a release is out, and Settings, Updates gives the command that updates that computer, ready to copy: the install command again, which keeps your settings and your data as they are. Either way, the app brings its database up to date when it starts.
Backups
The simplest is in the app: Settings, Data, Back Up Your Data downloads one file with your records and uploaded files, which the tool or Pental can restore. From the server, in the app’s folder:
docker compose exec -T db pg_dump -U postgres report > report-$(date +%F).sqlKeep .env with your backups. VAULT_KEY in it seals the server’s signing keys in the database, and the server will not start on a copy of the database without it.
Where your data goes
| What | Where it goes |
|---|---|
| Engagements, findings, the library, settings, templates and uploaded files | The PostgreSQL beside the app, or for uploaded files an S3-compatible bucket you choose. Nothing is sent to Pental. |
| AI requests | Only when you use AI: to the provider you chose, sent by your own server with your own key, or to Ollama on your own hardware, which your browser talks to. |
| A PDF made from a Word template | The Word-to-PDF engine is fetched from cdn.zetaoffice.net and runs in your browser. Your document is not uploaded anywhere. |
| The update check | Twice a day the server asks GitHub for the latest release. The request carries nothing but the version it runs, and UPDATE_CHECK=off in .env stops it. |
If you are locked out
An administrator makes a colleague a new password link from Team, and resets a lost authenticator there too. When the person locked out is the only administrator, whoever runs the server does it, in the app’s folder:
# A link to choose a new password (it works once, for an hour)
docker compose exec report node server/bin/password-link.js you@yourfirm.com
# Clear a lost authenticator or security key: a new one is set up at the next sign-in
docker compose exec report node server/bin/reset-mfa.js you@yourfirm.comWhen you want more than reporting
The tool is the reporting. When you want clients signing in to a portal of their own, QA before anything goes out, encrypted credentials and the rest, moving from the free reporting tool to Pental takes everything across in one file. What running any reporting server yourself takes is counted in what open-source pentest reporting costs.
Install It on Your Own Computer
One command installs our free reporting tool beside its own PostgreSQL, on a Mac, a Windows PC or a Linux server, and opens it with the setup code filled in.
When you want a client portal too, start a free trial of the Portal.
Also Worth Reading
From Finding to Word Report in the Free Reporting Tool
A whole engagement in our free reporting tool: fields and sections your way, findings drafted from your evidence with AI on your own key, and the report in your own Word template.
Free ToolMoving From the Free Reporting Tool to Pental
What the Portal adds to our free reporting tool, what stays exactly as it is, and the three steps that bring your team, clients and findings across in one file.
Free ToolAI Pentest Report Writing in the Free Reporting Tool
Our free reporting tool drafts findings, summaries and sections with AI on your own key or your own hardware: what each AI button does, how to set a provider up, and where every request goes.
Setup guide
Prefer to watch it?
The whole setup recorded, with chapters you can jump to: registering, your own domain, your own database in any of three places, your own mail server, branding, the first sign-in, updating the database on Supabase Cloud, and moving the database if you change your mind.
- 0:00 · Registering, signing in, and the free trial
- 0:44 · Your name and your firm’s name
- 0:50 · Custom domain
- +6 more