> For the complete documentation index, see [llms.txt](https://govplane.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://govplane.gitbook.io/docs/documentation/cli/licensing.md).

# Licensing

The CLI Toolkit is **free**. Activation asks for an email address and nothing else, and once activated the toolkit never contacts Govplane again.

This page explains what that licence is, what it is not, and what happens if you never activate.

## What the licence is

A small signed JSON document at `~/.govplane/license.json`, mode `0600`:

```json
{
  "schemaVersion": 1,
  "licenseId": "lic_…",
  "subject": { "email": "dev@example.com" },
  "plan": "toolkit-free",
  "issuedAt": "2026-08-08T09:00:00.000Z",
  "renewAfter": "2027-08-08T09:00:00.000Z",
  "terms": { "version": "2026-07-01", "acceptedAt": "2026-08-08T09:00:00.000Z" },
  "marketingConsent": false,
  "signature": { "algorithm": "Ed25519", "keyId": "…", "value": "…" }
}
```

{% hint style="info" %}
**The licence is evidence, not permission.** It records that somebody accepted the terms. It is verified entirely offline, against a public key shipped inside the package — there is no server that can revoke it, and no check that can fail because Govplane is down.
{% endhint %}

It is **not machine-bound**: one licence covers every machine you own.

It is **not a credential**: it grants access to nothing, and leaking it exposes no system. It does contain your email address, so treat it as personal data.

## Where it is read from

| Precedence | Source                                                        |
| ---------- | ------------------------------------------------------------- |
| 1          | `GOVPLANE_LICENSE` — the file's contents, inline              |
| 2          | `GOVPLANE_LICENSE_FILE` — a path                              |
| 3          | `~/.govplane/license.json` (or `$GOVPLANE_HOME/license.json`) |

The environment variables exist for CI, where writing to a home directory is awkward and secrets belong in a secret store.

## The 30-day grace period

The toolkit works for 30 days before activation is required. The clock starts the **first time you run a toolkit command**, not when you install it.

| Days  | What happens                                        |
| ----- | --------------------------------------------------- |
| 1–23  | Commands run. One-line reminder.                    |
| 24–30 | Commands run. Short notice with the days remaining. |
| 31+   | Toolkit commands stop and explain how to activate.  |

```
Activation required in 30 days — free, needs only an email: govplane activate
```

### What still works on day 31

Only the **toolkit** commands stop. Everything else is untouched:

|                                                            | Day 31           |
| ---------------------------------------------------------- | ---------------- |
| `analyze`, `policies`, `build`, `sign`, `simulate`         | stop             |
| `validate`, `inspect`, `version`, `help`, `working-folder` | keep working     |
| The SDK, in your application                               | unaffected       |
| Bundles you already built                                  | unaffected       |
| Anything running in production                             | unaffected, ever |

A lapsed grace period cannot take down a service. The toolkit is build-time tooling; the runtime never consults it.

### In CI

The reminder appears from the **first** run rather than staying quiet for a month, so a pipeline is never surprised by a failure on day 31.

`--quiet` silences reminders. `govplane license --format json` reports the state as data instead of prose:

```json
{
  "state": "grace",
  "daysRemaining": 30,
  "licensePath": "/Users/example/.govplane/license.json"
}
```

`state` is one of `activated`, `grace` or `grace_expired`. Gate on it explicitly if you want a pipeline to fail early rather than on day 31:

```bash
govplane license --format json | jq -e '.state == "activated"'
```

## What is sent, and what is not

Activation makes exactly two HTTP requests, and only while `govplane activate` is running.

**Sent:**

```json
{ "client": "govplane-toolkit", "clientVersion": "1.0.1" }
```

**Never sent:** your hostname, username, file paths, project contents, policy contents, machine identifiers, or any usage data.

There is no telemetry, no heartbeat, no licence check and no fingerprinting — by design, and the activation specification forbids adding any.

Your email address is collected **in the browser**, by the activation page, never by the terminal. That is why nothing personal reaches your shell history or your CI logs.

## Your data

* `govplane license` links to the dashboard for withdrawing consent, exporting your data or deleting your account.
* `govplane license remove` deletes the local copy.
* Marketing consent is opt-in, recorded in the licence, and declining it activates you identically.

## Renewal and key rotation

`renewAfter` is a year out. Renewal is a convenience, not an expiry cliff — see the activation reference below for the exact behaviour, and for how signing-key rotation is handled without invalidating licences already issued.

## Troubleshooting

| Symptom                                   | Cause                                                                    |
| ----------------------------------------- | ------------------------------------------------------------------------ |
| `state` is `grace` in CI, not `activated` | `GOVPLANE_LICENSE` not set, or set on the wrong job                      |
| Signature verification fails              | The file was edited, or truncated by a secret store that strips newlines |
| Grace period restarts unexpectedly        | `GOVPLANE_HOME` points at a fresh directory each run                     |

That last one is the common CI surprise: a per-run `GOVPLANE_HOME` means a per-run clock. Supply a licence instead of relying on grace.

```bash
govplane license verify --verbose
```

## Next

* [Installing the Toolkit](/docs/documentation/cli/installing-the-cli-toolkit-extension.md)
* [Configuring the Toolkit](/docs/documentation/cli/configuring-the-cli-toolkit.md)

## More detail

* [Activation model](https://github.com/Govplane/govplane-cli-toolkit/blob/main/docs/activation.md) — the licence, the grace period, renewal and key rotation
* [Privacy](https://github.com/Govplane/govplane-cli-toolkit/blob/main/docs/privacy.md)
* [CI and automation](https://github.com/Govplane/govplane-cli-toolkit/blob/main/docs/automation.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://govplane.gitbook.io/docs/documentation/cli/licensing.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
