Editions & licensing
What the AGPL and MIT licences mean for you, how Community, Enterprise and Cloud differ, and how licence files work.
Pinwren is open source under two licences, chosen so that self-hosting is free and embedding Pinwren in your own product carries no obligations.
Two licences
| Code | Licence |
|---|---|
The server and dashboard: apps/web, packages/api, packages/core, packages/db, the Docker files | AGPL-3.0 |
@pinwren/widget, @pinwren/react, @pinwren/sdk, @pinwren/mcp, @pinwren/cli | MIT |
What the MIT packages mean for you
Everything you put into your site, app or tooling — the widget, the React component, the API client, the MCP server and the CLI — is MIT. Bundle it, modify it, ship it in closed-source products: keep the copyright notice and you're done. Your own code is never affected.
What the AGPL means for you
You may use, modify and self-host the server freely, including commercially, for any number of users and projects. The AGPL asks one thing in return, and only in one situation:
- Running Pinwren unmodified — for your team, your clients, or as part of your agency's service — creates no obligations.
- Modifying the server and letting other people use your modified version over a network means you must offer those users the source code of your modified version, under the AGPL.
Feedback data, your website and the code of the sites the widget runs on are never covered by the AGPL.
Editions
Self-hosting is the main way to run Pinwren today
Community is complete and free. Pinwren Cloud is not available yet: the Cloud plans and prices below are proposals and may change before launch.
| Community (self-host) | Cloud Free | Cloud Pro | Cloud Business | Enterprise | |
|---|---|---|---|---|---|
| Availability | Available now | Coming soon | Coming soon | Coming soon | Self-host licence; Cloud later |
| Price | $0 | $0 | $29/mo (proposed) | $99/mo (proposed) | From $4,000/yr (proposed) |
| Team seats | Unlimited | 3 | 10 | 30 | Per contract |
| Guests (clients) | Unlimited | Unlimited | Unlimited | Unlimited | Unlimited |
| Projects | Unlimited | 1 | 10 | Unlimited | Unlimited |
| Reports per month | Unlimited | 100 | 2,000 | 20,000 | Per contract |
| Pins, bug reports, annotation, console and network capture | ✓ | ✓ | ✓ | ✓ | ✓ |
| Integrations, webhooks, GitHub/GitLab/Linear sync, API | ✓ | Email + 1 chat, read-only API | ✓ | ✓ | ✓ |
| Jira Cloud issue sync | — | — | — | — | ✓ |
| Storage | Disk or any S3 bucket | Included | Included | Included | Customer bucket option |
| White-label | — | — | Remove badge | Full white-label | ✓ |
| SSO, SCIM, audit log, custom roles | — | — | — | Audit log (planned) | Planned |
| Support | Community (GitHub) | Community | Priority email | SLA |
The full proposal is on the pricing page.
Cloud plans and limits
Cloud billing is built (checkout through Dodo Payments, in test mode until the service goes live) but sign-up is still closed, so these are the rules a Cloud workspace follows, not something you can buy today. A workspace is on Free or Pro; the Business plan in the table is not built yet.
| Limit | Free | Pro |
|---|---|---|
| Team seats | 3 | 10 |
| Projects | 1 | 10 |
| Reports per month | 100 | 2,000 |
- Seats and projects are hard limits. Creating a project or inviting a person past the limit is refused with
402 PLAN_LIMIT_PROJECTSor402 PLAN_LIMIT_SEATS. - Reports are soft first: a banner in the dashboard shows from 100 % of the month's allowance, and the widget
only stops accepting new reports at 120 % (
429 FEEDBACK_UNAVAILABLE; the widget keeps the report in its offline queue). Guests are never counted as seats. - Pro also removes the "Powered by Pinwren" badge (
white_label). - A failed renewal keeps Pro for 14 days; after that the workspace is Free. Nothing is deleted. Projects above the Free limit keep working, only new ones are refused.
- None of this applies to self-hosted installs: without Cloud billing configured every limit is off.
The principle
Free: everything a single team needs to collect, triage and route feedback, at any scale, on its own infrastructure. Paid: what an organisation needs to govern many teams — identity, compliance, branding, support — and, in Cloud, the cost of running it.
Storage on S3, integrations and issue sync are free in Community — features some competitors keep for paid plans.
The trust rule
A feature that ships in Community never moves to a paid edition later. Movement only goes the other way. Nothing in Community calls into the commercial code to nag or degrade.
Enterprise licence files
In this release a licence unlocks two features:
- White-label (
white_label): hides "Powered by Pinwren" in the widget and the Pinwren credit in emails. Your own name, logo and colour stay free in every edition. - Jira Cloud (
jira): two-way issue sync with Jira, like the free GitHub, GitLab and Linear sync. See Jira.
SSO, SCIM, audit log, custom roles, legal hold and the SIEM stream are planned: licences may already name them, and Settings › Licence lists them under Coming soon until they ship.
An Enterprise licence is a single .lic text file: a JSON payload and an Ed25519 signature, each
base64url-encoded and joined with a dot.
{
"v": 1,
"kid": "2026-1",
"lid": "lic_01J…",
"customer": "Acme GmbH",
"email": "it@acme.example",
"edition": "enterprise",
"features": ["white_label", "jira"],
"limits": { "seats": 250 },
"instance": null,
"issuedAt": "2026-11-01T00:00:00Z",
"expiresAt": "2027-11-01T00:00:00Z",
"graceDays": 30
}Installing a licence
Install it one of these ways:
- Settings › Licence (instance admins): Install a licence, then drop the
.licfile or paste its contents and click Install licence. The page shows the edition and status (Community, Active, Grace period, Expired · read-only or Not valid), the customer, contact, licence id, validity, grace period, seats, instance binding and which Enterprise features are on. Replace licence installs a new one; Remove licence takes an uploaded one off again. - Set
PINWREN_LICENSE_FILEto the path of the file inside the container (mount it read-only). The Licence page then shows "Set byPINWREN_LICENSE_FILE" and offers no upload or remove — replace the file to change it. - The admin API:
POST /api/admin/licensewith{ "license": "<the file's text>" }(GETshows the current state,DELETEremoves it). An invalid file answers400 INVALID_LICENSE; whilePINWREN_LICENSE_FILEis set, uploads answer409 LICENSE_LOCKED.
A licence with an instance binding only verifies on the server whose PINWREN_INSTANCE_ID matches it.
How it behaves:
- Verified offline. The signature is checked against public keys built into the server, chosen by
kidso keys can rotate. Nothing phones home, so licences work on air-gapped installs. - Production builds trust production keys only. With
NODE_ENV=production(the Docker image), only the maintainers' production keys verify; the development key used in the repository's tests is refused. A production server built without any production key logsPRODUCTION_KEYS is emptyat start, and can verify no licence at all. - Expiry is gentle. After
expiresAt, everything keeps working forgraceDays(30 unless the licence says otherwise). After the grace period, Enterprise settings become read-only: what you configured keeps working, you just can't change it. Data is never hidden or deleted, and nobody is locked out. - Seats above
limits.seatsare reported in the licence status (seats: { limit, used }); they never block sign-in. - Invalid files — a bad signature, an unknown key, a file bound to another instance — are treated as no licence, and the reason is returned in the licence status.
- Signed-in members can read their instance's entitlements from
GET /api/me/entitlements.
For maintainers
Release images must carry a production public key: building with PINWREN_RELEASE=1 fails while
PRODUCTION_KEYS is empty. Generating, storing, committing and rotating the signing key is described in
docs/release/licence-keys.md.
A contribution is licensed under the licence of the files it changes; see CONTRIBUTING.md.