14-day Cloud trial
Start today. For free.

One editor. 50+ features. Zero constraints. After your trial, retain the advanced features.

Try Professional Plan for FREE
PricingContact Us
Log InGet Started Free

Create an LMS app with TinyMCE Self-hosted + Cloud

June 29th, 2022

7 min read

LMS and self-host with a + Cloud and LMS icons floating above TinyMCE imagery

Written by

Joe Robinson


How-to Use TinyMCE

Learning management needs accuracy, integrity, and transparency. Alongside these virtues is another, more practical value that every Learning Management System (LMS) must have: security

Security and integrity go hand in hand.

To add both security and integrity to your LMS, the best LMS editor component that can support you, is TinyMCE.

And for added security, you can self-host TinyMCE within your own premises, so your teaching content and students' work is managed the way you prefer. Then by combining Self-hosting with the functionality provided by Premium Plugins from TinyMCE cloud, your LMS reaches further to support teachers and student learning..

That’s exactly what you learn in this article. Read on for a guide on how to design your LMS editor. The end result? You’ll know exactly what you need to run an LMS with TinyMCE Self-hosted and TinyMCE Cloud.

What you need for your LMS

The TinyMCE Cloud component

First of all, get your TinyMCE API key. This key gives you free access to TinyMCE premium plugins for 14 days.

Why do this? What’s the API key do? 

You can get your TinyMCE API key two ways:

  1. Navigate to the pricing plans for TinyMCE. Choose the plan that fits your app.
  2. Go directly to the Get-tiny sign up page to get your FREE API key.

Enter an email and password, and click Sign up. When you arrive at the TinyMCE dashboard, your API key is waiting for you in the center of the page. You can use TinyMCE without an API key. However there will be warning messages in the text editor area.

  “This domain is not registered with Tiny Cloud.  Please see the quick start
  guide or create an account”

Adding your API key to your app or project, removes these warning messages.

The TinyMCE Self-hosted LMS component

The second part of this setup is to download a copy of TinyMCE in .zip format.

  1. On the Get-tiny sign up page, click the Download TinyMCE SDK Now button. A .zip file then starts downloading into your downloads folder.

This .zip file holds the rich text editor. This is what you host on your own workspace.

How to set up TinyMCE Self-hosted

Follow along the with the video tutorial for a guide on how to set up the configuration:

And here's the transcript:

Hey there it's John from Tiny and in this video i'm going to show you how to set up tinymce's lms starter config self-hosted loading premium plugins from the cloud now you might be wondering why would i self-host tinymce and then load premium plugins from the cloud well there's a couple scenarios where you might want to do this for example your app might already be using self-hosted tinymce and you want to add premium plugins without migrating everything over the cloud or maybe you're already self-hosting tinymce and you just want to try out some of the premium plugins on a 14 day free trial we built this starter config based on lms best practices and how some of our customers including blackboard mcgraw-hill and desire2learn use tinymce you can use it for building your own lms from scratch or adding rich text editing capabilities to your existing lms okay let's take a look at how to set it up so i've got a local development and web server setup on my computer here with the project directory and editor on the left and then my browser on the right so the first thing i'm going to do is i'm going to head over to tiny dot cloud slash get dash tiny and i'm going to download the tiny mce sdk so we're going to unzip the file and copy the tinymce folder into our project's js directory awesome now we're going to go to the solutions tab on our website click on learning management system and scroll down to the starter config we've got the starter config available in two forms one without code tips and one with code tips the version with code tips is great if you're new to tinymce and you want to learn what each config option does so we'll copy that over to our html file okay so by default the starter config loads tiny mce from the cloud we just need to go to the script tag that loads tinymce and replace the path with the local version of tinymce.min.js perfect let's save the file and load it up on our web server great so it looks like it's loaded the lms starter config but it's still missing the premium features which are what we need to load from the cloud in our docs we have a help article on loading premium plugins from the cloud i'll include a link to that in the description but head over there and copy this script tag to load premium plugins we'll paste it right under our tinymce script tag and then we're going to replace no api key with our api key from our account screen save the file and head back into our lms reload it and here we go now we've got tinymce self-hosted loading all the premium features from the cloud from here you can take the code put it into your app and play around with the settings to make it perfect for your lms if you don't have a tiny mce api key you can head over to our pricing page and sign up for a free 14-day trial to try out all the premium features included in the starter config the 14 day trial also comes with access to our support team which can help you get started if you get stuck so what's next you're going to want to learn how to get and set content from the editor i've included a link in the description for you to check that out we're going to be releasing a lot more content on rich text editing in lms's so be sure to check out our youtube channel and head over to our blog for more resources good luck
  1. Start with the zip file – unzip the tinymce file you downloaded in the previous step (the file name - tinymce_6.0.3.zip or similar)
  2. Create a new directory for testing out TinyMCE Self-hosted for your LMS (try mkdir TinymceLMS as a reminder)
  3. Move the unzipped tinymce folder into that directory
  4. Create a new index.html file in the directory, and include the beginnings of the LMS app HTML. This content is drawn from the TinyMCE LMS demo config,and it includes the tinymce.init script, which controls TinyMCE:
<!DOCTYPE html>
  <meta charset="utf-8">
  <title>LMS use-case demo</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
      selector: "#editor",
      <div class="editor-wrap">
        <textarea id="editor"></textarea>
  1. Inside the head of the document, reference the local tinymce.min.js file:

<script src="/tinymce/js/tinymce/tinymce.min.js"></script>;
  1. Save the file, and then load the file in a browser. Or use a local server with Python or PHP.

With these steps complete, you’ve successfully set up TinyMCE Self-hosted (excellent work!).

Next, we combine Self-hosted TinyMCE with the cloud CDN link (to try out the premium plugins!)

TinyMCE Cloud and TinyMCE Self-hosted together

  1. Add a link to TinyMCE with your API key in your index.html head before the TinyMCE Self-host link. This enables access to TinyMCE Premium plugins.

  1. Add the following new configuration to your tinymce.init script. This will rewrite and change the editor’s capabilities to better suit academic integrity in your LMS:

      selector: "#editor",
      plugins: "a11ychecker advcode autocorrect autoresize autosave charmap charmap checklist code emoticons footnotes fullscreen image link linkchecker lists media mediaembed mergetags powerpaste preview table tinycomments tinymcespellchecker",

      toolbar: "undo redo | blocks | bold italic underline strikethrough forecolor backcolor | align checklist bullist numlist | link image media footnotes mergetags table | subscript superscript charmap blockquote | tokens | spellchecker a11ycheck  |  addcomment showcomments | fullscreen preview",

      statusbar: false,

      toolbar_sticky: true,

      mediaembed_max_width: 800,

      block_formats: 'Title=h1; Heading=h2; Sub heading=h3; Blockquote=blockquote; Paragraph=p',

      font_css: ['https://fonts.googleapis.com/css2?family=Asap:ital,wght@0,400;0,550;1,400&display=swap'],

      a11y_advanced_options: true,
      a11ychecker_html_version: 'html5',
      a11ychecker_level: 'aa',

      mergetags_list: [
        title: "Course",
        menu: [{
          value: 'Course.Name',
          title: 'Course Name'
          value: 'Course.Teacher.Name',
          title: 'Teacher Name'
          value: 'Course.Department.Head',
          title: 'Department Head'
        title: "Assignment",
        menu: [{
          value: 'Assignment.Name',
          title: 'Assignment Name'
          value: 'Assignment.DueDate',
          title: 'Assignment Due Date'
        title: "Student",
        menu: [{
          value: 'Student.Name',
          title: 'Student Name'
          value: 'Student.ID',
          title: 'Student ID'
          value: 'Student.Email',
          title: 'Student Email'

      text_patterns: [
        { start: 'darnit', replacement: '????' },
        { start: '????', replacement: '????' },
        { start: '1/2', replacement: '1/2' },
        { start: '--', replacement: '--' },
        { start: '(c)', replacement: '(c)' },
        { start: '->', replacement: '?' },
        { start: '* ', cmd: 'InsertUnorderedList' },
        { start: '1. ', cmd: 'InsertOrderedList', value: { 'list-style-type': 'decimal' } },
        { start: '#', format: 'h1' },
        { start: '##', format: 'h2' },
        { start: '###', format: 'h3' },

      tinycomments_mode: 'embedded',
      tinycomments_author: 'rmartel',
      tinycomments_author_name: 'Rosalina Martel (Instructor)',
      tinycomments_author_avatar: 'https://www.tiny.cloud/images/avatars/avatar-RosalinaMartel.jpg',

      sidebar_show: 'showcomments',

      content_style: `
      body {
        max-width: 800px;
        margin: auto;
        font-family: 'Asap', serif;
        font-size: 17px;
        color: #222f3e;
      h1, h2, h3, strong {
        font-weight: 550;
      table th,
      table thead td {
        background-color: #ecf0f1;
        font-weight: 550;
        text-align: left;
      table caption {
        display: none;
      table[data-mce-selected="1"] caption {
        display: table-caption;
      .mce-footnotes {
  1. Include additional CSS in a pair of style tags to change the LMS page around the text editor: 

    body {
      margin: 60px 16px;
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif;
      background-color: #fafafc;
      font-family: 'Asap', serif;
      color: #222f3e;
    .editor-wrap {
      max-width: 1200px;
      margin: auto;
  1. Next, for the LMS content, include the following sample HTML drawn from the TinyMCE LMS solutions page:

<h1><span class="mce-annotation tox-comment" data-mce-annotation-uid="mce-conversation_39124539331662741473397" data-mce-annotation="tinycomments">Assignment</span> #3: Color Theory</h1>
      <p>Hello {{Student.Name}},</p>
      <p>For this week's assignment, you will learn the basics of color theory.</p>
      <p>Select one of the following topics, and write a research essay. Ensure you answer the questions in full, and provide references for any primary or secondary sources<sup id="footnote_83179098411662742784603" class="mce-footnote"><a href="#footnotes_entry_83179098411662742784603">1</a></sup> consulted. Contact {{Course.Teacher.Name}} or {{Course.Department.Head}} if you have any questions about the assignment.</p>
      <div style="left: 0px; width: 100%; height: 0px; position: relative; padding-bottom: 56.25%; max-width: 800px;" data-ephox-embed-iri="<a href="https://www.youtube.com/watch?v=Qj1FK8n7WgY">https://www.youtube.com/watch?v=Qj1FK8n7WgY</a>"><iframe style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" src="<a href="https://www.youtube.com/embed/Qj1FK8n7WgY?rel=0">https://www.youtube.com/embed/Qj1FK8n7WgY?rel=0</a>" scrolling="no" allowfullscreen="allowfullscreen"></iframe></div>
      <h2>This week's tasks</h2>
      <p>Begin by watching the video above then proceed to the assignment questionnaire by pressing continue below.</p>
      <h3>Topic List</h3>
        <li>The origin of Color theory and its effect on emotion and mood is contentious.<sup id="footnote_98446634721662742994322" class="mce-footnote"><a href="#footnotes_entry_98446634721662742994322">2</a></sup> Identify your understanding of the originators of Color theory. Argue for the effectiveness of certain color palettes over others to create different moods.</li>
        <li>While some experts argue there are no new color palettes, others argue innovation is a constant process. Choose one side, and build an argument: There are no new color palette innovations. New color palette innovations are happening all the time.</li>
        <li>Select three examples of color theory in practice that are all part of one medium (e.g. film, magazine, television). Explain why these three examples are effective. Contrast and argue why one of these examples is more effective in its use of color theory concepts compared to the others.</li>
        <li>Wassily Kandinsky states “Color is a power which directly influences the soul.”<sup id="footnote_34341905131662743043554" class="mce-footnote"><a href="#footnotes_entry_34341905131662743043554">3</a></sup> Explain what Kandinsky meant, and provide an argument explaining what Kandinsky means using color theory principles.</li>
        <li>Think about the difference between mixing colors using colored lights vs using paint.</li>
        <li>Pay extra attention to the different complementary color models.</li>
        <p>“Color is a power which directly influences the soul.”<br><span style="color: #95a5a6;"><em>– Wassily Kandinsky </em></span></p>
      <p>Please submit your tasks before {{Assignment.DueDate}}</p>
      <h2>Grading Criteria</h2>
      <table style="border-collapse: collapse; width: 99.8698%; height: 157px;" border="1">
            <th style="width: 18.0915%;" scope="col"> </th>
            <td style="width: 18.0915%;" scope="col">High Achievement</td>
            <td style="width: 18.2224%;" scope="col">Good Achievement</td>
            <td style="width: 18.2224%;" scope="col">Pass</td>
            <td style="width: 18.2224%;" scope="col">Fail</td>
            <th style="width: 18.0915%;" scope="col">Demonstrated knowledge of color theory</th>
            <td style="width: 18.0915%;">The student shows an outstanding knowledge and command of color theory concepts</td>
            <td style="width: 18.2224%;">The student shows good knowledge and understanding of color theory concepts</td>
            <td style="width: 18.2224%;">The student shows some knowledge of color theory and a basic understanding of color theory concepts</td>
            <td style="width: 18.2224%;">The student has not demonstrated knowledge of color theory, or the concepts of color theory.</td>
            <th style="width: 18.0915%;" scope="col">Argument composition skills</th>
            <td style="width: 18.0915%;">The student shows an outstanding argument composition skills</td>
            <td style="width: 18.2224%;">The student shows good argument composition skills</td>
            <td style="width: 18.2224%;">The student shows some argument composition skills.</td>
            <td style="width: 18.2224%;">The student does not show clear argument composition skills</td>
            <th style="width: 18.0915%;" scope="col">Consulted resources</th>
            <td style="width: 18.0915%;">The student shows they have consulted excellent resources</td>
            <td style="width: 18.2224%;">The student has consulted good resources</td>
            <td style="width: 18.2224%;">The student has consulted some resources required for the assignment</td>
            <td style="width: 18.2224%;">The student has not consulted adequate resources</td>
            <th style="width: 18.0915%;" scope="col">Writing, Grammar, and Clarity</th>
            <td style="width: 18.0915%;">The student shows a command of the language in their work</td>
            <td style="width: 18.2224%;">The student shows effective writing skills</td>
            <td style="width: 18.2224%;">The student shows clear writing skills</td>
            <td style="width: 18.2224%;">The student shows unclear writing skills</td>
      <p> </p>
      <div class="mce-footnotes">
          <li id="footnotes_entry_83179098411662742784603"><a class="mce-footnotes-backlink" href="#footnote_83179098411662742784603">^ </a><span class="mce-footnotes-note">AMA Style Guide. <a href="<a href="https://owl.purdue.edu/owl/research_and_citation/ama_style/index.html">https://owl.purdue.edu/owl/research_and_citation/ama_style/index.html</a>"><a href="https://owl.purdue.edu/owl/research_and_citation/ama_style/index.html">https://owl.purdue.edu/owl/research_and_citation/ama_style/index.html</a></a>. Accessed September 9, 2022. </span></li>
          <li id="footnotes_entry_98446634721662742994322"><a class="mce-footnotes-backlink" href="#footnote_98446634721662742994322">^ </a><span class="mce-footnotes-note">Color theory. Wikipedia. <a href="<a href="https://en.wikipedia.org/wiki/Color_theory">https://en.wikipedia.org/wiki/Color_theory</a>"><a href="https://en.wikipedia.org/wiki/Color_theory">https://en.wikipedia.org/wiki/Color_theory</a></a>. Published September 3, 2022. Accessed September 24, 2022. </span></li>
          <li id="footnotes_entry_34341905131662743043554"><a class="mce-footnotes-backlink" href="#footnote_34341905131662743043554">^ </a><span class="mce-footnotes-note">Kandinsky W. A quote from concerning the spiritual in art. Goodreads. <a href="<a href="https://www.goodreads.com/quotes/90420-colour-is-a-power-which-directly-influences-the-soul">https://www.goodreads.com/quotes/90420-colour-is-a-power-which-directly-influences-the-soul</a>"><a href="https://www.goodreads.com/quotes/90420-colour-is-a-power-which-directly-influences-the-soul">https://www.goodreads.com/quotes/90420-colour-is-a-power-which-directly-influences-the-soul</a></a>. Accessed September 14, 2022. </span></li>
  1. Save the changes, and reload the demo.

Here's a codepen example of the LMS:

The next steps for your LMS editor

For teachers searching for integrity, TinyMCE gives what’s needed to create an LMS that promotes integrity.

Check out our LMS editor page next – the procedure in this article covers just one facet of the TinyMCE configuration that works best for a LMS – there are a wealth of opportunities and plugins that you can can adapt to fit your LMS project plans.

Remember that your FREE API key grants free access to Premium Plugin functionality for 14 days, after which you need to either choose a Premium Plan or remove the TinyMCE premium features.

Get your FREE TinyMCE API key today!

LMSTinyMCETiny CloudSelf Hosting
byJoe Robinson

Technical and creative writer, editor, and a TinyMCE advocate. An enthusiast for teamwork, open source software projects, and baking. Can often be found puzzling over obscure history, cryptic words, and lucid writing.

Related Articles

  • How-to Use TinyMCEApr 16th, 2024

    How to enable a Bootstrap WYSIWYG editor: a step-by-step guide

Join 100,000+ developers who get regular tips & updates from the Tiny team.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Tiny logo

Stay Connected

SOC2 compliance badge


© Copyright 2024 Tiny Technologies Inc.

TinyMCE® and Tiny® are registered trademarks of Tiny Technologies, Inc.