<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hatem Hosny</title>
    <description>The latest articles on DEV Community by Hatem Hosny (@hatemhosny).</description>
    <link>https://dev.to/hatemhosny</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F238410%2F1deb67fd-de56-4fa8-9590-c0a6bcc0dfbf.jpg</url>
      <title>DEV Community: Hatem Hosny</title>
      <link>https://dev.to/hatemhosny</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hatemhosny"/>
    <language>en</language>
    <item>
      <title>LiveCodes is featured with the big guys 🤩</title>
      <dc:creator>Hatem Hosny</dc:creator>
      <pubDate>Mon, 07 Jul 2025 19:37:04 +0000</pubDate>
      <link>https://dev.to/hatemhosny/livecodes-is-featured-with-the-big-guys-1d6f</link>
      <guid>https://dev.to/hatemhosny/livecodes-is-featured-with-the-big-guys-1d6f</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/madza/9-useful-coding-tools-every-developer-should-bookmark-6d6" class="crayons-story__hidden-navigation-link"&gt;9 Useful Coding Tools Every Developer Should Bookmark 📚🧑‍💻&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/madza" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F159737%2F10b8de99-9383-42da-80e2-851af40d5d0f.png" alt="madza profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/madza" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Madza
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Madza
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-2663849" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/madza" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F159737%2F10b8de99-9383-42da-80e2-851af40d5d0f.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Madza&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/madza/9-useful-coding-tools-every-developer-should-bookmark-6d6" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 7 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/madza/9-useful-coding-tools-every-developer-should-bookmark-6d6" id="article-link-2663849"&gt;
          9 Useful Coding Tools Every Developer Should Bookmark 📚🧑‍💻
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/coding"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;coding&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/api"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;api&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/madza/9-useful-coding-tools-every-developer-should-bookmark-6d6" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;184&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/madza/9-useful-coding-tools-every-developer-should-bookmark-6d6#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              43&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>coding</category>
      <category>api</category>
      <category>productivity</category>
    </item>
    <item>
      <title>LiveCodes Gets a Fresh Look, and Goes Multilingual!</title>
      <dc:creator>Hatem Hosny</dc:creator>
      <pubDate>Mon, 09 Dec 2024 23:14:34 +0000</pubDate>
      <link>https://dev.to/livecodes_io/livecodes-gets-a-fresh-look-and-goes-multilingual-4b9i</link>
      <guid>https://dev.to/livecodes_io/livecodes-gets-a-fresh-look-and-goes-multilingual-4b9i</guid>
      <description>&lt;p&gt;LiveCodes &lt;a href="https://github.com/live-codes/livecodes/releases/tag/v36" rel="noopener noreferrer"&gt;recent release&lt;/a&gt; provides a major update to the UI. The new UI is more modern, cleaner, more accessible and allows customization with custom theme colors.&lt;/p&gt;

&lt;p&gt;In addition, LiveCodes now supports multiple languages. It already supports 90+ programming languages. But we are adding spoken languages this time! With the new internationalization (i18n) support, the UI now can be displayed in 12 different languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  The New UI
&lt;/h2&gt;

&lt;p&gt;The UI is now cleaner, more consistent and more accessible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkfoc90oegm7ashfyxtgv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkfoc90oegm7ashfyxtgv.jpg" alt="LiveCodes new UI" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In addition, the UI theme is now custommizable with custom colors. The theme color can be selected from the UI (Settings menu -&amp;gt; Color).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2kdjo91tgp6v3flnhtq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2kdjo91tgp6v3flnhtq.jpg" alt="LiveCodes themes" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The color applies to dark and light themes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzfpp8ie7cnagut06vysi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzfpp8ie7cnagut06vysi.jpg" alt="LiveCodes themes" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7p4zho8oykfkm6bfhcxk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7p4zho8oykfkm6bfhcxk.jpg" alt="LiveCodes themes" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The theme color can also be selected as the configuration option &lt;a href="https://livecodes.io/docs/configuration/configuration-object#themecolor" rel="noopener noreferrer"&gt;&lt;code&gt;themeColor&lt;/code&gt;&lt;/a&gt;. This allows setting the color using the &lt;a href="https://livecodes.io/docs/sdk/" rel="noopener noreferrer"&gt;SDK&lt;/a&gt; (for &lt;a href="https://livecodes.io/docs/features/embeds" rel="noopener noreferrer"&gt;embedded playgrounds&lt;/a&gt;) or &lt;a href="https://livecodes.io/docs/configuration/query-params" rel="noopener noreferrer"&gt;query params&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Example: &lt;a href="https://livecodes.io/?themeColor=lightblue" rel="noopener noreferrer"&gt;https://livecodes.io/?themeColor=lightblue&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The UI is responsive and can be used in different screen sizes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frsjegoe5kxazaamefsdg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frsjegoe5kxazaamefsdg.jpg" alt="Responsive UI" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Multilingual Support (i18n)
&lt;/h2&gt;

&lt;p&gt;The UI can now be displayed in 12 different languages: English (default), Arabic, Chinese, French, German, Hindi, Italian, Japanese, Portuguese, Russian, Spanish and Urdu.&lt;/p&gt;

&lt;p&gt;The language is auto-detected based on the user's browser language. In addition, the language can be selected from the UI (i18n menu).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fys4np931n2q76m0l3ttf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fys4np931n2q76m0l3ttf.png" alt="i18n support" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fusnak86kz2kfq99y6o2h.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fusnak86kz2kfq99y6o2h.jpg" alt="i18n support" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Moreover, the UI language can also be set using the configuration option &lt;a href="https://livecodes.io/docs/configuration/configuration-object#applanguage" rel="noopener noreferrer"&gt;&lt;code&gt;appLanguage&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Example: &lt;a href="https://livecodes.io/?appLanguage=fr" rel="noopener noreferrer"&gt;https://livecodes.io/?appLanguage=fr&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;p&gt;A huge shout-out to the wonderful contributors who helped make this release possible by working for months to provide high quality work. Very special thanks to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://x.com/nunoluciano" rel="noopener noreferrer"&gt;&lt;strong&gt;Nuno Luciano&lt;/strong&gt;&lt;/a&gt; (aka &lt;a href="https://github.com/gigamaster" rel="noopener noreferrer"&gt;gigamaster&lt;/a&gt;) for the design and implementation of the new UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Max Alex&lt;/strong&gt; (aka &lt;a href="https://github.com/zyf722" rel="noopener noreferrer"&gt;zyf722&lt;/a&gt;) for the i18n support.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contributions are always welcome. Check out the &lt;a href="https://github.com/live-codes/livecodes/blob/develop/CONTRIBUTING.md" rel="noopener noreferrer"&gt;contribution guide&lt;/a&gt; for more details.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;We have been busy the past few months working on the UI and setting up the infra-structure for more features to come. Now expect more features to be rolling out more frequently.&lt;/p&gt;

&lt;p&gt;Stay tuned!&lt;/p&gt;

&lt;p&gt;You can stay updated by following us on &lt;a href="https://x.com/livecodes_io" rel="noopener noreferrer"&gt;X/Twitter&lt;/a&gt; and &lt;a href="https://github.com/live-codes/livecodes" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>livecodes</category>
      <category>ui</category>
      <category>i18n</category>
      <category>themes</category>
    </item>
    <item>
      <title>Introducing RacingBars 📊</title>
      <dc:creator>Hatem Hosny</dc:creator>
      <pubDate>Mon, 19 Aug 2024 14:02:01 +0000</pubDate>
      <link>https://dev.to/hatemhosny/introducing-racingbars-245f</link>
      <guid>https://dev.to/hatemhosny/introducing-racingbars-245f</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Bar Chart Race Made Easy 🎉&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;RacingBars&lt;/em&gt; is an &lt;a href="https://github.com/hatemhosny/racing-bars" rel="noopener noreferrer"&gt;open-source&lt;/a&gt;, light-weight (~45kb gzipped), easy-to-use, and &lt;a href="https://racing-bars.hatemhosny.dev/features.md" rel="noopener noreferrer"&gt;feature-rich&lt;/a&gt; javascript library for bar chart race, based on &lt;a href="https://d3js.org" rel="noopener noreferrer"&gt;D3.js&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;RacingBars&lt;/em&gt; is available for JavaScript, TypeScript, React, Vue and Svelte.&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qysc13OJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://racing-bars.hatemhosny.dev/img/racing-bars.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qysc13OJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://racing-bars.hatemhosny.dev/img/racing-bars.gif" width="716" height="322"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;🎡 Try it now on the &lt;a href="https://racing-bars.hatemhosny.dev/playground" rel="noopener noreferrer"&gt;online playground&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://racing-bars.hatemhosny.dev" rel="noopener noreferrer"&gt;Documentations&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Easy to use.&lt;/li&gt;
&lt;li&gt;Light-weight (~45kb gzipped).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://racing-bars.hatemhosny.dev/documentation/options" rel="noopener noreferrer"&gt;Highly configurable&lt;/a&gt;, with sensible defaults.&lt;/li&gt;
&lt;li&gt;Available for vanilla JavaScript,TypeScript, React, Vue and Svelte.&lt;/li&gt;
&lt;li&gt;Responsive / configurable &lt;a href="https://racing-bars.hatemhosny.dev/guides/chart-size" rel="noopener noreferrer"&gt;chart size&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Light and dark &lt;a href="https://racing-bars.hatemhosny.dev/guides/themes-styles" rel="noopener noreferrer"&gt;themes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Good looking default &lt;a href="https://racing-bars.hatemhosny.dev/guides/colors" rel="noopener noreferrer"&gt;colors&lt;/a&gt;, also configurable with color maps or palettes.&lt;/li&gt;
&lt;li&gt;Customizable title, sub-title, caption and date counter. They all allow displaying &lt;a href="https://racing-bars.hatemhosny.dev/guides/dynamic-values" rel="noopener noreferrer"&gt;calculated/dynamic values&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Flexible handling for various &lt;a href="https://racing-bars.hatemhosny.dev/documentation/data" rel="noopener noreferrer"&gt;data shapes and formats&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Data manipulation for &lt;a href="https://racing-bars.hatemhosny.dev/documentation/options#datatransform" rel="noopener noreferrer"&gt;data transformation&lt;/a&gt;, &lt;a href="https://racing-bars.hatemhosny.dev/documentation/data#cumulative-sum" rel="noopener noreferrer"&gt;cumulative sums&lt;/a&gt; and &lt;a href="https://racing-bars.hatemhosny.dev/documentation/data#filling-gaps-in-data" rel="noopener noreferrer"&gt;filling date gaps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://racing-bars.hatemhosny.dev/guides/icons" rel="noopener noreferrer"&gt;Icons&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://racing-bars.hatemhosny.dev/guides/labels" rel="noopener noreferrer"&gt;Labels&lt;/a&gt; on the bars or outside.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://racing-bars.hatemhosny.dev/guides/groups" rel="noopener noreferrer"&gt;Groups&lt;/a&gt; with filters.&lt;/li&gt;
&lt;li&gt;Bar &lt;a href="https://racing-bars.hatemhosny.dev/guides/highlight-select" rel="noopener noreferrer"&gt;highlight and selection&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Autorun or start manually.&lt;/li&gt;
&lt;li&gt;Allows looping.&lt;/li&gt;
&lt;li&gt;Optional fixed scale.&lt;/li&gt;
&lt;li&gt;Custom start/end dates.&lt;/li&gt;
&lt;li&gt;Allows changing speed.&lt;/li&gt;
&lt;li&gt;Controls for play/pause/skip-back/skip-forward (&lt;a href="https://racing-bars.hatemhosny.dev/guides/chart-controls" rel="noopener noreferrer"&gt;chart controls&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Overlays for play/repeat (&lt;a href="https://racing-bars.hatemhosny.dev/guides/chart-controls" rel="noopener noreferrer"&gt;chart controls&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Keyboard and mouse controls (&lt;a href="https://racing-bars.hatemhosny.dev/guides/chart-controls" rel="noopener noreferrer"&gt;chart controls&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://racing-bars.hatemhosny.dev/guides/multiple-charts" rel="noopener noreferrer"&gt;Multiple charts&lt;/a&gt; can be inserted in the same page.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://racing-bars.hatemhosny.dev/documentation/api" rel="noopener noreferrer"&gt;API&lt;/a&gt; to control the chart.&lt;/li&gt;
&lt;li&gt;Emits custom DOM &lt;a href="https://racing-bars.hatemhosny.dev/documentation/events" rel="noopener noreferrer"&gt;events&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Comprehensive &lt;a href="https://racing-bars.hatemhosny.dev/category/documentation/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;, with &lt;a href="https://racing-bars.hatemhosny.dev/category/guides" rel="noopener noreferrer"&gt;usage guides&lt;/a&gt;, &lt;a href="https://racing-bars.hatemhosny.dev/category/gallery" rel="noopener noreferrer"&gt;examples gallery&lt;/a&gt; and an &lt;a href="https://racing-bars.hatemhosny.dev/playground" rel="noopener noreferrer"&gt;online playground&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Open-source (&lt;a href="https://racing-bars.hatemhosny.dev/license" rel="noopener noreferrer"&gt;MIT License&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Usage options include:&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 1: Using a bundler
&lt;/h3&gt;

&lt;p&gt;Install from npm&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;racing-bars
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then you can import it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;race&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;racing-bars&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;My Racing Bars&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// ... other options&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://racing-bars.hatemhosny.dev/data/population.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;race&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#race&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option 2: Load from CDN
&lt;/h3&gt;

&lt;h4&gt;
  
  
  ESM
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"race"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"height: 80vh"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;race&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://cdn.jsdelivr.net/npm/racing-bars&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;My Racing Bars&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// ... other options&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://racing-bars.hatemhosny.dev/data/population.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;race&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#race&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  UMD
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"race"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"height: 80vh"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://https://cdn.jsdelivr.net/npm/racing-bars/racing-bars.umd.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;My Racing Bars&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// ... other options&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;


  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://racing-bars.hatemhosny.dev/data/population.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// the UMD version provides the global object `racingBars`&lt;/span&gt;
  &lt;span class="nx"&gt;racingBars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;race&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#race&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please refer to &lt;a href="https://racing-bars.hatemhosny.dev/" rel="noopener noreferrer"&gt;documentation website&lt;/a&gt; for &lt;a href="https://racing-bars.hatemhosny.dev/getting-started/usage" rel="noopener noreferrer"&gt;usage&lt;/a&gt;, &lt;a href="https://racing-bars.hatemhosny.dev/documentation/data" rel="noopener noreferrer"&gt;data preparation&lt;/a&gt;, &lt;a href="https://racing-bars.hatemhosny.dev/documentation/options" rel="noopener noreferrer"&gt;chart options&lt;/a&gt;, &lt;a href="https://racing-bars.hatemhosny.dev/documentation/api" rel="noopener noreferrer"&gt;API&lt;/a&gt; and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples Gallery
&lt;/h2&gt;

&lt;p&gt;See &lt;a href="https://racing-bars.hatemhosny.dev/category/gallery/" rel="noopener noreferrer"&gt;gallery&lt;/a&gt; for usage examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  Playground
&lt;/h2&gt;

&lt;p&gt;Go to the &lt;a href="https://racing-bars.hatemhosny.dev/playground/" rel="noopener noreferrer"&gt;online playground&lt;/a&gt; to try out the library.&lt;/p&gt;

&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/hatemhosny/racing-bars/blob/develop/LICENSE" rel="noopener noreferrer"&gt;MIT&lt;/a&gt; License © &lt;a href="https://github.com/hatemhosny" rel="noopener noreferrer"&gt;Hatem Hosny&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's Get Started 🚀
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://racing-bars.hatemhosny.dev/getting-started/installation/" rel="noopener noreferrer"&gt;Get started now&lt;/a&gt;!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>LiveCodes AI Code Assistant</title>
      <dc:creator>Hatem Hosny</dc:creator>
      <pubDate>Fri, 16 Feb 2024 00:15:30 +0000</pubDate>
      <link>https://dev.to/livecodes_io/livecodes-ai-code-assistant-4e05</link>
      <guid>https://dev.to/livecodes_io/livecodes-ai-code-assistant-4e05</guid>
      <description>&lt;p&gt;I'm excited to announce the general availability of &lt;em&gt;LiveCodes AI Code Assistant&lt;/em&gt;. It is totally &lt;strong&gt;free&lt;/strong&gt;, for &lt;strong&gt;unlimited usage&lt;/strong&gt;, with &lt;strong&gt;no account or API token required&lt;/strong&gt; and with &lt;strong&gt;no need to install any browser extensions&lt;/strong&gt;. It can be easily enabled from the UI (as easy as &lt;a href="https://livecodes.io/?screen=editor-settings"&gt;flipping a switch&lt;/a&gt;!)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbppgbm0cllzpjvfc7wm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbppgbm0cllzpjvfc7wm.png" alt="enable AI in LiveCodes" width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The AI code completion is powered by &lt;a href="https://codeium.com/"&gt;Codeium&lt;/a&gt;, the ultrafast Copilot alternative.&lt;/p&gt;

&lt;p&gt;It has a wide range of language support, and it works everywhere (in the &lt;a href="https://livecodes.io/docs/getting-started#standalone-app"&gt;standalone app&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/features/embeds"&gt;embedded playgrounds&lt;/a&gt; and &lt;a href="https://livecodes.io/docs/features/self-hosting"&gt;self-hosted&lt;/a&gt; apps).&lt;/p&gt;

&lt;p&gt;Currently, only &lt;a href="https://livecodes.io/docs/features/editor-settings#code-editor"&gt;Monaco editor&lt;/a&gt; is supported. Wider editor support is planned.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples:
&lt;/h2&gt;

&lt;p&gt;JavaScript:&lt;/p&gt;



  


&lt;p&gt;Python:&lt;/p&gt;



  


&lt;h2&gt;
  
  
  How it works?
&lt;/h2&gt;

&lt;p&gt;The large generative machine learning model is capable of understanding the context of your code and comments (across the &lt;a href="https://livecodes.io/docs/features/projects#markup-editor"&gt;3 code editors&lt;/a&gt;) in order to generate suggestions on what you might want to type next.&lt;/p&gt;

&lt;h2&gt;
  
  
  How can I use it?
&lt;/h2&gt;

&lt;p&gt;The AI code assistant can be enabled from:&lt;/p&gt;

&lt;h3&gt;
  
  
  UI
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://livecodes.io/?screen=editor-settings"&gt;editor settings&lt;/a&gt; screen (App menu → Editor Settings → Enable AI Code Assistant).&lt;/p&gt;

&lt;p&gt;When set from the UI, this configuration is saved locally to user settings and is remembered across sessions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuration
&lt;/h3&gt;

&lt;p&gt;Alternatively, this can be enabled/disabled (&lt;em&gt;only for the current session&lt;/em&gt;) using the &lt;a href="https://livecodes.io/docs/configuration/configuration-object#enableai"&gt;&lt;code&gt;enableAI&lt;/code&gt;&lt;/a&gt; property in the &lt;a href="https://livecodes.io/docs/configuration/configuration-object"&gt;configuration object&lt;/a&gt;. This can be used to enable the AI code assistant in &lt;a href="https://livecodes.io/docs/features/embeds"&gt;embedded playgrounds&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPlayground&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;livecodes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;createPlayground&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#container&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;enableAI&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also this can be enabled using &lt;a href="https://livecodes.io/docs/configuration/query-params"&gt;query params&lt;/a&gt; (e.g. &lt;a href="https://livecodes.io/?enableAI"&gt;https://livecodes.io/?enableAI&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Why isn't it enabled by default?
&lt;/h2&gt;

&lt;p&gt;When using the AI assistant, your code is sent to &lt;a href="https://codeium.com/"&gt;Codeium&lt;/a&gt; servers for code completion. LiveCodes has a very &lt;a href="https://livecodes.io/docs/why#client-side"&gt;strict philosophy&lt;/a&gt; which mandates that your code never leaves your device unless you choose to.&lt;/p&gt;

&lt;p&gt;Please note that even though your code is sent to Codeium, it is not used for training their model. Check Codeium &lt;a href="https://codeium.com/faq#Will-Codeium-regurgitate-private-code%3F"&gt;FAQ&lt;/a&gt; and &lt;a href="https://codeium.com/privacy-policy"&gt;privacy policy&lt;/a&gt; for more details.&lt;/p&gt;

&lt;p&gt;Moreover, in many uses of LiveCodes it may not be desirable to have AI code completions (e.g. courses, quizzes, etc.).&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's try it! 🚀
&lt;/h2&gt;

&lt;p&gt;Go to the &lt;a href="https://livecodes.io/?screen=editor-settings"&gt;editor settings&lt;/a&gt; screen. Enable the AI code assistant and enjoy the magic! ✨&lt;/p&gt;

&lt;p&gt;Please ⭐ &lt;a href="https://github.com/live-codes/livecodes"&gt;star the project on GitHub&lt;/a&gt; if you like it, and follow &lt;a href="https://twitter.com/livecode_io"&gt;LiveCodes on Twitter&lt;/a&gt; to be notified with latest updates!&lt;/p&gt;

</description>
      <category>livecodes</category>
      <category>ai</category>
      <category>code</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How is LiveCodes Free?!</title>
      <dc:creator>Hatem Hosny</dc:creator>
      <pubDate>Sat, 27 Jan 2024 23:49:36 +0000</pubDate>
      <link>https://dev.to/livecodes_io/how-is-livecodes-free-5a52</link>
      <guid>https://dev.to/livecodes_io/how-is-livecodes-free-5a52</guid>
      <description>&lt;p&gt;&lt;a href="https://livecodes.io"&gt;LiveCodes&lt;/a&gt; is a &lt;a href="https://livecodes.io/docs/features/"&gt;feature-rich&lt;/a&gt;, &lt;a href="https://github.com/live-codes/livecodes"&gt;open-source&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/why#client-side"&gt;client-side&lt;/a&gt;, code playground that supports &lt;a href="https://livecodes.io/docs/languages/"&gt;80+ languages and frameworks&lt;/a&gt;. Playgrounds can be &lt;a href="https://livecodes.io/docs/features/embeds"&gt;embedded&lt;/a&gt; in web pages. A powerful, yet easy-to-use, &lt;a href="https://livecodes.io/docs/sdk"&gt;SDK&lt;/a&gt; allows creating and communicating with playgrounds.&lt;/p&gt;

&lt;p&gt;Nevertheless, LiveCodes is free, with no subscriptions, no limits to usage, no ads and no account required. It is &lt;a href="https://livecodes.io/docs/license"&gt;MIT-licensed&lt;/a&gt; which allows its use, distribution and modification even for commercial projects.&lt;/p&gt;

&lt;p&gt;So, how can LiveCodes be free? What is the catch?&lt;/p&gt;

&lt;p&gt;In this article we will discuss LiveCodes business model and how it can be sustainable.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;High quality, free product → wide adoption → use for profit → &lt;a href="https://livecodes.io/docs/sponsor"&gt;sponsors&lt;/a&gt; 🎉&lt;/p&gt;

&lt;p&gt;Win/Win/Win!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  LiveCodes is a Developer Tool Not a Hosting Company!
&lt;/h2&gt;

&lt;p&gt;Most other code playgrounds with comparable features and language support are either paid, or have &lt;a href="https://codepen.io/accounts/signup"&gt;significant&lt;/a&gt;, &lt;a href="https://blog.replit.com/embeds-are-going-away"&gt;progressively&lt;/a&gt; &lt;a href="https://blog.replit.com/update-on-teams-for-education"&gt;increasing&lt;/a&gt;, &lt;a href="https://www.codesandbox.community/c/api-billing-updates/api-update-and-usage-based-billing"&gt;limitations&lt;/a&gt; on free plans. Limitations restrict number of users, private projects, compute time to run code, available RAM or CPU, editable playgrounds and more. This is understandable. Servers cost money, and high usage of running code on servers can be expensive.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodes.io"&gt;LiveCodes&lt;/a&gt; solves this problem by running code on user devices not servers. So, instead of selling VMs and cloud computing, LiveCodes works on the client-side, and runs all the code (including compiling 80+ languages) in the browser. See how &lt;a href="https://livecodes.io/docs/why"&gt;LiveCodes is different&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;LiveCodes aims to be a developer tool that boosts productivity, enhances &lt;a href="https://blog.livecodes.io/lets-make-learning-frontend-great-again"&gt;learning new technologies&lt;/a&gt; and allows the use of &lt;a href="https://blog.livecodes.io/lets-make-an-interactive-coding-tutorial"&gt;interactive tutorials&lt;/a&gt; in &lt;a href="https://blog.livecodes.io/livecodes-for-education"&gt;teaching&lt;/a&gt;, without having to care about spinning servers, maintaining databases, managing scaling or struggling with configuration files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sustainability and Scalability
&lt;/h2&gt;

&lt;p&gt;Sustainability is important. Running costs should not exceed project budget.&lt;/p&gt;

&lt;p&gt;With this in mind, here is the current technology stack and services used by LiveCodes and their running costs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code hosting and version control: &lt;a href="https://github.com/live-codes/livecodes"&gt;GitHub&lt;/a&gt; - Free.&lt;/li&gt;
&lt;li&gt;CI/CD: &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt; - Free.&lt;/li&gt;
&lt;li&gt;Web hosting and CDN: &lt;a href="https://pages.cloudflare.com/"&gt;Cloudflare Pages&lt;/a&gt; - Free.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://livecodes.io/docs/features/permanent-url"&gt;Permanent URLs&lt;/a&gt;: &lt;a href="https://www.cloudflare.com/application-services/products/dns/"&gt;Cloudflare DNS&lt;/a&gt; + &lt;a href="https://pages.cloudflare.com/"&gt;Cloudflare Pages&lt;/a&gt; - Free.&lt;/li&gt;
&lt;li&gt;Dynamic services (like sharing short URLs): &lt;a href="https://workers.cloudflare.com/"&gt;Cloudflare Workers&lt;/a&gt; - Generous Free Tier.&lt;/li&gt;
&lt;li&gt;Module hosting: &lt;a href="https://esm.sh/"&gt;esm.sh&lt;/a&gt; / &lt;a href="https://www.jsdelivr.com/"&gt;jsDelivr&lt;/a&gt; / &lt;a href="https://www.unpkg.com/"&gt;unpkg&lt;/a&gt; - Free.&lt;/li&gt;
&lt;li&gt;TypeScript types (for &lt;a href="https://livecodes.io/docs/features/intellisense"&gt;editor Intellisense&lt;/a&gt;): &lt;a href="https://esm.sh/"&gt;esm.sh&lt;/a&gt; - Free.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://livecodes.io/docs/features/deploy"&gt;Deploy&lt;/a&gt; user projects: &lt;a href="https://pages.github.com/"&gt;GitHub Pages&lt;/a&gt; - Free.&lt;/li&gt;
&lt;li&gt;Host user &lt;a href="https://livecodes.io/docs/features/assets"&gt;assets&lt;/a&gt;: &lt;a href="https://pages.github.com/"&gt;GitHub Pages&lt;/a&gt; - Free.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://livecodes.io/docs/features/sync"&gt;Sync&lt;/a&gt; user data: GitHub - Free.&lt;/li&gt;
&lt;li&gt;Authentication with &lt;a href="https://livecodes.io/docs/features/github-integration/"&gt;GitHub account&lt;/a&gt;: &lt;a href="https://firebase.google.com/products/auth"&gt;Firebase Authentication&lt;/a&gt; - Almost Free.&lt;/li&gt;
&lt;li&gt;Compiling and running user code: User browsers - Free!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total running costs: &lt;strong&gt;Almost Zero!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In addition, being a static app, the files are aggressively cached in the browser and on CDN.&lt;/p&gt;

&lt;p&gt;With high usage, LiveCodes is served from the edge (on Cloudflare CDN) close to the users. The computation occurs on user browsers. This does not result in any significant increase in costs.&lt;/p&gt;

&lt;p&gt;Everybody is happy!&lt;/p&gt;

&lt;h2&gt;
  
  
  Can LiveCodes be used for profit?
&lt;/h2&gt;

&lt;p&gt;Absolutely!&lt;/p&gt;

&lt;p&gt;LiveCodes is &lt;a href="https://github.com/live-codes/livecodes"&gt;open-source&lt;/a&gt; and uses the commercial-friendly &lt;a href="https://livecodes.io/docs/license"&gt;MIT-license&lt;/a&gt; which allows unrestricted use, distribution and modification even for commercial projects.&lt;/p&gt;

&lt;p&gt;It can be easily &lt;a href="https://livecodes.io/docs/features/self-hosting"&gt;self-hosted&lt;/a&gt; (if you wish) on any static file server. And, of course, you may use the hosted app (&lt;a href="https://livecodes.io"&gt;livecodes.io&lt;/a&gt;) or any of its &lt;a href="https://livecodes.io/docs/features/permanent-url"&gt;permanent URLs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;LiveCodes offers a wide range of &lt;a href="https://livecodes.io/docs/features"&gt;features&lt;/a&gt;. And, in fact, many of these were specifically added to allow building products on top of it (e.g. &lt;a href="https://livecodes.io/docs/features/self-hosting"&gt;self-hosting&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/features/embeds"&gt;embedded playgrounds&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/sdk"&gt;SDK&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/sdk/headless"&gt;headless mode&lt;/a&gt;, and &lt;a href="https://livecodes.io/docs/features/tests"&gt;running tests&lt;/a&gt;, just to name a few).&lt;/p&gt;

&lt;p&gt;With wider adoption and happy users, more and more projects would start building on top of LiveCodes.&lt;/p&gt;

&lt;p&gt;Examples for products that can be built on top of LiveCodes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Courses/Tutorials websites: similar to FreeCodeCamp, W3Schools, etc.&lt;/li&gt;
&lt;li&gt;Social coding platforms: similar to CodePen, Replit, etc.&lt;/li&gt;
&lt;li&gt;Code challenge platforms: similar to Leetcode, CodeWars, etc.&lt;/li&gt;
&lt;li&gt;Interactive documentations for libraries.&lt;/li&gt;
&lt;li&gt;Interactive blogs.&lt;/li&gt;
&lt;li&gt;Website builders and content management systems, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Development and Maintenance Costs
&lt;/h2&gt;

&lt;p&gt;Commercial projects built on top of LiveCodes, would value the continued development and maintenance of the project. The cost of in-house building or maintaining such a project is high. At a fraction of that cost, &lt;a href="https://livecodes.io/docs/sponsor"&gt;sponsoring LiveCodes&lt;/a&gt; would provide stability for the project, ensure that it continues to receive regular updates and allow having a higher priority in feature development. Sponsors can also have custom playground builds with their own &lt;strong&gt;logo and brand&lt;/strong&gt; among other &lt;a href="https://livecodes.io/docs/sponsor#sponsorship-benefits"&gt;benefits&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In addition, such a sponsorship could enhance the sponsor's reputation, reflect goodwill and signal the commitment to technological innovation and support for the open-source community.&lt;br&gt;
This is a strategic investment that pays off very well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Win/Win/Win
&lt;/h2&gt;

&lt;p&gt;In summary, this business model is beneficial for everybody:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The vast majority of &lt;strong&gt;users&lt;/strong&gt; can continue to use LiveCodes for free and enjoy the large number of features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Commercial projects&lt;/strong&gt; that build on top of LiveCodes can make use of the well-maintained product. Some of these projects may choose to &lt;a href="https://livecodes.io/docs/sponsor"&gt;sponsor LiveCodes&lt;/a&gt; to support its continued development at a fraction of the cost that would be required for in-house building or maintaining such a project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;LiveCodes &lt;strong&gt;maintainers&lt;/strong&gt; can satisfy the passion of building the project they love, see it being used by their community and get compensated for their effort.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Win/Win/Win!&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can I Help?
&lt;/h2&gt;

&lt;p&gt;I'm glad you asked! Thank you :)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Please continue using &lt;a href="https://livecodes.io"&gt;LiveCodes&lt;/a&gt;!
Don't worry, it is staying free for the foreseeable future.&lt;/li&gt;
&lt;li&gt;Report any issues and suggest new features &lt;a href="https://github.com/live-codes/livecodes/issues"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Star the project on &lt;a href="https://github.com/live-codes/livecodes"&gt;GitHub&lt;/a&gt;. ⭐&lt;/li&gt;
&lt;li&gt;You are very welcome to &lt;a href="https://livecodes.io/docs/contribution"&gt;contribute&lt;/a&gt; to the project.&lt;/li&gt;
&lt;li&gt;Follow &lt;a href="https://twitter.com/livecodes_io"&gt;@livecodes_io&lt;/a&gt; on Twitter.&lt;/li&gt;
&lt;li&gt;Spread the word!&lt;/li&gt;
&lt;li&gt;... and consider &lt;a href="https://livecodes.io/docs/sponsor"&gt;sponsoring LiveCodes&lt;/a&gt;! 💚&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>livecodes</category>
      <category>opensource</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>LiveCodes for Education 🎓</title>
      <dc:creator>Hatem Hosny</dc:creator>
      <pubDate>Mon, 27 Nov 2023 12:46:57 +0000</pubDate>
      <link>https://dev.to/livecodes_io/livecodes-for-education-57ip</link>
      <guid>https://dev.to/livecodes_io/livecodes-for-education-57ip</guid>
      <description>&lt;h2&gt;
  
  
  LiveCodes - A Gateway to Interactive Learning
&lt;/h2&gt;

&lt;p&gt;In the evolving landscape of education, teachers and students are continuously seeking effective learning tools. The need for such tools is even more pronounced in the sphere of programming. The complexity of setting up development environments and the steep learning curve of programming languages are often challenging. This is where &lt;a href="https://livecodes.io"&gt;LiveCodes&lt;/a&gt; steps in, offering a seamless solution that makes programming accessible, interactive, and engaging while remaining free (and open-source) with unlimited usage. The versatility of LiveCodes makes it an ideal tool for schools, colleges, and coding bootcamps, as well as course websites and online learning platforms.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;This article was originally published at &lt;a href="https://blog.livecodes.io/livecodes-for-education/"&gt;LiveCodes blog&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Outline
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What is LiveCodes?&lt;/li&gt;
&lt;li&gt;Language Support&lt;/li&gt;
&lt;li&gt;Powerful Editor&lt;/li&gt;
&lt;li&gt;Importing Code&lt;/li&gt;
&lt;li&gt;Exporting/Sharing Projects&lt;/li&gt;
&lt;li&gt;Integrated Console&lt;/li&gt;
&lt;li&gt;Compiled Code Viewer&lt;/li&gt;
&lt;li&gt;Tasks and Assignments&lt;/li&gt;
&lt;li&gt;Rapid Feedback&lt;/li&gt;
&lt;li&gt;AI Assistance&lt;/li&gt;
&lt;li&gt;Interactive Tutorials&lt;/li&gt;
&lt;li&gt;Mobile-Friendly&lt;/li&gt;
&lt;li&gt;Embedded Playgrounds&lt;/li&gt;
&lt;li&gt;Full Power with the SDK&lt;/li&gt;
&lt;li&gt;Free and Open-Source&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;Get in Touch&lt;/li&gt;
&lt;li&gt;Start Now 🚀&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is LiveCodes?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://livecodes.io"&gt;LiveCodes&lt;/a&gt; is a &lt;a href="https://livecodes.io/docs/features"&gt;feature-rich&lt;/a&gt;, &lt;a href="https://github.com/live-codes/livecodes"&gt;open-source&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/why#client-side"&gt;client-side&lt;/a&gt;, code playground that runs directly in your browser. It is an innovative platform that enables quick prototyping and experimenting with various technologies without the need for setup of individual development environments. It is an excellent tool for learning and teaching programming, offering a platform for quick prototyping and idea experimentation.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;See more: &lt;a href="https://blog.livecodes.io/introducing-livecodes"&gt;Introducing LiveCodes 🎉&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/"&gt;LiveCodes Docs&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Language Support
&lt;/h2&gt;

&lt;p&gt;LiveCodes supports a wide range of programming languages (currently &lt;a href="https://livecodes.io/docs/languages/"&gt;more than 80&lt;/a&gt;), making it suitable for teaching and learning different programming concepts. Here are some of the language categories supported by LiveCodes:&lt;/p&gt;

&lt;h3&gt;
  
  
  Web Languages
&lt;/h3&gt;

&lt;p&gt;LiveCodes supports web languages, including HTML, CSS, and JavaScript. It also extends support to web frameworks like React, Vue, Svelte, and Solid. In addition, the most popular CSS processors and frameworks are supported, including Sass, Less, Stylus, Tailwind CSS, CSS modules, PostCSS, and many more.&lt;/p&gt;

&lt;p&gt;Demo: &lt;a href="https://livecodes.io/?template=react"&gt;https://livecodes.io/?template=react&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodes.io/?template=react"&gt;&lt;img alt="React Starter Template" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkkqikkkud8t9u0vl1flg.png" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;React Starter Template
  &lt;/p&gt;

&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;

&lt;p&gt;Python, one of the most popular languages for beginners and experienced coders alike, is also supported on LiveCodes. This allows for a broader range of applications and projects to be developed and tested on the platform. Data science and machine learning projects are also supported (&lt;a href="https://livecodes.io/docs/languages/python-wasm"&gt;using Pyodide&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Demo: &lt;a href="https://livecodes.io/?template=python"&gt;https://livecodes.io/?template=python&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodes.io/?template=python"&gt;&lt;img alt="Python Starter Template" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl7cdwn1jt63j6z8aaaal.png" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;Python Starter Template
  &lt;/p&gt;

&lt;p&gt;&lt;small&gt;See more: &lt;a href="https://livecodes.io/docs/languages/python"&gt;Python Docs&lt;/a&gt;, &lt;a href="https://livecodes.io/?template=python"&gt;Python starter template&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/languages/python-wasm"&gt;Python-Wasm Docs&lt;/a&gt;, &lt;a href="https://livecodes.io/?template=python-wasm"&gt;Python-Wasm starter template&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Block-Based and Low-Code Programming
&lt;/h3&gt;

&lt;p&gt;For beginners, particularly kids, LiveCodes offers Blockly, a block-based programming interface. This feature makes learning programming concepts easier and more engaging, providing a strong foundation for future coding education. More over, LiveCodes also supports a rich text editor which produces valid HTML. The readable code produced by these tools (JavaScript from Blockly and HTML from the rich text editor) can be examined by the user for an engaging learning experience.&lt;/p&gt;

&lt;p&gt;Demo: &lt;a href="https://livecodes.io/?template=blockly"&gt;https://livecodes.io/?template=blockly&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodes.io?template=blockly"&gt;&lt;img alt="A screenshot for Blockly starter template on LiveCodes" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp61dmt2uvonddn0l0kjk.png" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;A screenshot for Blockly starter template on LiveCodes
  &lt;/p&gt;

&lt;p&gt;Demo: &lt;a href="https://livecodes.io/?richtext=%3Ch1%3EHello%20World!%3C/h1%3E%3Cp%3EThis%20is%20my%20first%20web%20page.%3C/p%3E&amp;amp;compiled=open"&gt;https://livecodes.io/?richtext=...&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodes.io/?richtext=%3Ch1%3EHello%20World!%3C/h1%3E%3Cp%3EThis%20is%20my%20first%20web%20page.%3C/p%3E&amp;amp;compiled=open"&gt;&lt;img alt="Rich text editor on LiveCodes" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fonla2dqrmpthj85vqbx2.png" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;Rich text editor on LiveCodes
  &lt;/p&gt;

&lt;p&gt;&lt;small&gt;See more: &lt;a href="https://livecodes.io?template=blockly"&gt;Blockly starter template&lt;/a&gt;, &lt;a href="https://livecodes.io/?richtext=%3Ch1%3EHello%20World!%3C/h1%3E%3Cp%3EThis%20is%20my%20first%20web%20page.%3C/p%3E&amp;amp;compiled=open"&gt;rich text editor example&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  More Languages
&lt;/h3&gt;

&lt;p&gt;LiveCodes supports a comprehensive list of other languages, including C, C++, PHP, Ruby, Go, Lua, Scheme, Common Lisp, R, Julia, and many more. This makes LiveCodes a universal tool for learning and teaching programming. The large number of starter templates makes it easy to get started with any of the supported programming languages.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;See more: &lt;a href="https://livecodes.io/docs/languages/"&gt;LiveCodes Languages&lt;/a&gt;, &lt;a href="https://livecodes.io/?new"&gt;Starter Templates&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Powerful Editor
&lt;/h2&gt;

&lt;p&gt;The default code editor is the powerful editor that powers VS Code, featuring intellisense, code-completion, go-to-definition, multi-cursor support and other powerful features. The editor is very customizable. It supports keyboard shortcuts, code formatting, Emmet abbreviations and even Vim and Emacs bindings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5nbsfd7cy7n7y6iurm8j.jpg" class="article-body-image-wrapper"&gt;&lt;img alt="LiveCodes editor intellisense" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5nbsfd7cy7n7y6iurm8j.jpg" width="800" height="401"&gt;&lt;/a&gt;&lt;br&gt;LiveCodes editor intellisense
  &lt;/p&gt;

&lt;p&gt;&lt;small&gt;See more: &lt;a href="https://livecodes.io/docs/features/#powerful-editor"&gt;Code Editor&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Importing Code
&lt;/h2&gt;

&lt;p&gt;LiveCodes makes code importing seamless. Code can be easily pulled from GitHub and many other sources without leaving the platform, providing an excellent opportunity for students to learn from existing codes and integrate them into their projects or assignments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodes.io/?screen=import"&gt;&lt;img alt="Import screen" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjevqidehqg8bs8z10llq.png" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;Import screen
  &lt;/p&gt;

&lt;p&gt;&lt;small&gt;See more: &lt;a href="https://livecodes.io/docs/features/import"&gt;Import&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Exporting/Sharing Projects
&lt;/h2&gt;

&lt;p&gt;Collaboration is at the heart of LiveCodes. Projects can be exported locally or to GitHub gists. In addition, users can easily share projects with peers or teachers, making it a valuable tool for cooperative learning and project evaluation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgrlai8ksfazx4xjcnesh.png" class="article-body-image-wrapper"&gt;&lt;img alt="Export project" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgrlai8ksfazx4xjcnesh.png" width="800" height="481"&gt;&lt;/a&gt;&lt;br&gt;Export project
  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2u7439xaovycwn7l4xz0.png" class="article-body-image-wrapper"&gt;&lt;img alt="Share screen" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2u7439xaovycwn7l4xz0.png" width="800" height="475"&gt;&lt;/a&gt;&lt;br&gt;Share screen
  &lt;/p&gt;

&lt;p&gt;&lt;small&gt;See more: &lt;a href="https://livecodes.io/docs/features/export"&gt;Export&lt;/a&gt; - &lt;a href="https://livecodes.io/docs/features/share"&gt;Share&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrated Console
&lt;/h2&gt;

&lt;p&gt;LiveCodes provides an integrated console, enabling users to examine their code output in real time, a feature that significantly enhances the learning and debugging experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodes.io/?x=id/7g5ehpicnwt&amp;amp;console=open"&gt;&lt;img alt="LiveCodes console" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzl5qatah77835t874dkb.png" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;LiveCodes console
  &lt;/p&gt;

&lt;p&gt;&lt;small&gt;See more: &lt;a href="https://livecodes.io/docs/features/console"&gt;Console&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Compiled Code Viewer
&lt;/h2&gt;

&lt;p&gt;The compiled code viewer in LiveCodes is an excellent tool for students learning new languages and frameworks. It provides a clear view of how languages like TypeScript/JSX compile to JavaScript, or how CSS processors operate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodes.io/?x=id/5fkjd7j96v6&amp;amp;compiled=full"&gt;&lt;img alt="LiveCodes compiled code viewer" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuk3aulci8d0fpm93q79p.png" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;LiveCodes compiled code viewer
  &lt;/p&gt;

&lt;p&gt;&lt;small&gt;See more: &lt;a href="https://livecodes.io/docs/features/compiled-code"&gt;Compiled Code&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tasks and Assignments
&lt;/h2&gt;

&lt;p&gt;LiveCodes offers a test runner that can be used to validate tasks and assignments, providing immediate feedback. This feature allows teachers to set tasks and students to validate their solutions, promoting an interactive learning environment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodes.io/?x=id/kmikuyrhxzb&amp;amp;tests=full"&gt;&lt;img alt="LiveCodes tests" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fonxqtyupsmpe8xnm1lv8.png" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;LiveCodes tests
  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodes.io/?x=id/zxjehyf93m3&amp;amp;console=full"&gt;&lt;img alt="Python doctests" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpxq6cmhm5t24jjboyplh.png" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;Python doctests
  &lt;/p&gt;

&lt;p&gt;&lt;small&gt;See more: &lt;a href="https://livecodes.io/docs/features/tests"&gt;Tests&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Rapid Feedback
&lt;/h2&gt;

&lt;p&gt;One of the standout features of LiveCodes is its instant feedback mechanism. Students can see the result of their code directly in the browser without running any compilation or build. This immediate response encourages experimentation and enhances understanding.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Assistance
&lt;/h2&gt;

&lt;p&gt;The AI code assistant available (for free) in LiveCodes helps users write better code. This feature provides on-the-fly suggestions and corrections, making the journey of learning coding less daunting for beginners and more efficient for advanced users. The AI assistance can be turned off for tasks and assignments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwejjgj15kqrwpblx9ouw.png" class="article-body-image-wrapper"&gt;&lt;img alt="LiveCodes AI code assistant (JavaScript)" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwejjgj15kqrwpblx9ouw.png" width="800" height="433"&gt;&lt;/a&gt;&lt;br&gt;LiveCodes AI code assistant (JavaScript)
  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnj2shy4rycj20dw15051.png" class="article-body-image-wrapper"&gt;&lt;img alt="LiveCodes AI code assistant (Python)" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnj2shy4rycj20dw15051.png" width="800" height="365"&gt;&lt;/a&gt;&lt;br&gt;LiveCodes AI code assistant (Python)
  &lt;/p&gt;

&lt;p&gt;&lt;small&gt;See more: &lt;a href="https://livecodes.io/docs/features/ai"&gt;AI Code Assistant&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Interactive Tutorials
&lt;/h2&gt;

&lt;p&gt;The embedded playgrounds together with the powerful SDK allows you to create engaging interactive tutorials. Such tutorials can guide students through different programming concepts and projects, making LiveCodes a fun educational tool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodes.io/?x=id/y7jfw26evhr&amp;amp;view=result"&gt;&lt;img alt="LiveCodes interactive tutorial" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7dc3ub8nr79sr6n9zr6u.png" width="800" height="441"&gt;&lt;/a&gt;&lt;br&gt;A screenshot of LiveCodes interactive tutorial
  &lt;/p&gt;

&lt;p&gt;&lt;small&gt;See more: &lt;a href="https://blog.livecodes.io/lets-make-an-interactive-coding-tutorial"&gt;Let's Make an Interactive Coding Tutorial&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mobile-Friendly
&lt;/h2&gt;

&lt;p&gt;LiveCodes is not confined to desktops. The platform is mobile-friendly, allowing users to code on-the-go. The responsive layout allows working on devices with different screen sizes. On mobile, a lighter-weight touch-friendly code editor (CodeMirror 6) is used. This ensures that learning, practicing, or teaching coding can take place anytime, anywhere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5r5749smw4jiertxgt1m.png" class="article-body-image-wrapper"&gt;&lt;img alt="" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5r5749smw4jiertxgt1m.png" width="800" height="473"&gt;&lt;/a&gt;&lt;br&gt;LiveCodes mobile interface
  &lt;/p&gt;

&lt;h2&gt;
  
  
  Embedded Playgrounds
&lt;/h2&gt;

&lt;p&gt;LiveCodes playgrounds can be easily embedded in any web page, be it in a course website, a tutorial blog post or a learning management system (LMS). The embed screen makes it easy to customize various options and configurations, and provides a preview for the embedded playground. Alternatively, the powerful &lt;a href="https://livecodes.io/docs/sdk"&gt;SDK&lt;/a&gt; can be used to provide full control over creating and communicating with the embedded playground.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fye6edjnxysa9qsbmn9i0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fye6edjnxysa9qsbmn9i0.png" alt="LiveCodes embed screen" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F42ozzp3rp4zxy1cc84rx.png" class="article-body-image-wrapper"&gt;&lt;img alt="LiveCodes embed screen" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F42ozzp3rp4zxy1cc84rx.png" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;LiveCodes embed screen
  &lt;/p&gt;

&lt;p&gt;&lt;small&gt;See more: &lt;a href="https://livecodes.io/docs/features/embeds"&gt;Embedded Playgrounds&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Full Power with the SDK
&lt;/h2&gt;

&lt;p&gt;One of the distinguishing features of LiveCodes is its powerful SDK that provides an easy way for creating and communicating with embedded playgrounds. The SDK is available for various technologies including vanilla JavaScript, TypeScript, React, Vue, and Svelte. This opens up endless possibilities for using it as a building block for bigger platforms that can revolutionize education.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;See more: &lt;a href="https://livecodes.io/docs/sdk"&gt;LiveCodes SDK&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Free and Open-Source
&lt;/h2&gt;

&lt;p&gt;LiveCodes is totally free to use. There are no ads, no subscriptions, no account required, and no limits to its use. It can also be easily self-hosted and is licensed under the permissive MIT license which allows free commercial use.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;See more: &lt;a href="https://github.com/live-codes/livecodes"&gt;LiveCodes on GitHub&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;LiveCodes is an impactful and revolutionary tool that can transform the way programming is taught and learned in educational environments. Its rich features, wide language support, and ease of use make it a great choice for educators and learners.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get in Touch
&lt;/h2&gt;

&lt;p&gt;Are you a teacher who wants to use LiveCodes for teaching? Are you a developer who wants to build an online learning platform? Please &lt;a href="https://livecodes.io/docs/contact"&gt;get in touch&lt;/a&gt;. We would love to help.&lt;/p&gt;

&lt;p&gt;If you have any questions or feature requests, please &lt;a href="https://github.com/live-codes/livecodes/issues"&gt;submit an issue&lt;/a&gt; in the GitHub repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start Now 🚀
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://livecodes.io"&gt;LiveCodes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://livecodes.io?new"&gt;Starter Templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://livecodes.io/docs"&gt;Documentations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/live-codes/livecodes"&gt;Star the GitHub Repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/livecodes_io"&gt;Follow on Twitter/X&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>learning</category>
      <category>coding</category>
      <category>beginners</category>
      <category>livecodes</category>
    </item>
    <item>
      <title>Let's Make Learning Frontend Great Again!</title>
      <dc:creator>Hatem Hosny</dc:creator>
      <pubDate>Tue, 22 Aug 2023 11:16:05 +0000</pubDate>
      <link>https://dev.to/livecodes_io/lets-make-learning-frontend-great-again-3l3k</link>
      <guid>https://dev.to/livecodes_io/lets-make-learning-frontend-great-again-3l3k</guid>
      <description>&lt;p&gt;Gone are the happy days when we used to start a frontend project by creating 3 files (for HTML, CSS and JavaScript), and start coding. Frontend development is becoming increasingly complex with a large number of frameworks (and meta frameworks) each with its own (non-standard) syntax, processors, build tools and configuration files. These are all great tools, and each solves a real set of problems. However, the ecosystem has become overwhelming for new comers who want to start a frontend development career.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;This article was originally published at &lt;a href="https://blog.livecodes.io/lets-make-learning-frontend-great-again/"&gt;LiveCodes blog&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Outline
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript Fatigue&lt;/li&gt;
&lt;li&gt;In Search for a Solution&lt;/li&gt;
&lt;li&gt;What is LiveCodes?&lt;/li&gt;
&lt;li&gt;Demo&lt;/li&gt;
&lt;li&gt;Language Support&lt;/li&gt;
&lt;li&gt;Development Environment&lt;/li&gt;
&lt;li&gt;AI Code Assistant&lt;/li&gt;
&lt;li&gt;Sharing/Exporting/Deploying Projects&lt;/li&gt;
&lt;li&gt;Embedded Playgrounds&lt;/li&gt;
&lt;li&gt;Can I Use it to Make a Full Website?&lt;/li&gt;
&lt;li&gt;Does it Work Offline?&lt;/li&gt;
&lt;li&gt;Open-Source&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  JavaScript Fatigue
&lt;/h2&gt;

&lt;p&gt;The rapidly expanding ecosystem of modern JavaScript can be intimidating for new frontend developers. The complexity added by each new tool is increasing, to the extent that people started taking &lt;a href="https://frontendmasters.com/learn/webpack/"&gt;multiple courses&lt;/a&gt; to learn the build tool, instead of learning the technology they use! This has been the situation over the &lt;a href="https://hackernoon.com/how-it-feels-to-learn-javascript-in-2016-d3a717dd577f"&gt;past few years&lt;/a&gt; and it does not seem to be improving.&lt;/p&gt;

&lt;p&gt;Why should a junior web developer, who wants to learn something new, need to run terminal commands and download the heaviest object in the universe, just to get started?!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgkxqn65g0jdlgl7490xu.jpg" class="article-body-image-wrapper"&gt;&lt;img alt="node_modules, the heaviest object in the universe" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgkxqn65g0jdlgl7490xu.jpg" width="800" height="575"&gt;&lt;/a&gt;&lt;br&gt;node_modules, the heaviest object in the universe!
  &lt;/p&gt;

&lt;p&gt;Then comes the configuration hell, with the need to configure zillion different things to work together. Just to start a hello-world project!&lt;/p&gt;

&lt;p&gt;Such environment setup may be needed for a production scale project, but it should not be required for learning, exploring, prototyping, experimenting, reproducing issues, sharing or teaching.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmejm05xzjre5tp3k6cpc.jpg" class="article-body-image-wrapper"&gt;&lt;img alt="many configuration files" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmejm05xzjre5tp3k6cpc.jpg" width="445" height="565"&gt;&lt;/a&gt;&lt;br&gt;Configuration hell in action
  &lt;/p&gt;

&lt;h2&gt;
  
  
  In Search for a Solution
&lt;/h2&gt;

&lt;p&gt;To simplify local environment setup, many platforms have provided online IDE/playgrounds to abstract away the build process and allow users to write code and see its result. These are great tools and they do solve parts of the problem. However, there has always been something missing. Since a lot of processing (e.g. compiling, bundling, etc.) occurs on their servers, there are always limitations for use (e.g. number of projects, private projects, processing power/memory, down-time etc.).&lt;/p&gt;

&lt;p&gt;To overcome these limitations users are either required to pay for a subscription, or ,in case of open-source solutions, users are required to self-host the tool and deal with the complexity themselves (and still pay for the hosting provider).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As a developer I can understand why I need to pay for servers that host my websites for users. But why do I need to pay for servers to write code? I can use my local device. I just needed to take away the complexity! 🤔&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Other alternatives were able to run all the processing inside the browser on the user device, which is a great step forwards indeed. However, that required downloading a whole nodejs runtime and then, also downloading the heaviest object in the universe (see above) every time you load the playground. And you still need to go through the configuration hell (also see above). Just to start a hello-world project!&lt;/p&gt;

&lt;p&gt;This is where LiveCodes comes to the scene.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx1ilj50k2h0bawmg1joq.jpg" class="article-body-image-wrapper"&gt;&lt;img alt="Let's Make Frontend Great Again" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx1ilj50k2h0bawmg1joq.jpg" width="800" height="793"&gt;&lt;/a&gt;&lt;br&gt;Let's Make Frontend Great Again!
  &lt;/p&gt;

&lt;p&gt;&lt;small&gt;Disclosure: I'm the author of LiveCodes.&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is LiveCodes?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://livecodes.io"&gt;LiveCodes&lt;/a&gt; is a &lt;a href="https://livecodes.io/docs/features/"&gt;feature-rich&lt;/a&gt;, &lt;a href="https://github.com/live-codes/livecodes"&gt;open-source&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/why#client-side"&gt;client-side&lt;/a&gt;, code playground that supports 80+ languages and frameworks. Check out the &lt;a href="//../2023-08-03-introducing-livecodes/index.md"&gt;announcement&lt;/a&gt; for details.&lt;/p&gt;

&lt;p&gt;When a user selects any of the supported languages/frameworks, the compiler of that language is downloaded and runs in the browser. After that, all code changes are compiled locally on the user device.&lt;/p&gt;

&lt;p&gt;No server rounds are required for compilation or processing. No need to download a nodejs runtime. No &lt;code&gt;npm install&lt;/code&gt;s. No build steps. No configuration hell. It just works!&lt;/p&gt;

&lt;p&gt;LiveCodes is a client-side app, with no servers required. This allows it to be &lt;strong&gt;free&lt;/strong&gt; with &lt;strong&gt;no limits&lt;/strong&gt; to usage, &lt;strong&gt;no ads&lt;/strong&gt; and &lt;strong&gt;no account&lt;/strong&gt; required.&lt;/p&gt;

&lt;p&gt;Another added benefit is privacy. All projects created in LiveCodes are &lt;strong&gt;private by default&lt;/strong&gt;. The code written in LiveCodes does not leave the local device unless the user chooses to &lt;a href="https://livecodes.io/docs/features/share"&gt;share&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/features/export"&gt;export&lt;/a&gt; or &lt;a href="https://livecodes.io/docs/features/deploy"&gt;deploy&lt;/a&gt; it.&lt;/p&gt;

&lt;p&gt;A large number of &lt;a href="https://livecodes.io?new"&gt;starter templates&lt;/a&gt; are available to make starting with a new framework a seamless experience. In addition, any &lt;a href="https://livecodes.io/docs/features/projects"&gt;project&lt;/a&gt; can be saved as a &lt;a href="https://livecodes.io/docs/features/templates#user-templates"&gt;user template&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/live-codes"&gt;
        live-codes
      &lt;/a&gt; / &lt;a href="https://github.com/live-codes/livecodes"&gt;
        livecodes
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Code Playground That Just Works!
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://www.techforpalestine.org" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/8ae065d42c53ee023bfc31586cdfdca206ce2a3bcf0ab9a1f3793b08d35ee8c9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2546302539462538372542352546302539462538372542385f4365617365666972655f4e6f772d74656368666f7270616c657374696e652e6f72672d4438333833383f636f6c6f723d443833383338" alt="Ceasefire_Now-techforpalestine.org"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LiveCodes&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Code Playground That Just Works!&lt;/p&gt;
&lt;p&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/cacbb8729d0925d387ba1e24740a9deab4f66f0c4c8f5271f543e3d7728cbdaa/68747470733a2f2f6465762e6c697665636f6465732e696f2f646f63732f696d672f6c697665636f6465732d6c6f676f2e737667"&gt;&lt;img width="300" src="https://camo.githubusercontent.com/cacbb8729d0925d387ba1e24740a9deab4f66f0c4c8f5271f543e3d7728cbdaa/68747470733a2f2f6465762e6c697665636f6465732e696f2f646f63732f696d672f6c697665636f6465732d6c6f676f2e737667"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://livecodes.io/docs/features/" rel="nofollow"&gt;feature-rich&lt;/a&gt;, open-source, &lt;strong&gt;client-side&lt;/strong&gt; code playground for React, Vue, Svelte, Solid, Typescript, Python, Go, Ruby, PHP and &lt;a href="https://livecodes.io/docs/languages/" rel="nofollow"&gt;80+ languages/frameworks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://status.livecodes.io" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/a2da3b6b656346ad2ac5564558aa6c67be18007da40ab49aec947923aee4de47/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f6c6976652d636f6465732f75707074696d652f6d61737465722f6170692f6c6976652d636f6465732f757074696d652e6a736f6e" alt="LiveCodes: uptime status"&gt;&lt;/a&gt;
&lt;a href="https://livecodes.io" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/3773b0f271c90e45fc1dd8d98e19db9319d278e0512489818313a2bf25e0e1a2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f6c6976652d636f6465732f6c697665636f6465733f6c6162656c3d617070" alt="LiveCodes: app version"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/livecodes" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/daee341d8d476c4e7b9b35cdebe7f8b89af29c3f952291df6f4548945de12b0f/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f6c697665636f646573" alt="LiveCodes: npm version"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/livecodes" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/9c1b9e0e9d0fcc0b682580eb5f01d288414f9acb82719897bba5de73964dd6e4/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f6c697665636f646573" alt="LiveCodes: npm downloads"&gt;&lt;/a&gt;
&lt;a href="https://livecodes.io/docs/languages/" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/203d099d451ec9c269894210e3992d7a290c80cbde4ebc628cf983d2328beb6e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c616e6775616765732d39302d626c7565" alt="LiveCodes: languages"&gt;&lt;/a&gt;
&lt;a href="https://www.codacy.com/gh/live-codes/livecodes/dashboard?utm_source=github.com&amp;amp;utm_medium=referral&amp;amp;utm_content=live-codes/livecodes&amp;amp;utm_campaign=Badge_Grade" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/3d7e40148bf3d716cfcd4c01540ccb9c7f50a15f2dbed8c0993d23405a5cc2f3/68747470733a2f2f6170702e636f646163792e636f6d2f70726f6a6563742f62616467652f47726164652f3364333966313536313865303438646239643133633261306538303032623333" alt="Codacy Badge"&gt;&lt;/a&gt;
&lt;a href="https://github.com/live-codes/livecodes/blob/develop/LICENSE"&gt;&lt;img src="https://camo.githubusercontent.com/e70374d5f099a48ae99ec120381faef8e6d5e793a322baf0e53c26937c59499b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6c6976652d636f6465732f6c697665636f646573" alt="license - MIT"&gt;&lt;/a&gt;
&lt;a href="https://github.com/live-codes/livecodes"&gt;&lt;img src="https://camo.githubusercontent.com/dc0bfe914fbac019da170af4ddbb566c02aff383bcd8eff114b1a94aa0f2c046/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6c6976652d636f6465732f6c697665636f6465733f7374796c653d736f6369616c" alt="LiveCodes: GitHub repo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://livecodes.io" rel="nofollow"&gt;Try it now on livecodes.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://livecodes.io/docs" rel="nofollow"&gt;Documentations&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://livecodes.io/docs/why" rel="nofollow"&gt;What makes LiveCodes different?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2a6cda0488ccdd20753e7ea820dc0973f79d59f25dc2add0553551849a58976c/68747470733a2f2f6465762e6c697665636f6465732e696f2f646f63732f696d672f73637265656e73686f74732f6c697665636f6465732d6c616e6775616765732e6a7067"&gt;&lt;img src="https://camo.githubusercontent.com/2a6cda0488ccdd20753e7ea820dc0973f79d59f25dc2add0553551849a58976c/68747470733a2f2f6465762e6c697665636f6465732e696f2f646f63732f696d672f73637265656e73686f74732f6c697665636f6465732d6c616e6775616765732e6a7067" alt="LiveCodes list of languages screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Code Playground That Just Works!&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;No servers to configure (or pay for!)&lt;/li&gt;
&lt;li&gt;No databases to maintain (or pay for!)&lt;/li&gt;
&lt;li&gt;No installs&lt;/li&gt;
&lt;li&gt;No configuration files&lt;/li&gt;
&lt;li&gt;No build steps&lt;/li&gt;
&lt;li&gt;No subscription fees (free and open-source)&lt;/li&gt;
&lt;li&gt;No account required *&lt;/li&gt;
&lt;li&gt;No limits for usage (unlimited private projects)&lt;/li&gt;
&lt;li&gt;80+ languages/frameworks/processors&lt;/li&gt;
&lt;li&gt;Large set of features and integrations&lt;/li&gt;
&lt;li&gt;Import code from a wide variety of sources&lt;/li&gt;
&lt;li&gt;Use modules from npm, deno.land/x, jsr, GitHub, and others&lt;/li&gt;
&lt;li&gt;Easily embed it in your web pages&lt;/li&gt;
&lt;li&gt;It runs in the browser (client-side)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;* GitHub account is required only for features that use &lt;a href="https://livecodes.io/docs/features/github-integration" rel="nofollow"&gt;GitHub Integration&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Quick Start&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Standalone App&lt;/h4&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://livecodes.io" rel="nofollow"&gt;livecodes.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;... and enjoy all the &lt;a href="https://livecodes.io/docs/features/" rel="nofollow"&gt;features&lt;/a&gt;!&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Embedded Playground&lt;/h4&gt;

&lt;/div&gt;
&lt;p&gt;Add this…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/live-codes/livecodes"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Try the standalone app running React with JSX: &lt;a href="https://livecodes.io/?template=react"&gt;https://livecodes.io/?template=react&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try the interactive demo for an embedded LiveCodes playground that runs React with JSX on &lt;a href="https://blog.livecodes.io/lets-make-learning-frontend-great-again/#demo"&gt;LiveCodes blog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Language Support
&lt;/h2&gt;

&lt;p&gt;Currently, there are 80+ languages/frameworks supported in LiveCodes. These include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web languages (HTML, CSS &amp;amp; JavaScript)&lt;/li&gt;
&lt;li&gt;Web frameworks/libraries (e.g. React JSX/TSX, Vue SFC, Svelte SFC, Solid, MDX, Astro).&lt;/li&gt;
&lt;li&gt;Languages that transpile to JavaScript (e.g. TypeScript, CoffeeScript, LiveScript, ReScript).&lt;/li&gt;
&lt;li&gt;Languages/frameworks that generate CSS (e.g. SCSS, Less, Stylus, Tailwind CSS, UnoCSS).&lt;/li&gt;
&lt;li&gt;CSS processors (e.g. PostCSS, Autoprefixer, Lightning CSS, CSS Modules, cssnano).&lt;/li&gt;
&lt;li&gt;Traditional programming languages (e.g. Python, Ruby, Go, PHP, C++, R, Lua, Scheme, Perl).&lt;/li&gt;
&lt;li&gt;Data manipulation/logic languages (e.g. SQL, Prolog).&lt;/li&gt;
&lt;li&gt;Authoring/templating languages (e.g Markdown, AsciiDoc, Pug, Handlebars, Haml).&lt;/li&gt;
&lt;li&gt;Low-code/visual editors (e.g. blockly, rich text editor).&lt;/li&gt;
&lt;li&gt;Modeling languages/diagram-as-code (e.g. Gnuplot, Graphviz, Mermaid, Vega, Plotly).&lt;/li&gt;
&lt;li&gt;Languages that target WebAssembly (e.g. AssemblyScript, WebAssembly Text Format).&lt;/li&gt;
&lt;li&gt;... and &lt;a href="https://livecodes.io/docs/languages"&gt;many more&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generally, if you are a developer (or want to be one), there is a big chance you will find something interesting to do with LiveCodes.&lt;/p&gt;

&lt;h2&gt;
  
  
  One Interface for Many Tools
&lt;/h2&gt;

&lt;p&gt;Many tools have provided playgrounds to help exploration and learning. However, each playground has different UI and features. A big advantage for LiveCodes is that it has a wide range of language/framework support. Through this single interface users can explore and learn many tools in one place. In addition, the large set of &lt;a href="https://livecodes.io/docs/features/"&gt;features&lt;/a&gt; becomes available while using any of these tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Development Environment
&lt;/h2&gt;

&lt;p&gt;LiveCodes provides many of the commonly used developer tools. These include Monaco editor (that powers &lt;a href="https://code.visualstudio.com/"&gt;VS Code&lt;/a&gt;), &lt;a href="https://prettier.io/"&gt;Prettier&lt;/a&gt;, &lt;a href="https://emmet.io/"&gt;Emmet&lt;/a&gt;, Vim/Emacs modes, &lt;a href="https://babeljs.io/"&gt;Babel&lt;/a&gt;, &lt;a href="https://www.typescriptlang.org/"&gt;TypeScript&lt;/a&gt;, &lt;a href="https://sass-lang.com/"&gt;SCSS&lt;/a&gt;, &lt;a href="https://lesscss.org/"&gt;Less&lt;/a&gt;, &lt;a href="https://postcss.org/"&gt;PostCSS&lt;/a&gt;, &lt;a href="https://jestjs.io/"&gt;Jest&lt;/a&gt; and &lt;a href="https://testing-library.com/"&gt;Testing Library&lt;/a&gt;, among others. All these tools run seamlessly in the browser without any installations or configurations. It feels like a very light-weight version of your own local development environment including the keyboard shortcuts, IntelliSense and code navigation features.&lt;/p&gt;

&lt;p&gt;The integrated &lt;a href="https://livecodes.io/docs/features/console"&gt;console&lt;/a&gt; allows quick inspection of logged values. And the &lt;a href="https://livecodes.io/docs/features/compiled-code"&gt;compiled code viewer&lt;/a&gt; improves the learning experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodes.io/docs/features/module-resolution"&gt;NPM modules&lt;/a&gt; can be imported as usual. It just works™ without having to &lt;code&gt;npm install&lt;/code&gt; anything. Not even on the server (because there is no server!).&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Code Assistant
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://livecodes.io/docs/features/ai"&gt;AI code assistant&lt;/a&gt; provides code completion based on the current context and comments. This is powered by &lt;a href="https://codeium.com"&gt;Codeium&lt;/a&gt;, the &lt;strong&gt;free&lt;/strong&gt; ultrafast Copilot alternative. This can significantly boost the learning experience. See &lt;a href="https://livecodes.io/docs/features/ai"&gt;how to enable it&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sharing/Exporting/Deploying Projects
&lt;/h2&gt;

&lt;p&gt;Projects can be easily &lt;a href="https://livecodes.io/docs/features/share"&gt;shared&lt;/a&gt; as URLs, QR codes or to social media platforms. In addition, any project can be &lt;a href="https://livecodes.io/docs/features/export"&gt;exported&lt;/a&gt; as HTML, JSON or zip file containing source code files. Projects can also be exported to other services like GitHub gists, CodePen or JSFiddle.&lt;/p&gt;

&lt;p&gt;User data can be &lt;a href="https://livecodes.io/docs/features/sync"&gt;synchronized&lt;/a&gt; across devices. Also it can be &lt;a href="https://livecodes.io/docs/features/backup-restore"&gt;backed-up and restored&lt;/a&gt; on same or different device.&lt;/p&gt;

&lt;p&gt;Projects can be &lt;a href="https://livecodes.io/docs/features/deploy"&gt;deployed&lt;/a&gt; to public URLs that can be shared with others. This is hosted for free on GitHub Pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Embedded Playgrounds
&lt;/h2&gt;

&lt;p&gt;Playgrounds can be &lt;a href="https://livecodes.io/docs/features/embeds"&gt;embedded&lt;/a&gt; in any web page. This can be very useful for blogs, tutorials and documentation websites. The &lt;a href="https://livecodes.io/docs/features/embeds"&gt;embed screen&lt;/a&gt; allows customization of embed options and previewing the resulting playground. Code can be easily &lt;a href="https://livecodes.io/docs/features/code-prefill"&gt;prefilled&lt;/a&gt; into embedded playgrounds.&lt;/p&gt;

&lt;p&gt;An easy-to-use, yet powerful, &lt;a href="https://livecodes.io/docs/sdk/"&gt;SDK&lt;/a&gt;, allows &lt;a href="https://livecodes.io/docs/sdk/js-ts#sdk-methods"&gt;communication&lt;/a&gt; between the embedding page and the playground. This can be used to make &lt;a href="//../2023-08-04-lets-make-an-interactive-coding-tutorial/index.md"&gt;interactive coding tutorials&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can I Use it to Make a Full Website?
&lt;/h2&gt;

&lt;p&gt;You probably can, but you probably should NOT!&lt;/p&gt;

&lt;p&gt;LiveCodes &lt;a href="https://livecodes.io/docs/features/project"&gt;projects&lt;/a&gt; are kept simple, by design, where each project represents a single web page/component. There is no concept of multi-file projects. This makes it more suitable for learning, prototyping, experimenting, sharing and teaching. Once you cross that limit and require something bigger, you can then move back to your local IDE.&lt;/p&gt;

&lt;p&gt;In fact, many of the features of LiveCodes were initially prototyped in LiveCodes, then later integrated into the big project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does it Work Offline?
&lt;/h2&gt;

&lt;p&gt;Not Yet!&lt;/p&gt;

&lt;p&gt;Offline use is definitely on the roadmap. However, it is not ready yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open-Source
&lt;/h2&gt;

&lt;p&gt;LiveCodes is released under the permissive &lt;a href="https://livecodes.io/docs/license"&gt;MIT License&lt;/a&gt; which allows anyone to use (including commercial use), modify, and distribute. It can also be &lt;a href="https://livecodes.io/docs/features/self-hosting"&gt;self-hosted&lt;/a&gt; (for free) on any static file server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;LiveCodes makes getting started with frontend development easier, more accessible and more fun. Of course this alone does not solve the problem of increasing complexity in the frontend web development, however, it can be a great tool for learning, prototyping, experimenting, sharing and teaching. And it is free!&lt;/p&gt;

&lt;p&gt;What will you learn (or teach) today?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start now: &lt;a href="https://livecodes.io?new"&gt;https://livecodes.io?new&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Check the docs: &lt;a href="https://livecodes.io/docs"&gt;https://livecodes.io/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Star the repo: &lt;a href="https://github.com/live-codes/livecodes"&gt;https://github.com/live-codes/livecodes&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>Let's Make an Interactive Coding Tutorial</title>
      <dc:creator>Hatem Hosny</dc:creator>
      <pubDate>Sat, 05 Aug 2023 06:31:51 +0000</pubDate>
      <link>https://dev.to/livecodes_io/lets-make-an-interactive-coding-tutorial-p45</link>
      <guid>https://dev.to/livecodes_io/lets-make-an-interactive-coding-tutorial-p45</guid>
      <description>&lt;p&gt;Let's assume we want to make an interactive coding tutorial on a blog or a tutorials website. The tutorial should have a playground that helps us guide the students to write code, see the results and complete an assignment task.&lt;/p&gt;

&lt;p&gt;We are going to use &lt;a href="https://livecodes.io/docs"&gt;LiveCodes&lt;/a&gt; and its powerful &lt;a href="https://livecodes.io/docs/sdk"&gt;SDK&lt;/a&gt; to achieve this. So, here we go.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;This article was originally published at &lt;a href="https://blog.livecodes.io/lets-make-an-interactive-coding-tutorial"&gt;LiveCodes blog&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  What Are We Building?
&lt;/h2&gt;

&lt;p&gt;We are going to build a playground for a simple interactive coding tutorial.&lt;/p&gt;

&lt;p&gt;We will add some HTML, add styles using CSS and dynamically change its content using JavaScript. The student can interact with the playground, add code and see its result. At the end, the student is asked to complete a simple task (e.g. changing the value of a variable), then the task is verified and a feedback is given if the task was completed successfully.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Check a live demo on &lt;a href="https://blog.livecodes.io/lets-make-an-interactive-coding-tutorial#demo"&gt;LiveCodes blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The full source code (in vanilla JavaScript and also in React TSX) can be found &lt;a href="https://blog.livecodes.io/lets-make-an-interactive-coding-tutorial/#full-code"&gt;here&lt;/a&gt;.&lt;/p&gt;



&lt;h2&gt;
  
  
  What is LiveCodes?
&lt;/h2&gt;

&lt;p&gt;LiveCodes is a &lt;a href="https://livecodes.io/docs/features/"&gt;feature-rich&lt;/a&gt;, &lt;a href="https://github.com/live-codes/livecodes"&gt;open-source&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/why#client-side"&gt;client-side&lt;/a&gt;, code playground that supports &lt;a href="https://livecodes.io/docs/languages/"&gt;80+ languages and frameworks&lt;/a&gt;. Playgrounds can be &lt;a href="https://livecodes.io/docs/features/embeds"&gt;embedded&lt;/a&gt; in any web pages. A powerful, yet easy-to-use, &lt;a href="https://livecodes.io/docs/sdk"&gt;SDK&lt;/a&gt; allows creating and communicating with playgrounds.&lt;/p&gt;

&lt;p&gt;LiveCodes is free with no limits to usage, no ads and no account required. It is &lt;a href="https://livecodes.io/docs/license"&gt;MIT-licensed&lt;/a&gt; which allows its use, distribution and modification even for commercial projects.&lt;/p&gt;

&lt;p&gt;Read more in the &lt;a href="https://dev.to/livecodes_io/introducing-livecodes-3300"&gt;announcement&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/live-codes"&gt;
        live-codes
      &lt;/a&gt; / &lt;a href="https://github.com/live-codes/livecodes"&gt;
        livecodes
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Code Playground That Just Works!
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://www.techforpalestine.org" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/8ae065d42c53ee023bfc31586cdfdca206ce2a3bcf0ab9a1f3793b08d35ee8c9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2546302539462538372542352546302539462538372542385f4365617365666972655f4e6f772d74656368666f7270616c657374696e652e6f72672d4438333833383f636f6c6f723d443833383338" alt="Ceasefire_Now-techforpalestine.org"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LiveCodes&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Code Playground That Just Works!&lt;/p&gt;
&lt;p&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/cacbb8729d0925d387ba1e24740a9deab4f66f0c4c8f5271f543e3d7728cbdaa/68747470733a2f2f6465762e6c697665636f6465732e696f2f646f63732f696d672f6c697665636f6465732d6c6f676f2e737667"&gt;&lt;img width="300" src="https://camo.githubusercontent.com/cacbb8729d0925d387ba1e24740a9deab4f66f0c4c8f5271f543e3d7728cbdaa/68747470733a2f2f6465762e6c697665636f6465732e696f2f646f63732f696d672f6c697665636f6465732d6c6f676f2e737667"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://livecodes.io/docs/features/" rel="nofollow"&gt;feature-rich&lt;/a&gt;, open-source, &lt;strong&gt;client-side&lt;/strong&gt; code playground for React, Vue, Svelte, Solid, Typescript, Python, Go, Ruby, PHP and &lt;a href="https://livecodes.io/docs/languages/" rel="nofollow"&gt;80+ languages/frameworks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://status.livecodes.io" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/a2da3b6b656346ad2ac5564558aa6c67be18007da40ab49aec947923aee4de47/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f6c6976652d636f6465732f75707074696d652f6d61737465722f6170692f6c6976652d636f6465732f757074696d652e6a736f6e" alt="LiveCodes: uptime status"&gt;&lt;/a&gt;
&lt;a href="https://livecodes.io" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/3773b0f271c90e45fc1dd8d98e19db9319d278e0512489818313a2bf25e0e1a2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f6c6976652d636f6465732f6c697665636f6465733f6c6162656c3d617070" alt="LiveCodes: app version"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/livecodes" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/daee341d8d476c4e7b9b35cdebe7f8b89af29c3f952291df6f4548945de12b0f/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f6c697665636f646573" alt="LiveCodes: npm version"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/livecodes" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/9c1b9e0e9d0fcc0b682580eb5f01d288414f9acb82719897bba5de73964dd6e4/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f6c697665636f646573" alt="LiveCodes: npm downloads"&gt;&lt;/a&gt;
&lt;a href="https://livecodes.io/docs/languages/" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/203d099d451ec9c269894210e3992d7a290c80cbde4ebc628cf983d2328beb6e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c616e6775616765732d39302d626c7565" alt="LiveCodes: languages"&gt;&lt;/a&gt;
&lt;a href="https://www.codacy.com/gh/live-codes/livecodes/dashboard?utm_source=github.com&amp;amp;utm_medium=referral&amp;amp;utm_content=live-codes/livecodes&amp;amp;utm_campaign=Badge_Grade" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/3d7e40148bf3d716cfcd4c01540ccb9c7f50a15f2dbed8c0993d23405a5cc2f3/68747470733a2f2f6170702e636f646163792e636f6d2f70726f6a6563742f62616467652f47726164652f3364333966313536313865303438646239643133633261306538303032623333" alt="Codacy Badge"&gt;&lt;/a&gt;
&lt;a href="https://github.com/live-codes/livecodes/blob/develop/LICENSE"&gt;&lt;img src="https://camo.githubusercontent.com/e70374d5f099a48ae99ec120381faef8e6d5e793a322baf0e53c26937c59499b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6c6976652d636f6465732f6c697665636f646573" alt="license - MIT"&gt;&lt;/a&gt;
&lt;a href="https://github.com/live-codes/livecodes"&gt;&lt;img src="https://camo.githubusercontent.com/dc0bfe914fbac019da170af4ddbb566c02aff383bcd8eff114b1a94aa0f2c046/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6c6976652d636f6465732f6c697665636f6465733f7374796c653d736f6369616c" alt="LiveCodes: GitHub repo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://livecodes.io" rel="nofollow"&gt;Try it now on livecodes.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://livecodes.io/docs" rel="nofollow"&gt;Documentations&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://livecodes.io/docs/why" rel="nofollow"&gt;What makes LiveCodes different?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2a6cda0488ccdd20753e7ea820dc0973f79d59f25dc2add0553551849a58976c/68747470733a2f2f6465762e6c697665636f6465732e696f2f646f63732f696d672f73637265656e73686f74732f6c697665636f6465732d6c616e6775616765732e6a7067"&gt;&lt;img src="https://camo.githubusercontent.com/2a6cda0488ccdd20753e7ea820dc0973f79d59f25dc2add0553551849a58976c/68747470733a2f2f6465762e6c697665636f6465732e696f2f646f63732f696d672f73637265656e73686f74732f6c697665636f6465732d6c616e6775616765732e6a7067" alt="LiveCodes list of languages screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Code Playground That Just Works!&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;No servers to configure (or pay for!)&lt;/li&gt;
&lt;li&gt;No databases to maintain (or pay for!)&lt;/li&gt;
&lt;li&gt;No installs&lt;/li&gt;
&lt;li&gt;No configuration files&lt;/li&gt;
&lt;li&gt;No build steps&lt;/li&gt;
&lt;li&gt;No subscription fees (free and open-source)&lt;/li&gt;
&lt;li&gt;No account required *&lt;/li&gt;
&lt;li&gt;No limits for usage (unlimited private projects)&lt;/li&gt;
&lt;li&gt;80+ languages/frameworks/processors&lt;/li&gt;
&lt;li&gt;Large set of features and integrations&lt;/li&gt;
&lt;li&gt;Import code from a wide variety of sources&lt;/li&gt;
&lt;li&gt;Use modules from npm, deno.land/x, jsr, GitHub, and others&lt;/li&gt;
&lt;li&gt;Easily embed it in your web pages&lt;/li&gt;
&lt;li&gt;It runs in the browser (client-side)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;* GitHub account is required only for features that use &lt;a href="https://livecodes.io/docs/features/github-integration" rel="nofollow"&gt;GitHub Integration&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Quick Start&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Standalone App&lt;/h4&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://livecodes.io" rel="nofollow"&gt;livecodes.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;... and enjoy all the &lt;a href="https://livecodes.io/docs/features/" rel="nofollow"&gt;features&lt;/a&gt;!&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Embedded Playground&lt;/h4&gt;

&lt;/div&gt;
&lt;p&gt;Add this…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/live-codes/livecodes"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Enough talk, let's get started!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Playground
&lt;/h2&gt;

&lt;p&gt;The LiveCodes &lt;a href="https://livecodes.io/docs/sdk"&gt;SDK&lt;/a&gt; makes it easy to create code playgrounds. The SDK can be &lt;a href="https://livecodes.io/docs/sdk/#cdn"&gt;loaded from CDN&lt;/a&gt; or can be &lt;a href="https://livecodes.io/docs/sdk/#npm-package"&gt;installed from npm&lt;/a&gt;. To keep things simple, we will just use the CDN.&lt;/p&gt;

&lt;p&gt;The SDK is available for &lt;a href="https://livecodes.io/docs/sdk/js-ts"&gt;vanilla JavaScript/TypeScript&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/sdk/react"&gt;React&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/sdk/vue"&gt;Vue&lt;/a&gt; and &lt;a href="https://livecodes.io/docs/sdk/svelte"&gt;Svelte&lt;/a&gt;. Again, for simplicity, we will use vanilla JavaScript.&lt;/p&gt;

&lt;p&gt;A new playground can be created using the &lt;a href="https://livecodes.io/docs/sdk/js-ts#createplayground"&gt;&lt;code&gt;createPlayground&lt;/code&gt;&lt;/a&gt; function. It takes the container HTML element (or its selector) and optionally &lt;a href="https://livecodes.io/docs/sdk/js-ts#embed-options"&gt;embed options&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPlayground&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://unpkg.com/livecodes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;createPlayground&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#container&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* embed options */&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;&lt;a href="https://livecodes.io/?mode=result&amp;amp;html=%3Cdiv+id%3D%22container%22%3E%3C%2Fdiv%3E%0A%0A%3Cscript+type%3D%22module%22%3E%0A++import+%7B+createPlayground+%7D+from+%27https%3A%2F%2Funpkg.com%2Flivecodes%27%3B%0A%0A++createPlayground%28%27%23container%27%2C+%7B+%2F*+embed+options+*%2F+%7D%29%3B%0A%3C%2Fscript%3E%0A&amp;amp;css=body+%7B+margin%3A+50px+2em%3B+%7D"&gt;Preview&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;This creates a playground that the user can interact with and see the result immediately, without having to install or build anything (not even for any of the &lt;a href="https://livecodes.io/docs/languages/"&gt;supported languages&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;It is generally a good practice to specify the SDK version and a &lt;a href="https://livecodes.io/docs/features/permanent-url"&gt;permanent URL&lt;/a&gt; for the app to avoid later potential breaking changes with updates to the SDK or the app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPlayground&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://unpkg.com/livecodes@0.4.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// permanent URL avoids later breaking changes&lt;/span&gt;
    &lt;span class="na"&gt;appUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://v25.livecodes.io&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="nf"&gt;createPlayground&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#container&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;&lt;a href="https://livecodes.io/?mode=result&amp;amp;html=%3Cdiv+id%3D%22container%22%3E%3C%2Fdiv%3E%0A%0A%3Cscript+type%3D%22module%22%3E%0A++%2F%2F+highlight-next-line%0A++import+%7B+createPlayground+%7D+from+%27https%3A%2F%2Funpkg.com%2Flivecodes%400.1.2%27%3B%0A%0A++const+options+%3D+%7B%0A++++%2F%2F+highlight-next-line%0A++++appUrl%3A+%27https%3A%2F%2Fv25.livecodes.io%27%2C%0A++%7D%3B%0A++createPlayground%28%27%23container%27%2C+options%29%3B%0A%3C%2Fscript%3E%0A&amp;amp;css=body+%7B+margin%3A+50px+2em%3B+%7D"&gt;Preview&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;We now have an empty playground. Let's fill it with code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding Content
&lt;/h2&gt;

&lt;p&gt;When creating the playground, embed options can be used to add content (e.g. using the options &lt;a href="https://livecodes.io/docs/sdk/js-ts#config"&gt;&lt;code&gt;config&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/sdk/js-ts#params"&gt;&lt;code&gt;params&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/sdk/js-ts#import"&gt;&lt;code&gt;import&lt;/code&gt;&lt;/a&gt; or &lt;a href="https://livecodes.io/docs/sdk/js-ts#template"&gt;&lt;code&gt;template&lt;/code&gt;&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;This loads the playground prefilled with the code you specified.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPlayground&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://unpkg.com/livecodes@0.4.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;appUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://v25.livecodes.io&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;markup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Welcome to the tutorial!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="nf"&gt;createPlayground&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#container&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;&lt;a href="https://livecodes.io/?mode=result&amp;amp;html=%3Cdiv+id%3D%22container%22%3E%3C%2Fdiv%3E%0A%0A%3Cscript+type%3D%22module%22%3E%0A++import+%7B+createPlayground+%7D+from+%27https%3A%2F%2Funpkg.com%2Flivecodes%400.1.2%27%3B%0A%0A++const+options+%3D+%7B%0A++++appUrl%3A+%27https%3A%2F%2Fv25.livecodes.io%27%2C%0A++++%2F%2F+highlight-start%0A++++config%3A+%7B%0A++++++markup%3A+%7B%0A++++++++language%3A+%27html%27%2C%0A++++++++content%3A+%27Welcome+to+the+tutorial%21%27%2C%0A++++++%7D%2C%0A++++%7D%2C%0A++++%2F%2F+highlight-end%0A++%7D%3B%0A++createPlayground%28%27%23container%27%2C+options%29%3B%0A%3C%2Fscript%3E%0A&amp;amp;css=body+%7B+margin%3A+50px+2em%3B+%7D"&gt;Preview&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding Tutorial Steps
&lt;/h2&gt;

&lt;p&gt;Now the student can see the playground, interact with it and see the result. So let's add some tutorial steps, where new code is added to the playground in different editors (HTML, CSS and JavaScript). This can gradually introduce new concepts to the student without losing context or having to move to a new playground.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://livecodes.io/docs/sdk/js-ts#createplayground"&gt;&lt;code&gt;createPlayground&lt;/code&gt;&lt;/a&gt; function returns a promise that resolves to the playground instance. This instance has some useful &lt;a href="https://livecodes.io/docs/sdk/js-ts/#sdk-methods"&gt;methods&lt;/a&gt; that allows interaction with the already running playground (e.g. &lt;a href="https://livecodes.io/docs/sdk/js-ts#run"&gt;&lt;code&gt;run&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/sdk/js-ts#getconfig"&gt;&lt;code&gt;getConfig&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/sdk/js-ts#setconfig"&gt;&lt;code&gt;setConfig&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/sdk/js-ts#getcode"&gt;&lt;code&gt;getCode&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/sdk/js-ts#format"&gt;&lt;code&gt;format&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/sdk/js-ts#show"&gt;&lt;code&gt;show&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/sdk/js-ts#runtests"&gt;&lt;code&gt;runTests&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/sdk/js-ts#onchange"&gt;&lt;code&gt;onChange&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/sdk/js-ts#getshareurl"&gt;&lt;code&gt;getShareUrl&lt;/code&gt;&lt;/a&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"next"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Next&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPlayground&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://unpkg.com/livecodes@0.4.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// add data for tutorial steps&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;markup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;h1&amp;gt;Hello,&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  &amp;lt;span id="title"&amp;gt;World&amp;lt;/span&amp;gt;!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;appUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://v25.livecodes.io&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;markup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Welcome to the tutorial!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nf"&gt;createPlayground&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#container&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;playground&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextBtn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#next&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;nextBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currentStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
      &lt;span class="c1"&gt;// send the config object to the playground&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;playground&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentStep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;&lt;a href="https://livecodes.io/?mode=result&amp;amp;html=%3Cdiv+id%3D%22container%22%3E%3C%2Fdiv%3E%0A%3C%21--+highlight-next-line+--%3E%0A%3Cbutton+id%3D%22next%22%3ENext%3C%2Fbutton%3E%0A%0A%3Cscript+type%3D%22module%22%3E%0A++import+%7B+createPlayground+%7D+from+%22https%3A%2F%2Funpkg.com%2Flivecodes%400.1.2%22%3B%0A%0A++%2F%2F+highlight-start%0A++const+steps+%3D+%5B%0A++++%7B%0A++++++config%3A+%7B%0A++++++++markup%3A+%7B%0A++++++++++language%3A+%22html%22%2C%0A++++++++++content%3A+%27%3Ch1%3EHello%2C%5Cn++%3Cspan+id%3D%22title%22%3EWorld%3C%2Fspan%3E%21%5Cn%3C%2Fh1%3E%27%2C%0A++++++++%7D%2C%0A++++++%7D%2C%0A++++%7D%2C%0A++%5D%3B%0A++%2F%2F+highlight-end%0A%0A++const+options+%3D+%7B%0A++++appUrl%3A+%22https%3A%2F%2Fv25.livecodes.io%22%2C%0A++++config%3A+%7B%0A++++++markup%3A+%7B%0A++++++++language%3A+%22html%22%2C%0A++++++++content%3A+%22Welcome+to+the+tutorial%21%22%2C%0A++++++%7D%2C%0A++++%7D%2C%0A++%7D%3B%0A%0A++%2F%2F+highlight-start%0A++createPlayground%28%22%23container%22%2C+options%29.then%28%28playground%29+%3D%3E+%7B%0A++++const+nextBtn+%3D+document.querySelector%28%22%23next%22%29%3B%0A++++nextBtn.addEventListener%28%22click%22%2C+async+%28%29+%3D%3E+%7B%0A++++++const+currentStep+%3D+steps%5B0%5D%3B%0A++++++await+playground.setConfig%28currentStep.config%29%3B%0A++++%7D%29%3B%0A++%7D%29%3B%0A++%2F%2F+highlight-end%0A%3C%2Fscript%3E%0A&amp;amp;css=body+%7B+margin%3A+50px+2em%3B+%7D"&gt;Preview&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Now we have defined an array (&lt;code&gt;steps&lt;/code&gt;) that will hold the data of each step in the tutorial. The first step has a &lt;a href="https://livecodes.io/docs/configuration/configuration-object"&gt;&lt;code&gt;config&lt;/code&gt; object&lt;/a&gt; that is to be sent to the playground.&lt;/p&gt;

&lt;p&gt;A button with the id &lt;code&gt;"next"&lt;/code&gt; controls moving between steps. An event handler for its &lt;code&gt;click&lt;/code&gt; event sends the current step &lt;code&gt;config&lt;/code&gt; to the playground using the method &lt;a href="https://livecodes.io/docs/sdk/js-ts#setconfig"&gt;&lt;code&gt;setConfig&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  More Steps
&lt;/h2&gt;

&lt;p&gt;So, let's add some more steps. Clicking the button should move us to the next step.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"next"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Next&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPlayground&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://unpkg.com/livecodes@0.4.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;markup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;h1&amp;gt;Hello,&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  &amp;lt;span id="title"&amp;gt;World&amp;lt;/span&amp;gt;!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// add a new step&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;markup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;h1&amp;gt;Hello,&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  &amp;lt;span id="title"&amp;gt;World&amp;lt;/span&amp;gt;!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#title {&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  color: blue;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;    
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;appUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://v25.livecodes.io&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;markup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Welcome to the tutorial!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nf"&gt;createPlayground&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#container&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;playground&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextBtn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#next&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;nextBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lastStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currentStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;playground&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentStep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;lastStep&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;&lt;a href="https://livecodes.io/?mode=result&amp;amp;html=%3Cdiv+id%3D%22container%22%3E%3C%2Fdiv%3E%0A%3Cbutton+id%3D%22next%22%3ENext%3C%2Fbutton%3E%0A%0A%3Cscript+type%3D%22module%22%3E%0A++import+%7B+createPlayground+%7D+from+%22https%3A%2F%2Funpkg.com%2Flivecodes%400.1.2%22%3B%0A%0A++const+steps+%3D+%5B%0A++++%7B%0A++++++config%3A+%7B%0A++++++++markup%3A+%7B%0A++++++++++language%3A+%22html%22%2C%0A++++++++++content%3A+%27%3Ch1%3EHello%2C%5Cn++%3Cspan+id%3D%22title%22%3EWorld%3C%2Fspan%3E%21%5Cn%3C%2Fh1%3E%27%2C%0A++++++++%7D%2C%0A++++++%7D%2C%0A++++%7D%2C%0A++++%2F%2F+highlight-start%0A++++%7B%0A++++++config%3A+%7B%0A++++++++markup%3A+%7B%0A++++++++++language%3A+%22html%22%2C%0A++++++++++content%3A+%27%3Ch1%3EHello%2C%5Cn++%3Cspan+id%3D%22title%22%3EWorld%3C%2Fspan%3E%21%5Cn%3C%2Fh1%3E%27%2C%0A++++++++%7D%2C%0A++++++++style%3A+%7B%0A++++++++++language%3A+%27css%27%2C%0A++++++++++content%3A+%27%23title+%7B%5Cn++color%3A+blue%3B%5Cn%7D%27%2C%0A++++++++%7D%2C%0A++++++%7D%2C%0A++++%7D%2C++++%0A++++%2F%2F+highlight-end%0A++%5D%3B%0A%0A++const+options+%3D+%7B%0A++++appUrl%3A+%22https%3A%2F%2Fv25.livecodes.io%22%2C%0A++++config%3A+%7B%0A++++++markup%3A+%7B%0A++++++++language%3A+%22html%22%2C%0A++++++++content%3A+%22Welcome+to+the+tutorial%21%22%2C%0A++++++%7D%2C%0A++++%7D%2C%0A++%7D%3B%0A%0A++createPlayground%28%22%23container%22%2C+options%29.then%28%28playground%29+%3D%3E+%7B%0A++++%2F%2F+highlight-next-line%0A++++let+step+%3D+0%3B%0A++++const+nextBtn+%3D+document.querySelector%28%22%23next%22%29%3B%0A++++nextBtn.addEventListener%28%22click%22%2C+async+%28%29+%3D%3E+%7B%0A++++++%2F%2F+highlight-start%0A++++++const+lastStep+%3D+steps.length+-+1%3B%0A++++++const+currentStep+%3D+steps%5Bstep%5D%3B%0A++++++await+playground.setConfig%28currentStep.config%29%3B%0A++++++step+%3D+step+%3C+lastStep+%3F+step+%2B+1+%3A+0%3B%0A++++++%2F%2F+highlight-end%0A++++%7D%29%3B%0A++%7D%29%3B%0A%3C%2Fscript%3E%0A&amp;amp;css=body+%7B+margin%3A+50px+2em%3B+%7D"&gt;Preview&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;The variable &lt;code&gt;step&lt;/code&gt; keeps track of the step index. The corresponding data is read from the &lt;code&gt;steps&lt;/code&gt; array and sent to the playground.&lt;/p&gt;

&lt;p&gt;However, there is now a lot of duplication in the code of each step. Also, if the student makes some changes to the HTML, the next step will overwrite them.&lt;/p&gt;

&lt;p&gt;So, let's read the current &lt;code&gt;config&lt;/code&gt; object from the playground (using the method &lt;a href="https://livecodes.io/docs/sdk/js-ts#getconfig"&gt;&lt;code&gt;getConfig&lt;/code&gt;&lt;/a&gt;) and then merge the changes for the new step. Now, we can remove the duplication in steps.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"next"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Next&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPlayground&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://unpkg.com/livecodes@0.4.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;markup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;h1&amp;gt;Hello,&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  &amp;lt;span id="title"&amp;gt;World&amp;lt;/span&amp;gt;!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// remove duplication&lt;/span&gt;
        &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#title {&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  color: blue;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;    
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;appUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://v25.livecodes.io&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;markup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Welcome to the tutorial!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nf"&gt;createPlayground&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#container&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;playground&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextBtn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#next&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;nextBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lastStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currentStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
      &lt;span class="c1"&gt;// get previous config&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prevConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;playground&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getConfig&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="c1"&gt;// merge previous with new config&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;playground&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;prevConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;currentStep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;lastStep&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;&lt;a href="https://livecodes.io/?mode=result&amp;amp;html=%3Cdiv+id%3D%22container%22%3E%3C%2Fdiv%3E%0A%3Cbutton+id%3D%22next%22%3ENext%3C%2Fbutton%3E%0A%0A%3Cscript+type%3D%22module%22%3E%0A++import+%7B+createPlayground+%7D+from+%22https%3A%2F%2Funpkg.com%2Flivecodes%400.1.2%22%3B%0A%0A++const+steps+%3D+%5B%0A++++%7B%0A++++++config%3A+%7B%0A++++++++markup%3A+%7B%0A++++++++++language%3A+%22html%22%2C%0A++++++++++content%3A+%27%3Ch1%3EHello%2C%5Cn++%3Cspan+id%3D%22title%22%3EWorld%3C%2Fspan%3E%21%5Cn%3C%2Fh1%3E%27%2C%0A++++++++%7D%2C%0A++++++%7D%2C%0A++++%7D%2C%0A++++%7B%0A++++++%2F%2F+highlight-start%0A++++++config%3A+%7B%0A++++++++style%3A+%7B%0A++++++++++language%3A+%27css%27%2C%0A++++++++++content%3A+%27%23title+%7B%5Cn++color%3A+blue%3B%5Cn%7D%27%2C%0A++++++++%7D%2C%0A++++++%7D%2C%0A++++++%2F%2F+highlight-end%0A++++%7D%2C++++%0A++%5D%3B%0A%0A++const+options+%3D+%7B%0A++++appUrl%3A+%22https%3A%2F%2Fv25.livecodes.io%22%2C%0A++++config%3A+%7B%0A++++++markup%3A+%7B%0A++++++++language%3A+%22html%22%2C%0A++++++++content%3A+%22Welcome+to+the+tutorial%21%22%2C%0A++++++%7D%2C%0A++++%7D%2C%0A++%7D%3B%0A%0A++createPlayground%28%22%23container%22%2C+options%29.then%28%28playground%29+%3D%3E+%7B%0A++++let+step+%3D+0%3B%0A++++const+nextBtn+%3D+document.querySelector%28%22%23next%22%29%3B%0A++++nextBtn.addEventListener%28%22click%22%2C+async+%28%29+%3D%3E+%7B%0A++++++const+lastStep+%3D+steps.length+-+1%3B%0A++++++const+currentStep+%3D+steps%5Bstep%5D%3B%0A++++++%2F%2F+highlight-start%0A++++++const+prevConfig+%3D+step+%3D%3D%3D+0+%3F+options.config+%3A+await+playground.getConfig%28%29%3B%0A++++++await+playground.setConfig%28%7B+...prevConfig%2C+...currentStep.config+%7D%29%3B%0A++++++%2F%2F+highlight-end%0A++++++step+%3D+step+%3C+lastStep+%3F+step+%2B+1+%3A+0%3B%0A++++%7D%29%3B%0A++%7D%29%3B%0A%3C%2Fscript%3E%0A&amp;amp;css=body+%7B+margin%3A+50px+2em%3B+%7D"&gt;Preview&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Changing Layout
&lt;/h2&gt;

&lt;p&gt;We still have a problem!&lt;/p&gt;

&lt;p&gt;Although we were able to add CSS code, the style editor was not activated. We can correct this by using the &lt;a href="https://livecodes.io/docs/sdk/js-ts#show"&gt;&lt;code&gt;show&lt;/code&gt;&lt;/a&gt; method.&lt;/p&gt;

&lt;p&gt;We can even control the position of the cursor, so that your student is guided where to start typing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"next"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Next&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPlayground&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://unpkg.com/livecodes@0.4.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// active editor and cursor position&lt;/span&gt;
      &lt;span class="na"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;markup&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;markup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;h1&amp;gt;Hello,&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  &amp;lt;span id="title"&amp;gt;World&amp;lt;/span&amp;gt;!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;style&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#title {&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  color: blue;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;    
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;appUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://v25.livecodes.io&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;markup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Welcome to the tutorial!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nf"&gt;createPlayground&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#container&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;playground&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextBtn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#next&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;nextBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lastStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currentStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prevConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;playground&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getConfig&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;playground&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;prevConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;currentStep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="c1"&gt;// set layout&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;playground&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentStep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;currentStep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;lastStep&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;&lt;a href="https://livecodes.io/?mode=result&amp;amp;html=%3Cdiv+id%3D%22container%22%3E%3C%2Fdiv%3E%0A%3Cbutton+id%3D%22next%22%3ENext%3C%2Fbutton%3E%0A%0A%3Cscript+type%3D%22module%22%3E%0A++import+%7B+createPlayground+%7D+from+%22https%3A%2F%2Funpkg.com%2Flivecodes%400.1.2%22%3B%0A%0A++const+steps+%3D+%5B%0A++++%7B%0A++++++%2F%2F+highlight-start%0A++++++panel%3A+%27markup%27%2C%0A++++++position%3A+%7B+line%3A+2%2C+column%3A+20+%7D%2C%0A++++++%2F%2F+highlight-end%0A++++++config%3A+%7B%0A++++++++markup%3A+%7B%0A++++++++++language%3A+%22html%22%2C%0A++++++++++content%3A+%27%3Ch1%3EHello%2C%5Cn++%3Cspan+id%3D%22title%22%3EWorld%3C%2Fspan%3E%21%5Cn%3C%2Fh1%3E%27%2C%0A++++++++%7D%2C%0A++++++%7D%2C%0A++++%7D%2C%0A++++%7B%0A++++++%2F%2F+highlight-start%0A++++++panel%3A+%27style%27%2C%0A++++++position%3A+%7B+line%3A+2%2C+column%3A+10+%7D%2C%0A++++++%2F%2F+highlight-end%0A++++++config%3A+%7B%0A++++++++style%3A+%7B%0A++++++++++language%3A+%27css%27%2C%0A++++++++++content%3A+%27%23title+%7B%5Cn++color%3A+blue%3B%5Cn%7D%27%2C%0A++++++++%7D%2C%0A++++++%7D%2C%0A++++%7D%2C++++%0A++%5D%3B%0A%0A++const+options+%3D+%7B%0A++++appUrl%3A+%22https%3A%2F%2Fv25.livecodes.io%22%2C%0A++++config%3A+%7B%0A++++++markup%3A+%7B%0A++++++++language%3A+%22html%22%2C%0A++++++++content%3A+%22Welcome+to+the+tutorial%21%22%2C%0A++++++%7D%2C%0A++++%7D%2C%0A++%7D%3B%0A%0A++createPlayground%28%22%23container%22%2C+options%29.then%28%28playground%29+%3D%3E+%7B%0A++++let+step+%3D+0%3B%0A++++const+nextBtn+%3D+document.querySelector%28%22%23next%22%29%3B%0A++++nextBtn.addEventListener%28%22click%22%2C+async+%28%29+%3D%3E+%7B%0A++++++const+lastStep+%3D+steps.length+-+1%3B%0A++++++const+currentStep+%3D+steps%5Bstep%5D%3B%0A++++++const+prevConfig+%3D+step+%3D%3D%3D+0+%3F+options.config+%3A+await+playground.getConfig%28%29%3B%0A++++++await+playground.setConfig%28%7B+...prevConfig%2C+...currentStep.config+%7D%29%3B%0A++++++%2F%2F+highlight-next-line%0A++++++await+playground.show%28currentStep.panel%2C+currentStep.position%29%3B%0A++++++step+%3D+step+%3C+lastStep+%3F+step+%2B+1+%3A+0%3B%0A++++%7D%29%3B%0A++%7D%29%3B%0A%3C%2Fscript%3E%0A&amp;amp;css=body+%7B+margin%3A+50px+2em%3B+%7D"&gt;Preview&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Now, let's add some steps for JavaScript code. We can even open the integrated &lt;a href="https://livecodes.io/docs/features/console"&gt;console&lt;/a&gt; to show logs. Let's also change the text of the "next" button with each step.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"next"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Start Tutorial&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPlayground&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://unpkg.com/livecodes@0.4.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;btnText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;markup&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;markup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;h1&amp;gt;Hello,&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  &amp;lt;span id="title"&amp;gt;World&amp;lt;/span&amp;gt;!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;btnText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;style&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#title {&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  color: blue;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// add new steps&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;btnText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;script&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;javascript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;// change this value to "LiveCodes"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;const newTitle = "???";&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;document.querySelector("#title").textContent = newTitle;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;console.log(newTitle);&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;btnText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Final Result&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;console&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;btnText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Restart Tutorial&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;result&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;appUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://v25.livecodes.io&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;markup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Welcome to the tutorial!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nf"&gt;createPlayground&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#container&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;playground&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextBtn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#next&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;nextBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lastStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currentStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prevConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;playground&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getConfig&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;playground&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;prevConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;currentStep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;playground&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentStep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;currentStep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="c1"&gt;// change the button text for new steps&lt;/span&gt;
      &lt;span class="nx"&gt;nextBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;currentStep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;btnText&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;lastStep&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;&lt;a href="https://livecodes.io/?mode=result&amp;amp;html=%3Cdiv+id%3D%22container%22%3E%3C%2Fdiv%3E%0A%3C%21--+highlight-next-line+--%3E%0A%3Cbutton+id%3D%22next%22%3EStart+Tutorial%3C%2Fbutton%3E%0A%0A%3Cscript+type%3D%22module%22%3E%0A++import+%7B+createPlayground+%7D+from+%22https%3A%2F%2Funpkg.com%2Flivecodes%400.1.2%22%3B%0A%0A++const+steps+%3D+%5B%0A++++%7B%0A++++++%2F%2F+highlight-next-line%0A++++++btnText%3A+%27Next%27%2C%0A++++++panel%3A+%27markup%27%2C%0A++++++position%3A+%7B+line%3A+2%2C+column%3A+20+%7D%2C%0A++++++config%3A+%7B%0A++++++++markup%3A+%7B%0A++++++++++language%3A+%22html%22%2C%0A++++++++++content%3A+%27%3Ch1%3EHello%2C%5Cn++%3Cspan+id%3D%22title%22%3EWorld%3C%2Fspan%3E%21%5Cn%3C%2Fh1%3E%27%2C%0A++++++++%7D%2C%0A++++++%7D%2C%0A++++%7D%2C%0A++++%7B%0A++++++%2F%2F+highlight-next-line%0A++++++btnText%3A+%27Next%27%2C%0A++++++panel%3A+%27style%27%2C%0A++++++position%3A+%7B+line%3A+2%2C+column%3A+10+%7D%2C%0A++++++config%3A+%7B%0A++++++++style%3A+%7B%0A++++++++++language%3A+%27css%27%2C%0A++++++++++content%3A+%27%23title+%7B%5Cn++color%3A+blue%3B%5Cn%7D%27%2C%0A++++++++%7D%2C%0A++++++%7D%2C%0A++++%7D%2C%0A++++%2F%2F+highlight-start%0A++++%7B%0A++++++btnText%3A+%27Next%27%2C%0A++++++panel%3A+%27script%27%2C%0A++++++position%3A+%7B+line%3A+2%2C+column%3A+19+%7D%2C%0A++++++config%3A+%7B%0A++++++++script%3A+%7B%0A++++++++++language%3A+%27javascript%27%2C%0A++++++++++content%3A%0A++++++++++++%27%2F%2F+change+this+value+to+%22LiveCodes%22%5Cnconst+newTitle+%3D+%22%3F%3F%3F%22%3B%5Cndocument.querySelector%28%22%23title%22%29.textContent+%3D+newTitle%3B%5Cnconsole.log%28newTitle%29%3B%27%2C%0A++++++++%7D%2C%0A++++++%7D%2C%0A++++%7D%2C%0A++++%7B%0A++++++btnText%3A+%27Final+Result%27%2C%0A++++++panel%3A+%27console%27%2C%0A++++%7D%2C%0A++++%7B%0A++++++btnText%3A+%27Restart+Tutorial%27%2C%0A++++++panel%3A+%27result%27%2C%0A++++%7D%2C%0A++++%2F%2F+highlight-end%0A++%5D%3B%0A%0A++const+options+%3D+%7B%0A++++appUrl%3A+%22https%3A%2F%2Fv25.livecodes.io%22%2C%0A++++config%3A+%7B%0A++++++markup%3A+%7B%0A++++++++language%3A+%22html%22%2C%0A++++++++content%3A+%22Welcome+to+the+tutorial%21%22%2C%0A++++++%7D%2C%0A++++%7D%2C%0A++%7D%3B%0A%0A++createPlayground%28%22%23container%22%2C+options%29.then%28%28playground%29+%3D%3E+%7B%0A++++let+step+%3D+0%3B%0A++++const+nextBtn+%3D+document.querySelector%28%22%23next%22%29%3B%0A++++nextBtn.addEventListener%28%22click%22%2C+async+%28%29+%3D%3E+%7B%0A++++++const+lastStep+%3D+steps.length+-+1%3B%0A++++++const+currentStep+%3D+steps%5Bstep%5D%3B%0A++++++const+prevConfig+%3D+step+%3D%3D%3D+0+%3F+options.config+%3A+await+playground.getConfig%28%29%3B%0A++++++await+playground.setConfig%28%7B+...prevConfig%2C+...currentStep.config+%7D%29%3B%0A++++++await+playground.show%28currentStep.panel%2C+currentStep.position%29%3B%0A++++++%2F%2F+highlight-next-line%0A++++++nextBtn.textContent+%3D+currentStep.btnText%3B%0A++++++step+%3D+step+%3C+lastStep+%3F+step+%2B+1+%3A+0%3B%0A++++%7D%29%3B%0A++%7D%29%3B%0A%3C%2Fscript%3E%0A&amp;amp;css=body+%7B+margin%3A+50px+2em%3B+%7D"&gt;Preview&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Assignments
&lt;/h2&gt;

&lt;p&gt;So, we are progressing very well!&lt;/p&gt;

&lt;p&gt;Now we want our student to complete a task. We then need to validate if the task was completed successfully. This can be achieved by running &lt;a href="https://livecodes.io/docs/features/tests"&gt;automated tests&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;LiveCodes supports running automated tests using Jest and Testing Library. You may test the page DOM or test the &lt;a href="https://livecodes.io/docs/features/tests/#importing-code"&gt;code exported from the script editor&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let's write some tests for our tutorial.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;screen&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@testing-library/dom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@testing-library/jest-dom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Should display title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;exact&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;})).&lt;/span&gt;&lt;span class="nf"&gt;toHaveTextContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, LiveCodes!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Title should be blue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getComputedStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rgb(0, 0, 255)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We test that the student was indeed able to complete the task (by changing the value of the variable &lt;code&gt;newTitle&lt;/code&gt; to become &lt;code&gt;"LiveCodes"&lt;/code&gt;). Also we are testing the color of the title.&lt;/p&gt;

&lt;p&gt;These tests can be added to &lt;a href="https://livecodes.io/docs/configuration/configuration-object#tests"&gt;&lt;code&gt;tests&lt;/code&gt;&lt;/a&gt; property of the &lt;a href="https://livecodes.io/docs/configuration/configuration-object"&gt;&lt;code&gt;config&lt;/code&gt; object&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We can then run the tests using the SDK method &lt;a href="https://livecodes.io/docs/sdk/js-ts#runtests"&gt;&lt;code&gt;runTests&lt;/code&gt;&lt;/a&gt;. This method returns a promise that resolves to the test results, which we can then show to our student.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Result
&lt;/h2&gt;

&lt;p&gt;Check the &lt;a href="https://livecodes.io/?mode=result&amp;amp;x=code/N4IgLglmA2CmIC4QFUB2kawCYAIAKATgPYBWsAxmCADQhawDO5BEADpEaoiDeAIYBzBogDaAXVp9KEAG6wAolihEC3ALZ8CAawCurXhu17EoaH1QCdg+EgAWYNdF7lOYWOm4AeAIRYilAE9WWBx7RwA+AB0CSNRPMOgcMwsAXkiQd3SomNQcHHjYPixs2Ly8zzVYMD4ccltNBiq0lAAVADEAWgAOdJwAehLcsoqqmvswVg7YAEcdWWaADQ7kAEEOgGEiNVY+SAAjOF6XdHcwZoBJeRTsAVhegejS4crqnFQ+SuaZCFgAd1YVGAjq5Ts1fhAsGBbCl6N9yLAOuDIbZqDgIKgoBA+NAOkxsbAUgBGAB0AAZ7oMyvkMHBwgAZWSwTb0Bg4Fo6MAqLGJAAisDURE8fRpsEpwwYYACtMeQypeyIWACOGAMqpVKUDFYZgCCBwADM4AAPADcqrVeQNsENHSUBAoHFQupc0B0alQppy5otrl1pOJAE5+TgGOYGLjYCw9R6nuaSDoJRA9QEOsc3OgnacI9HZWrDAJ0bqAKyk1iGnAAJn52fNAF8zVTbITlfW1W5DWAOtiIAJHbVMwRq169a5cRAAF6wXUkwtVltU50qXUEAR7AAUAHZy6jN9vywBKQdUuuetUAYlTfHREebJ-Ntlg3fsuoAbKSZLZD7nNPne3wOURPzyY8YzKc9XGIaBWRVW81WgCAJVxSU4F1VBOFgQCyg1LU+B1fUjQwvIBD4Vgp1nGCqTjBMkxTEF0z7E4BznMpLWtX4CGI3U2OIgicA0ViIShKdSVJABSHi8wLHBCTIkCqR2LAlAsX0MOAnM8jA9AINZPYOU5XJoNksokUEqSZzUHj70fMBdUrcymLyPYpC0ARiB0VAsBo6BFxwZc13LAAWABmVEAuCisgoPeycHlAh6AIKdS2DIg4NwFzYACHiYrijp2KUeMbNLHjyB0AgGG8gF0TcRjyLKBd4pwLBNC0BgzDcNKMqirDtV1FieMoyBqNTU4MwYniux7DooH5BgRqqlSmNPO0GB0aAwBvQy8gk3tpLsmq8jbDtxt7eFRqY1TzUWxgVrAYllvIeEGCgqK6t1NL3HmmrLuW1biT1S9EgMtTauS7y7SwD6QKFCUpVFM0hXvIoxU8eVFTFcolBkNEsGaC8rxiEBwiFDG0fyDGsZx8DkoYLImOR3TOHJ9JUCtIECYAZWqAg1vZTkWGxIUdLAPSSfKQW9MZ8BGFZ8J1nvcgtBwABZJU2eSjkIE4AX6dQEmidkXWyYhZoluurI9ZkXWmBYdgcElYJmgFLAVruAmmIgbZAWVWo7V2WA8G1FyiDc3Aa31Yg1BwABycZWBmvo+jc1hnOJFw1D6OC5BcFkAAE-RJctI+zJjjglYM3FjnAUhwEQosBr0yj2MBUBaFndUjgA5FnI+oKK8h2ZnoDbwxdFYbve5wAEGExThdWAJIrxs1FnVdXty1JHAax7vbgdQPVu1n8fNqavQD+381kksaw24SMez7VIa6Mj+JCXCAAJWBoC8nunk8TVzAlkUWQADqKhoBYChv3cI3hIixHhi-W+G01Sb3Hsg7eqDEF13rtFJuLd2xt07u2BBQM5LmA-m3aGcAiFYInkQKeDpZ7z2ZovWoas3RCQ3lvRBeRjh7wEKfLhZQKGTnWsQr0F8rC3DbuQR6VDqE7zTNZKOp4RTNieC9aKLp0IwNQDWWR1D0GiKApw0RBj66YPro3Zurco4ELAHor0-cyFRytmwOxxjqGT2nr2OecEmEViXqw7a-oOHjx4fvERcjgzMFcfwwxsFzCX0kVHEgfAZB8Bcewex1CH7WUPmqSO8daj1AsCEKE8EcBpM0bbIgOB0gMjkMyRg6RtElzWszX4LQoBwErrUkAAB+AZ6RTSxD8MVSo6BiSzAjAENmH97QqFXOkZRXSXZ7mJAdTYJx0A9PaZ0zAwzUAl2SrAYkXkBCrl2Ssg8WSvSmKwXc2s7ivTmK9JY3BijI5tHRNiHAAAlK6q0bkkIHlIzgZVKFPMebXcebzrGR3+RKTQ3N-x82gECsojjB5RxNoCyFSC8V5DEEXGqrScBEHYBrVArIq4vKpMRVgyACBYujkLWOCB44yEJH6DOFAFSMGJBrPo6KvJFHRHwqOhRbgEHRWE8VtKvxGBIhEuR4ir5RxvgSr0OS25AI-qnUpNSoSlJRdybwyMCDhA5ki6KSpyBwXlmK2295ora2ih-IgvxiToqMePNwEoZrKuoaqpJkcUlpIyW4vJ2q8l5Eju7AEXMvZW1gO4DeYcti9Ozn6yAFgOhwT2OxAgAQ+h+DUEM7R8bPbpCzVLMVeaIAFs0MWsgCFS3ltiNo7NiyQBs1sEHMBDV4LYSVIAmgOB0kBEOTgVce5K7hFUUMK0wRKCrmTe4YktwwAACEAjvO7e-T+RB0iojnlaKQii-qQRCDWPcazOSv1SbAd5myFGLJAukA9X8cD1KZHyhg0CQDaLyJFWIN6Dmdqlt2vZ3SGB9pWrgPYIQDg6BdqiCdU6Z1zoXdwsFa0hE9PBO5D1G6qibG2BybAHMYarlGa6U4kyUNFtmXASgCylmjtvQcvIS77SrqQicuqd6iBbtgN23yq5SSokkxWQshY9zpBAzo65mqjwqZCTVGsxLDLMEKG4f2OFA7B1XJHDS1Q8bdzJRSsFd77yoFXKuYdhn3KzpSPO+VeQ4B4fLj00kRVcNvBZlupuPTaPjJulMpjczWMEGM6eZmhDIrb1JdmhgQXchV1C-RiLMyou81i9myOiXEHJalgi66IX-B0Ymdl5j8yYsmZxXYorqAorxe3U3YkRQsDyDkOgBkEp3ARmM3aiA8sLPofINOlzbnQn+bMBKDmsBWA9IG7HU57gBBQhwB0KSPEcNUrWsVAgdp0CLeW1XVbDARCraJbNg7E87QyE2bwlb3mUjvZwOvPplmHQMBTpwF7uo+C-EvGtRzrl3IkbAM97sM6tNxOB6DieAcIdYFuqRgHsO57Ehx6wR7MOBCohxynEqJ2wBnf+7vbsG9mvUMR1AZHBnUe3T7b8VcR2ycU8xUvUnpwue0K8c18ebW0vrJZi+04PSOd8-LsSWF7Y9tlyW695XngkjpPJ9577q2cAAGopI4GUlFMDMooopdF11nrpx+tpiG5HEbY20MMEnZNzDrnA1emzWVn6GzaJrSrpHWWFAtCOoCEHAgSUXQOmJ4XX1pWAU3TtekhgNviR2gFHIYzd0HoMEK4rr3CeU7zZT-BG66eiCZ8jn9CAaKhd31JXPRrrJQ5V3p2DlHQdIcEDci3f1cPx6JmnU326WxROrka9NnyhfEVgHjJXD7Vf-qFdne51s8fvo3V91s-3UcgHEAsOOqlvwIyojAEW8dRF0TeFj3ffa6-rpF+T6nrrxnq+18V3fiU3vE-F9T+Xyv2ejAuetO9yOAH8jQHu9cBeG+Yu7YEu2yAemwx29oh+DAx+BAqIx+n8DUaE1+H+ts9+P0Sej0z+CkWeOg90QBeeeS0BD+xBJeEoae-IFeomi+Ne1Bd850tyIBR4PB+QfQEaSMfQKMAQgw8MDg0A4QIAm8IAQiJgIAwaNgIA0iwgtAOS3A0htAEa8hih3AYa6S0S7AzgfuGhMhQisGKaYAwgCA4gWhhhVhogEgyhj0hAjAVQGhtAeO-gQBKg1hthyh8YnIagsyQsYq1hwAMhlaXM4RMhdsjAJgsRUs4RChCSEiShcR2hahJhSAmhIAcgpUlK3AXK0hQAA"&gt;final result&lt;/a&gt; after adding tests, styles and some final touches. See it in action on &lt;a href="https://blog.livecodes.io/lets-make-an-interactive-coding-tutorial#final-result"&gt;LiveCodes blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fud2mflgiak6g24gpbrk7.png" class="article-body-image-wrapper"&gt;&lt;img alt="Final result for tutorial demo" src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fud2mflgiak6g24gpbrk7.png" width="800" height="342"&gt;&lt;/a&gt;&lt;br&gt;A screenshot for the final result of the tutorial demo
  &lt;/p&gt;

&lt;h2&gt;
  
  
  Full Code
&lt;/h2&gt;

&lt;p&gt;The full code in vanilla JavaScript and also in React TSX can be found &lt;a href="https://blog.livecodes.io/lets-make-an-interactive-coding-tutorial/#full-code"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;That was an interesting project to build!&lt;/p&gt;

&lt;p&gt;Using LiveCodes SDK, we have built a very basic tutorial where the student can learn how to add HTML elements, style them with CSS and change the text content with JavaScript. We were even able to check if the assignment was completed successfully.&lt;/p&gt;

&lt;p&gt;During our work, we had an idea about the LiveCodes SDK and how to use it. Please refer to the &lt;a href="https://livecodes.io/docs/sdk"&gt;SDK documentations&lt;/a&gt; for more details.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;You can now make your tutorials a lot more interactive and fun with LiveCodes. These tutorials can use any of the supported &lt;a href="https://livecodes.io/docs/languages"&gt;languages and frameworks&lt;/a&gt;. Tutorials may also cover your own libraries (with full editor &lt;a href="https://livecodes.io/docs/features/intellisense"&gt;IntelliSense&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;You may want to create full courses and even sell them. LiveCodes is &lt;a href="https://livecodes.io/docs/license"&gt;MIT-licensed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Your imagination is the limit!&lt;/p&gt;

&lt;h2&gt;
  
  
  Tell Us What You Think
&lt;/h2&gt;

&lt;p&gt;Please &lt;a href="https://github.com/live-codes/livecodes/discussions"&gt;let us know&lt;/a&gt; what you think. If you have a case that the SDK does not cover, &lt;a href="https://github.com/live-codes/livecodes/issues"&gt;tell us about it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you do use LiveCodes for your tutorials/courses, we would &lt;a href="https://livecodes.io/docs/contact"&gt;love to know&lt;/a&gt; about them (we may even link to them!). And if you find LiveCodes to be useful, please &lt;a href="https://github.com/live-codes/livecodes"&gt;give us a star on GitHub&lt;/a&gt; and please consider becoming a &lt;a href="https://livecodes.io/docs/sponsor"&gt;sponsor&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What will you learn/build/teach today?&lt;/p&gt;

</description>
      <category>livecodes</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Introducing LiveCodes 🎉</title>
      <dc:creator>Hatem Hosny</dc:creator>
      <pubDate>Fri, 04 Aug 2023 16:29:59 +0000</pubDate>
      <link>https://dev.to/livecodes_io/introducing-livecodes-3300</link>
      <guid>https://dev.to/livecodes_io/introducing-livecodes-3300</guid>
      <description>&lt;p&gt;&lt;a href="https://livecodes.io" rel="noopener noreferrer"&gt;LiveCodes&lt;/a&gt; is here! 🎊&lt;/p&gt;

&lt;p&gt;A Code Playground That Just Works!&lt;/p&gt;

&lt;p&gt;I'm thrilled to announce the public release of LiveCodes, a feature-rich, open-source, client-side, code playground that supports 80+ languages and frameworks. With LiveCodes, learning, prototyping, experimenting, documenting, teaching, and sharing code is easier and more enjoyable than ever.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;This article was originally published at &lt;a href="https://blog.livecodes.io/introducing-livecodes" rel="noopener noreferrer"&gt;LiveCodes blog&lt;/a&gt;&lt;/small&gt;.&lt;/p&gt;



&lt;h2&gt;
  
  
  Outline
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Why another playground?&lt;/li&gt;
&lt;li&gt;Show me a demo&lt;/li&gt;
&lt;li&gt;What are the main features?&lt;/li&gt;
&lt;li&gt;How do I get started?&lt;/li&gt;
&lt;li&gt;Can I self-host it?&lt;/li&gt;
&lt;li&gt;What about commercial use?&lt;/li&gt;
&lt;li&gt;Can I use LiveCodes today?&lt;/li&gt;
&lt;li&gt;Can I contribute?&lt;/li&gt;
&lt;li&gt;Let's start coding!&lt;/li&gt;
&lt;li&gt;Where can I learn more?&lt;/li&gt;
&lt;/ul&gt;





&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/live-codes" rel="noopener noreferrer"&gt;
        live-codes
      &lt;/a&gt; / &lt;a href="https://github.com/live-codes/livecodes" rel="noopener noreferrer"&gt;
        livecodes
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Code Playground That Just Works!
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://www.techforpalestine.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/85448fc0867c409bb30f95e015f57830d6ac55817af8f0dece66f680a114b68b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2546302539462538372542352546302539462538372542385f4365617365666972655f4e6f772d74656368666f7270616c657374696e652e6f72672d4438333833383f636f6c6f723d443833383338" alt="Ceasefire_Now-techforpalestine.org"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LiveCodes&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Code Playground That Just Works!&lt;/p&gt;
&lt;p&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/dd157fcbfe20550eabd9a13c9696bcffbdb3e2a19073cb6aa7e0599d84563aa9/68747470733a2f2f6465762e6c697665636f6465732e696f2f646f63732f696d672f6c697665636f6465732d6c6f676f2e737667"&gt;&lt;img width="300" src="https://camo.githubusercontent.com/dd157fcbfe20550eabd9a13c9696bcffbdb3e2a19073cb6aa7e0599d84563aa9/68747470733a2f2f6465762e6c697665636f6465732e696f2f646f63732f696d672f6c697665636f6465732d6c6f676f2e737667"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://livecodes.io/docs/features/" rel="nofollow noopener noreferrer"&gt;feature-rich&lt;/a&gt;, open-source, &lt;strong&gt;client-side&lt;/strong&gt; code playground for React, Vue, Svelte, Solid, Typescript, Python, Go, Ruby, PHP and &lt;a href="https://livecodes.io/docs/languages/" rel="nofollow noopener noreferrer"&gt;90+ languages/frameworks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://status.livecodes.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/080974d5fe33fe827a10490cdbdbf71dc989889590dace39be40c60b656198b4/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f6c6976652d636f6465732f75707074696d652f6d61737465722f6170692f6c6976652d636f6465732f757074696d652e6a736f6e" alt="LiveCodes: uptime status"&gt;&lt;/a&gt;
&lt;a href="https://livecodes.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f2d20911202658711e69d831ae624fae345503939b65c2e8196133841e6f9b94/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f6c6976652d636f6465732f6c697665636f6465733f6c6162656c3d617070" alt="LiveCodes: app version"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/livecodes" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2c1085120aad85bf7b6c2520491dbb0b6f8306c4f7767e3a3be80a15bdd76424/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f6c697665636f646573" alt="LiveCodes: npm version"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/livecodes" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bae264cfe18b14d3c044205b54e48506706d3014fcf67ca35cfc7c40608a61d4/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f6c697665636f646573" alt="LiveCodes: npm downloads"&gt;&lt;/a&gt;
&lt;a href="https://www.jsdelivr.com/package/npm/livecodes" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6f0c3247da87777b6c95444bbc38b918e0a7bd4bc3135c820ab89f9e63d3331a/68747470733a2f2f646174612e6a7364656c6976722e636f6d2f76312f7061636b6167652f6e706d2f6c697665636f6465732f62616467653f7374796c653d726f756e646564" alt="LiveCodes: jsdelivr downloads"&gt;&lt;/a&gt;
&lt;a href="https://livecodes.io/docs/languages/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c5736538c6bb3a47e13878e9047cbc6a1e31779b711e5e1830b944d306712125/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c616e6775616765732d39312d626c7565" alt="LiveCodes: languages"&gt;&lt;/a&gt;
&lt;a href="https://www.codacy.com/gh/live-codes/livecodes/dashboard?utm_source=github.com&amp;amp;utm_medium=referral&amp;amp;utm_content=live-codes/livecodes&amp;amp;utm_campaign=Badge_Grade" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7d9fcc1d1b11a519dec03994bebe2a5ff99f9d62e058f79769496e9255e5dd0c/68747470733a2f2f6170702e636f646163792e636f6d2f70726f6a6563742f62616467652f47726164652f3364333966313536313865303438646239643133633261306538303032623333" alt="Codacy Badge"&gt;&lt;/a&gt;
&lt;a href="https://app.lokalise.com/public/34958094667a72e9454592.95108106/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0f7c88636f4f25330ac3b1a0b9e8ef5b6aabbf25fb6e3d408245fe33a7ec23f0/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f6c6976652d636f6465732f6c6f6b616c6973652d62616467652f6d61696e2f62616467652e6a736f6e" alt="LiveCodes: i18n on Lokalise"&gt;&lt;/a&gt;
&lt;a href="https://github.com/live-codes/livecodes/blob/develop/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f5f262b83296435a5b7632460ee7d0bcbf8e8936c835a983ca103511030d87dc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6c6976652d636f6465732f6c697665636f646573" alt="license - MIT"&gt;&lt;/a&gt;
&lt;a href="https://github.com/live-codes/livecodes" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d2f61a6cba46c91f359389df7b8d41053686b4efb21dd1b4f09292bc5cb837a8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6c6976652d636f6465732f6c697665636f6465733f7374796c653d736f6369616c" alt="LiveCodes: GitHub repo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://livecodes.io" rel="nofollow noopener noreferrer"&gt;Try it now on livecodes.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://livecodes.io/docs" rel="nofollow noopener noreferrer"&gt;Documentations&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://livecodes.io/docs/why" rel="nofollow noopener noreferrer"&gt;What makes LiveCodes different?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/dcad072e7bf5062b44cbc96d373de70715151aebb1e01f15e693997e7ca04e84/68747470733a2f2f6465762e6c697665636f6465732e696f2f646f63732f696d672f73637265656e73686f74732f6c697665636f6465732d6c616e6775616765732e6a7067"&gt;&lt;img src="https://camo.githubusercontent.com/dcad072e7bf5062b44cbc96d373de70715151aebb1e01f15e693997e7ca04e84/68747470733a2f2f6465762e6c697665636f6465732e696f2f646f63732f696d672f73637265656e73686f74732f6c697665636f6465732d6c616e6775616765732e6a7067" alt="LiveCodes list of languages screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Code Playground That Just Works!&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;No servers to configure (or pay for!)&lt;/li&gt;
&lt;li&gt;No databases to maintain (or pay for!)&lt;/li&gt;
&lt;li&gt;No installs&lt;/li&gt;
&lt;li&gt;No configuration files&lt;/li&gt;
&lt;li&gt;No build steps&lt;/li&gt;
&lt;li&gt;No subscription fees (free and open-source)&lt;/li&gt;
&lt;li&gt;No account required *&lt;/li&gt;
&lt;li&gt;No limits for usage (unlimited private projects)&lt;/li&gt;
&lt;li&gt;90+ languages/frameworks/processors&lt;/li&gt;
&lt;li&gt;Large set of features and integrations&lt;/li&gt;
&lt;li&gt;Import code from a wide variety of sources&lt;/li&gt;
&lt;li&gt;Use modules from npm, deno.land/x, jsr, GitHub, and others&lt;/li&gt;
&lt;li&gt;Easily embed it in your web pages&lt;/li&gt;
&lt;li&gt;It runs in the browser (client-side)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;* GitHub account is required only for features that use &lt;a href="https://livecodes.io/docs/features/github-integration" rel="nofollow noopener noreferrer"&gt;GitHub Integration&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Quick Start&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Standalone App&lt;/h4&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://livecodes.io" rel="nofollow noopener noreferrer"&gt;livecodes.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;... and enjoy all the &lt;a href="https://livecodes.io/docs/features/" rel="nofollow noopener noreferrer"&gt;features&lt;/a&gt;!&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Embedded Playground&lt;/h4&gt;

&lt;/div&gt;
&lt;p&gt;Add this…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/live-codes/livecodes" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  Why another playground?
&lt;/h2&gt;

&lt;p&gt;With already existing excellent playgrounds, LiveCodes tries to be different. The major differences include:&lt;/p&gt;
&lt;h3&gt;
  
  
  Language Support
&lt;/h3&gt;

&lt;p&gt;Currently, there are 80+ languages/frameworks supported. These include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web languages (HTML, CSS &amp;amp; JavaScript).&lt;/li&gt;
&lt;li&gt;Web frameworks/libraries (e.g. React JSX/TSX, Vue SFC, Svelte SFC, Solid, MDX, Astro).&lt;/li&gt;
&lt;li&gt;Languages that transpile to JavaScript (e.g. TypeScript, CoffeeScript, LiveScript, ReScript).&lt;/li&gt;
&lt;li&gt;Languages/frameworks that generate CSS (e.g. SCSS, Less, Stylus, Tailwind CSS, UnoCSS).&lt;/li&gt;
&lt;li&gt;CSS processors (e.g. PostCSS, Autoprefixer, Lightning CSS, CSS Modules, cssnano).&lt;/li&gt;
&lt;li&gt;Traditional programming languages (e.g. Python, Ruby, Go, PHP, C++, R, Lua, Scheme, Perl).&lt;/li&gt;
&lt;li&gt;Data manipulation/logic languages (e.g. SQL, Prolog).&lt;/li&gt;
&lt;li&gt;Authoring/templating languages (e.g Markdown, AsciiDoc, Pug, Handlebars, Haml).&lt;/li&gt;
&lt;li&gt;Low-code/visual editors (e.g. blockly, rich text editor).&lt;/li&gt;
&lt;li&gt;Modeling languages/diagram-as-code (e.g. Gnuplot, Graphviz, Mermaid, Vega, Plotly).&lt;/li&gt;
&lt;li&gt;Languages that target WebAssembly (e.g. AssemblyScript, WebAssembly Text Format).&lt;/li&gt;
&lt;li&gt;... and &lt;a href="https://livecodes.io/docs/languages" rel="noopener noreferrer"&gt;many more&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generally, if you are a developer (or want to be one), there is a big chance you will find something interesting to do with LiveCodes.&lt;/p&gt;


  &lt;img alt="LiveCodes language support" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faf9j3wxf3fmlzdg9i18e.png"&gt;A wide range of language support
  

&lt;h3&gt;
  
  
  Client-Side!
&lt;/h3&gt;

&lt;p&gt;All processing and code transformations run in the browser on the client-side. After the initial load, the app gets significantly faster without having to wait for server rounds. Lazy-loading is heavily used. Only parts of the app required for the selected languages/features are downloaded.&lt;/p&gt;

&lt;p&gt;The code you write in LiveCodes does not leave your computer. All projects are private unless you choose to share/export/deploy them.&lt;/p&gt;
&lt;h3&gt;
  
  
  Developer Tool
&lt;/h3&gt;

&lt;p&gt;An important goal for LiveCodes is to allow library developers to use it for the documentation of their libraries and showcase their products. This can be achieved by &lt;a href="https://livecodes.io/docs/features/embeds" rel="noopener noreferrer"&gt;embedding playgrounds&lt;/a&gt; in blogs, documentation and educational websites. In addition, private (unpublished) modules &lt;a href="https://livecodes.io/docs/features/module-resolution#custom-module-resolution" rel="noopener noreferrer"&gt;can be imported&lt;/a&gt; with editor auto-completion and &lt;a href="https://livecodes.io/docs/features/intellisense#custom-types" rel="noopener noreferrer"&gt;intellisense&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;LiveCodes does NOT aim to be a social coding platform. It will stay as a backendless developer tool. Other platforms are already doing a great job in this regard.&lt;/p&gt;
&lt;h3&gt;
  
  
  Build-Free Development Environment
&lt;/h3&gt;

&lt;p&gt;LiveCodes provides many of the tools you may already be using. These include Monaco editor (that powers &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt;), &lt;a href="https://prettier.io/" rel="noopener noreferrer"&gt;Prettier&lt;/a&gt;, &lt;a href="https://emmet.io/" rel="noopener noreferrer"&gt;Emmet&lt;/a&gt;, &lt;a href="https://babeljs.io/" rel="noopener noreferrer"&gt;Babel&lt;/a&gt;, &lt;a href="https://www.typescriptlang.org/" rel="noopener noreferrer"&gt;TypeScript&lt;/a&gt;, &lt;a href="https://sass-lang.com/" rel="noopener noreferrer"&gt;SCSS&lt;/a&gt;, &lt;a href="https://lesscss.org/" rel="noopener noreferrer"&gt;Less&lt;/a&gt;, &lt;a href="https://postcss.org/" rel="noopener noreferrer"&gt;PostCSS&lt;/a&gt;, &lt;a href="https://jestjs.io/" rel="noopener noreferrer"&gt;Jest&lt;/a&gt; and &lt;a href="https://testing-library.com/" rel="noopener noreferrer"&gt;Testing Library&lt;/a&gt;, among others. &lt;a href="https://livecodes.io/docs/features/module-resolution" rel="noopener noreferrer"&gt;NPM modules&lt;/a&gt; can be imported as usual. All these tools run seamlessly in the browser without any explicit build step. It feels like a very light-weight version of your own local development environment with the keyboard shortcuts, IntelliSense and code navigation features.&lt;/p&gt;

&lt;p&gt;It just works™ without having to &lt;code&gt;npm install&lt;/code&gt; anything. Not even on the server (because there is no server!).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Fun Fact&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Significant portions of LiveCodes features were experimented/prototyped inside LiveCodes!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Web Platform
&lt;/h3&gt;

&lt;p&gt;The output of code written in LiveCodes is a &lt;a href="https://livecodes.io/docs/features/result" rel="noopener noreferrer"&gt;web page&lt;/a&gt;. Whatever language/syntax you use, the result can ultimately be viewed as a web page which you can interact with, &lt;a href="https://livecodes.io/docs/features/tests" rel="noopener noreferrer"&gt;test&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/features/share" rel="noopener noreferrer"&gt;share&lt;/a&gt; or &lt;a href="https://livecodes.io/docs/features/deploy" rel="noopener noreferrer"&gt;deploy&lt;/a&gt;. Check the &lt;a href="https://livecodes.io?screen=new" rel="noopener noreferrer"&gt;starter templates&lt;/a&gt; for examples.&lt;/p&gt;
&lt;h3&gt;
  
  
  Powerful SDK
&lt;/h3&gt;

&lt;p&gt;The LiveCodes playground can be &lt;a href="https://livecodes.io/docs/features/embeds" rel="noopener noreferrer"&gt;embedded&lt;/a&gt; in any web page. A powerful &lt;a href="https://livecodes.io/docs/sdk/" rel="noopener noreferrer"&gt;SDK&lt;/a&gt; allows the embedding page to interact with the playground (e.g. run, get/set source code, format, get result page or compiled code, get share URL, listen to changes, run tests, get test results, change layout, etc.). This enables other apps to be built on top of LiveCodes.&lt;/p&gt;

&lt;p&gt;Check how you can &lt;a href="https://dev.to/livecodes_io/lets-make-an-interactive-coding-tutorial-p45"&gt;build an interactive coding tutorial with LiveCodes SDK&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Your imagination is the limit!&lt;/p&gt;
&lt;h3&gt;
  
  
  Free and Open-Source
&lt;/h3&gt;

&lt;p&gt;LiveCodes is free, with no limits for use, no ads and no account required.&lt;br&gt;
Do you want to &lt;a href="https://livecodes.io/docs/features/self-hosting" rel="noopener noreferrer"&gt;self-host&lt;/a&gt; it for commercial use? No problem! It is &lt;a href="https://livecodes.io/docs/license" rel="noopener noreferrer"&gt;MIT-licensed&lt;/a&gt; 🎉&lt;/p&gt;



&lt;h2&gt;
  
  
  Show me a demo
&lt;/h2&gt;

&lt;p&gt;Try the embedded interactive playground in &lt;a href="https://blog.livecodes.io/introducing-livecodes#show-me-a-demo" rel="noopener noreferrer"&gt;LiveCodes blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Or, go to &lt;a href="https://livecodes.io" rel="noopener noreferrer"&gt;livecodes.io&lt;/a&gt; to try the full standalone playground.&lt;/p&gt;



&lt;h2&gt;
  
  
  What are the main features?
&lt;/h2&gt;


  &lt;img alt="LiveCodes features" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzx7k11duy5nqgn9k0bt4.png"&gt;A large set of features!
  

&lt;h3&gt;
  
  
  Powerful Editor
&lt;/h3&gt;

&lt;p&gt;The default code editor is the powerful editor that powers &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt;, featuring code-completion, go-to-definition, multi-cursor support and other powerful features you got used to. The editor is very &lt;a href="https://livecodes.io/docs/features/editor-settings" rel="noopener noreferrer"&gt;customizable&lt;/a&gt;. It supports keyboard shortcuts, &lt;a href="https://livecodes.io/docs/features/code-format" rel="noopener noreferrer"&gt;code formatting&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/features/editor-settings#emmet" rel="noopener noreferrer"&gt;Emmet abbreviations&lt;/a&gt; and even &lt;a href="https://livecodes.io/docs/features/editor-settings#editor-modes" rel="noopener noreferrer"&gt;Vim and Emacs bindings&lt;/a&gt;.&lt;/p&gt;


  &lt;img alt="Editor IntelliSense" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk12sd385ccc86r6icsie.png"&gt;A powerful editor with IntelliSense
  

&lt;h3&gt;
  
  
  Mobile-friendly
&lt;/h3&gt;

&lt;p&gt;The responsive layout allows working on devices with different screen sizes. On mobile, a lighter-weight touch-friendly code editor (CodeMirror 6) is used, so that you can experiment your ideas on the go.&lt;/p&gt;
&lt;h3&gt;
  
  
  External Code/Libraries
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://livecodes.io/docs/features/external-resources" rel="noopener noreferrer"&gt;External scripts/stylesheets&lt;/a&gt; can be added to the web page. There is a UI screen that helps you search for and add NPM libraries and google fonts. Moreover, &lt;a href="https://livecodes.io/docs/features/module-resolution" rel="noopener noreferrer"&gt;NPM modules can be imported&lt;/a&gt; without the need for any &lt;code&gt;npm install&lt;/code&gt;s.&lt;/p&gt;
&lt;h3&gt;
  
  
  Import and Code Pre-fill
&lt;/h3&gt;

&lt;p&gt;Code can be &lt;a href="https://livecodes.io/docs/features/import" rel="noopener noreferrer"&gt;imported&lt;/a&gt; from a variety of sources including GitHub gist, GitHub file, directory in a GitHub repo, Gitlab snippet, Gitlab file, directory in a Gitlab repo, JS Bin, raw code, code in web page DOM and code in zip file. You can also &lt;a href="https://livecodes.io/docs/features/code-prefill" rel="noopener noreferrer"&gt;pre-fill code&lt;/a&gt; using various ways.&lt;/p&gt;
&lt;h3&gt;
  
  
  Share/Export
&lt;/h3&gt;

&lt;p&gt;Projects can be easily &lt;a href="https://livecodes.io/docs/features/share" rel="noopener noreferrer"&gt;shared&lt;/a&gt; as URLs or QR codes. In addition, you may &lt;a href="https://livecodes.io/docs/features/export" rel="noopener noreferrer"&gt;export&lt;/a&gt; any project as HTML, JSON or zip file containing source code files. You may also export to other services like GitHub gists, CodePen or JSFiddle.&lt;/p&gt;
&lt;h3&gt;
  
  
  Embedded Playgrounds
&lt;/h3&gt;

&lt;p&gt;Projects can be &lt;a href="https://livecodes.io/docs/features/embeds" rel="noopener noreferrer"&gt;embedded&lt;/a&gt; in any web page. The embed screen allows you to customize the embed options and preview the resulting playground. An easy-to-use, yet powerful, &lt;a href="https://livecodes.io/docs/sdk/" rel="noopener noreferrer"&gt;SDK&lt;/a&gt;, allows &lt;a href="https://livecodes.io/docs/sdk/js-ts#sdk-methods" rel="noopener noreferrer"&gt;communication&lt;/a&gt; between the embedding page and the playground. In addition, code can be easily &lt;a href="https://livecodes.io/docs/features/code-prefill" rel="noopener noreferrer"&gt;prefilled&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is particularly useful for educational websites and for library documentations. It is secure and highly &lt;a href="https://livecodes.io/docs/configuration/" rel="noopener noreferrer"&gt;configurable&lt;/a&gt;. Custom modules can be &lt;a href="https://livecodes.io/docs/features/module-resolution#custom-module-resolution" rel="noopener noreferrer"&gt;imported&lt;/a&gt; with full &lt;a href="https://livecodes.io/docs/features/intellisense" rel="noopener noreferrer"&gt;IntelliSense&lt;/a&gt;!&lt;/p&gt;
&lt;h3&gt;
  
  
  Lite mode
&lt;/h3&gt;

&lt;p&gt;In &lt;a href="https://livecodes.io/docs/features/lite" rel="noopener noreferrer"&gt;lite mode&lt;/a&gt;, a light-weight, minimal code editor is used. This is specifically useful if you expect your users to make very little code edits, specially if you want to embed multiple playgrounds in the same webpage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livecodes.io/docs/features/intellisense/code-format" rel="noopener noreferrer"&gt;Code formatting&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/features/intellisense/emmet" rel="noopener noreferrer"&gt;Emmet abbreviations&lt;/a&gt; and &lt;a href="https://livecodes.io/docs/features/intellisense/tools-pane" rel="noopener noreferrer"&gt;dev tools&lt;/a&gt; are not available. However, any language supported by LiveCodes can be used, with syntax highlighting. Code edits are compiled and shown in the &lt;a href="https://livecodes.io/docs/features/intellisense/result" rel="noopener noreferrer"&gt;result page&lt;/a&gt; as usual.&lt;/p&gt;
&lt;h3&gt;
  
  
  Deploy
&lt;/h3&gt;

&lt;p&gt;Projects can be &lt;a href="https://livecodes.io/docs/features/deploy" rel="noopener noreferrer"&gt;deployed&lt;/a&gt; to public URLs that can be shared with others. This is hosted for free on GitHub Pages.&lt;/p&gt;
&lt;h3&gt;
  
  
  Starter Templates
&lt;/h3&gt;

&lt;p&gt;A large number of &lt;a href="https://livecodes.io/docs/features/templates" rel="noopener noreferrer"&gt;starter templates&lt;/a&gt; are available. They can be used to get you started with most of the supported technologies.&lt;/p&gt;


  &lt;img alt="LiveCodes Starter Templates" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3cix38hdw1k24kwcfoh.png"&gt;LiveCodes Starter Templates
  

&lt;h3&gt;
  
  
  Assets
&lt;/h3&gt;

&lt;p&gt;Your own local assets (e.g. images, icons, fonts, local scripts and stylesheets) can be added to the app and then used in any project. The assets are made available even when the projects are shared, exported or deployed.&lt;/p&gt;
&lt;h3&gt;
  
  
  Dev Tools
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://livecodes.io/docs/features/tools-pane" rel="noopener noreferrer"&gt;Tools&lt;/a&gt; like &lt;a href="https://livecodes.io/docs/features/console" rel="noopener noreferrer"&gt;console&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/features/compiled-code" rel="noopener noreferrer"&gt;compiled code viewer&lt;/a&gt; and &lt;a href="https://livecodes.io/docs/features/tests" rel="noopener noreferrer"&gt;test runner&lt;/a&gt; can significantly improve your development experience.&lt;/p&gt;
&lt;h3&gt;
  
  
  Broadcast
&lt;/h3&gt;

&lt;p&gt;You can &lt;a href="https://livecodes.io/docs/features/broadcast" rel="noopener noreferrer"&gt;broadcast&lt;/a&gt; source code or &lt;a href="https://livecodes.io/docs/features/result" rel="noopener noreferrer"&gt;result page&lt;/a&gt; in real-time to others. This can be of great value as an educational tool and for demo purposes.&lt;/p&gt;
&lt;h3&gt;
  
  
  Sync/Backup/Restore
&lt;/h3&gt;

&lt;p&gt;Do you work on multiple devices? No Problem! You may &lt;a href="https://livecodes.io/docs/features/sync" rel="noopener noreferrer"&gt;sync&lt;/a&gt; or &lt;a href="https://livecodes.io/docs/features/backup-restore" rel="noopener noreferrer"&gt;backup and restore&lt;/a&gt; your data any time on any device.&lt;/p&gt;
&lt;h3&gt;
  
  
  Developer-friendly
&lt;/h3&gt;

&lt;p&gt;LiveCodes makes it easy to &lt;a href="https://livecodes.io/docs/getting-started" rel="noopener noreferrer"&gt;get started&lt;/a&gt;. It is highly &lt;a href="https://livecodes.io/docs/configuration/" rel="noopener noreferrer"&gt;configurable&lt;/a&gt;. Lots of features can be configured by URL &lt;a href="https://livecodes.io/docs/configuration/query-params" rel="noopener noreferrer"&gt;query params&lt;/a&gt;. The &lt;a href="https://livecodes.io/docs/sdk/" rel="noopener noreferrer"&gt;SDK&lt;/a&gt; facilitates &lt;a href="https://livecodes.io/docs/features/embeds" rel="noopener noreferrer"&gt;embedding&lt;/a&gt; playgrounds and allows easy &lt;a href="https://livecodes.io/docs/sdk/js-ts#sdk-methods" rel="noopener noreferrer"&gt;communication&lt;/a&gt; with them. The SDK is available for use in &lt;a href="https://livecodes.io/docs/sdk/js-ts" rel="noopener noreferrer"&gt;Vanilla JS/TS&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/sdk/react" rel="noopener noreferrer"&gt;React&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/sdk/vue" rel="noopener noreferrer"&gt;Vue&lt;/a&gt; and &lt;a href="https://livecodes.io/docs/sdk/svelte" rel="noopener noreferrer"&gt;Svelte&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Focused on Privacy
&lt;/h3&gt;

&lt;p&gt;Projects are private by default. The code you write in LiveCodes never leaves your computer, unless you choose to &lt;a href="https://livecodes.io/docs/features/share" rel="noopener noreferrer"&gt;share&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/features/export" rel="noopener noreferrer"&gt;export&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/features/broadcast" rel="noopener noreferrer"&gt;broadcast&lt;/a&gt; or &lt;a href="https://livecodes.io/docs/features/sync" rel="noopener noreferrer"&gt;sync&lt;/a&gt; it. User data is stored in the browser.&lt;/p&gt;
&lt;h3&gt;
  
  
  Documentation
&lt;/h3&gt;

&lt;p&gt;Comprehensive documentations are available for &lt;a href="https://livecodes.io/docs/features/" rel="noopener noreferrer"&gt;features&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/configuration/" rel="noopener noreferrer"&gt;configuration&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/languages/" rel="noopener noreferrer"&gt;supported languages&lt;/a&gt; and &lt;a href="https://livecodes.io/docs/sdk/" rel="noopener noreferrer"&gt;SDK&lt;/a&gt; (including &lt;a href="https://livecodes.io/docs/api/modules" rel="noopener noreferrer"&gt;TypeScript Types&lt;/a&gt;). Documentations are rich with code samples, live demos and screenshots. A gallery of usage examples is provided as a &lt;a href="https://livecodes.io/stories" rel="noopener noreferrer"&gt;storybook&lt;/a&gt;. You can even just ask our &lt;a href="https://livecodes.io/docs" rel="noopener noreferrer"&gt;AI chatbot&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  More Features
&lt;/h3&gt;

&lt;p&gt;Go to the &lt;a href="https://livecodes.io/docs/features/" rel="noopener noreferrer"&gt;features&lt;/a&gt; documentation to know about more features with detailed description.&lt;/p&gt;



&lt;h2&gt;
  
  
  How do I get started?
&lt;/h2&gt;

&lt;p&gt;Check the &lt;a href="https://livecodes.io/docs/getting-started" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt;. However, in a nutshell:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;To use the standalone App:&lt;/p&gt;

&lt;p&gt;Just go to &lt;a href="https://livecodes.io" rel="noopener noreferrer"&gt;livecodes.io&lt;/a&gt; and enjoy all the &lt;a href="https://livecodes.io/docs/features" rel="noopener noreferrer"&gt;features&lt;/a&gt;! &lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To embed a playground in your web page:&lt;/p&gt;

&lt;p&gt;Add this code to your web page:&lt;br&gt;
&lt;/p&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPlayground&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://unpkg.com/livecodes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;createPlayground&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#container&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;# Hello LiveCodes!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;css&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;h1 {color: dodgerblue;}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;js&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;console.log("Hello, from JS!");&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;console&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;open&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Please check the documentation about &lt;a href="https://livecodes.io/docs/features/embeds" rel="noopener noreferrer"&gt;embedded playgrounds&lt;/a&gt; and &lt;a href="https://livecodes.io/docs/sdk/" rel="noopener noreferrer"&gt;SDK&lt;/a&gt; for more details.&lt;/p&gt;



&lt;h2&gt;
  
  
  Can I self-host it?
&lt;/h2&gt;

&lt;p&gt;Sure!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download a &lt;a href="https://github.com/live-codes/livecodes/releases" rel="noopener noreferrer"&gt;release&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Put it on a static file server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;... and it just works!&lt;/p&gt;

&lt;p&gt;Please check the documentation about &lt;a href="https://livecodes.io/docs/features/self-hosting" rel="noopener noreferrer"&gt;self-hosting&lt;/a&gt; for more details.&lt;/p&gt;



&lt;h2&gt;
  
  
  What about commercial use?
&lt;/h2&gt;

&lt;p&gt;Feel free to use it for commercial purposes. It is &lt;a href="https://livecodes.io/docs/license" rel="noopener noreferrer"&gt;MIT-licensed&lt;/a&gt; 🎉&lt;/p&gt;

&lt;p&gt;If you find it useful, please consider &lt;a href="https://livecodes.io/docs/sponsor" rel="noopener noreferrer"&gt;supporting the project&lt;/a&gt; 💚.&lt;/p&gt;



&lt;h2&gt;
  
  
  Can I use LiveCodes today?
&lt;/h2&gt;

&lt;p&gt;Yes!&lt;/p&gt;

&lt;p&gt;However, please note that LiveCodes is currently in &lt;strong&gt;public beta&lt;/strong&gt;. It is in active development.&lt;/p&gt;

&lt;p&gt;Having said that, the public-facing API has been stable for a while. &lt;a href="https://livecodes.io/docs/features/permanent-url" rel="noopener noreferrer"&gt;Permanent URLs&lt;/a&gt; are available for the app and SDK to avoid later breaking changes in your embedded playgrounds.&lt;/p&gt;



&lt;h2&gt;
  
  
  Can I contribute?
&lt;/h2&gt;

&lt;p&gt;Of course! You are very welcome. Please &lt;a href="https://livecodes.io/docs/contribution" rel="noopener noreferrer"&gt;start here&lt;/a&gt;.&lt;/p&gt;



&lt;h2&gt;
  
  
  Let's start coding!
&lt;/h2&gt;

&lt;p&gt;Visit &lt;a href="https://livecodes.io" rel="noopener noreferrer"&gt;livecodes.io&lt;/a&gt; to experience LiveCodes for yourself!&lt;/p&gt;

&lt;p&gt;Please &lt;a href="https://github.com/live-codes/livecodes" rel="noopener noreferrer"&gt;star the repo&lt;/a&gt;, &lt;a href="https://livecodes.io/docs/contact" rel="noopener noreferrer"&gt;let us know&lt;/a&gt; what you think and &lt;a href="https://github.com/live-codes/livecodes/issues" rel="noopener noreferrer"&gt;report any bugs&lt;/a&gt; you find.&lt;/p&gt;

&lt;p&gt;If you do use LiveCodes in a project, we'd &lt;a href="https://livecodes.io/docs/contact" rel="noopener noreferrer"&gt;love to hear&lt;/a&gt; about it (we may add a link to it!).&lt;/p&gt;

&lt;p&gt;What will you learn/build/teach with LiveCodes today?&lt;/p&gt;



&lt;h2&gt;
  
  
  Where can I learn more?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://livecodes.io" rel="noopener noreferrer"&gt;LiveCodes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://livecodes.io/docs" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.livecodes.io" rel="noopener noreferrer"&gt;Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/live-codes/livecodes" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/livecodes_io" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/livecodes_io"&gt;Dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://livecodes.io/docs/contact" rel="noopener noreferrer"&gt;Contact&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/live-codes" rel="noopener noreferrer"&gt;
        live-codes
      &lt;/a&gt; / &lt;a href="https://github.com/live-codes/livecodes" rel="noopener noreferrer"&gt;
        livecodes
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Code Playground That Just Works!
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://www.techforpalestine.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/85448fc0867c409bb30f95e015f57830d6ac55817af8f0dece66f680a114b68b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2546302539462538372542352546302539462538372542385f4365617365666972655f4e6f772d74656368666f7270616c657374696e652e6f72672d4438333833383f636f6c6f723d443833383338" alt="Ceasefire_Now-techforpalestine.org"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LiveCodes&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Code Playground That Just Works!&lt;/p&gt;

&lt;p&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/dd157fcbfe20550eabd9a13c9696bcffbdb3e2a19073cb6aa7e0599d84563aa9/68747470733a2f2f6465762e6c697665636f6465732e696f2f646f63732f696d672f6c697665636f6465732d6c6f676f2e737667"&gt;&lt;img width="300" src="https://camo.githubusercontent.com/dd157fcbfe20550eabd9a13c9696bcffbdb3e2a19073cb6aa7e0599d84563aa9/68747470733a2f2f6465762e6c697665636f6465732e696f2f646f63732f696d672f6c697665636f6465732d6c6f676f2e737667"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://livecodes.io/docs/features/" rel="nofollow noopener noreferrer"&gt;feature-rich&lt;/a&gt;, open-source, &lt;strong&gt;client-side&lt;/strong&gt; code playground for React, Vue, Svelte, Solid, Typescript, Python, Go, Ruby, PHP and &lt;a href="https://livecodes.io/docs/languages/" rel="nofollow noopener noreferrer"&gt;90+ languages/frameworks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://status.livecodes.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/080974d5fe33fe827a10490cdbdbf71dc989889590dace39be40c60b656198b4/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f6c6976652d636f6465732f75707074696d652f6d61737465722f6170692f6c6976652d636f6465732f757074696d652e6a736f6e" alt="LiveCodes: uptime status"&gt;&lt;/a&gt;
&lt;a href="https://livecodes.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f2d20911202658711e69d831ae624fae345503939b65c2e8196133841e6f9b94/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f6c6976652d636f6465732f6c697665636f6465733f6c6162656c3d617070" alt="LiveCodes: app version"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/livecodes" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2c1085120aad85bf7b6c2520491dbb0b6f8306c4f7767e3a3be80a15bdd76424/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f6c697665636f646573" alt="LiveCodes: npm version"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/livecodes" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bae264cfe18b14d3c044205b54e48506706d3014fcf67ca35cfc7c40608a61d4/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f6c697665636f646573" alt="LiveCodes: npm downloads"&gt;&lt;/a&gt;
&lt;a href="https://www.jsdelivr.com/package/npm/livecodes" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6f0c3247da87777b6c95444bbc38b918e0a7bd4bc3135c820ab89f9e63d3331a/68747470733a2f2f646174612e6a7364656c6976722e636f6d2f76312f7061636b6167652f6e706d2f6c697665636f6465732f62616467653f7374796c653d726f756e646564" alt="LiveCodes: jsdelivr downloads"&gt;&lt;/a&gt;
&lt;a href="https://livecodes.io/docs/languages/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c5736538c6bb3a47e13878e9047cbc6a1e31779b711e5e1830b944d306712125/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c616e6775616765732d39312d626c7565" alt="LiveCodes: languages"&gt;&lt;/a&gt;
&lt;a href="https://www.codacy.com/gh/live-codes/livecodes/dashboard?utm_source=github.com&amp;amp;utm_medium=referral&amp;amp;utm_content=live-codes/livecodes&amp;amp;utm_campaign=Badge_Grade" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7d9fcc1d1b11a519dec03994bebe2a5ff99f9d62e058f79769496e9255e5dd0c/68747470733a2f2f6170702e636f646163792e636f6d2f70726f6a6563742f62616467652f47726164652f3364333966313536313865303438646239643133633261306538303032623333" alt="Codacy Badge"&gt;&lt;/a&gt;
&lt;a href="https://app.lokalise.com/public/34958094667a72e9454592.95108106/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0f7c88636f4f25330ac3b1a0b9e8ef5b6aabbf25fb6e3d408245fe33a7ec23f0/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f6c6976652d636f6465732f6c6f6b616c6973652d62616467652f6d61696e2f62616467652e6a736f6e" alt="LiveCodes: i18n on Lokalise"&gt;&lt;/a&gt;
&lt;a href="https://github.com/live-codes/livecodes/blob/develop/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f5f262b83296435a5b7632460ee7d0bcbf8e8936c835a983ca103511030d87dc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6c6976652d636f6465732f6c697665636f646573" alt="license - MIT"&gt;&lt;/a&gt;
&lt;a href="https://github.com/live-codes/livecodes" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d2f61a6cba46c91f359389df7b8d41053686b4efb21dd1b4f09292bc5cb837a8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6c6976652d636f6465732f6c697665636f6465733f7374796c653d736f6369616c" alt="LiveCodes: GitHub repo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://livecodes.io" rel="nofollow noopener noreferrer"&gt;Try it now on livecodes.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://livecodes.io/docs" rel="nofollow noopener noreferrer"&gt;Documentations&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://livecodes.io/docs/why" rel="nofollow noopener noreferrer"&gt;What makes LiveCodes different?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/dcad072e7bf5062b44cbc96d373de70715151aebb1e01f15e693997e7ca04e84/68747470733a2f2f6465762e6c697665636f6465732e696f2f646f63732f696d672f73637265656e73686f74732f6c697665636f6465732d6c616e6775616765732e6a7067"&gt;&lt;img src="https://camo.githubusercontent.com/dcad072e7bf5062b44cbc96d373de70715151aebb1e01f15e693997e7ca04e84/68747470733a2f2f6465762e6c697665636f6465732e696f2f646f63732f696d672f73637265656e73686f74732f6c697665636f6465732d6c616e6775616765732e6a7067" alt="LiveCodes list of languages screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Code Playground That Just Works!&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;No servers to configure (or pay for!)&lt;/li&gt;
&lt;li&gt;No databases to maintain (or pay for!)&lt;/li&gt;
&lt;li&gt;No installs&lt;/li&gt;
&lt;li&gt;No configuration files&lt;/li&gt;
&lt;li&gt;No build steps&lt;/li&gt;
&lt;li&gt;No subscription fees (free and open-source)&lt;/li&gt;
&lt;li&gt;No account required *&lt;/li&gt;
&lt;li&gt;No limits for usage (unlimited private projects)&lt;/li&gt;
&lt;li&gt;90+ languages/frameworks/processors&lt;/li&gt;
&lt;li&gt;Large set of features and integrations&lt;/li&gt;
&lt;li&gt;Import code from a wide variety of sources&lt;/li&gt;
&lt;li&gt;Use modules from npm, deno.land/x, jsr, GitHub, and others&lt;/li&gt;
&lt;li&gt;Easily embed it in your web pages&lt;/li&gt;
&lt;li&gt;It runs in the browser (client-side)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;* GitHub account is required only for features that use &lt;a href="https://livecodes.io/docs/features/github-integration" rel="nofollow noopener noreferrer"&gt;GitHub Integration&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Quick Start&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Standalone App&lt;/h4&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://livecodes.io" rel="nofollow noopener noreferrer"&gt;livecodes.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;... and enjoy all the &lt;a href="https://livecodes.io/docs/features/" rel="nofollow noopener noreferrer"&gt;features&lt;/a&gt;!&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Embedded Playground&lt;/h4&gt;

&lt;/div&gt;
&lt;p&gt;Add this…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/live-codes/livecodes" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>livecodes</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>A powerful backend ready for your next app 🚀</title>
      <dc:creator>Hatem Hosny</dc:creator>
      <pubDate>Sat, 28 Nov 2020 01:05:35 +0000</pubDate>
      <link>https://dev.to/hatemhosny/a-powerful-backend-ready-for-your-next-app-55a</link>
      <guid>https://dev.to/hatemhosny/a-powerful-backend-ready-for-your-next-app-55a</guid>
      <description>&lt;p&gt;I am a primarily frontend developer. &lt;/p&gt;

&lt;p&gt;Whenever I start a new project I keep going into the dilemma of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which backend?&lt;/li&gt;
&lt;li&gt;Which database?&lt;/li&gt;
&lt;li&gt;Which hosting provider? &lt;/li&gt;
&lt;li&gt;Which complexity for the cloud service provider will I have to go through this time?&lt;/li&gt;
&lt;li&gt;What if I need later on to move to another provider?&lt;/li&gt;
&lt;li&gt;Should I go serverless?&lt;/li&gt;
&lt;li&gt;Do I need authentication? should I use a 3rd party service for that?&lt;/li&gt;
&lt;li&gt;How to handle HTTPS certificates issuing and renewal?&lt;/li&gt;
&lt;li&gt;How about the CI/CD setup?&lt;/li&gt;
&lt;li&gt;How to get a convenient local development environment that also matches production deployment?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Services like Firebase and AWS Amplify, have always been appealing. However, I felt uncomfortable with having marked restrictions on the database design (with lots of de-normalization) because of pay-per-read model. I know, I know, this is how NoSQL works, but still I was not happy. In addition, I do not want to &lt;a href="https://hackernoon.com/how-we-spent-30k-usd-in-firebase-in-less-than-72-hours-307490bd24d" rel="noopener noreferrer"&gt;pay $30K in 72 hours because of a coding mistake&lt;/a&gt;. And then &lt;a href="https://firebase.google.com/docs/firestore/solutions/search" rel="noopener noreferrer"&gt;not be able to do a basic full-text search&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Serverless can be very cost-effective on small scale but can be quite expensive on large scales. I want to have a predictable budget.&lt;/p&gt;

&lt;p&gt;In addition, the ease of local development with a cloud backend was concerning. There are many good solutions or workarounds for all of these questions, but none felt as easy and flexible for the requirements of different projects.&lt;/p&gt;

&lt;p&gt;All of that, and we have not even started talking about what I care about most, my app!&lt;/p&gt;

&lt;p&gt;Frontend development has become complex enough to also get distracted by all of these questions.&lt;/p&gt;

&lt;p&gt;Recently, I have come across &lt;a href="https://github.com/parse-community/parse-server" rel="noopener noreferrer"&gt;Parse server&lt;/a&gt;. It is a project that was acquired by Facebook (parse.com) and was later open-sourced when they decided to stop providing the cloud service. It is such a nice project that ticks nearly all my boxes.&lt;/p&gt;

&lt;p&gt;So, I created a monorepo starter project that is managed by &lt;a href="https://docs.docker.com/compose/" rel="noopener noreferrer"&gt;Docker Compose&lt;/a&gt; which runs the feature-rich ready-to-use setup that works out of the box for local development and can be easily deployed.&lt;/p&gt;

&lt;p&gt;You can find it on github: &lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/hatemhosny" rel="noopener noreferrer"&gt;
        hatemhosny
      &lt;/a&gt; / &lt;a href="https://github.com/hatemhosny/parse-starter" rel="noopener noreferrer"&gt;
        parse-starter
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A powerful backend ready for your next app 🚀
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Feature Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/parse-community/parse-server" rel="noopener noreferrer"&gt;Parse server&lt;/a&gt;&lt;/strong&gt;: Backend-as-a-Service (BaaS) that features:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://parseplatform.org/#sdks" rel="noopener noreferrer"&gt;SDKs&lt;/a&gt; for popular platforms&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.parseplatform.org/rest/guide/" rel="noopener noreferrer"&gt;REST API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.parseplatform.org/graphql/guide/" rel="noopener noreferrer"&gt;Graphql API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.parseplatform.org/parse-server/guide/#live-queries" rel="noopener noreferrer"&gt;LiveQuery&lt;/a&gt; for realtime apps&lt;/li&gt;
&lt;li&gt;Security features including authentication, &lt;a href="https://docs.parseplatform.org/js/guide/#users" rel="noopener noreferrer"&gt;users&lt;/a&gt;, &lt;a href="https://docs.parseplatform.org/js/guide/#roles" rel="noopener noreferrer"&gt;roles&lt;/a&gt;, &lt;a href="https://docs.parseplatform.org/rest/guide/#object-level-access-control" rel="noopener noreferrer"&gt;access control lists (ACL)&lt;/a&gt; and &lt;a href="https://docs.parseplatform.org/rest/guide/#class-level-permissions" rel="noopener noreferrer"&gt;class-level permissions (CLP)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.parseplatform.org/parse-server/guide/#oauth-and-3rd-party-authentication" rel="noopener noreferrer"&gt;3rd party authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.parseplatform.org/parse-server/guide/#push-notifications" rel="noopener noreferrer"&gt;Push notifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Adapters for &lt;a href="https://docs.parseplatform.org/parse-server/guide/#configuring-file-adapters" rel="noopener noreferrer"&gt;file storage&lt;/a&gt; and &lt;a href="https://docs.parseplatform.org/parse-server/guide/#configuring-cache-adapters" rel="noopener noreferrer"&gt;caching&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.parseplatform.org/rest/guide/#analytics" rel="noopener noreferrer"&gt;Analytics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.parseplatform.org/rest/guide/#cloud-code" rel="noopener noreferrer"&gt;Cloud code&lt;/a&gt; for custom server-side logic&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.parseplatform.org/rest/guide/#hooks" rel="noopener noreferrer"&gt;Web hooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Runs on top of &lt;a href="https://expressjs.com" rel="noopener noreferrer"&gt;Express&lt;/a&gt; allowing the use of Express middleware&lt;/li&gt;
&lt;li&gt;Comprehensive &lt;a href="https://docs.parseplatform.org/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Large &lt;a href="https://github.com/parse-community" rel="noopener noreferrer"&gt;community&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;&lt;a href="https://www.mongodb.com" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt;&lt;/strong&gt; database.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;&lt;a href="https://github.com/parse-community/parse-dashboard" rel="noopener noreferrer"&gt;Parse dashboard&lt;/a&gt;&lt;/strong&gt; (optional): a powerful dashboard for managing the parse server.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;API-First Headless CMS&lt;/strong&gt; (optional): using &lt;a href="https://chiselcms.com" rel="noopener noreferrer"&gt;chisel-cms&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;A sample realtime &lt;strong&gt;frontend app&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Automatic HTTPS&lt;/strong&gt; for the frontend and backend using &lt;a href="https://caddyserver.com" rel="noopener noreferrer"&gt;Caddy server&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;Reproducible setup using &lt;strong&gt;&lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;&lt;/strong&gt; containers managed by a single &lt;strong&gt;&lt;a href="https://docs.docker.com/compose" rel="noopener noreferrer"&gt;Docker Compose&lt;/a&gt;&lt;/strong&gt; file.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Local development workflow&lt;/strong&gt; with hot reload for frontend and backend.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Easy deployment&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;CI/CD&lt;/strong&gt; (&lt;a href="https://www.atlassian.com/continuous-delivery/principles/continuous-integration-vs-delivery-vs-deployment" rel="noopener noreferrer"&gt;continuous integration and deployment&lt;/a&gt;): using &lt;a href="https://docs.github.com/en/free-pro-team@latest/actions" rel="noopener noreferrer"&gt;github actions&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;Optional &lt;strong&gt;deployment to multiple environments&lt;/strong&gt; (e.g. development, staging and production).&lt;/li&gt;

&lt;li&gt;Highly &lt;strong&gt;configurable&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;The whole stack is &lt;strong&gt;open source&lt;/strong&gt; with no vendor lock-in or pay-per-request restrictions.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Run the shell command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, the following will be served:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;parse server backend: &lt;span&gt;https:&lt;/span&gt;//localhost:1337/api&lt;/li&gt;
&lt;li&gt;parse graphql API: &lt;span&gt;https:&lt;/span&gt;//localhost:1337/graphql&lt;/li&gt;
&lt;li&gt;parse dashboard: &lt;span&gt;https:&lt;/span&gt;//localhost:1337/dashboard&lt;/li&gt;
&lt;li&gt;frontend local dev server (with HMR): &lt;span&gt;https:&lt;/span&gt;//localhost:1234&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After &lt;a href="https://github.com/hatemhosny/parse-starter#production-build" rel="noopener noreferrer"&gt;production build&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;frontend app: &lt;span&gt;https:&lt;/span&gt;//localhost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When &lt;a href="https://github.com/hatemhosny/parse-starter#headless-cms" rel="noopener noreferrer"&gt;CMS is enabled&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chisel CMS: &lt;span&gt;https:&lt;/span&gt;//localhost:1337&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now you can edit/replace the app in the &lt;code&gt;frontend&lt;/code&gt; directory and start building your own app making use of the feature-rich backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment
&lt;/h2&gt;

&lt;p&gt;Docker and Docker Compose significantly simplify deployment. All the setup and dependencies are already taken care of in the docker images.&lt;/p&gt;

&lt;p&gt;So, in principle, the steps required for deployment are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defining the variables for the deployment environment.&lt;/li&gt;
&lt;li&gt;Building the docker images and verifying them.&lt;/li&gt;
&lt;li&gt;Running the containers on the host server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although this can be done manually, it is greatly simplified using the included automated CI/CD setup that uses github actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Start
&lt;/h3&gt;

&lt;p&gt;Assuming you can connect using SSH to your server which has Docker and Docker Compose installed (see &lt;a href="https://github.com/hatemhosny/parse-starter#server-setup" rel="noopener noreferrer"&gt;Server Setup&lt;/a&gt;), and that you have a github personal access token (see &lt;a href="https://github.com/hatemhosny/parse-starter#container-registry" rel="noopener noreferrer"&gt;Container Registry&lt;/a&gt;), add the following &lt;a href="https://github.com/hatemhosny/parse-starter#github-secrets" rel="noopener noreferrer"&gt;Github Secrets&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PROD_DOCKER_REGISTRY_TOKEN: your personal github access token&lt;/li&gt;
&lt;li&gt;PROD_SSH_HOST: your server IP address&lt;/li&gt;
&lt;li&gt;PROD_SSH_KEY: your server SSH private key&lt;/li&gt;
&lt;li&gt;PROD_ENV_VARS: edit the following example with your values
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  HOST_NAME=mywebsite.com
  APP_ID=myappid
  MASTER_KEY=mymasterkey
  PARSE_DASHBOARD_USER_ID=user
  PARSE_DASHBOARD_USER_PASSWORD=pass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: The environment variable &lt;code&gt;HOST_NAME&lt;/code&gt; is required for remote deployment.&lt;/p&gt;

&lt;p&gt;Now pushing code to main/master branch should trigger build and deploy to your server. Note that you can follow the progress and read logs of CI/CD workflows on the "Actions" tab in the gihub repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  That's it!
&lt;/h2&gt;

&lt;p&gt;You have launched your powerful backend locally and deployed it within a few minutes.&lt;/p&gt;

&lt;p&gt;You can find the documentation and configuration details in the github repo: &lt;a href="https://github.com/hatemhosny/parse-starter" rel="noopener noreferrer"&gt;https://github.com/hatemhosny/parse-starter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is clearly not the magic bullet that solves all the problems of the world, but it has made my life easier, and I hope it makes yours too.&lt;/p&gt;

&lt;p&gt;Please let me know your suggestions/advices/comments, and I would be very grateful for contributions.&lt;/p&gt;

&lt;p&gt;Happy coding, go build some great apps!&lt;/p&gt;

</description>
      <category>backend</category>
      <category>docker</category>
      <category>javascript</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
