More
Licensing
ReportForge validates your license key offline after an initial activation. Normal test runs do not phone home.
Offline-first model
After the reporter activates your key, it caches a signed JWT on disk at ~/.reportforge/license.json. Subsequent runs verify the JWT against an Ed25519 public key bundled into the reporter package; no network call required.
The JWT is refreshed automatically when fewer than 24 hours of TTL remain. If the refresh call fails but the cache is still valid, the cache wins and the run proceeds normally. If the server explicitly denies the key (HTTP 4xx), the cache is cleared and PDF generation is skipped on that run.
The reporter verifies the JWT's Ed25519 signature and expiry at every PDF generation run. A corrupted cache file, a mismatch between the bundled public key and the JWT's issuer, or a JWT whose TTL has passed all cause PDF generation to be skipped with a clear error rather than producing an artifact from an unverified license.
Key lifecycle
- You subscribe at reportforge.org/pricing. A RFSU-XXXX-XXXX-XXXX-XXXX key is emailed and stored in your dashboard.
- You set RF_LICENSE_KEY in your environment or config. The reporter validates the key format offline (HMAC check); no network needed for this step.
- On first run, the reporter calls /api/license/activate with the key and a machine fingerprint. The server checks your subscription status and the 25-machine cap, then returns a signed JWT.
- The JWT is cached. Future runs verify it offline.
- When your subscription renews, your key continues to work; no action needed.
- When your subscription ends or is cancelled, the next refresh is denied and PDF generation stops after the cached JWT expires.
Offline behaviour
| Scenario | Outcome |
|---|---|
| No key set | One-line warning logged; tests run; PDF skipped. |
| Invalid key format | One-line warning; PDF skipped. Tests unaffected. |
| Network unreachable, JWT valid | PDF generated using cached JWT. No warning. |
| Network unreachable, JWT expired | Warning logged; PDF skipped. Tests unaffected. |
| JWT signature invalid (corrupted cache) | JWT rejected at generation time; PDF skipped. Delete ~/.reportforge/license.json and re-run to trigger a fresh activation. |
| Server denies key (4xx) | Cache cleared; warning logged; PDF skipped. |
| Machine cap exceeded | Warning with cap details; PDF skipped. Oldest machine is auto-evicted after 30 days of inactivity. |
Rotating keys
If your key is exposed or you need to revoke CI access, rotate it from your dashboard under the License tab. The old key is invalidated immediately; all machines using it will fail to refresh and stop generating PDFs after their cached JWT expires (within 24 hours).
After rotating, update RF_LICENSE_KEY in all CI environments and on developer machines.