Skip to content

Commit 5f7c71c

Browse files
committed
Enhance license key documentation for TinyMCE 8, clarifying T8LK prefix usage and client-side JWT validation across various integration references and examples.
1 parent f000623 commit 5f7c71c

File tree

8 files changed

+189
-104
lines changed

8 files changed

+189
-104
lines changed

modules/ROOT/pages/license-key.adoc

Lines changed: 157 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -4,85 +4,115 @@
44
:keywords: {productname}, cloud, script, textarea, apiKey, faq, license key, frequently asked questions,
55

66
== Overview
7-
8-
{productname} 8 introduces an enhanced license key system that provides improved subscription access control and streamlined renewal processes. This system includes both date-based and version-locked keys, supporting various deployment scenarios including cloud, self-hosted, and hybrid configurations.
7+
{productname} 8 uses an enhanced license key system that provides improved subscription access control and streamlined renewal processes. This system includes both **date-based** and **version-locked** keys, supporting various deployment scenarios including cloud, self-hosted, hybrid and offline (air-gapped) environment configurations.
98

109
[IMPORTANT]
1110
====
12-
If you are using {productname} 7, it is licensed under the GNU General Public License Version 2 or later. A configuration option called 'license_key' requires developers to make a conscious decision to use {productname} with the GPLv2+ license or with a commercial license.
11+
{productname} is licensed under the GNU General Public License Version 2 or later. A configuration option called 'license_key' introduced in v7 required developers to make a conscious decision to use {productname} with the GPLv2+ license or with a commercial license.
12+
13+
For {productname} 8, self-hosted, hybrid, and offline deployments require a valid license key with the `+"T8LK:"+` prefix such as `+license_key: "T8LK:your-license-key"+`. This prefix indicates that the key is for version 8 and provides enhanced validation and management features.
1314
1415
If you are using {productname} in a self-hosted environment, a console log warning message will display if the license key config option is missing or invalid. This message aims to ensure compliance with licensing requirements and provide transparency during the evaluation period.
1516
1617
This message will not be shown when loading {productname} from {cloudname}, as it is already under a commercial license.
17-
18-
For {productname} 8, license keys use the `+"T8LK:"+` prefix and provide enhanced validation and management features. These keys support both online and offline validation modes.
1918
====
2019

2120
include::partial$misc/setting-the-license.adoc[]
2221

2322
== License Types and Deployment Options
2423

25-
=== Date-based Keys (Standard)
26-
27-
The standard license key type in {productname} 8 is date-based, meaning:
28-
29-
* The key has a soft expiration date that matches your subscription end date.
30-
* After the soft expiration, the editor enters a grace period in `read-only` mode.
31-
* After the grace period expires, the editor becomes completely disabled.
32-
* Premium plugins are disabled at the soft expiration date.
33-
* In-editor messaging will notify users about approaching expiration.
34-
35-
=== Version-locked Keys (Alternative)
36-
37-
For customers who cannot use date-based keys, version-locked keys are available:
38-
39-
* The key is locked to specific {productname} versions.
40-
* No expiration date - the key continues working for allowed versions.
41-
* Cannot be used with versions released after your subscription ends.
42-
* Must contact account manager to get access to newer versions.
43-
* Suitable for air-gapped environments or strict deployment policies.
44-
45-
=== Deployment Patterns
46-
47-
==== Cloud-only
48-
49-
* Use API key.
50-
* Premium features via subscription.
51-
* CDN-hosted resources.
52-
* Automatic updates.
53-
54-
==== Self-hosted
55-
56-
* Use license key with `T8LK` prefix.
57-
* Local premium plugins.
58-
* Manual updates.
59-
* Full control over assets.
60-
61-
==== Hybrid
62-
63-
* Both API key and license key.
64-
* Mix of cloud and local features.
65-
* Flexible deployment options.
66-
* Fallback capabilities.
67-
68-
=== Offline Mode
69-
70-
For air-gapped environments or offline usage:
71-
72-
* Supports environments without internet connectivity
73-
* Compatible with strict network security policies
74-
* Maintains license compliance through client-side JWT validation
75-
* Enforces version and domain restrictions without server connection
76-
* Works with standard security controls and firewalls
77-
* Requires version-locked keys for maximum compatibility
78-
79-
[NOTE]
80-
====
81-
For air-gapped environments:
82-
* Use version-locked keys instead of date-based keys
83-
* Premium plugins must be downloaded and bundled locally
84-
* Updates require manual deployment of new versions
85-
====
24+
=== License Key Types
25+
26+
[cols="1,2,2", options="header"]
27+
|===
28+
| **Type** | **Key Features** | **Best For**
29+
30+
| Date-based Keys (Standard)
31+
a|
32+
* Time-based subscription:
33+
** Automatic version updates
34+
** 30-day grace period
35+
** Premium plugin access
36+
* Flexible usage:
37+
** Works with cloud features
38+
** Compatible with hybrid setups
39+
a|
40+
* Common scenarios:
41+
** Most deployments
42+
** Development teams
43+
** Cloud integrations
44+
45+
| Version-locked Keys
46+
a|
47+
* Fixed version access:
48+
** Specific version only
49+
** No expiration date
50+
** Domain restrictions
51+
* Security focused:
52+
** Offline validation
53+
** No cloud dependencies
54+
a|
55+
* Security-focused scenarios:
56+
** Air-gapped systems
57+
** Regulated industries
58+
** Government deployments
59+
** Security-critical systems
60+
|===
61+
62+
=== Deployment Types
63+
64+
[cols="1,2,2", options="header"]
65+
|===
66+
| **Type** | **Key Configuration** | **Capabilities**
67+
68+
| Cloud-only
69+
a|
70+
* API key required for:
71+
** Cloud services access
72+
** Premium plugin access
73+
** Automatic updates
74+
a|
75+
* Fully managed service:
76+
** No local deployment needed
77+
** Automatic updates and CDN delivery
78+
** Cloud storage features
79+
** Real-time collaboration
80+
81+
| Self-hosted
82+
a|
83+
* License key required with:
84+
** `T8LK` prefix
85+
** Domain validation
86+
a|
87+
* Complete local control:
88+
** Self-hosted premium plugins
89+
** Custom deployment options
90+
** No cloud dependencies
91+
92+
| Hybrid
93+
a|
94+
* Both keys required:
95+
** API key for cloud features
96+
** License key for local fallback
97+
* Optional failover configuration
98+
a|
99+
* Best of both worlds:
100+
** Cloud features when online
101+
** Local fallback when needed
102+
** High availability options
103+
104+
| Offline/Air-gapped
105+
a|
106+
* Version-locked key required:
107+
** `T8LK` prefix
108+
** Domain/environment locks
109+
** No internet connectivity needed
110+
a|
111+
* Completely offline operation:
112+
** Local resource bundling
113+
** Network isolation
114+
** Air-gap compliance
115+
|===
86116

87117
== Configuration Examples
88118

@@ -135,19 +165,29 @@ tinymce.init({
135165
"advlist", "anchor", "autolink", "charmap", "code", "fullscreen",
136166
"help", "image", "link", "lists",
137167
138-
// Premium plugins - available both via cloud and local fallback
168+
// Premium plugins - ensure these are available both via cloud and locally
169+
// Local versions should be downloaded and included in your bundle
139170
"powerpaste", "tinycomments", "tinydrive"
140171
],
141172
toolbar: "undo redo | styles | bold italic | alignleft aligncenter alignright | bullist numlist | link image",
173+
142174
// Cloud configuration with local fallback
143175
api_key: "your-api-key", // For cloud features
144176
license_key: "T8LK:your-license", // For local fallback
145-
// Optional: Configure failover behavior
177+
178+
// Failover configuration example
146179
serviceLoadFailbackTime: 5000, // Wait 5s before falling back to local
180+
181+
// Custom handler for image uploads with cloud/local failover
147182
images_upload_handler: function (blobInfo, progress) {
148-
// Custom handler that tries cloud first, falls back to local
149183
return new Promise((resolve, reject) => {
150-
// Implementation of cloud/local failover logic
184+
// Example implementation:
185+
// 1. Try uploading to cloud service first
186+
// 2. If cloud upload fails or times out, fall back to local storage
187+
// 3. Handle progress updates for both scenarios
188+
// 4. Return the URL of the uploaded image
189+
190+
// For detailed implementation, see the Image Upload documentation
151191
});
152192
}
153193
});
@@ -156,6 +196,7 @@ tinymce.init({
156196
[NOTE]
157197
====
158198
For hybrid deployments:
199+
159200
* Both `api_key` and `license_key` are used together
160201
* Configure appropriate timeouts for service failover
161202
* Consider implementing custom handlers for seamless fallback
@@ -188,32 +229,44 @@ tinymce.init({
188229
[NOTE]
189230
====
190231
For offline deployments:
232+
191233
* All assets must be available locally
192234
* Content delivery URLs should point to local resources
193235
* Premium plugins must be downloaded and included in your bundle
236+
* JWT validation is built into the {productname} core and works completely offline:
237+
** No internet connectivity required for license validation
238+
** No server communication or "phone home" checks
239+
** All validation is performed securely within the browser
194240
====
195241

196242
== License States
197243

198-
=== Active
199-
200-
* Full editor and premium plugin functionality.
201-
* Regular version upgrades available (date-based keys).
202-
* No restrictions on features.
203-
204-
=== Grace Period (Date-based keys only)
205-
206-
// TBA: Validate this date is correct
207-
* Occurs 30 days before subscription end.
208-
* All features remain functional.
209-
* In-editor notifications about approaching expiration.
210-
* Time to contact Tiny for renewal.
211-
212-
=== Expired
213-
214-
* Date-based keys: Editor disabled after grace period.
215-
* Version-locked keys: Cannot use new versions.
216-
* Must obtain new license key after renewal.
244+
[cols="1,2,1", options="header"]
245+
|===
246+
| State | Features & Behavior | Applicable To
247+
248+
| Active
249+
a|
250+
* Full editor and premium plugin functionality
251+
* Regular version upgrades available
252+
* No restrictions on features
253+
| All license types
254+
255+
| Grace Period
256+
a|
257+
* All features remain functional
258+
* In-editor notifications about approaching expiration
259+
* Occurs 30 days before subscription end
260+
* Time to contact Tiny for renewal
261+
| Date-based keys only
262+
263+
| Expired
264+
a|
265+
* Date-based keys: Editor disabled
266+
* Version-locked keys: Cannot use new versions
267+
* Must obtain new license key after renewal
268+
| All license types
269+
|===
217270

218271
== FAQ
219272

@@ -225,39 +278,47 @@ The GPLv2+ license was chosen to provide the best compatibility with existing GP
225278

226279
=== What is the difference between a license key and the API key?
227280

228-
The **API key** is used when loading {productname} from the {cloudname} and undergoes server-side validation. The **license key** (starting with T8LK: in version 8) is used to declare the license terms when self-hosting {productname} and uses client-side JWT validation in the browser.
281+
The **API key** is used when loading {productname} from the {cloudname} and undergoes server-side validation. The **license key** (starting with `T8LK:` in version 8) is used to declare the license terms when self-hosting {productname}. The license key contains a JSON Web Token (JWT) that enables secure client-side validation performed entirely within the browser, requiring no server communication or "phone home" checks.
229282

230283
=== Who needs to get a license key?
231284

232285
Anyone who intends to self-host {productname} will need to:
286+
233287
* For version 7: Provide a valid commercial license key or declare their intention to use {productname} under the GPLv2+ license
234288
* For version 8: Obtain a T8LK-prefixed commercial license key or use GPL mode
235289

236290
=== How will I know if this change affects me?
237291

238-
If {productname} detects that the `license_key` configuration is missing or invalid, it will display a console log warning message. These warnings are designed to ensure compliance and provide transparency during evaluation periods. If you have actively suppressed or hidden these messages, please remove those overrides to maintain proper license validation. If no notification appears, you are not affected.
292+
If {productname} detects that the `license_key` configuration is missing or invalid, it will display a console log warning message. These warnings are designed to ensure compliance and provide transparency during evaluation periods.
293+
294+
[TIP]
295+
If you have actively suppressed or hidden these messages, please remove those overrides to maintain proper license validation. If no notification appears, you are not affected.
239296

240297
=== Should I be using both an API key and a license key?
241298

242299
For standard deployments, use only one of the following:
300+
243301
* *API key* - For cloud deployments
244302
** Server-side validation
245303
** Automatic updates and CDN delivery
246304
** Premium plugin access via subscription
247305
** No client-side validation required
248306

249307
* *License key* - For self-hosted deployments
250-
** Client-side JWT validation
308+
** Client-side JWT validation is automatically performed
251309
** T8LK prefix required for version 8
252310
** Supports air-gapped environments
253311
** Local premium plugin validation
254312

255313
*Hybrid Deployment Cases:*
314+
256315
* Using both keys together requires specific configuration:
257-
** Set up cloud services with API key
258-
** Configure local fallback with license key
259-
** Enable high availability features
260-
** Access both cloud and local premium plugins
316+
** Set up cloud services with API key for primary cloud access
317+
** Configure local fallback with license key for offline operation
318+
** Configure service failover timeouts (e.g., `serviceLoadFailbackTime`)
319+
** Ensure premium plugins are available both via cloud and locally
320+
** Implement custom handlers for seamless cloud/local failover
321+
** Test both online and offline scenarios thoroughly
261322

262323
[IMPORTANT]
263324
====

modules/ROOT/partials/integrations/angular-tech-ref.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ include::partial$misc/get-an-api-key.adoc[]
132132

133133
{cloudname} License key.
134134

135-
Use this when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation. For more information, see: xref:license-key.adoc[License Key].
135+
Use this when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation that runs entirely in the browser, requiring no server communication or "phone home" checks. For more information, see: xref:license-key.adoc[License Key].
136136

137137
*Type:* `+String+`
138138

modules/ROOT/partials/integrations/blazor-tech-ref.adoc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ In your component:
190190

191191
Specifies the {productname} license key. Required for self-hosted deployments of {productname}. This property is not required for deployments using the {cloudname}.
192192

193-
License keys must start with the "T8LK:" prefix and use client-side JWT validation. For more information, see: xref:license-key.adoc[License Key].
193+
License keys must start with the "T8LK:" prefix and use client-side JWT validation that runs entirely in the browser, requiring no server communication or "phone home" checks. For more information, see: xref:license-key.adoc[License Key].
194194

195195
*Type:* `+String+`
196196

@@ -206,6 +206,7 @@ License keys must start with the "T8LK:" prefix and use client-side JWT validati
206206
LicenseKey="T8LK:your-license-key"
207207
/>
208208
----
209+
209210
Use this example when you have a commercial license for TinyMCE 8 or newer. The T8LK prefix is required.
210211

211212
==== Example: Open source GPL license

modules/ROOT/partials/integrations/react-tech-ref.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ include::partial$misc/get-an-api-key.adoc[]
189189

190190
{cloudname} License key.
191191

192-
Use this when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation. For more information, see: xref:license-key.adoc[License Key].
192+
Use this when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation that runs entirely in the browser, requiring no server communication or "phone home" checks. For more information, see: xref:license-key.adoc[License Key].
193193

194194
*Type:* `+String+`
195195

modules/ROOT/partials/integrations/svelte-tech-ref.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ include::partial$misc/get-an-api-key.adoc[]
5858

5959
{cloudname} License key.
6060

61-
Use this option when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation. For more information, see: xref:license-key.adoc[License Key].
61+
Use this option when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation that runs entirely in the browser, requiring no server communication or "phone home" checks. For more information, see: xref:license-key.adoc[License Key].
6262

6363
*Type:* `+String+`
6464

modules/ROOT/partials/integrations/vue-tech-ref.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ include::partial$misc/get-an-api-key.adoc[]
139139

140140
{cloudname} License key.
141141

142-
Use this when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation. For more information, see: xref:license-key.adoc[License Key].
142+
Use this when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation that runs entirely in the browser, requiring no server communication or "phone home" checks. For more information, see: xref:license-key.adoc[License Key].
143143

144144
*Type:* `+String+`
145145

0 commit comments

Comments
 (0)