Skip to content

Commit f000623

Browse files
committed
DOC-3226: Update licensing information and examples for TinyMCE 8, including T8LK: prefix requirements for self-hosted deployments across various integrations and documentation.
1 parent b3a9cdd commit f000623

File tree

11 files changed

+369
-31
lines changed

11 files changed

+369
-31
lines changed

modules/ROOT/pages/license-key.adoc

Lines changed: 241 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,218 @@
33
:description: Learn how to configure license key and stop {productname} from running in the evaluation mode.
44
:keywords: {productname}, cloud, script, textarea, apiKey, faq, license key, frequently asked questions,
55

6+
== 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.
9+
610
[IMPORTANT]
711
====
8-
{productname} 7 is licensed under the GNU General Public License Version 2 or later. A new configuration option called 'license_key' requires developers to make a conscious decision to use {productname} with the GPLv2+ license or with a commercial license.
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.
913
1014
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.
1115
1216
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.
1319
====
1420

1521
include::partial$misc/setting-the-license.adoc[]
1622

23+
== License Types and Deployment Options
24+
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+
====
86+
87+
== Configuration Examples
88+
89+
=== Cloud Deployment
90+
91+
[source,javascript]
92+
----
93+
tinymce.init({
94+
selector: "textarea",
95+
plugins: [
96+
// Core plugins
97+
"advlist", "anchor", "autolink", "charmap", "code", "fullscreen",
98+
"help", "image", "insertdatetime", "link", "lists", "media",
99+
"preview", "searchreplace", "table", "visualblocks",
100+
101+
// Premium plugins (requires valid subscription)
102+
"powerpaste", "tinycomments", "tinydrive"
103+
],
104+
toolbar: "undo redo | styles | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image",
105+
api_key: "no-api-key"
106+
});
107+
----
108+
109+
=== Self-hosted Commercial
110+
111+
[source,javascript]
112+
----
113+
tinymce.init({
114+
selector: "textarea",
115+
plugins: [
116+
"advlist", "anchor", "autolink", "charmap", "code", "fullscreen",
117+
"help", "image", "insertdatetime", "link", "lists", "media",
118+
"preview", "searchreplace", "table", "visualblocks",
119+
// Premium plugins need to be separately downloaded and included
120+
"powerpaste", "tinycomments", "tinydrive"
121+
],
122+
toolbar: "undo redo | styles | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image",
123+
license_key: "T8LK:your-license-key" // Your commercial license key
124+
});
125+
----
126+
127+
=== Hybrid Deployment
128+
129+
[source,javascript]
130+
----
131+
tinymce.init({
132+
selector: "textarea",
133+
plugins: [
134+
// Core plugins
135+
"advlist", "anchor", "autolink", "charmap", "code", "fullscreen",
136+
"help", "image", "link", "lists",
137+
138+
// Premium plugins - available both via cloud and local fallback
139+
"powerpaste", "tinycomments", "tinydrive"
140+
],
141+
toolbar: "undo redo | styles | bold italic | alignleft aligncenter alignright | bullist numlist | link image",
142+
// Cloud configuration with local fallback
143+
api_key: "your-api-key", // For cloud features
144+
license_key: "T8LK:your-license", // For local fallback
145+
// Optional: Configure failover behavior
146+
serviceLoadFailbackTime: 5000, // Wait 5s before falling back to local
147+
images_upload_handler: function (blobInfo, progress) {
148+
// Custom handler that tries cloud first, falls back to local
149+
return new Promise((resolve, reject) => {
150+
// Implementation of cloud/local failover logic
151+
});
152+
}
153+
});
154+
----
155+
156+
[NOTE]
157+
====
158+
For hybrid deployments:
159+
* Both `api_key` and `license_key` are used together
160+
* Configure appropriate timeouts for service failover
161+
* Consider implementing custom handlers for seamless fallback
162+
* Test both online and offline scenarios
163+
====
164+
165+
=== Offline/Air-gapped Deployment
166+
167+
[source,javascript]
168+
----
169+
tinymce.init({
170+
selector: "textarea",
171+
plugins: [
172+
// Core plugins included in your local bundle
173+
"advlist", "anchor", "autolink", "charmap", "code", "fullscreen",
174+
"help", "image", "link", "lists",
175+
176+
// Premium plugins downloaded and bundled locally
177+
"powerpaste", "spelling", "a11ychecker"
178+
],
179+
toolbar: "undo redo | styles | bold italic | alignleft aligncenter alignright | bullist numlist outdent indent | link image",
180+
// Version-locked key for offline environments
181+
license_key: "T8LK:your-version-locked-key",
182+
// Ensure all resources are loaded locally
183+
skin_url: "/path/to/local/skin",
184+
content_css: "/path/to/local/content.css"
185+
});
186+
----
187+
188+
[NOTE]
189+
====
190+
For offline deployments:
191+
* All assets must be available locally
192+
* Content delivery URLs should point to local resources
193+
* Premium plugins must be downloaded and included in your bundle
194+
====
195+
196+
== License States
197+
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.
217+
17218
== FAQ
18219

19220
=== What does the GPL license mean?
@@ -24,21 +225,46 @@ The GPLv2+ license was chosen to provide the best compatibility with existing GP
24225

25226
=== What is the difference between a license key and the API key?
26227

27-
The **API key** is used when loading {productname} from the {cloudname}. The **license key** is used to declare the license terms when self-hosting {productname}.
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.
28229

29230
=== Who needs to get a license key?
30231

31-
Anyone who intends to self-host {productname} will need to provide a valid commercial license key or declare their intention to use {productname} under the GPLv2+ license.
232+
Anyone who intends to self-host {productname} will need to:
233+
* For version 7: Provide a valid commercial license key or declare their intention to use {productname} under the GPLv2+ license
234+
* For version 8: Obtain a T8LK-prefixed commercial license key or use GPL mode
32235

33236
=== How will I know if this change affects me?
34237

35-
If {productname} detects that the `license_key` configuration is missing or invalid, it will display a console log warning. If you have actively suppressed or hidden this message, please remove those overrides. If no notification appears, you are not affected.
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.
36239

37240
=== Should I be using both an API key and a license key?
38241

39-
No, an API key and a license key should not be used simultaneously. The API key should only be used if {productname} is loaded from the {cloudname}. If {productname} is being self-hosted, the license key option should be used instead.
242+
For standard deployments, use only one of the following:
243+
* *API key* - For cloud deployments
244+
** Server-side validation
245+
** Automatic updates and CDN delivery
246+
** Premium plugin access via subscription
247+
** No client-side validation required
248+
249+
* *License key* - For self-hosted deployments
250+
** Client-side JWT validation
251+
** T8LK prefix required for version 8
252+
** Supports air-gapped environments
253+
** Local premium plugin validation
40254

41-
=== Will {productname} “phone home” to check the license key?
255+
*Hybrid Deployment Cases:*
256+
* 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
261+
262+
[IMPORTANT]
263+
====
264+
Only use both keys in properly configured hybrid deployments where you need cloud features with local fallback. Using both keys without proper hybrid deployment configuration **may cause** validation conflicts and unexpected behavior.
265+
====
266+
267+
=== Will {productname} "phone home" to check the license key?
42268

43269
No. {productname} does not contact any server to validate the license key.
44270

@@ -52,4 +278,12 @@ The license key ensures compliance with {productname} licensing terms. It's part
52278

53279
=== How can I get further assistance?
54280

55-
For any licensing or technical support questions, see our available options on the https://www.tiny.cloud/docs/tinymce/latest/support/[support page.]
281+
For any licensing or technical support questions, see our available options on the https://www.tiny.cloud/docs/tinymce/latest/support/[support page.]
282+
283+
=== Technical Support
284+
285+
For licensing or technical support:
286+
* API key issues: Visit link:https://www.tiny.cloud/my-account[Tiny Cloud Account]
287+
* License key issues: Contact your account manager
288+
* Technical support: Visit link:https://support.tiny.cloud[Support Portal]
289+
* Documentation: See link:https://www.tiny.cloud/docs/tinymce/latest/[TinyMCE Docs]

modules/ROOT/pages/vite-es6-npm.adoc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,18 @@ This guide requires the following:
1515

1616
* Node.js and npm.
1717
* Basic knowledge of how to use https://vitejs.dev[Vite].
18+
* For self-hosted deployments: A valid license key starting with `T8LK:` from your link:{accountpageurl}/[{accountpage}]
1819
* (Optional: For premium features) The latest premium .zip bundle of TinyMCE that includes premium plugins.
1920

21+
[IMPORTANT]
22+
====
23+
When self-hosting TinyMCE 8:
24+
25+
* A license key is required for commercial deployments
26+
* Keys must start with the `T8LK:` prefix
27+
* For hybrid deployments that need both cloud features and local fallback, you can use both `license_key` and `api_key`
28+
====
29+
2030
== Procedures
2131

2232
:is_zip_install: vite
@@ -72,4 +82,6 @@ npx vite preview
7282
----
7383
:!is_zip_install:
7484

85+
86+
7587
include::partial$module-loading/bundling-next-steps.adoc[]

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,19 +132,27 @@ 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}. 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. For more information, see: xref:license-key.adoc[License Key].
136136

137137
*Type:* `+String+`
138138

139139
*Default value:* `+undefined+`
140140

141-
*Possible values:* `undefined`, `'gpl'` or a valid {productname} license key
141+
*Possible values:*
142+
* `undefined` - Use this when loading from {cloudname} with an API key
143+
* `'gpl'` - For open source projects using GPL license
144+
* `'T8LK:your-license-key'` - For commercial {productname} installations
142145

143-
==== Example: using `+licenseKey+`
146+
==== Example: Commercial license
147+
[source,html]
148+
----
149+
<editor licenseKey="T8LK:your-license-key" />
150+
----
144151

145-
[source,jsx]
152+
==== Example: using `+licenseKey+` with GPL
153+
[source,html]
146154
----
147-
<editor licenseKey='your-license-key' />
155+
<editor licenseKey="gpl" />
148156
----
149157

150158
[[cloudchannel]]

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,18 +188,35 @@ In your component:
188188

189189
=== `LicenseKey`
190190

191-
Specifies the {productname} license key. Required for self-hosted deployments of {productname}. This property is not required for deployments using the {cloudname}. For more information on licensing, see: xref:license-key.adoc[License key].
191+
Specifies the {productname} license key. Required for self-hosted deployments of {productname}. This property is not required for deployments using the {cloudname}.
192+
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].
192194

193195
*Type:* `+String+`
194196

195-
==== Example using LicenseKey
197+
*Possible values:*
198+
* `null` - Use this when loading from {cloudname} with an API key
199+
* `"gpl"` - For open source projects using GPL license
200+
* `"T8LK:your-license-key"` - For commercial {productname} installations
196201

202+
==== Example: Commercial license (TinyMCE 8+)
197203
[source,cs]
198204
----
199205
<Editor
200-
LicenseKey="your-license-key"
206+
LicenseKey="T8LK:your-license-key"
201207
/>
202208
----
209+
Use this example when you have a commercial license for TinyMCE 8 or newer. The T8LK prefix is required.
210+
211+
==== Example: Open source GPL license
212+
[source,cs]
213+
----
214+
<Editor
215+
LicenseKey="gpl"
216+
/>
217+
----
218+
219+
Use this example when you're using TinyMCE under the open source GPL license in a self-hosted environment.
203220

204221
=== `ScriptSrc`
205222

0 commit comments

Comments
 (0)