Skip to main content

Licensing

NullReport unlocks paid features with a license key you set as an environment variable. There's no in-app license screen; the key is read at startup and verified against the license server. This page covers how that works, what each tier includes, and how to manage it.

Self-hosted, but not fully offline on paid tiers

Your report data never leaves your machine, but a paid license isn't fully offline. NullReport checks it with the license server on startup and needs to reach that server at least once every 7 days to keep paid features; after that, paid falls back to Free. The Free tier runs fully offline. See Offline and air-gapped installs below.

How it works

  1. Choose a plan and check out on the NullReport website.
  2. You receive your license key (it looks like NR-xxxxxxxx) by email right after payment, and it's always available in the customer portal.
  3. Activate it by re-running the installer with your key, which pulls the matching tier image. See Activate a paid tier.
  4. Your tier is read from the license server at startup and re-checked in the background.

Between checks, NullReport verifies your cached token locally, so it keeps working offline within a 7-day grace period. Your license is bound to the machine you activated it on, so it can't be copied to another install.

Tiers

  • Free: solo penetration testing with unlimited reports, findings, and DOCX export. 1 user, 1 report template.
  • Pro: adds AI drafting and polishing. Still single-user.
  • Team: multi-user with Admin, Editor, and Viewer roles, report assignment, comments, an activity feed, and real-time field locking. 3 seats included; add more at $30/seat.

The license is tier-neutral: the same NR- key works on any tier, and the server decides whether you get Pro or Team, so an upgrade never changes your key. Questions or problems? Email support@nullreport.app or open a GitHub issue.

AI uses your own provider

A Pro or Team license unlocks the AI features, but not the AI itself. You bring your own API key for OpenAI, Anthropic (Claude), or Google Gemini, or run a local Ollama model. NullReport does not provide AI access or keys, and any provider usage is billed to you by that provider.

Setting your license key

There is no license field inside the app. The key is an environment variable read at startup.

.env
LICENSE_KEY=NR-xxxxxxxx
docker compose up -d

On startup NullReport activates the key and detects your tier. Leaving LICENSE_KEY empty runs the free tier.

Your tier and your Docker image must match

Each tier ships as its own Docker image. A Team license on a free or pro image won't unlock the missing features; you'll see an "upgrade your image" banner with the command to fix it. You don't pick the image yourself: re-running the installer with your key reads your tier from the license server and pulls the matching image (see Getting Started).

Grace period and downgrade

What happens when a check can't confirm your tier depends on why:

SituationWhat happens
Server unreachable (network error / 5xx)7-day grace: your cached, still-valid token keeps the paid tier. After 7 days without a successful check, you fall back to Free.
Server rejects the key (cancelled, revoked, suspended, wrong machine)Immediate downgrade to Free, no grace.
Your data is never deleted

Downgrading only locks paid features. Extra users are locked out (not removed), templates beyond the free limit are hidden (not deleted), and reports, findings, and DOCX export all keep working. You can always export.

Upgrading and downgrading

Each tier ships as its own Docker image, so changing tier means pulling the new-tier image. The installer does this for you: re-run it with your key, from the same nullreport/ folder you installed into:

cd ~ && curl -fsSL https://raw.githubusercontent.com/nullreport/install/main/install.sh | LICENSE_KEY=NR-xxxxxxxx sh

It reads your current tier from the license server and pulls the matching image; you don't set the tier by hand. Your data is never touched: reports, findings, templates, and users live in Docker volumes that swapping the image leaves alone, so the change only unlocks (or locks) features. Do it from the same folder, and don't run docker compose down -v. A downgrade locks paid features but deletes nothing (see the tip above).

Plan and seat changes

Change your plan or seat count from the customer portal under Change plan & seats. Billing is handled by Lemon Squeezy, which prorates an upgrade immediately and defers a downgrade to the end of your paid term.

  • A tier change (Pro ↔ Team) needs the matching image, so re-run the installer as above.
  • A seat change needs no new image. The running install picks up the new seat count on its next daily license check, immediately when an admin clicks Sync license in Settings → Current Plan, or after a backend restart.

Offline and air-gapped installs

NullReport verifies the cached token locally, so it runs offline within the 7-day grace period. It still reaches the server on every startup and on the periodic refresh. If it can't reach the server for more than 7 days, paid features fall back to Free until the next successful check. For fully air-gapped environments, contact us about extended key validity.

The only routine outbound calls are license activation and refresh, and no telemetry is ever sent. The AI features are the exception: with a cloud provider (OpenAI, Anthropic, or Gemini) the content you draft is sent to that provider, while a local Ollama model keeps everything on your machine.