Appearance
Configure TinyMCE License
- Status: accepted
- Deciders: Development Team
- Date: 2026-04-28
- Tags: tinymce, licensing, environment, frontend
Technical Story: Document how the Negotiate UI configures the commercial TinyMCE license key and where that configuration is consumed in the application.
Context and Problem Statement
The Negotiate UI uses a locally hosted TinyMCE installation and now requires a commercial license key to enable the editor in non-GPL mode. We need one documented, consistent place to configure that key and clear guidance on where the application reads and applies it.
Decision
The TinyMCE license key is configured through the frontend environment variable VITE_TINYMCE_LICENSE_KEY. This keeps the commercial key out of committed source, follows the project's existing frontend configuration pattern, and makes setup consistent across local development, tests, and CI/CD.
Configuration
Where the license key can be set
The TinyMCE license key is configured with the frontend environment variable VITE_TINYMCE_LICENSE_KEY.
For local development, set it in the project root .env file:
dotenv
VITE_TINYMCE_LICENSE_KEY=your-commercial-tinymce-license-keyFor CI/CD or other build environments, set VITE_TINYMCE_LICENSE_KEY in the environment before running the frontend build. Because this application uses Vite, the value is injected at build time.
Where the license key is declared and mocked
vite-env.d.tsdeclaresVITE_TINYMCE_LICENSE_KEYonImportMetaEnvvitest.config.jsprovides a test env value for Vitest runsvitest.setup.jsassigns a mock value ontoimport.meta.envduring test setup
Usage
Where the license key is used in the app
The license key is consumed by the rich text editor wrapper in src/components/RichTextEditor/RichTextEditor.tsx.
That component:
- reads the value from
import.meta.env.VITE_TINYMCE_LICENSE_KEY - passes it to the TinyMCE React wrapper through the
licenseKeyprop - serves TinyMCE assets locally from
/public/tinymceviabase_url: '/tinymce'
Related self-hosted licensing assets
Commercial self-hosted validation also depends on the TinyMCE premium licensekeymanager plugin assets being copied into the public TinyMCE directory.
This happens through the tinymce:copy-assets script in package.json, which copies:
- core TinyMCE plugins, themes, skins, icons, and models
tinymce-premium/plugins/licensekeymanagerintopublic/tinymce/plugins/licensekeymanager
Operational Notes
- If the editor reports that no license key was provided, first confirm that
VITE_TINYMCE_LICENSE_KEYis set and not commented out - Restart the Vite dev server after changing
.env - If the app has already been built, rebuilding is required for a changed key to take effect
Links
- Related component documentation:
src/components/RichTextEditor/README.md - Related implementation:
src/components/RichTextEditor/RichTextEditor.tsx