{"componentChunkName":"component---src-templates-blog-post-tsx","path":"/benefits-of-typescript/","result":{"data":{"allContentfulCategory":{"edges":[{"node":{"contentful_id":"2gOurgpDj1BasZvVToN13z","slug":"tiny-sparks","title":"The Tiny Way"}},{"node":{"contentful_id":"2a3w396SgR2Fl1ep4eYu0w","slug":"product-management","title":"Product-Led Growth"}},{"node":{"contentful_id":"T7VZcLaLRpt6XlNLJPLmL","slug":"wysiwyg-world","title":"World of WYSIWYG"}},{"node":{"contentful_id":"6HNYGjOUjHzUS2gXBnMVXn","slug":"design-and-ux","title":"Content Marketing & Design"}},{"node":{"contentful_id":"6XFMYLCe4AEYIDazkjGFvb","slug":"engineering","title":"Developer Insights"}},{"node":{"contentful_id":"24ufWIsR0ImSvxvvIrutB5","slug":"open-source","title":"Open Source"}},{"node":{"contentful_id":"2fLgNI8yOMeZHNl1nSQ11","slug":"how-tos-and-tutorials","title":"How-to Use TinyMCE"}}]},"contentfulBlogPost":{"title":"Technical debt and types: The benefits of TypeScript vs JavaScript","lastUpdated":"July 26th, 2023","publishDate":"2023-07-26T00:00+10:00","category":{"slug":"engineering","title":"Developer Insights","blog_post":[{"title":"Comparing Customization: TinyMCE vs. Froala","slug":"tinymce-vs-froala-customization","featured":true,"lastUpdated":"Mar 24th, 2026","description":{"description":"<p>How TinyMCE and Froala compare on plugin depth, API extensibility, and collaboration features? Developer guide to customization ceilings and trade-offs.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"How TinyMCE and Froala compare on plugin depth, API extensibility, and collaboration features? Developer guide to customization ceilings and trade-offs."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Comparing Customization TinyMCE vs Froala","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABelBMVEUKE1QACE8ABk4ABE4ABU4AB08JElMLE1QEDVEACFEABVMABlIAB1AEDlEJE1QAA04AAEwAAEoAAEkAAE0AB04AClIADFUbJlwQHVkAD1UABE8AAEsAO2IAU3MBTnMBS3QCSnYDRncAIVoABk8AAFNCRmm5ucCPkJwAAFUIE1QEDVAAOmEAWHgAWXwAWYAATnoBVIUAMWY7P2WpqbJ/gI8CEFQAQ2cAYX8AYIMAWYIAV4UAVIcAWJAATYoAGF4AAEcAAFAABVQACFcAE1cABFAAAEhBR2dga4FYZHxsdIlnboVNWHdGUXNcY4BSVXFZWnMgJFgAEFYUI10EF1kAAFR3eImPj5wKGVcAAFJLS2mKiZeXl6KYl6KNjJl9fYx7e4t/f46Tk6BERmkAMmAJSGoQH1yjo6zDw8kdJlsAAEQAAFEOKl0PMWAHFFcADFYcJVsrMV8ACFQIElQBC1EAAE4AAU4ABlABClIDC1MAClEABFMADlMHEVMLFFTxKlLmAAAAo0lEQVQI123IOw4BUQBG4f/M3DvCeI3QaES0ConotGIZ1mAB9mBHaBU2QASJSrwSoXBjFEM0vurkIKEvAKc4MCncS/KdJGMApxwUAElwVBmAg5PJkjhRT6K4dETVpDeeq+ThEt2uaUOYzCYAu9pWcZ0ef5T6n7iHAOcSXPzMPpy1V49p8Jy0rLV5a+3KDGARdtSKNc8C4+G60ZVG9scre76v4A1DxyZkUHvegwAAAABJRU5ErkJggg==","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/hSfpSImgxOsHs4iIKlvbB/6919ae5955c4e2db9092985361be7d4a/-TinyMCE--Blog_Header-_Comparing_Customization__TinyMCE_vs_Froala.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/hSfpSImgxOsHs4iIKlvbB/6919ae5955c4e2db9092985361be7d4a/-TinyMCE--Blog_Header-_Comparing_Customization__TinyMCE_vs_Froala.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/hSfpSImgxOsHs4iIKlvbB/6919ae5955c4e2db9092985361be7d4a/-TinyMCE--Blog_Header-_Comparing_Customization__TinyMCE_vs_Froala.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/hSfpSImgxOsHs4iIKlvbB/6919ae5955c4e2db9092985361be7d4a/-TinyMCE--Blog_Header-_Comparing_Customization__TinyMCE_vs_Froala.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/hSfpSImgxOsHs4iIKlvbB/6919ae5955c4e2db9092985361be7d4a/-TinyMCE--Blog_Header-_Comparing_Customization__TinyMCE_vs_Froala.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/hSfpSImgxOsHs4iIKlvbB/6919ae5955c4e2db9092985361be7d4a/-TinyMCE--Blog_Header-_Comparing_Customization__TinyMCE_vs_Froala.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/hSfpSImgxOsHs4iIKlvbB/6919ae5955c4e2db9092985361be7d4a/-TinyMCE--Blog_Header-_Comparing_Customization__TinyMCE_vs_Froala.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/hSfpSImgxOsHs4iIKlvbB/6919ae5955c4e2db9092985361be7d4a/-TinyMCE--Blog_Header-_Comparing_Customization__TinyMCE_vs_Froala.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/hSfpSImgxOsHs4iIKlvbB/6919ae5955c4e2db9092985361be7d4a/-TinyMCE--Blog_Header-_Comparing_Customization__TinyMCE_vs_Froala.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/hSfpSImgxOsHs4iIKlvbB/6919ae5955c4e2db9092985361be7d4a/-TinyMCE--Blog_Header-_Comparing_Customization__TinyMCE_vs_Froala.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/hSfpSImgxOsHs4iIKlvbB/6919ae5955c4e2db9092985361be7d4a/-TinyMCE--Blog_Header-_Comparing_Customization__TinyMCE_vs_Froala.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/hSfpSImgxOsHs4iIKlvbB/6919ae5955c4e2db9092985361be7d4a/-TinyMCE--Blog_Header-_Comparing_Customization__TinyMCE_vs_Froala.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/hSfpSImgxOsHs4iIKlvbB/6919ae5955c4e2db9092985361be7d4a/-TinyMCE--Blog_Header-_Comparing_Customization__TinyMCE_vs_Froala.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/hSfpSImgxOsHs4iIKlvbB/6919ae5955c4e2db9092985361be7d4a/-TinyMCE--Blog_Header-_Comparing_Customization__TinyMCE_vs_Froala.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Coco Poley","slug":"coco-poley"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"TinyMCE vs Froala Customization: Plugins, APIs & Collaboration | TinyMCE"},"metaDescription":{"metaDescription":"How TinyMCE and Froala compare on plugin depth, API extensibility, and collaboration features? Developer guide to customization ceilings and trade-offs."}},{"title":"How to Discern Level of Effort to Integrate Collaboration in a Rich Text Editor","slug":"rich-text-editor-integration-level-of-effort-collaboration","featured":true,"lastUpdated":"Feb 2nd, 2026","description":{"description":"<p>Learn how to estimate the level of effort required to integrate a rich text editor with collaboration features like comments, mentions, and version history.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Learn how to estimate the level of effort required to integrate a rich text editor with collaboration features like comments, mentions, and version history."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"How to Discern Level of Effort to Integrate a Rich Text Editor","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABvFBMVEUJE1QABk8AB08ACE8ABU4ABE4IElMIEVMACFAAAE4AAU4AA04ABVAABlIABFMACVIAB1EAAFIADVMAAEwCCE8AAE0ACU8ADlQfJVowNWEAF1kAElk7P2Y2O2QAClUAAE8AAEhfXnaNi5mBfo50d4kNZn8AYXsAX3oAVXIAW3YAYn0AMWF6eYqmpq8ZK2EhMmW4uL6lpa8AAFUAAFAAAEkePmM9a4I3boUyY3wAV3QAWXUAYHoAXXgAXXkAG1lOT21vcIMBHl0IIl+AgZFvcIQAPWMAWnYAXnoAWXYAU3EVW3ZLb4U4YHkARGcAElYAAFkAAFoAGF4AF10AElclRWcxaYEna4MraYEiY3wtaoJEZ353dYdfXHQAAEtrbIGPkJ0aKV8AG116e4xoan8ABFUAAVAAAEZnZ3ySkZ56eImGhJOEgpGTkp9xcYQAAEoAAFGYmaTLy881P2kSKWKenqiMjJoAAlAEC08fIVQMD1AWGFIXGVIaHFMeIFQVGVIABE8AC1QcJls0OWQAEFgAFVopMF8tM2AADlUAAk8HEVMABU8AB1AABFIAB1IACFIAB1MDDlMKE1QABk4JElO5P9nKAAAAjUlEQVQIHQXBMUrCUQAH4N/3fCAEWmAH8BAdIRwEr+Dk5OJmBEE0BAktTp5DEJy8kTrpEvx5fZ+EJJLWeppE9En4S9IHcTdyfyi6ktyGAMYAAKjPAK0ArueaJ2gFoMvjxfgFwGEGqBNwnLKfA6dXowVgtwRQ15+DJMnt6/3H9wddXcvWKtm8kdZLi/yWfxvuH2LfYxclAAAAAElFTkSuQmCC","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/4a6Y89AUrMs3F9FBApjSa2/a999da5fe3da0f46fb01e6d7ea3b7426/Collaboration_Series_-5__How_to_Determine_Level_of_Effort_to_Integrate_a_Rich_Text_Editor_blog.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/4a6Y89AUrMs3F9FBApjSa2/a999da5fe3da0f46fb01e6d7ea3b7426/Collaboration_Series_-5__How_to_Determine_Level_of_Effort_to_Integrate_a_Rich_Text_Editor_blog.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4a6Y89AUrMs3F9FBApjSa2/a999da5fe3da0f46fb01e6d7ea3b7426/Collaboration_Series_-5__How_to_Determine_Level_of_Effort_to_Integrate_a_Rich_Text_Editor_blog.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4a6Y89AUrMs3F9FBApjSa2/a999da5fe3da0f46fb01e6d7ea3b7426/Collaboration_Series_-5__How_to_Determine_Level_of_Effort_to_Integrate_a_Rich_Text_Editor_blog.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4a6Y89AUrMs3F9FBApjSa2/a999da5fe3da0f46fb01e6d7ea3b7426/Collaboration_Series_-5__How_to_Determine_Level_of_Effort_to_Integrate_a_Rich_Text_Editor_blog.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4a6Y89AUrMs3F9FBApjSa2/a999da5fe3da0f46fb01e6d7ea3b7426/Collaboration_Series_-5__How_to_Determine_Level_of_Effort_to_Integrate_a_Rich_Text_Editor_blog.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4a6Y89AUrMs3F9FBApjSa2/a999da5fe3da0f46fb01e6d7ea3b7426/Collaboration_Series_-5__How_to_Determine_Level_of_Effort_to_Integrate_a_Rich_Text_Editor_blog.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/4a6Y89AUrMs3F9FBApjSa2/a999da5fe3da0f46fb01e6d7ea3b7426/Collaboration_Series_-5__How_to_Determine_Level_of_Effort_to_Integrate_a_Rich_Text_Editor_blog.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/4a6Y89AUrMs3F9FBApjSa2/a999da5fe3da0f46fb01e6d7ea3b7426/Collaboration_Series_-5__How_to_Determine_Level_of_Effort_to_Integrate_a_Rich_Text_Editor_blog.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4a6Y89AUrMs3F9FBApjSa2/a999da5fe3da0f46fb01e6d7ea3b7426/Collaboration_Series_-5__How_to_Determine_Level_of_Effort_to_Integrate_a_Rich_Text_Editor_blog.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4a6Y89AUrMs3F9FBApjSa2/a999da5fe3da0f46fb01e6d7ea3b7426/Collaboration_Series_-5__How_to_Determine_Level_of_Effort_to_Integrate_a_Rich_Text_Editor_blog.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4a6Y89AUrMs3F9FBApjSa2/a999da5fe3da0f46fb01e6d7ea3b7426/Collaboration_Series_-5__How_to_Determine_Level_of_Effort_to_Integrate_a_Rich_Text_Editor_blog.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4a6Y89AUrMs3F9FBApjSa2/a999da5fe3da0f46fb01e6d7ea3b7426/Collaboration_Series_-5__How_to_Determine_Level_of_Effort_to_Integrate_a_Rich_Text_Editor_blog.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4a6Y89AUrMs3F9FBApjSa2/a999da5fe3da0f46fb01e6d7ea3b7426/Collaboration_Series_-5__How_to_Determine_Level_of_Effort_to_Integrate_a_Rich_Text_Editor_blog.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Coco Poley","slug":"coco-poley"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"How to Determine Level of Effort to Integrate Collaboration in a Rich Text Editor | TinyMCE"},"metaDescription":{"metaDescription":"Learn how to estimate the level of effort required to integrate a rich text editor with collaboration features like comments, mentions, and version history."}},{"title":"What to Expect During a Free Trial with TinyMCE","slug":"tinymce-14-day-free-trial-guide","featured":true,"lastUpdated":"Feb 3rd, 2026","description":{"description":"<p>Learn what the TinyMCE 14-day free trial really offers: full premium features, framework integrations, support access, and what happens after day 15.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Learn what the TinyMCE 14-day free trial really offers: full premium features, framework integrations, support access, and what happens after day 15."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"What to Expect During a Free Trial with TinyMCE","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABiVBMVEUIElMKE1QACE8AB08JE1QHEVMCC1EABE4ABU4ABk8CCU8CC08GD1IIEVMAAE0AAEoAAEYAAEcAAEgAAEwABU8AB1EAB1MAClQEElUFDlEKElIAAElJS2l1dYdhYnlbXHVdXnZjZXtdX3deYHg8QGMABE8ACFIAAEsAAlUAAE4HEVIAAEVYWXOIiZeFhZR0dYd4eYqGg4+Li5iEg5BZVWwKAEsABVIAAFFfX3a8vMLAwMZ5eooAAFMEFFYABk4AAERiY3mKipiGhpWMjZp3dIR9QjqEPy9wNjmJT0GFTkYQE1W1tbzc3eDFxcu7u8EAAFUAEVdOT2yHiJZ7e4yEhZR9fo+GhJKOiJRua38hA0svF04AE1gAAFakpa7Kys/k5Oelpa4AD1ZISWhkZHpXWHJ1doh5eotydIdaXHUAAU8CE1UABFY1OGCGh5dwcoYEEVIAA1UAC1IAAk4IEVIAD1UAElsAAFwAD1kADVMAB04CDFEAA04HD1EFEFMADFMAClMACFEJElMLFFSBEinTAAAAmUlEQVQI12NkYGRkQAaMDIx/GFmhgoy//4NINkYgYOEEkWBRxneMQiAO4wsWXkYYeKXM+FaEEYhfMGozYgIWESTOJ34wtZ3loiNCEGzkHVUGZmGdw9qcILDZmAMMpDmZGPlAsv+kn/5PnlAIcgcjY1c587+CQ79/F2gc+nuUwYmFFQjaxLez1DD+ZmBoB7u/3foUg5k1Q+Z/AEz1I+llH/E0AAAAAElFTkSuQmCC","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/3o9qGwM2PgitaqxcfCBROx/6ef77a45182243650ea85c81549e41b6/What_to_Expect_During_a_Free_Trial_with_TinyMCE__1_.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/3o9qGwM2PgitaqxcfCBROx/6ef77a45182243650ea85c81549e41b6/What_to_Expect_During_a_Free_Trial_with_TinyMCE__1_.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/3o9qGwM2PgitaqxcfCBROx/6ef77a45182243650ea85c81549e41b6/What_to_Expect_During_a_Free_Trial_with_TinyMCE__1_.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/3o9qGwM2PgitaqxcfCBROx/6ef77a45182243650ea85c81549e41b6/What_to_Expect_During_a_Free_Trial_with_TinyMCE__1_.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/3o9qGwM2PgitaqxcfCBROx/6ef77a45182243650ea85c81549e41b6/What_to_Expect_During_a_Free_Trial_with_TinyMCE__1_.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/3o9qGwM2PgitaqxcfCBROx/6ef77a45182243650ea85c81549e41b6/What_to_Expect_During_a_Free_Trial_with_TinyMCE__1_.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/3o9qGwM2PgitaqxcfCBROx/6ef77a45182243650ea85c81549e41b6/What_to_Expect_During_a_Free_Trial_with_TinyMCE__1_.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/3o9qGwM2PgitaqxcfCBROx/6ef77a45182243650ea85c81549e41b6/What_to_Expect_During_a_Free_Trial_with_TinyMCE__1_.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/3o9qGwM2PgitaqxcfCBROx/6ef77a45182243650ea85c81549e41b6/What_to_Expect_During_a_Free_Trial_with_TinyMCE__1_.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/3o9qGwM2PgitaqxcfCBROx/6ef77a45182243650ea85c81549e41b6/What_to_Expect_During_a_Free_Trial_with_TinyMCE__1_.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/3o9qGwM2PgitaqxcfCBROx/6ef77a45182243650ea85c81549e41b6/What_to_Expect_During_a_Free_Trial_with_TinyMCE__1_.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/3o9qGwM2PgitaqxcfCBROx/6ef77a45182243650ea85c81549e41b6/What_to_Expect_During_a_Free_Trial_with_TinyMCE__1_.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/3o9qGwM2PgitaqxcfCBROx/6ef77a45182243650ea85c81549e41b6/What_to_Expect_During_a_Free_Trial_with_TinyMCE__1_.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/3o9qGwM2PgitaqxcfCBROx/6ef77a45182243650ea85c81549e41b6/What_to_Expect_During_a_Free_Trial_with_TinyMCE__1_.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Coco Poley","slug":"coco-poley"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"What to Expect From the TinyMCE 14-Day Free Trial | TinyMCE"},"metaDescription":{"metaDescription":"Learn what the TinyMCE 14-day free trial really offers: full premium features, framework integrations, support access, and what happens after day 15."}},{"title":"Why collaborative rich text editing is essential for modern products","slug":"collaborative-text-editing","featured":false,"lastUpdated":"Mar 11th, 2021","description":{"description":"<p>Looking for a text editor for your product? Find out why real-time, collaborative rich text editing is an essential feature for modern apps.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Looking for a text editor for your product? Find out why real-time, collaborative rich text editing is an essential feature for modern apps."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Stylized graphic showing three people reaching into the center, pointing and holding colored shapes.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAMAAADTRh9nAAAC01BMVEX+9ej88+f68ub58eX48eX68uX88+X38Of89Ob68+b99ej/+Ov78+fd1sz27uHz7ePy7OLz7eLv6uDy7eS+zfa7zPb48+j79Of79Ob89Ofu59y/urjIwr/17uL+9ukhU5Lc2tn/9+f78+T78+Xn5erm393p4+Ho5+z2w8D4j5Htwcjv7ev/+Oe7trQAAFcAAE2xrq7/9eVVk/LOtNPTx+Ouxfmgu/mOs/2Xq+XkuGr70nf749P2X2/3GUfhU46hqezT2/Lb2+V9oegmWp9hUGnsl4hxb9G+VaGfkeR+rv+kvfjE0/rn4uT80Xj73ab66uH3d4H2CkT2Z3K1teZyqf99q/+Jsf9QbaYAElBsIlprTr++nsXy5uT28Oj99OT///////7//ff++e3/6ef9x8r73dPw7ODm5eq0x/h9qfxBWIsADE0VJl1kQr66rtD/+eb/9+TW2u2ivPft7/f//fj59fDH0ezc5ff//vXw7+7t6un17uH78+L17uerrL9SWHrIYkS4SqLdt8f58+jN1fFxpf9nof/g4ezz7N3U2OpNl/zEz/H78uSeuO91pvuswvfH0e/Z3eyeu/p2oPHjqqGFlfCes/STtfxcnf/l5Ov58eLi4eiBq/t3p/3g4e3/9eTZ2+qhu/V7qfxgn/9dnv9XnP9Vnf/O1fBTnf9Sm/+Hr/3T2PD78uHi4uiHr/7f4O3s6On88+Ty7efj4+zO1fG1x/awxPfy7eiAq/3CzvP+9eT89OTw7OeWtvldmPXX2+//9uT58eatwvf99OX+9OT78uXw6+j78+b89efE1PgkeNBQb6fp5+jp5+pkoP+2xvL69ej45NrWibqKVZc6hdTZ4/X/+ufN1vJfnv3f4Or68eX68+f4paT6P1TjW4bThrX3wb783tKqvvZgof/n5uv58ub69Oj51872S2H3QVr5SFr6Pk/4MU34UF7VbqmDnfXm5ux5YcFCAAAAlUlEQVQY02NkYGQEIkYwyfCTgYOR4T8TIy/jF15GCPjMB2UwyoOI+0qMyIBFGESKMKIKovGRBNeGoIrm4lSJTXBeMqogkzAQnAXil0KMgs0CEMC4g/EfM0zFdS3niLRZ6Y6Mx756HwSLLIllZDT/zwACjMqP/p6DG9a6/CpIkOURw02t6zBBBgZNsOC/R4yPGBGCYAAAAH4gxKo/a2YAAAAASUVORK5CYII=","aspectRatio":1.3333333333333333,"src":"//images.ctfassets.net/s600jj41gsex/1qCGDGSz0tHzTKqXh309Q2/b69ee36e76042abcffbc721fe32096ef/Collaborative_Editing_.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/1qCGDGSz0tHzTKqXh309Q2/b69ee36e76042abcffbc721fe32096ef/Collaborative_Editing_.png?w=185&h=139&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1qCGDGSz0tHzTKqXh309Q2/b69ee36e76042abcffbc721fe32096ef/Collaborative_Editing_.png?w=370&h=278&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1qCGDGSz0tHzTKqXh309Q2/b69ee36e76042abcffbc721fe32096ef/Collaborative_Editing_.png?w=739&h=554&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1qCGDGSz0tHzTKqXh309Q2/b69ee36e76042abcffbc721fe32096ef/Collaborative_Editing_.png?w=800&h=600&q=50&fit=scale 800w","srcWebp":"//images.ctfassets.net/s600jj41gsex/1qCGDGSz0tHzTKqXh309Q2/b69ee36e76042abcffbc721fe32096ef/Collaborative_Editing_.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/1qCGDGSz0tHzTKqXh309Q2/b69ee36e76042abcffbc721fe32096ef/Collaborative_Editing_.png?w=185&h=139&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1qCGDGSz0tHzTKqXh309Q2/b69ee36e76042abcffbc721fe32096ef/Collaborative_Editing_.png?w=370&h=278&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1qCGDGSz0tHzTKqXh309Q2/b69ee36e76042abcffbc721fe32096ef/Collaborative_Editing_.png?w=739&h=554&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1qCGDGSz0tHzTKqXh309Q2/b69ee36e76042abcffbc721fe32096ef/Collaborative_Editing_.png?w=800&h=600&q=50&fm=webp&fit=scale 800w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Elise Bentley","slug":"elise-bentley"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Why modern products need collaborative text editing"},"metaDescription":{"metaDescription":"Looking for a text editor for your product? Find out why real-time, collaborative rich text editing is an essential feature for modern apps."}},{"title":"5 tools for checking mobile accessibility","slug":"5-tools-for-checking-mobile-accessibility","featured":false,"lastUpdated":"Apr 26th, 2020","description":{"description":"<p>Here are five things you can get started with right away when it comes to testing for mobile accessibility.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Here are five things you can get started with right away when it comes to testing for mobile accessibility."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Mobile device displaying color filters options","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAACh0lEQVQYGQXBvW5cVRSG4fdbe58ziUzGseRqhKBwKIiEQgIFBUIRBdTcBNwKFEgUSDRUXIEbJCpSuDCVFVCUgIAwDvIP2CM7/mHmnL33WjyPNrdPgFWjBZFTmCnAQwgAgAAjbpjXFqMH0BudkSkxOg1534WZQ11e5mHsPAAgwAkzqzfWCqagU3QBjTwMtACDLJz0y6N7j745vVrtL64AJMTWxtrtm/38w8/K3Yddi04gCLKXECgiotacuic/jTs//BPMJtx58AB4srt3/BcV9PDdje7eajXFgAAyBQCw1lrUtyfdG598/Gaehsf6+nop5bWtu8NqWU7/PdqYHpQTlmv0CQCyKgDgEs23Nqfv3/mon7xydHw8nU4vLy9ns1kt5fD5n2nt1jwouesCtRZgVKhQRYXKwcnLo8ODxWKxu7u7v7+/t7d3dnZ2cnr6/bdfP16cdGZNVnMuqRuLMk0AAOAyZCaZcs4ppZyzJJP625t5GMpYrUS0GPqcvWUqACCJBh7NvTWXFBGS3L15E8IMKQbqzaQxQinTBACCDpufD/y43a29fnh0vFqtzs/PF4tFq3V5/Peq7wn5y6owC0fKNIVok6Rs2aNan3OSWUppZ2en7/uLi4t37t//9POvti1+DsKVli4CwsLVJl0K9YO725nZ88d//Pbr0/l8DtRa+677/dnT77784tnVZY9w4QpXuLLLhFLxFtYGf7Xx1gfvDX5rPt+/vr4GAB/HFy+OFGSgKVwCwFKYYT6qFUVYmEmklGazWUpJkqSUMyABwg23cAu3bKEBU5dB0cmz1f9Gmxjg7hEhCQAEAtzCJQByHaVwkGXlZdjSAw9vQM65lAIAAEQgQoQFAfwPIZd49pDeApIAAAAASUVORK5CYII=","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/6K40X0CdENUmHHcC5aaYDH/a8de64c661956b2b78c03bcb82444a9c/Image_default_5tools-MobileAccessibility.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6K40X0CdENUmHHcC5aaYDH/a8de64c661956b2b78c03bcb82444a9c/Image_default_5tools-MobileAccessibility.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6K40X0CdENUmHHcC5aaYDH/a8de64c661956b2b78c03bcb82444a9c/Image_default_5tools-MobileAccessibility.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6K40X0CdENUmHHcC5aaYDH/a8de64c661956b2b78c03bcb82444a9c/Image_default_5tools-MobileAccessibility.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6K40X0CdENUmHHcC5aaYDH/a8de64c661956b2b78c03bcb82444a9c/Image_default_5tools-MobileAccessibility.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6K40X0CdENUmHHcC5aaYDH/a8de64c661956b2b78c03bcb82444a9c/Image_default_5tools-MobileAccessibility.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6K40X0CdENUmHHcC5aaYDH/a8de64c661956b2b78c03bcb82444a9c/Image_default_5tools-MobileAccessibility.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6K40X0CdENUmHHcC5aaYDH/a8de64c661956b2b78c03bcb82444a9c/Image_default_5tools-MobileAccessibility.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6K40X0CdENUmHHcC5aaYDH/a8de64c661956b2b78c03bcb82444a9c/Image_default_5tools-MobileAccessibility.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6K40X0CdENUmHHcC5aaYDH/a8de64c661956b2b78c03bcb82444a9c/Image_default_5tools-MobileAccessibility.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Matthew Thackwell","slug":"matthew-thackwell"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":null},{"title":"Functional debt vs Technical debt: What’s the difference in a rich text editor?","slug":"technical-vs-functional-debt","featured":false,"lastUpdated":"May 16th, 2023","description":{"description":"<p>What is functional debt compared to technical debt? Read on to find out how knowing the difference influences your technical debts.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"What is functional debt compared to technical debt? Read on to find out how knowing the difference influences your technical debts."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"the symbols that represent debt and it's affects, including time and money loss.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.780758556891767,"src":"//images.ctfassets.net/s600jj41gsex/7p6SJvrwphZ1vTDomoRs5J/bc466e697ac16d79060b6c1b31f178e0/Tech_Debt_-7__1_.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/7p6SJvrwphZ1vTDomoRs5J/bc466e697ac16d79060b6c1b31f178e0/Tech_Debt_-7__1_.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/7p6SJvrwphZ1vTDomoRs5J/bc466e697ac16d79060b6c1b31f178e0/Tech_Debt_-7__1_.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/7p6SJvrwphZ1vTDomoRs5J/bc466e697ac16d79060b6c1b31f178e0/Tech_Debt_-7__1_.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/7p6SJvrwphZ1vTDomoRs5J/bc466e697ac16d79060b6c1b31f178e0/Tech_Debt_-7__1_.png?w=1109&h=623&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/7p6SJvrwphZ1vTDomoRs5J/bc466e697ac16d79060b6c1b31f178e0/Tech_Debt_-7__1_.png?w=1478&h=830&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/7p6SJvrwphZ1vTDomoRs5J/bc466e697ac16d79060b6c1b31f178e0/Tech_Debt_-7__1_.png?w=1925&h=1081&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/7p6SJvrwphZ1vTDomoRs5J/bc466e697ac16d79060b6c1b31f178e0/Tech_Debt_-7__1_.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/7p6SJvrwphZ1vTDomoRs5J/bc466e697ac16d79060b6c1b31f178e0/Tech_Debt_-7__1_.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/7p6SJvrwphZ1vTDomoRs5J/bc466e697ac16d79060b6c1b31f178e0/Tech_Debt_-7__1_.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/7p6SJvrwphZ1vTDomoRs5J/bc466e697ac16d79060b6c1b31f178e0/Tech_Debt_-7__1_.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/7p6SJvrwphZ1vTDomoRs5J/bc466e697ac16d79060b6c1b31f178e0/Tech_Debt_-7__1_.png?w=1109&h=623&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/7p6SJvrwphZ1vTDomoRs5J/bc466e697ac16d79060b6c1b31f178e0/Tech_Debt_-7__1_.png?w=1478&h=830&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/7p6SJvrwphZ1vTDomoRs5J/bc466e697ac16d79060b6c1b31f178e0/Tech_Debt_-7__1_.png?w=1925&h=1081&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Millie Macdonald","slug":"millie-macdonald"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Functional vs Technical Debt: Cost, Causes, Examples | TinyMCE"},"metaDescription":{"metaDescription":"We focus on what is functional debt compared to technical debt in software development. One example is the rich text editor, and the key differences in handling and prioritising those are discussed.\n"}},{"title":"CSS preprocessors and frameworks: streamlining your CSS development","slug":"css-development","featured":false,"lastUpdated":"Aug 23rd, 2023","description":{"description":"<p>How do you approach CSS development? Find out ways to streamline your projects, including vanilla CSS, preprocessors such as LESS, SASS and SCSS, as well as Bulma and Bootstrap, plus utility-first frameworks like Tailwind CSS.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"How do you approach CSS development? Find out ways to streamline your projects, including vanilla CSS, preprocessors such as LESS, SASS and SCSS, as well as Bulma and Bootstrap, plus utility-first frameworks like Tailwind CSS."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"CSS, the initialism, appearing in a box, surrounded by colour, showing the design power of CSS","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAAulBMVEVo8eVo8eVo8uVn8uVl8uVo8uZn8uZl8uZi8+Zk8uZ/8eZp8uaA8eZr8uZs8uds8uZm8uZ669+h3dqI6dyw8Ohy6dp76N6x8Ol97eVm6uFt8eFu8eVj7+F16dyg2NGg5Nes8Ol53s584NSs8emP6uGEz9+V2c+F7tRl8udl8eW37ufG6uSA7OKv8eqJ6NGK39Ow7+l87+OB2+J04+Bm7+Fn8eaS8eea8ehn8eVm8+Vm8+Zj8uVi8uVm8uVrdVXpAAAAAXRSTlP+GuMHfQAAAF5JREFUCB2NwTEOggAQAMHd87Aw8hVi6f8bGxN6HwKFyAEVJFo4o3wLfkg2ioXCp4Bk1bhB0WGCBPLibgQSmK/u2leRrFoPAIU43ezzfa5OnzWBAnHXRzBXQQEGf1oA0sUURFtZ2vMAAAAASUVORK5CYII=","aspectRatio":1.780758556891767,"src":"//images.ctfassets.net/s600jj41gsex/1lrHp6Ww3gXvSDua3WTjDE/c68cbcea100165fd35106a8d881c21ce/CSS_preprocessors_and_frameworks__streamlining_your_CSS_development.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/1lrHp6Ww3gXvSDua3WTjDE/c68cbcea100165fd35106a8d881c21ce/CSS_preprocessors_and_frameworks__streamlining_your_CSS_development.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1lrHp6Ww3gXvSDua3WTjDE/c68cbcea100165fd35106a8d881c21ce/CSS_preprocessors_and_frameworks__streamlining_your_CSS_development.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1lrHp6Ww3gXvSDua3WTjDE/c68cbcea100165fd35106a8d881c21ce/CSS_preprocessors_and_frameworks__streamlining_your_CSS_development.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1lrHp6Ww3gXvSDua3WTjDE/c68cbcea100165fd35106a8d881c21ce/CSS_preprocessors_and_frameworks__streamlining_your_CSS_development.png?w=1109&h=623&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/1lrHp6Ww3gXvSDua3WTjDE/c68cbcea100165fd35106a8d881c21ce/CSS_preprocessors_and_frameworks__streamlining_your_CSS_development.png?w=1478&h=830&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/1lrHp6Ww3gXvSDua3WTjDE/c68cbcea100165fd35106a8d881c21ce/CSS_preprocessors_and_frameworks__streamlining_your_CSS_development.png?w=1925&h=1081&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/1lrHp6Ww3gXvSDua3WTjDE/c68cbcea100165fd35106a8d881c21ce/CSS_preprocessors_and_frameworks__streamlining_your_CSS_development.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/1lrHp6Ww3gXvSDua3WTjDE/c68cbcea100165fd35106a8d881c21ce/CSS_preprocessors_and_frameworks__streamlining_your_CSS_development.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1lrHp6Ww3gXvSDua3WTjDE/c68cbcea100165fd35106a8d881c21ce/CSS_preprocessors_and_frameworks__streamlining_your_CSS_development.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1lrHp6Ww3gXvSDua3WTjDE/c68cbcea100165fd35106a8d881c21ce/CSS_preprocessors_and_frameworks__streamlining_your_CSS_development.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1lrHp6Ww3gXvSDua3WTjDE/c68cbcea100165fd35106a8d881c21ce/CSS_preprocessors_and_frameworks__streamlining_your_CSS_development.png?w=1109&h=623&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/1lrHp6Ww3gXvSDua3WTjDE/c68cbcea100165fd35106a8d881c21ce/CSS_preprocessors_and_frameworks__streamlining_your_CSS_development.png?w=1478&h=830&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/1lrHp6Ww3gXvSDua3WTjDE/c68cbcea100165fd35106a8d881c21ce/CSS_preprocessors_and_frameworks__streamlining_your_CSS_development.png?w=1925&h=1081&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Marty Friedel","slug":"marty-friedel"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"CSS preprocessors and frameworks explained | TinyMCE"},"metaDescription":{"metaDescription":"Dive into CSS development optimization with our guide. Learn about vanilla CSS, preprocessors like LESS, SASS, SCSS, and frameworks like Bulma, Bootstrap, and Tailwind."}},{"title":"Developer insights collection: resources, trends, and news","slug":"developers-insights-collection","featured":false,"lastUpdated":"Dec 8th, 2021","description":{"description":"<p>Tiny values developers knowledge, and we're sharing more developer insights in this collection.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiny values developers knowledge, and we're sharing more developer insights in this collection."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"developer resources and useful information on software and web development insights, trends, news and hacks represented by prompts on devices.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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F3CculE8AAAC4lBMVEUZJFkYJFkhLWgjMGwjL2seKmMXI1cfK2QgLWccJ14YJFgbK2MbK2QjM3AlNXMkNHIgMGsaKmIhMWwiMm4kNHMeLmggNnIfNnIgNnMmO3snPH0jOXgfNXEkOXknPH4lOnohN3UjQYEoRIYqRIgpRIgnQ4QnQ4UpRIcoQ4YlQoMnTo8nTpAmT5ArT5MsT5MpT5ImUJEqWI8tPn8tPH8pRYcoT5ErW54rXJ4tXpwxUJgyUJkzUJkzT5kwUpksX5UuQX4vPX0tTosyUZkzT5gxUJcrWZwtZKYtZqc0a6U9TJ49TZ48Tp47Up88TZ47Tp4vYJYnXYsmXIsxXJI9T549TJ06TZsuYKMtZacvaq0uba40bag8S500YqEtbaI8T547TZ4zYZcsSoInWIkwY5U0YKA5Vp4vZqgvbK4xcbMwdLQ1cKs2XaAndKM5Vp8zYpctOXktNXgwXpEwaKE1X586TZwwbK4xc7UyeLoye7s1c608Spw8TJ44V58yZaE7UJ87TJ00ZZ0tXpEtXZEybJ07UJ09S506Tpwyc7Qyers0gMA0gsI2dK88RJk8R5s8RZs9RJs8SJs6R5o+U6M+VKM6aKU8S5w8Rps9Rpo6S5o0ebo2h8c2icgwf7MrX5YtYJgvbJ8wb6EuYZosYpksYJY5TZs7U6E7VaE2ZqAuWZMuapwuY5kuXpk0gcA4j804j843kc02ks02kMw3rdc3tNo2k842jME8TJ08Sp48S548TZ02bq42t9o2p9Q2j8s4kM04kM45l9Q5ldM6sN06tt85lNM6l9U4kMg6ZKc7aak7bqo7YaY4d7c6u+I6rNs7n9o7ndo7tOE7vuQ7p9w7qN07r986pNk6uuE6vOE6ntg7ndg7v+U7seA9qOE9p+E9quE9reI9rOI8x+o9vOc8zew9ueY9ruM8xeo9t+U9puA+sOc+r+c+tOg+tuk9z+8+uuo+suc/s+k/suk/seg9zfA/uOo/sujwUHQ/AAAAtklEQVQYGQXBwU0CURgGwG/e/kAMCsty8Ugx1mBPFmVBxETFEA667HNGojd6Y86qz1m72SbQG3NWfV67pbaBBGK5Z916bZOgt3kllnvWUg96IwH+ejYt9Qj0PgAx/tQIuBcQpprwOfF1gPOz71GNXLLnIzucd/bUnvGEOsE0gTdgGby/AC51APAK0OoILAMAxzomAQDXntolAQCtp3ZJICA8XeOcJEnAPYbfpDZJkoRlsPSaN8k/5R0yHQvzkmsAAAA4dEVYdGljYzpjb3B5cmlnaHQAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55+Vd5NwAAACF0RVh0aWNjOmRlc2NyaXB0aW9uAHNSR0IgSUVDNjE5NjYtMi4xV63aRwAAACZ0RVh0aWNjOm1hbnVmYWN0dXJlcgBJRUMgaHR0cDovL3d3dy5pZWMuY2gcfwBMAAAAN3RFWHRpY2M6bW9kZWwASUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCRFNIqQAAAABJRU5ErkJggg==","aspectRatio":1.0979142526071843,"src":"//images.ctfassets.net/s600jj41gsex/2T30PcQr5caJ36AncUnwHu/e3e45e1719bfb883bc0538de9057b833/Image_DeveloperInsights_Design_1.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/2T30PcQr5caJ36AncUnwHu/e3e45e1719bfb883bc0538de9057b833/Image_DeveloperInsights_Design_1.png?w=185&h=169&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2T30PcQr5caJ36AncUnwHu/e3e45e1719bfb883bc0538de9057b833/Image_DeveloperInsights_Design_1.png?w=370&h=337&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2T30PcQr5caJ36AncUnwHu/e3e45e1719bfb883bc0538de9057b833/Image_DeveloperInsights_Design_1.png?w=739&h=673&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2T30PcQr5caJ36AncUnwHu/e3e45e1719bfb883bc0538de9057b833/Image_DeveloperInsights_Design_1.png?w=1109&h=1010&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2T30PcQr5caJ36AncUnwHu/e3e45e1719bfb883bc0538de9057b833/Image_DeveloperInsights_Design_1.png?w=1478&h=1346&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2T30PcQr5caJ36AncUnwHu/e3e45e1719bfb883bc0538de9057b833/Image_DeveloperInsights_Design_1.png?w=1895&h=1726&q=50&fit=scale 1895w","srcWebp":"//images.ctfassets.net/s600jj41gsex/2T30PcQr5caJ36AncUnwHu/e3e45e1719bfb883bc0538de9057b833/Image_DeveloperInsights_Design_1.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/2T30PcQr5caJ36AncUnwHu/e3e45e1719bfb883bc0538de9057b833/Image_DeveloperInsights_Design_1.png?w=185&h=169&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2T30PcQr5caJ36AncUnwHu/e3e45e1719bfb883bc0538de9057b833/Image_DeveloperInsights_Design_1.png?w=370&h=337&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2T30PcQr5caJ36AncUnwHu/e3e45e1719bfb883bc0538de9057b833/Image_DeveloperInsights_Design_1.png?w=739&h=673&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2T30PcQr5caJ36AncUnwHu/e3e45e1719bfb883bc0538de9057b833/Image_DeveloperInsights_Design_1.png?w=1109&h=1010&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2T30PcQr5caJ36AncUnwHu/e3e45e1719bfb883bc0538de9057b833/Image_DeveloperInsights_Design_1.png?w=1478&h=1346&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2T30PcQr5caJ36AncUnwHu/e3e45e1719bfb883bc0538de9057b833/Image_DeveloperInsights_Design_1.png?w=1895&h=1726&q=50&fm=webp&fit=scale 1895w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Developers resources collection: insights, trends and news | TinyMCE"},"metaDescription":{"metaDescription":"Constantly updated overview of developer resources to keep an eye for the most useful information on software and web development insights, trends, news and hacks."}},{"title":"Real-time collaboration is the new responsive design","slug":"real-time-collaboration-essential","featured":false,"lastUpdated":"Feb 3rd, 2021","description":{"description":"<p>Real-time collaboration is the new responsive design. We share why it&rsquo;s becoming essential for tools and what developers can expect.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Real-time collaboration is the new responsive design. We share why it’s becoming essential for tools and what developers can expect."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Different colored text boxes","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAMAAAAhxq8pAAACmlBMVEUIG0wJHEwJHU0LHk4KHEwIG0sLHU0KG0wIGksIGUsLHE0OIVAMHk0LHUwIG0oJG0sMF00GAEcEAEUGAEYIEUgIGUoJHEoNIE4LHkwMH00MHkwIGkkIEUcMKEwXT1wXTVwXTVsXTlwXUF0NK00HD0cLHEsKHEoIG0kLHUoJGkgEAEEhcm88zKw7y6s5yqk6yqo8zawkenQEAEAJGUcLHEkKHEgJG0cJG0gJG0YKG0cMHEkKGkcFAEAcYWQ2tJs3uZ4zsZg0sZk0spk1tJoeaWkEAD8IGEUIGUUIGkYJGkQJGUQIE0MAADsYYWMvn4wCAD0CADoHAD4HAD8IBEEJFEMKGUQLG0UIGUQIGUMJGkULHEgKGkMJGUIIGUIFFkIAAEEhS1gdI1YbIlEyQG8zQnEyQW8yQm8yQ3AzRXIpOWMGF0AJGkMLHUgMG0YKGkQGFz8AET0AAzoACEKYoLZcYXsaLV8cLFc0RnQ2SHc2SHYtPWgGFj0KGkILHEcLG0MHFz8ACjkAADYAADAAADOGjqJQVmsAACEAADQAE0APH0UTIUcUIkcVI0gPHkMIFz0KGUEIFzwCEzkAACmSmq+7xdy2wNe1v9a3wdmvuc87QlgEFDkGFTkHFTkIFzoJFzsJGDwJGDsIFzkBEjcAACOiq8DO2fLJ1O3I0+zJ1e7CzORFS18AAC4HFjgJFzkKGDwJFzoIFjcEEzUAAC0wN01ESl1AR1pARllCSVw/RlkADzMADjMIFTYJFjYJFzgKGT0KGDoIFTQIFDMDEjMAADIAACAAACUADC8HEzMIFTMJFjUKGTwLGj8IFDAIEy8KGkEGEzEFES8FEi8HFTQIEzAIFTIKGDkIEi0IEy4LGT4MG0MJFjcIEiwJFjQIFDFKPH1hAAAAp0lEQVQYGQXBsVITYQCAwW+P3wGZxNzFxoaCN/AJpODNtaWhoaZyhkIG0oiBybmrqio6VdWZ4WMEp7OjqtZzG4EUb+vlW5/HBmCdMP+etY750Bcg2GEd8wIAeGkaSwEAM2MfuP8OgLEHbmGtCcYCAII/Yw+Ep2+CZSxA2OOwbTqNHbBO4HW7w5jx60f9vEGbgjuP1xTPX/9VXXjyAN77e7g6VvXp/fw/Qcck1qEbbkYAAAAASUVORK5CYII=","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/4tEPRk1cyAfxNcKMYmaH7Z/40fb3d40c19ab4298810104f9d97f041/BlogImage_Jan2021_default_RTC-new-responsive-design.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/4tEPRk1cyAfxNcKMYmaH7Z/40fb3d40c19ab4298810104f9d97f041/BlogImage_Jan2021_default_RTC-new-responsive-design.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4tEPRk1cyAfxNcKMYmaH7Z/40fb3d40c19ab4298810104f9d97f041/BlogImage_Jan2021_default_RTC-new-responsive-design.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4tEPRk1cyAfxNcKMYmaH7Z/40fb3d40c19ab4298810104f9d97f041/BlogImage_Jan2021_default_RTC-new-responsive-design.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4tEPRk1cyAfxNcKMYmaH7Z/40fb3d40c19ab4298810104f9d97f041/BlogImage_Jan2021_default_RTC-new-responsive-design.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/4tEPRk1cyAfxNcKMYmaH7Z/40fb3d40c19ab4298810104f9d97f041/BlogImage_Jan2021_default_RTC-new-responsive-design.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/4tEPRk1cyAfxNcKMYmaH7Z/40fb3d40c19ab4298810104f9d97f041/BlogImage_Jan2021_default_RTC-new-responsive-design.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4tEPRk1cyAfxNcKMYmaH7Z/40fb3d40c19ab4298810104f9d97f041/BlogImage_Jan2021_default_RTC-new-responsive-design.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4tEPRk1cyAfxNcKMYmaH7Z/40fb3d40c19ab4298810104f9d97f041/BlogImage_Jan2021_default_RTC-new-responsive-design.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4tEPRk1cyAfxNcKMYmaH7Z/40fb3d40c19ab4298810104f9d97f041/BlogImage_Jan2021_default_RTC-new-responsive-design.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ben Wilkinson","slug":"ben-wilkinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Real-time collaboration is no longer optional"},"metaDescription":{"metaDescription":"Real-time collaboration is the new responsive design. We share why it’s becoming essential for tools and what developers can expect."}},{"title":"To OT or CRDT, that is the question","slug":"real-time-collaboration-ot-vs-crdt","featured":true,"lastUpdated":"Jan 13th, 2020","description":{"description":"<p>If you&rsquo;re playing around in the real-time collaboration space, you&rsquo;re likely to come across these terms: operational transformation (OT) and conflict-free replicated data type (CRDT). But what do they really mean? And which one should you use?</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"If you’re playing around in the real-time collaboration space, you’re likely to come across these terms: operational transformation (OT) and conflict-free replicated data type (CRDT). But what do they really mean? And which one should you use?"}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Abstract illustration of text editor, containing text 'Hello World', and two cursors present.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAACkUlEQVQYGXXBS2ucZRQH8P85z3medy6ZS6ZJpmK1puJtpYJLXYjuBBeCIH4OwYVfws/hQtxIV668gEVBKyhk2o0RG9OZ6WTmncm8z+UcEysoSn8/2vtsqkCdKKmZ4VEc0HaIhqhgQkcQHESTlZTHYesqMjMYYIb/YcIFNUDIiq2btnmRzTldcZvHDzM7h3Zwh2MQ4dGIqKzPjz+/v2z6UiJyTPVMIQyOtDrFvxAuGf5GAIgQm1InCiSVJ2tVv94V6YbNsqQEGIhxwRk8IxsKQIRAcAQiUHKuJBpBrr7M8mDRdG7I2YOeWELHt9ziNG2iPPk0V514b6KrGAJZcAABIEKhZJYhOpnk40k6vFKitoftx64XsA36G+kPyGWPxbUbwr0wPcJqAWYQARklI0W49PwH8Wi9zvudA2YTO5trclXfvFuW1QYgabH45LEq2xC3HoClrNuooSs6PEiA74ZqZ7u8fTK7n11Locn7JiYvTuFCqKJUyZYL6F5p7RR1XIBCLrzxIZ/XBa3NZDnQW53R2c4T0ZfjcucnfPu9fvVDtT9rPxPqT74YvjnONz8dvv6Uqd+eJq36gkKmsMIlV4Zm8O6rZqb1uDrclfcHVtQ0u16n+ugt2e1hvcJqrn/Y/sFprKcMJRRiwAs1Xx+l30/qL2/Feye6qo2L5s36ux/zdAbSPJ93337JOHBuRq/tjV5cihUigECFqlQ9d/LxbWsMsiAw7c51Ecm4/uYud72Zwmz4XiXXx3mnZ8++IAwm47I+V98tr7zDDGbCQ2YgUkVRwC7ACfnpevvb4s4vyfpXhQ0ljGw95xiZCQTDP1RhBsIlAnSL2c8g6qK7SwrJmYzb6F9zDBAuGR5SQzH8Bxn+YjD7E5xUbHGOVy0aAAAAAElFTkSuQmCC","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/lq18Ma2NAAtWvmZbaj7E4/a6e3872f74d3d43613b0e2355af79b0a/Image_default_rtc.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/lq18Ma2NAAtWvmZbaj7E4/a6e3872f74d3d43613b0e2355af79b0a/Image_default_rtc.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/lq18Ma2NAAtWvmZbaj7E4/a6e3872f74d3d43613b0e2355af79b0a/Image_default_rtc.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/lq18Ma2NAAtWvmZbaj7E4/a6e3872f74d3d43613b0e2355af79b0a/Image_default_rtc.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/lq18Ma2NAAtWvmZbaj7E4/a6e3872f74d3d43613b0e2355af79b0a/Image_default_rtc.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/lq18Ma2NAAtWvmZbaj7E4/a6e3872f74d3d43613b0e2355af79b0a/Image_default_rtc.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/lq18Ma2NAAtWvmZbaj7E4/a6e3872f74d3d43613b0e2355af79b0a/Image_default_rtc.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/lq18Ma2NAAtWvmZbaj7E4/a6e3872f74d3d43613b0e2355af79b0a/Image_default_rtc.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/lq18Ma2NAAtWvmZbaj7E4/a6e3872f74d3d43613b0e2355af79b0a/Image_default_rtc.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/lq18Ma2NAAtWvmZbaj7E4/a6e3872f74d3d43613b0e2355af79b0a/Image_default_rtc.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Andrew Herron","slug":"andrew-herron"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Building real-time collaboration applications: OT vs CRDT"},"metaDescription":{"metaDescription":"What do OT (Operational Transformation) and CRDT (Conflict-free Replicated Data Type) really mean? And which one should you use in your real-time collaboration solution?"}},{"title":"Adaptability is key to your success as a software developer","slug":"software-developer-qualities-adaptability","featured":false,"lastUpdated":"Jun 7th, 2020","description":{"description":"<p>One of the most important software developer qualities is adaptability. Find out why it&rsquo;s so critical and how developers can be more adaptable.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"One of the most important software developer qualities is adaptability. Find out why it’s so critical and how developers can be more adaptable."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"A group of eight young adults crowd around a laptop.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAADnElEQVQYGRXBzW/bVAAAcD/72bHTfDZx0rVNQpt2XZp1tNWkoq1sB6i2ISakTRoHpImPC3dOHLjAiT8ATYIDgssQCAmEepiGQNBSRtu1S9s0zaZ8N0mbNLFjO3b8nu2H9vuB3P4ew/KQZQFDa5p21mrF4wmK2MjQbQsTChDHsV/ClmU1KsVMJrN4ebFaPVEUnQYA0DQANDAHutqotH//cdDXZLm7n93KHu5gjBxCKED1VFnr93xY46sHFkasW4BDPA0ADQANAI0s2yVw6bm07dgII8rRDV22sEUIkTtnhcKRpvYQ53JFxVK16FAAshDSDEMzL+UbzQe//ZyyFCpTu31tWe7KDmEJRRHHNrKbXu+wixfK3dZgbLJULq4k5+YvzdMQsggjRVNjfo/oDXzVY3r1gtslzM1fFwNhQ++fnTQspEunJ3JPwYAb8oVk1QiNjE6nZiFk4e72bm13/ebdd1/1+J9ZpbcXUqIYwRhrledc9zhfPt7f2fYL0Kg200tXbItSDEs3VOJYtI0GoFWIU6qJUIIy7vcPfNGEBehBXw1zTGcAHx0ppwZ9a/l19GK3dSY3291EbIJgtVTehw707NelwnbmvRu8zkVqG9lzd1iPJOX//gUp2DOVunY98OWnP13wgcrO3neHiDJb95YXuotLhy86oFGuff/1gz/W/kyvfMgSJ8p1gVf0MuRg9eGxpMy/85E/FB0obQiwm1jRkbFKubL+78ZB9XhhdgZaUtetNblw4pzoNZqVpdRUsVgcGH0L474rDBjI2Pbk+Kiitl2C8MrM+amR8Vgwcvfj+8bRJnPz/c9i4UAwGEhPxoMsEwUS45jDYZFieCKdtov5enaT8NyTtV//+W9z/uKlIazosqIR+lkuD755XJtyGwko1TZWy43m5VCTslXsnZJP6lg6JrQHjV596gQluT2dvBAf4pNjI4pi7/VsydAgj/u9zFqm+IiFHoxsxMeVTr3jCCYY9fgDQ+HY8Gu332B5DjK4086tPhSFN93D8TilJ+KTzBeffFBR0FaueXHxaldHE+MhmLziX1xxjaeednBGtgV/aHp6RgyFa08ek/qOXMo5gijGJl0eH0xGIO8+H/a4esVDxLkF3zCl1JTIDMNyycQEWyqUM9tA64luVq1kWYYVcAttfatGPxf8Iui3ypoNDVV9vv4XFRydDWA980MXh22jQzsmZZu2KZtqnhPGoDBCLGKZuoORGXvLSN34H6+NBEr56QH6AAAAAElFTkSuQmCC","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/2qCuzkMe5Mw3yXvl43jV5Y/ad7f614887d682612681731aba2adeca/Image_default_Adaptability.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/2qCuzkMe5Mw3yXvl43jV5Y/ad7f614887d682612681731aba2adeca/Image_default_Adaptability.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2qCuzkMe5Mw3yXvl43jV5Y/ad7f614887d682612681731aba2adeca/Image_default_Adaptability.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2qCuzkMe5Mw3yXvl43jV5Y/ad7f614887d682612681731aba2adeca/Image_default_Adaptability.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2qCuzkMe5Mw3yXvl43jV5Y/ad7f614887d682612681731aba2adeca/Image_default_Adaptability.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/2qCuzkMe5Mw3yXvl43jV5Y/ad7f614887d682612681731aba2adeca/Image_default_Adaptability.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/2qCuzkMe5Mw3yXvl43jV5Y/ad7f614887d682612681731aba2adeca/Image_default_Adaptability.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2qCuzkMe5Mw3yXvl43jV5Y/ad7f614887d682612681731aba2adeca/Image_default_Adaptability.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2qCuzkMe5Mw3yXvl43jV5Y/ad7f614887d682612681731aba2adeca/Image_default_Adaptability.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2qCuzkMe5Mw3yXvl43jV5Y/ad7f614887d682612681731aba2adeca/Image_default_Adaptability.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ben Long","slug":"ben-long"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Adaptability is key to your success as a software developer"},"metaDescription":{"metaDescription":"One of the most important software developer qualities is adaptability. Find out why it’s so critical and how developers can be more adaptable."}},{"title":"A Tiny road to Reason","slug":"tinymce-reasonml","featured":false,"lastUpdated":"Sep 21st, 2020","description":{"description":"<p>We are incorporating ReasonML in TinyMCE to take advantage of its guaranteed type safety, superb type inference, more advanced type system features, and the ability to compile to extremely fast native binaries.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We are incorporating ReasonML in TinyMCE to take advantage of its guaranteed type safety, superb type inference, more advanced type system features, and the ability to compile to extremely fast native binaries."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Time-lapse photo of highway road at dusk, a stream of white light on the left and red on the right.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAADTUlEQVQYGQ3BW08cZRgA4Pc7zOzMnmcXdlksCLSgMYYeYmtDpKaxtTXGaNL2Rm8kxit/gBdeNsZf4YV3XmmMxhMJaQSE1kMTE2nTKKUIrKW7LOzO7M7M973vq88j3OsLwlqBKNFKQkASjEwEjMAsiQUTEwsmZgZmBlAACEwgdKlcYWsctApRo2VEQSjRSkJFBEQIjMSGGZksMTIJZgHAAHq+OpRLY2NSY41FlCbVNlVoJaIlSohS5hTgCETCnAKkzJYYgZlBz/s+AvbTQTcOm1GUGNM3adZxHK2tMYJIELlSFawpOP9zWQgAMEIaIXSys9kJe724b5kbWislQhShicMYGYAIs0oCSR/AGpKEWS/jKQXAynH19sMHE8Xyi5XqkJfxpZAMUorQmFYcd61NEfeTgRGAABpE2fM87WjX1Y6bSCWgOgJIl+u1C1MTRa19pUbzRRCi4vkoFQIUgZlwaXd3uj5y+qljh8Y+isJsJiNAiGpj3BB14wRqQX24kq2WHi7dgajzdnC8MXPirhlcC/LTvvvJxsZ4qTQTBIbp0417z1eqBdfVvptxrXFcTjuR0b6qDEPU8V66WH3j9aDR+GDQ23hwf2FpXQ81lttP7L274BWA1D+7e0Cs00EfAASi7g9s2Ptb0Ts3P37z1Vfyufzt5eXTEFfKhR/r3upedLI2hmNn04OtuLubJAaYVC6TY4uqkFWNWm1ubuG99+fmzpcKha9Xby/+vPJWoVBM6Hy1vm8Of9rbhuIEHrakCR0ps1pqUcw5teEBw9SpM1euXq0G5TgM/zrsfvn94mNINqNkNow8AzcnZ/MGPt9fLx61tRFKSimEyj3zbD+xs5euvHz5ElgMDw7K5dKtO7//8sOi4ztP1xvzrXbTCO7HF/JVRlyLIw9RMzAIFYxPXbx+44VTJ4/anebW9sSxRrPT+/arb/SjraCQwZHRM48Pp9lZaXXKvf7ZYKio5VIc+cwKSb324UczoyOtf/c3/9w4PjmW8XOr678O1pa5H4Gr7HBtLLHP7fSCTvpF78mJIzNdGx73M/f7vVRLOVMptVvt726tTI4Maa332+2d9TVvEAmD2B8MDlq/ZVW72QkQznXFZ92m/8feuXzl3bGJDPF/0UvmX79MqwsAAAAASUVORK5CYII=","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/769iuq6HFbLRFFch3CrhSy/d7cf38e382559adbf73aa7ef4e09d26e/Image_default_Road-to-reason.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/769iuq6HFbLRFFch3CrhSy/d7cf38e382559adbf73aa7ef4e09d26e/Image_default_Road-to-reason.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/769iuq6HFbLRFFch3CrhSy/d7cf38e382559adbf73aa7ef4e09d26e/Image_default_Road-to-reason.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/769iuq6HFbLRFFch3CrhSy/d7cf38e382559adbf73aa7ef4e09d26e/Image_default_Road-to-reason.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/769iuq6HFbLRFFch3CrhSy/d7cf38e382559adbf73aa7ef4e09d26e/Image_default_Road-to-reason.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/769iuq6HFbLRFFch3CrhSy/d7cf38e382559adbf73aa7ef4e09d26e/Image_default_Road-to-reason.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/769iuq6HFbLRFFch3CrhSy/d7cf38e382559adbf73aa7ef4e09d26e/Image_default_Road-to-reason.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/769iuq6HFbLRFFch3CrhSy/d7cf38e382559adbf73aa7ef4e09d26e/Image_default_Road-to-reason.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/769iuq6HFbLRFFch3CrhSy/d7cf38e382559adbf73aa7ef4e09d26e/Image_default_Road-to-reason.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/769iuq6HFbLRFFch3CrhSy/d7cf38e382559adbf73aa7ef4e09d26e/Image_default_Road-to-reason.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Andrew Herron","slug":"andrew-herron"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"TinyMCE’s Road to ReasonML"},"metaDescription":{"metaDescription":"We are incorporating ReasonML in TinyMCE to take advantage of its guaranteed type safety, superb type inference, more advanced type system features, and the ability to compile to extremely fast native binaries."}},{"title":"Agile, waterfall, or hybrid: what’s right for your development team?","slug":"waterfall-vs-agile-development-team","featured":false,"lastUpdated":"May 7th, 2020","description":{"description":"<p>Agile is almost synonymous with software development, but that doesn&rsquo;t mean your dev team should automatically adopt it. We talk about alternative approaches and what to expect when you transition to agile.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Agile is almost synonymous with software development, but that doesn’t mean your dev team should automatically adopt it. We talk about alternative approaches and what to expect when you transition to agile."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Pineapple painted pale orange and green sits on a blue background.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAACV0lEQVQYGQXBPW5dVRSG4fdbe59zg23lRibYCcigUICQEgRNhERJxRCQaBAFs6DJOBAUDIARMABSUiBEZBHsACH+ybVv7s/Ze63F84hHv1EKRRTDhAHCBCL01a3p+4Udpj93SAjHE3falm2vmDBhhgkTBqkvdttn+9eX0/jwzvbevzs/ndXniEgQARKCahUTBkUYGEhIl1k+nZ++rZPLcvhi9+jb/24jsARhiUMpkAZCQiAhYUJaO0MPK9o//2VYLaAgwwwJExIIYZAIAAAAkp657lhbzIa249fvFgeBEEhIIJCRSQQReBIQEHwyrA/GxVAySn3L/rqviRQBAREkpAhVInABCBIMkpfNoliayjC6xn8mEUEkkfQgAg86xpS0oDk96EFPWn539dqz6SDqzrLxq997vBlpgSc96UkLutNbpTmZZGJgYNDz0cPd2x99eLY9uujctfmXMf143ClBD3rgTnd6VHqHAolBgUyq7r8zXs1m5cYtTx+2q/cON/zhZOJBOO64417JwA1L5KRIfVByr12fL3HvU2+rtk06JB6Ek0EEEURUJDLogKEAu2p58Opv37v7p++s1u16mpaT0xwc74TjQQZkRZBJJp5kYP3ZVpuNv++nK7/ze46TbLFas1hSwQQCkKjFIAEAA0uUn9/so2/65tXR5vjNfnG29ienS9pEBoBBLYyV2VCRyESJksGY6esH2wdvLPt6Oa3b7OLpyfH+z09fZ76HACgFE2ZAxYREKVRRjPHGNyd7L+Lmx/OXtl09Ph9+WM85HNhsCMdgGDEjIeJ/+jhprlqRihwAAAAASUVORK5CYII=","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/4tDsBx08Z8InkWXqt5XOuk/2cf53cd6878ad6e5acb2d4dc828ae63a/Image_default_AgileWaterfallHybrid.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/4tDsBx08Z8InkWXqt5XOuk/2cf53cd6878ad6e5acb2d4dc828ae63a/Image_default_AgileWaterfallHybrid.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4tDsBx08Z8InkWXqt5XOuk/2cf53cd6878ad6e5acb2d4dc828ae63a/Image_default_AgileWaterfallHybrid.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4tDsBx08Z8InkWXqt5XOuk/2cf53cd6878ad6e5acb2d4dc828ae63a/Image_default_AgileWaterfallHybrid.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4tDsBx08Z8InkWXqt5XOuk/2cf53cd6878ad6e5acb2d4dc828ae63a/Image_default_AgileWaterfallHybrid.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/4tDsBx08Z8InkWXqt5XOuk/2cf53cd6878ad6e5acb2d4dc828ae63a/Image_default_AgileWaterfallHybrid.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/4tDsBx08Z8InkWXqt5XOuk/2cf53cd6878ad6e5acb2d4dc828ae63a/Image_default_AgileWaterfallHybrid.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4tDsBx08Z8InkWXqt5XOuk/2cf53cd6878ad6e5acb2d4dc828ae63a/Image_default_AgileWaterfallHybrid.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4tDsBx08Z8InkWXqt5XOuk/2cf53cd6878ad6e5acb2d4dc828ae63a/Image_default_AgileWaterfallHybrid.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4tDsBx08Z8InkWXqt5XOuk/2cf53cd6878ad6e5acb2d4dc828ae63a/Image_default_AgileWaterfallHybrid.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Dallas Clark","slug":"dallas-clark"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Should every software development team adopt agile?"},"metaDescription":{"metaDescription":"Agile is almost synonymous with software development, but that doesn’t mean your dev team should automatically adopt it. We talk about alternative approaches and what to expect when you transition to agile."}},{"title":"Comparing Implementing Collaboration: TinyMCE & CKEditor","slug":"tinymce-vs-ckeditor-collaboration-implementation","featured":false,"lastUpdated":"Nov 25th, 2025","description":{"description":"<p>Compare collaboration features in TinyMCE and CKEditor, including comments, revision history, and real-time editing. Implementation effort included.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Compare collaboration features in TinyMCE and CKEditor, including comments, revision history, and real-time editing. Implementation effort included."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Comparing Implementation in CKEditor and TinyMCE","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABuVBMVEUJElMKE1QAB08ABU4ABE4AA00AB04JElQJE1QEDVEAAE0AAU4ABk4ABU8AAk4CDFAEDlEGD1EIEVIIElMAAE4EGV0rMWkkKmUuM2ksMWkpL2gwNWoxNmsyN2suNGoYHlsAAEgEDFAAA04AAFKFhpaFiJo0Qnk9RHtBSH0/R3xMVIRGTX5CSXpBSHo2PW4pL18dJFkAAU0ACFAACFWHiZhRYJNlb6Fca6Vdb6Ribp5qdaSltdumtt2ktNqltNujstl/i68AAEkADFIAAFAUJGRVYJNga6JdbaBcc5xfbZteZ5l2gq1rdqBkbphkcZlgbpZdaI9GT3cFDlEjKWNUXo9eaZ9eaZ1gaZdfaZdZY5RPXJEvOXUbJGYgInFFHJgWGWYAAE8DC1AFDlAIEVEfJmM9SJNET5lCTZhDTphCTZk0Q4RVQ248Om0oNW8sMnVMVnspPF8ADFMACE8IEFEAAEoKGGRebM58h+B1gt54hN5xft8vRJ6FSz5gP1gNJmMcJ2APIVsACVIJElIMFFIACE4EE14IFmAAEV8CEl8EFWEAE1k0LlYgIVYLFFQCC1ACC08AB00AAEQAAEWAlhNmAAAAmElEQVQIHVXBPQ7BAACG4e9tG23aJtrJIJKG2QFMNrvFOUicwGxwBOEUNqvdZpBgkhgspWjrN5I+DwIh9Eau3BQJDvcSiXORG3vcbITAMILY40V8HSt7jIgPiZ9DzXIDOJf5E+EKP21RtBB+Z2m0KZhbcdCdhRRk+L2QgnHysOyIbZ2fUWOdme7VOnk0mQwkdlPFm7Sv6vAJVJckrHdnKzQAAAAASUVORK5CYII=","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/3W3sUzUnjIF1kp32gUGVQI/a2f3012e87e992acbedeab4852416eb9/Comparing_Implementation_in_CKEditor_and_TinyMCE.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/3W3sUzUnjIF1kp32gUGVQI/a2f3012e87e992acbedeab4852416eb9/Comparing_Implementation_in_CKEditor_and_TinyMCE.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/3W3sUzUnjIF1kp32gUGVQI/a2f3012e87e992acbedeab4852416eb9/Comparing_Implementation_in_CKEditor_and_TinyMCE.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/3W3sUzUnjIF1kp32gUGVQI/a2f3012e87e992acbedeab4852416eb9/Comparing_Implementation_in_CKEditor_and_TinyMCE.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/3W3sUzUnjIF1kp32gUGVQI/a2f3012e87e992acbedeab4852416eb9/Comparing_Implementation_in_CKEditor_and_TinyMCE.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/3W3sUzUnjIF1kp32gUGVQI/a2f3012e87e992acbedeab4852416eb9/Comparing_Implementation_in_CKEditor_and_TinyMCE.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/3W3sUzUnjIF1kp32gUGVQI/a2f3012e87e992acbedeab4852416eb9/Comparing_Implementation_in_CKEditor_and_TinyMCE.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/3W3sUzUnjIF1kp32gUGVQI/a2f3012e87e992acbedeab4852416eb9/Comparing_Implementation_in_CKEditor_and_TinyMCE.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/3W3sUzUnjIF1kp32gUGVQI/a2f3012e87e992acbedeab4852416eb9/Comparing_Implementation_in_CKEditor_and_TinyMCE.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/3W3sUzUnjIF1kp32gUGVQI/a2f3012e87e992acbedeab4852416eb9/Comparing_Implementation_in_CKEditor_and_TinyMCE.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/3W3sUzUnjIF1kp32gUGVQI/a2f3012e87e992acbedeab4852416eb9/Comparing_Implementation_in_CKEditor_and_TinyMCE.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/3W3sUzUnjIF1kp32gUGVQI/a2f3012e87e992acbedeab4852416eb9/Comparing_Implementation_in_CKEditor_and_TinyMCE.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/3W3sUzUnjIF1kp32gUGVQI/a2f3012e87e992acbedeab4852416eb9/Comparing_Implementation_in_CKEditor_and_TinyMCE.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/3W3sUzUnjIF1kp32gUGVQI/a2f3012e87e992acbedeab4852416eb9/Comparing_Implementation_in_CKEditor_and_TinyMCE.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Coco Poley","slug":"coco-poley"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"TinyMCE vs CKEditor: Collaboration Implementation Comparison"},"metaDescription":{"metaDescription":"Compare collaboration features in TinyMCE and CKEditor, including comments, revision history, and real-time editing. Implementation effort included."}},{"title":"Comparing Implementing Collaboration: TinyMCE & Froala","slug":"comparing-implementing-collaboration-tinymce-and-froala","featured":true,"lastUpdated":"Nov 6th, 2025","description":{"description":"<p>Compare how much effort it takes to implement collaboration tools - comments, mentions, version history, and more - in TinyMCE vs Froala.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Compare how much effort it takes to implement collaboration tools - comments, mentions, version history, and more - in TinyMCE vs Froala."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Comparing Implementation in Froala and TinyMCE","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAALABQDAREAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAgMHCP/EACgQAAIBAwMCBQUAAAAAAAAAAAECAwQFEQASIQZRBwgUFTETFlJhgf/EABoBAQABBQAAAAAAAAAAAAAAAAMCAAEEBQf/xAAhEQABBAEFAAMAAAAAAAAAAAABAAIDESESMUFxgRORsf/aAAwDAQACEQMRAD8AxB4O+G9p6/qKn3W4xxsF3CIbt6YI5OCODnH811WaZ7H6GtNVvx14tVTQzVebqvrKoF38vdhgoK9LdKJ6xIGeMtLsG74XlnA+dTh+eY23joInOaMFQXrWSilv0kdss32/BTokElH601Y+qoxI4kP5Nk4HAzxrJYySK2Su1HoD8SamOyAkeqnoZmamnkpmwATC5QkduNRAB3R2gHV97S319u91q2obgI1qoHmZlmCNuQNns3OrmKMuDyMi69TjYpSoqwxYUcr2/Z1XKA5X/9k=","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/1m3Oz5274jXLX3XftB6Xu5/d8fe08bb03076779f11400d30413d0c7/_TinyMCE__Blog_Header__Comparing_Implementation_in_Froala_and_TinyMCE.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/1m3Oz5274jXLX3XftB6Xu5/d8fe08bb03076779f11400d30413d0c7/_TinyMCE__Blog_Header__Comparing_Implementation_in_Froala_and_TinyMCE.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1m3Oz5274jXLX3XftB6Xu5/d8fe08bb03076779f11400d30413d0c7/_TinyMCE__Blog_Header__Comparing_Implementation_in_Froala_and_TinyMCE.jpg?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1m3Oz5274jXLX3XftB6Xu5/d8fe08bb03076779f11400d30413d0c7/_TinyMCE__Blog_Header__Comparing_Implementation_in_Froala_and_TinyMCE.jpg?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1m3Oz5274jXLX3XftB6Xu5/d8fe08bb03076779f11400d30413d0c7/_TinyMCE__Blog_Header__Comparing_Implementation_in_Froala_and_TinyMCE.jpg?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/1m3Oz5274jXLX3XftB6Xu5/d8fe08bb03076779f11400d30413d0c7/_TinyMCE__Blog_Header__Comparing_Implementation_in_Froala_and_TinyMCE.jpg?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/1m3Oz5274jXLX3XftB6Xu5/d8fe08bb03076779f11400d30413d0c7/_TinyMCE__Blog_Header__Comparing_Implementation_in_Froala_and_TinyMCE.jpg?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/1m3Oz5274jXLX3XftB6Xu5/d8fe08bb03076779f11400d30413d0c7/_TinyMCE__Blog_Header__Comparing_Implementation_in_Froala_and_TinyMCE.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/1m3Oz5274jXLX3XftB6Xu5/d8fe08bb03076779f11400d30413d0c7/_TinyMCE__Blog_Header__Comparing_Implementation_in_Froala_and_TinyMCE.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1m3Oz5274jXLX3XftB6Xu5/d8fe08bb03076779f11400d30413d0c7/_TinyMCE__Blog_Header__Comparing_Implementation_in_Froala_and_TinyMCE.jpg?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1m3Oz5274jXLX3XftB6Xu5/d8fe08bb03076779f11400d30413d0c7/_TinyMCE__Blog_Header__Comparing_Implementation_in_Froala_and_TinyMCE.jpg?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1m3Oz5274jXLX3XftB6Xu5/d8fe08bb03076779f11400d30413d0c7/_TinyMCE__Blog_Header__Comparing_Implementation_in_Froala_and_TinyMCE.jpg?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/1m3Oz5274jXLX3XftB6Xu5/d8fe08bb03076779f11400d30413d0c7/_TinyMCE__Blog_Header__Comparing_Implementation_in_Froala_and_TinyMCE.jpg?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/1m3Oz5274jXLX3XftB6Xu5/d8fe08bb03076779f11400d30413d0c7/_TinyMCE__Blog_Header__Comparing_Implementation_in_Froala_and_TinyMCE.jpg?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Coco Poley","slug":"coco-poley"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Comparing Implementing Collaboration: TinyMCE & Froala | TinyMCE"},"metaDescription":{"metaDescription":"Compare how much effort it takes to implement collaboration tools - comments, mentions, version history, and more - in TinyMCE vs Froala."}},{"title":"Comparing Implementing Collaboration Features: TinyMCE and Tiptap","slug":"collaboration-features-implementation-tinymce-and-tiptap-compared","featured":true,"lastUpdated":"Oct 14th, 2025","description":{"description":"<p>Compare the level of effort to integrate collaboration into Tiptap and TinyMCE, and how much coding and configuration is necessary.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Compare the level of effort to integrate collaboration into Tiptap and TinyMCE, and how much coding and configuration is necessary."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Comparing Implementing Collaboration TinyMCE and Tiptap","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABrVBMVEUJElMIElMACE8AB08ABk8GEVMHEVMABE4AB04KE1QEDVEAB08ACE8ACFAADFMADFQAClEACVEAClQAEFUEElUABU8AAU8AAE8AAFAACFQ7L1dKMlYAE1YABlEAFFZTOVQ8K1cACVMsH05CLEw+KU1AK0w9KU1BK0xGLkxCK0xFLUxJMEwkH1RGL1ZYM1UAG1wAC1cAHV1pPlNMLldYNkqKVkOQWkKGVEONV0KHVEODVEN7T0R8T0WCVEVdPEwACFYAGVwvNWFJS2ssNGEAGl0AEVYAAE1SLlCDRk2EP0V9Qk2ESE50PEwdF1IAAE4AAEsAAVEADFhSVHCOjptNT24ADlgABk8AAEhWWXOSlKGWmaWjpa+YmqaLjZuDhJOamqaZmqWEhZQADFIAElcAHl0bJltER2kXJV0WI10OGVcACFEAAEwTGVJCRWZVV3FHSWhERmdBQ2UzNl1TVG9PUG0AD1NvREtUM1MAHFxnQlBUNFYAA04AAEkAAEoAFFRvO05WLVMAElUABlAAE1U5J1cuIlgACVIABU4AD1IAEVQAE1QADFEAClIAD1QGElQtkPicAAAACXRSTlP+/v7+/v7+/v4itX5mAAAAfUlEQVQI12NkYGRkgAEg6z8jCHDCBBkZQNw/rECChQeukhEOWJi4GdHBfRYGIQzBWyz6cDbDfyYwfcKTMZwRE7CIwBWCiJP/LRkZZzBWn+bUBTrnki7DZbhJzGceR7OxTeZlkZuiIsfGxtZ2yomVlRHJR0zMDH/+M7D9YwAATocVpRCoAqQAAAAASUVORK5CYII=","aspectRatio":1.780758556891767,"src":"//images.ctfassets.net/s600jj41gsex/7BBFYSN5SWgsjNdMkF00H9/af69b9548a29e6acbd9fff4d3124cf8c/Comparing_Implementing_Collaboration__TinyMCE_and_Tiptap.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/7BBFYSN5SWgsjNdMkF00H9/af69b9548a29e6acbd9fff4d3124cf8c/Comparing_Implementing_Collaboration__TinyMCE_and_Tiptap.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/7BBFYSN5SWgsjNdMkF00H9/af69b9548a29e6acbd9fff4d3124cf8c/Comparing_Implementing_Collaboration__TinyMCE_and_Tiptap.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/7BBFYSN5SWgsjNdMkF00H9/af69b9548a29e6acbd9fff4d3124cf8c/Comparing_Implementing_Collaboration__TinyMCE_and_Tiptap.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/7BBFYSN5SWgsjNdMkF00H9/af69b9548a29e6acbd9fff4d3124cf8c/Comparing_Implementing_Collaboration__TinyMCE_and_Tiptap.png?w=1109&h=623&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/7BBFYSN5SWgsjNdMkF00H9/af69b9548a29e6acbd9fff4d3124cf8c/Comparing_Implementing_Collaboration__TinyMCE_and_Tiptap.png?w=1478&h=830&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/7BBFYSN5SWgsjNdMkF00H9/af69b9548a29e6acbd9fff4d3124cf8c/Comparing_Implementing_Collaboration__TinyMCE_and_Tiptap.png?w=1925&h=1081&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/7BBFYSN5SWgsjNdMkF00H9/af69b9548a29e6acbd9fff4d3124cf8c/Comparing_Implementing_Collaboration__TinyMCE_and_Tiptap.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/7BBFYSN5SWgsjNdMkF00H9/af69b9548a29e6acbd9fff4d3124cf8c/Comparing_Implementing_Collaboration__TinyMCE_and_Tiptap.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/7BBFYSN5SWgsjNdMkF00H9/af69b9548a29e6acbd9fff4d3124cf8c/Comparing_Implementing_Collaboration__TinyMCE_and_Tiptap.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/7BBFYSN5SWgsjNdMkF00H9/af69b9548a29e6acbd9fff4d3124cf8c/Comparing_Implementing_Collaboration__TinyMCE_and_Tiptap.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/7BBFYSN5SWgsjNdMkF00H9/af69b9548a29e6acbd9fff4d3124cf8c/Comparing_Implementing_Collaboration__TinyMCE_and_Tiptap.png?w=1109&h=623&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/7BBFYSN5SWgsjNdMkF00H9/af69b9548a29e6acbd9fff4d3124cf8c/Comparing_Implementing_Collaboration__TinyMCE_and_Tiptap.png?w=1478&h=830&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/7BBFYSN5SWgsjNdMkF00H9/af69b9548a29e6acbd9fff4d3124cf8c/Comparing_Implementing_Collaboration__TinyMCE_and_Tiptap.png?w=1925&h=1081&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Coco Poley","slug":"coco-poley"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Collaboration Features’s Implementation: TinyMCE and Tiptap Compared | TinyMCE"},"metaDescription":{"metaDescription":"Compare the level of effort to integrate collaboration into Tiptap and TinyMCE, and how much coding and configuration is necessary."}},{"title":"Why TinyMCE Is the Right Rich Text Editor for CMS Projects","slug":"why-tinymce-is-the-right-rich-text-editor-for-cms-projects","featured":true,"lastUpdated":"Oct 2nd, 2025","description":{"description":"<p>Find out why TinyMCE is the perfect rich text editor for CMSs, from collaboration features to content conversion to media optimization and more.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Find out why TinyMCE is the perfect rich text editor for CMSs, from collaboration features to content conversion to media optimization and more."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Why TinyMCE is the right solution for a CMS","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABxVBMVEUKE1QACE8ACFAACFEOFVIIFlQTHFggHlgAElUJE1QDDVEABk8AB08AClAIFlUVG1YHFlYOGVYBD1MAElZAKlZoPU0UHFcABE8AAE8AAk8AAU8AAU4AAk4AClImHlVZMk0eIVoWJFwCGlgEHVoiJ1wwKFcKHFg2Jk1bPEo/JkxAIE1SJ003FU5UHlBaH1FUHVAABlAAElQeGlYEG1oIHFhNJ0w4IE4AG1kNF1QAAE5kREWkbDWbWjh6PEGSQEKgP0qpOlGjNVKTLlAAAEkHFlUAFVcHG1hSL0tAKE0AGVgDD1IPF1MAAEhSVHB3eImGg5BvboKHiJaDfo16eYqFhZSIh5Z5eosmK1kIElMdGlQRH1kIGlcXIVoRGFQAAEZaW3R1dohvcYR7fY2XmaRnan9TVnFcX3ZcXnZXWXMTHFQyIVJrP0sADlQBEVQQGVUBCVBWV3F6eotra4B6e4yKi5hOT2wAAEQAAEcAEFMaIVcnIVMmIVc8JlQSG1UKE1IAAE0AAEsABE4AFVNdL05ZK04AB1A7JVNhOk8IElQCDFEAA04HF1RJL05FLE4GE1ILFlMCDlEFD1ILFFQHFFIAD1MHE1IABU9as10IAAAAkklEQVQI12NkYGBkgAJGxv9MQAIIOIH4K1iMhxEOxBkhipABCyM/Ixq4aMBoieB944apFEYIigDxeyFGxuUsQihaz5oACQ5GHxUo/9D9BAijmYHFmPEMg/ZzpZ0enoyM/5gZGY8cYGBg4uS0u7B0H+PlBk4gqOXgcP024T9LxaQqhq8MDQzcHIxPZDk5Gr8AfQgAtA4dxOtwuy8AAAAASUVORK5CYII=","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/1TAGispnUU2xwtPVjoopsx/927256ed2a0f6bbfa52ea341e2faacfa/-TinyMCE--Blog-_-_-Why_TinyMCE_is_the_right_solution_for_a_CMS-.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/1TAGispnUU2xwtPVjoopsx/927256ed2a0f6bbfa52ea341e2faacfa/-TinyMCE--Blog-_-_-Why_TinyMCE_is_the_right_solution_for_a_CMS-.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1TAGispnUU2xwtPVjoopsx/927256ed2a0f6bbfa52ea341e2faacfa/-TinyMCE--Blog-_-_-Why_TinyMCE_is_the_right_solution_for_a_CMS-.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1TAGispnUU2xwtPVjoopsx/927256ed2a0f6bbfa52ea341e2faacfa/-TinyMCE--Blog-_-_-Why_TinyMCE_is_the_right_solution_for_a_CMS-.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1TAGispnUU2xwtPVjoopsx/927256ed2a0f6bbfa52ea341e2faacfa/-TinyMCE--Blog-_-_-Why_TinyMCE_is_the_right_solution_for_a_CMS-.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/1TAGispnUU2xwtPVjoopsx/927256ed2a0f6bbfa52ea341e2faacfa/-TinyMCE--Blog-_-_-Why_TinyMCE_is_the_right_solution_for_a_CMS-.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/1TAGispnUU2xwtPVjoopsx/927256ed2a0f6bbfa52ea341e2faacfa/-TinyMCE--Blog-_-_-Why_TinyMCE_is_the_right_solution_for_a_CMS-.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/1TAGispnUU2xwtPVjoopsx/927256ed2a0f6bbfa52ea341e2faacfa/-TinyMCE--Blog-_-_-Why_TinyMCE_is_the_right_solution_for_a_CMS-.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/1TAGispnUU2xwtPVjoopsx/927256ed2a0f6bbfa52ea341e2faacfa/-TinyMCE--Blog-_-_-Why_TinyMCE_is_the_right_solution_for_a_CMS-.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1TAGispnUU2xwtPVjoopsx/927256ed2a0f6bbfa52ea341e2faacfa/-TinyMCE--Blog-_-_-Why_TinyMCE_is_the_right_solution_for_a_CMS-.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1TAGispnUU2xwtPVjoopsx/927256ed2a0f6bbfa52ea341e2faacfa/-TinyMCE--Blog-_-_-Why_TinyMCE_is_the_right_solution_for_a_CMS-.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1TAGispnUU2xwtPVjoopsx/927256ed2a0f6bbfa52ea341e2faacfa/-TinyMCE--Blog-_-_-Why_TinyMCE_is_the_right_solution_for_a_CMS-.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/1TAGispnUU2xwtPVjoopsx/927256ed2a0f6bbfa52ea341e2faacfa/-TinyMCE--Blog-_-_-Why_TinyMCE_is_the_right_solution_for_a_CMS-.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/1TAGispnUU2xwtPVjoopsx/927256ed2a0f6bbfa52ea341e2faacfa/-TinyMCE--Blog-_-_-Why_TinyMCE_is_the_right_solution_for_a_CMS-.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Coco Poley","slug":"coco-poley"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Why TinyMCE Is the Right Rich Text Editor for CMS Projects | TinyMCE"},"metaDescription":{"metaDescription":"Find out why TinyMCE is the perfect rich text editor for CMSs, from collaboration features to content conversion to media optimization and more."}},{"title":"Full Page HTML Returns: Complete HTML Document Editing in TinyMCE 8.1","slug":"full-page-html-returns-tinymce-8-1","featured":true,"lastUpdated":"Sep 30th, 2025","description":{"description":"<p>TinyMCE 8.1 brings back Full Page HTML&mdash;secure, modern, and built for complete HTML document editing for emails, reports, and CMS templates.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TinyMCE 8.1 brings back Full Page HTML—secure, modern, and built for complete HTML document editing for emails, reports, and CMS templates."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"A screen shows an abstract of an editor that includes HTML markup, including the ability to edit both the head elements and the body element in a single screen.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABoVBMVEUJElMKE1QACE8AB04ABU4ABE4ABk4JE1QEDlEAB08AAk4AAU4ABE8ZI14tM2kkKmUtMmgrMWgqL2gzOGw1Om0yOGsgJl8AA04ABk8OE1I6IVE8LV85Qnk4QHg+RXs+RXpDSn47QnE4P2U2PmUoL1cHD00ACFAfHlZZNE1QNltVYJJkb55rdqVsd6Zsd6dkb6BKU4A9SXRBTXs4RG4RGVAACFEBClAMF1UAEFIhK2VYYpRocqFteKdoc6NibZ5KUn0tNlYsNFIME0wCClIBCVACClAMFFMjKmVdZ5hwe6pyfqxzfq1zfqxxfKlueaZMVH4sN2AuOFwpMEwKEksBCVEBCk8ME1IhKGNGToNQWYtPWIpPWIlPWIxNWJxNWJ1ATI4uO24xOl4rM04IEEoAB1ABCU8LE1IUG1kaIF4WHF0WHFwVGlgXJXlgcNpzgeRte98uPogtNEkjKkEHD0kABlAFD1EMFFIIEVEGD1AEDlAEDFAEDE8DCk0AClIXJHIcKHUcKG8cIksRFDQOEzcFDUoLFFQAAkoAAEIAAD4AAEEAAEozpH9vAAAAfElEQVQIHQXBsU3DUABAwXeOwaKJvQgTsBALpCMNiHUYgZKOXVCojCCfOxGVqjH9NoaFv67TqG7yM8btGKalA4jgsje3AkYTuNS8HAGuB7B95u4efB+D4H1u9fHACsBbc5t9AwA1t2kDAKUTAOB17POynavyAs+PX52f/gGRyR5Wla7YcwAAAABJRU5ErkJggg==","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/4ymgkoblToFt0GvJ32Hwku/3a21f8f4ebc8a5ae86a2e82b7e59fa52/New_Full_Page_release.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/4ymgkoblToFt0GvJ32Hwku/3a21f8f4ebc8a5ae86a2e82b7e59fa52/New_Full_Page_release.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4ymgkoblToFt0GvJ32Hwku/3a21f8f4ebc8a5ae86a2e82b7e59fa52/New_Full_Page_release.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4ymgkoblToFt0GvJ32Hwku/3a21f8f4ebc8a5ae86a2e82b7e59fa52/New_Full_Page_release.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4ymgkoblToFt0GvJ32Hwku/3a21f8f4ebc8a5ae86a2e82b7e59fa52/New_Full_Page_release.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4ymgkoblToFt0GvJ32Hwku/3a21f8f4ebc8a5ae86a2e82b7e59fa52/New_Full_Page_release.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4ymgkoblToFt0GvJ32Hwku/3a21f8f4ebc8a5ae86a2e82b7e59fa52/New_Full_Page_release.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/4ymgkoblToFt0GvJ32Hwku/3a21f8f4ebc8a5ae86a2e82b7e59fa52/New_Full_Page_release.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/4ymgkoblToFt0GvJ32Hwku/3a21f8f4ebc8a5ae86a2e82b7e59fa52/New_Full_Page_release.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4ymgkoblToFt0GvJ32Hwku/3a21f8f4ebc8a5ae86a2e82b7e59fa52/New_Full_Page_release.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4ymgkoblToFt0GvJ32Hwku/3a21f8f4ebc8a5ae86a2e82b7e59fa52/New_Full_Page_release.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4ymgkoblToFt0GvJ32Hwku/3a21f8f4ebc8a5ae86a2e82b7e59fa52/New_Full_Page_release.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4ymgkoblToFt0GvJ32Hwku/3a21f8f4ebc8a5ae86a2e82b7e59fa52/New_Full_Page_release.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4ymgkoblToFt0GvJ32Hwku/3a21f8f4ebc8a5ae86a2e82b7e59fa52/New_Full_Page_release.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Coco Poley","slug":"coco-poley"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Full Page HTML Returns in TinyMCE 8.1 | TinyMCE"},"metaDescription":{"metaDescription":"TinyMCE 8.1 brings back Full Page HTML—secure, modern, and built for complete HTML document editing for emails, reports, and CMS templates."}},{"title":"Simplifying User Identity Management Across TinyMCE with User Lookup API","slug":"user-identity-management-with-user-lookup-api","featured":false,"lastUpdated":"Aug 20th, 2025","description":{"description":"<p><span style=\"font-size: 11pt; font-family: Arial, sans-serif; white-space-collapse: preserve;\">Discover how the TinyMCE User Lookup API unifies user identity management across Comments, Revision History, and Suggested Edits.</span></p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"span","properties":{"style":"font-size: 11pt; font-family: Arial, sans-serif; white-space-collapse: preserve;"},"children":[{"type":"text","value":"Discover how the TinyMCE User Lookup API unifies user identity management across Comments, Revision History, and Suggested Edits."}]}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Simplifying User Identity Management Across TinyMCE with User Lookup API","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABnlBMVEUJElMKE1QACE8ABk4ABU4ABE4ACU8AB08GEVMHEVMJE1QEDlEAB04ABk8AA04HD1EEDVAEDlABEFIAGFcAEVQEEVMABE0eJF4tM2kkKmYrMWksMWkqMGgzOWw1O242PG4eJl4aGVVdN1U6K1cAA1ABCU8KElIIEFElK2U8Q3k7Qnk+Rns+RXs/RntBSHw8QnYyN2kvNGcbIlgZFEprQElAL1YAA1EJE1MAC1IkLGZcZphteahteKdmcaFYYpRHUIo4R6ZGVK5AT6o1RqYSLH0ADk8DDVEJG1koIFkoM2pcaJlueahsd6ZibJ1IUpBZa9Nufd1hcNVXaNMeMpIAAEYABU0ADFESI11wO0tIO2JXZ5hsd6VncqFmcKBha5xWX5NXYI+Yps2LmL8aImAAAE0AA00ABk0MGVc1KVcwOGpMXJVQXJVTYJlUYZtSX5hFT4c2PXU4P3VeaJJWYIsdI18AAEsACE4AB1AABlESHlwxPHMwO3M0P3c5RHw1QHcoMWoZIF4YH14KEloPFlsSGVgAAk0AAEkAAEgAAU0LFFQSppsqAAAAhklEQVQIHQXBsU0DMQAF0P98diROLhzooWQQFmEUoMsi9GzARugogtCFmPeEEElynamB1aXth/k7k5X9AEq73GEWcF2gtnuAANDrI0gAfFqewDaPtgGoGfD9gFvAe60fzzgCsI1zTQYAeC17rPy8icyvkeXvpew35ziV0mttrdWl915KOfkHr1UfAAWQlAgAAAAASUVORK5CYII=","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/6JIHk6uxQAQymmfo9HEK5P/dfc3abab083915ae004a729c16c9132b/Simplifying_User_Identity_Management_Across_TinyMCE_with_User_Lookup_API.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6JIHk6uxQAQymmfo9HEK5P/dfc3abab083915ae004a729c16c9132b/Simplifying_User_Identity_Management_Across_TinyMCE_with_User_Lookup_API.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6JIHk6uxQAQymmfo9HEK5P/dfc3abab083915ae004a729c16c9132b/Simplifying_User_Identity_Management_Across_TinyMCE_with_User_Lookup_API.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6JIHk6uxQAQymmfo9HEK5P/dfc3abab083915ae004a729c16c9132b/Simplifying_User_Identity_Management_Across_TinyMCE_with_User_Lookup_API.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6JIHk6uxQAQymmfo9HEK5P/dfc3abab083915ae004a729c16c9132b/Simplifying_User_Identity_Management_Across_TinyMCE_with_User_Lookup_API.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6JIHk6uxQAQymmfo9HEK5P/dfc3abab083915ae004a729c16c9132b/Simplifying_User_Identity_Management_Across_TinyMCE_with_User_Lookup_API.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6JIHk6uxQAQymmfo9HEK5P/dfc3abab083915ae004a729c16c9132b/Simplifying_User_Identity_Management_Across_TinyMCE_with_User_Lookup_API.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6JIHk6uxQAQymmfo9HEK5P/dfc3abab083915ae004a729c16c9132b/Simplifying_User_Identity_Management_Across_TinyMCE_with_User_Lookup_API.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6JIHk6uxQAQymmfo9HEK5P/dfc3abab083915ae004a729c16c9132b/Simplifying_User_Identity_Management_Across_TinyMCE_with_User_Lookup_API.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6JIHk6uxQAQymmfo9HEK5P/dfc3abab083915ae004a729c16c9132b/Simplifying_User_Identity_Management_Across_TinyMCE_with_User_Lookup_API.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6JIHk6uxQAQymmfo9HEK5P/dfc3abab083915ae004a729c16c9132b/Simplifying_User_Identity_Management_Across_TinyMCE_with_User_Lookup_API.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6JIHk6uxQAQymmfo9HEK5P/dfc3abab083915ae004a729c16c9132b/Simplifying_User_Identity_Management_Across_TinyMCE_with_User_Lookup_API.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6JIHk6uxQAQymmfo9HEK5P/dfc3abab083915ae004a729c16c9132b/Simplifying_User_Identity_Management_Across_TinyMCE_with_User_Lookup_API.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6JIHk6uxQAQymmfo9HEK5P/dfc3abab083915ae004a729c16c9132b/Simplifying_User_Identity_Management_Across_TinyMCE_with_User_Lookup_API.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Benjamin Chau","slug":"benjamin-chau"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Simplifying User Identity Management Across TinyMCE with User Lookup API | TinyMCE"},"metaDescription":{"metaDescription":"Discover how the TinyMCE User Lookup API unifies user identity management across Comments, Revision History, and Suggested Edits."}},{"title":"Improving the Developer Experience with TinyMCE Developer Center","slug":"improving-developer-experience-with-tinymce-developer-center","featured":true,"lastUpdated":"Aug 13th, 2025","description":{"description":"<p>Explore how TinyMCE is leveling up its developer experience in 2025 with the launch of the new Developer Center, tailored for real-world use cases.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Explore how TinyMCE is leveling up its developer experience in 2025 with the launch of the new Developer Center, tailored for real-world use cases."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"TinyMCE Developer Center","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABiVBMVEUKE1QAB08ACE8ABE4ABU4ABk4JE1QJElMCDVEABU8ABk8ABFEAAFIAA1EABE8AAE0AAU4DDFEJElQAAk8AAE8AA08ACFMrMmBDR2owNmIAD1UxNF8zNmAhJlgZE02DWUGGVEKNTUWdTUiYP1BjIlAAAE4AAFRhZHyenqhvcIUAAFZ6e42jpLA1OGAACk9nUVp5TEmDS0t7QlJ2MFBPI1MAEFYnLl55eos1OWIAEVg2OWBcXnYACFEAAEozNl6cnqmWmqaYnKieoq2iprCXmqU5PGAAAEwACVIAF1kAHF4AF1oAFFgAE1kAB1gCFFYABVAAAEscIFR1dohub4J0dYdwcoRYWnM6PWEeH1dUM1YlJ10AHV9gYnqAgZEqMF8nKViHiJaVlaGXmKORkp4rLVkAAEgnJFhlQVAtMmMAKWZ/gJGmpq8+QmcAAFEAAEkAAEcAAEYAAk4DFFUAHlwAIF8AHV4pMWE7P2cOGlcABlACDFEACU8ACFAAC1IADFIABlMEDVELFFQAB07MiIrRAAAAlklEQVQIHWXBMQ7BUADH4f/v9bVEmmoiYpYuEmdwBpPdBRzAWLvVJQw2i3PYRNKEwYg0Bonn5dXm+5BAgTMScgZsYpDQC6mNJ7wsRh61UhrP2iYdgvyW03g4+84J7oMuDQcT/uxtj8a2uEwJdh+rjKC4khHMN/Y4HEFdjU8o5cdWs01fOh/QEnBmvWhFUolnAlZxFNlSX1WpHy8jzz5nAAAAAElFTkSuQmCC","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/4J9rhe3agXZVgj760rgCiZ/42dcc015dbe61b22457e163f392689ad/TinyMCE_Developer__Center.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/4J9rhe3agXZVgj760rgCiZ/42dcc015dbe61b22457e163f392689ad/TinyMCE_Developer__Center.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4J9rhe3agXZVgj760rgCiZ/42dcc015dbe61b22457e163f392689ad/TinyMCE_Developer__Center.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4J9rhe3agXZVgj760rgCiZ/42dcc015dbe61b22457e163f392689ad/TinyMCE_Developer__Center.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4J9rhe3agXZVgj760rgCiZ/42dcc015dbe61b22457e163f392689ad/TinyMCE_Developer__Center.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4J9rhe3agXZVgj760rgCiZ/42dcc015dbe61b22457e163f392689ad/TinyMCE_Developer__Center.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4J9rhe3agXZVgj760rgCiZ/42dcc015dbe61b22457e163f392689ad/TinyMCE_Developer__Center.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/4J9rhe3agXZVgj760rgCiZ/42dcc015dbe61b22457e163f392689ad/TinyMCE_Developer__Center.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/4J9rhe3agXZVgj760rgCiZ/42dcc015dbe61b22457e163f392689ad/TinyMCE_Developer__Center.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4J9rhe3agXZVgj760rgCiZ/42dcc015dbe61b22457e163f392689ad/TinyMCE_Developer__Center.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4J9rhe3agXZVgj760rgCiZ/42dcc015dbe61b22457e163f392689ad/TinyMCE_Developer__Center.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4J9rhe3agXZVgj760rgCiZ/42dcc015dbe61b22457e163f392689ad/TinyMCE_Developer__Center.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4J9rhe3agXZVgj760rgCiZ/42dcc015dbe61b22457e163f392689ad/TinyMCE_Developer__Center.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4J9rhe3agXZVgj760rgCiZ/42dcc015dbe61b22457e163f392689ad/TinyMCE_Developer__Center.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Frédéric Harper","slug":"frederic-harper"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Improving the Developer Experience with TinyMCE Developer Center | TinyMCE"},"metaDescription":{"metaDescription":"Explore how TinyMCE is leveling up its developer experience in 2025 with the launch of the new Developer Center, tailored for real-world use cases."}},{"title":"Tell Us What You Think: The 2025 TinyMCE Developer Survey Is Now Open","slug":"tell-us-what-you-think-the-2025-tinymce-developer-survey-is-now-open","featured":true,"lastUpdated":"Jul 23rd, 2025","description":{"description":"<p>The 2025 TinyMCE Developer Survey is open! Share how you build with rich text editors and help shape the future of editing experiences.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The 2025 TinyMCE Developer Survey is open! Share how you build with rich text editors and help shape the future of editing experiences."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"2025 Rich Text Editors Developer Survey now open until August 5th, 2025","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABjFBMVEUJElMIElMKE1QAAE4AB08AAEoAAEgAAEwAB04AAEkAAEsLFFQJE1QKE1QACE8AB08ABk4ABU4IElQCDFEABE4ABk8DDFANFFIME1IMFFIOFlQAAEsAAEcAAEwHD1ELFlUBElUCElUED1IGDlEPF1NCRWZyc4ZwcoU0OV8AA08ABE8AC1ALE1MPHFkEH10AHGAAHl8BGVkADFIOFVNcWHCPi5eIh5RMR2URC04VDk8aEU8ZEE4GEFEEFFQAHl4xKlRnSUpaOU0CIV4AFFcOFlNjK0KNPjGJOzOSRTeTSDx9QEaNTEiKS0mST0hIKVAAD1UAIWJTOlKMU0WCQ0oSJmAAGFpVVG+IhZN9eoqIg5GNh5RUUmwfAUsfEU4zGk4ZFFEAElQAH14eH1djM1BCIVIDIl4FGFgRF1Q8P2NmaH1cXnZrboJnan84PGEBD1IHEVIAEVUAH10AI2IAIV8RIVwLFFQIEFEAAEYIEVIIEFIGElQFFFYHFFUPF1QDDFEEDFALElIID1EGD1IMFFSOpqeZAAAADXRSTlP+/v7+/v7+/v7+/v7+JG0F5gAAAI9JREFUCB1dwU0OwVAYhtH3ufn0NkWaNrEUS7AKQ1uwDyxAjMwlNmABprZBwqB/iYvSpHEOGqMOSIKrESEqtTwg4czFiNAEST6m5cwlgCZIdGSkwCOlR0YG5PTczFzGn/xk5HwcRprxI6uOaL6nuCs5T3nbSO65KMttWdYh+MsuGphp6W1Y1Ppa+WYtBVG8AOOaIQiqqypMAAAAAElFTkSuQmCC","aspectRatio":1.7833333333333334,"src":"//images.ctfassets.net/s600jj41gsex/5qdYVJWkent9FOyuyplJgg/20d4adcbbb491871ef5405de711f9484/_BLOG_HEADER__Survey_Launch_Blog_Post_-_Tiny.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/5qdYVJWkent9FOyuyplJgg/20d4adcbbb491871ef5405de711f9484/_BLOG_HEADER__Survey_Launch_Blog_Post_-_Tiny.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5qdYVJWkent9FOyuyplJgg/20d4adcbbb491871ef5405de711f9484/_BLOG_HEADER__Survey_Launch_Blog_Post_-_Tiny.png?w=370&h=207&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5qdYVJWkent9FOyuyplJgg/20d4adcbbb491871ef5405de711f9484/_BLOG_HEADER__Survey_Launch_Blog_Post_-_Tiny.png?w=739&h=414&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5qdYVJWkent9FOyuyplJgg/20d4adcbbb491871ef5405de711f9484/_BLOG_HEADER__Survey_Launch_Blog_Post_-_Tiny.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/5qdYVJWkent9FOyuyplJgg/20d4adcbbb491871ef5405de711f9484/_BLOG_HEADER__Survey_Launch_Blog_Post_-_Tiny.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/5qdYVJWkent9FOyuyplJgg/20d4adcbbb491871ef5405de711f9484/_BLOG_HEADER__Survey_Launch_Blog_Post_-_Tiny.png?w=1926&h=1080&q=50&fit=scale 1926w","srcWebp":"//images.ctfassets.net/s600jj41gsex/5qdYVJWkent9FOyuyplJgg/20d4adcbbb491871ef5405de711f9484/_BLOG_HEADER__Survey_Launch_Blog_Post_-_Tiny.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/5qdYVJWkent9FOyuyplJgg/20d4adcbbb491871ef5405de711f9484/_BLOG_HEADER__Survey_Launch_Blog_Post_-_Tiny.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5qdYVJWkent9FOyuyplJgg/20d4adcbbb491871ef5405de711f9484/_BLOG_HEADER__Survey_Launch_Blog_Post_-_Tiny.png?w=370&h=207&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5qdYVJWkent9FOyuyplJgg/20d4adcbbb491871ef5405de711f9484/_BLOG_HEADER__Survey_Launch_Blog_Post_-_Tiny.png?w=739&h=414&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5qdYVJWkent9FOyuyplJgg/20d4adcbbb491871ef5405de711f9484/_BLOG_HEADER__Survey_Launch_Blog_Post_-_Tiny.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/5qdYVJWkent9FOyuyplJgg/20d4adcbbb491871ef5405de711f9484/_BLOG_HEADER__Survey_Launch_Blog_Post_-_Tiny.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/5qdYVJWkent9FOyuyplJgg/20d4adcbbb491871ef5405de711f9484/_BLOG_HEADER__Survey_Launch_Blog_Post_-_Tiny.png?w=1926&h=1080&q=50&fm=webp&fit=scale 1926w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Coco Poley","slug":"coco-poley"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"2025 TinyMCE Developer Survey - Share Your Feedback Today | TinyMCE"},"metaDescription":{"metaDescription":"The 2025 TinyMCE Developer Survey is open! Share how you build with rich text editors and help shape the future of editing experiences."}},{"title":"Text editor developers 2023: Survey says RTEs are core component of everything","slug":"text-editor-developers","featured":false,"lastUpdated":"Oct 3rd, 2023","description":{"description":"<p>Insights about developers who work with rich text editors: their experience, preferred programming languages and comparison to the previous year</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Insights about developers who work with rich text editors: their experience, preferred programming languages and comparison to the previous year"}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Survey results represented by charts and percentages with several media images involved.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABDlBMVEV28dt28tt18ttz8tt08tty8ttw8ttx8ttz8txy8tyN5+B379xt89pu8tpv8tt18tx08duT8N6f7t6X8eB+7dKD6tKp3t6d596X6uCa6uGW6d+F69tu89uJ7dR+79hz8dvA8ebY7OfJ8eh+6NGh49Po4+Ty6fL36Pr56f316fnM09+H4tet48+M7dR18duB6N6yruOv4dD59/f8+fnr8fnM1tve4+ncwvLdwu6Xz+Fw89py89t86t7Nwbbe3rLq8vL7+/vV2eXPt43Hwbu/y+WQ1N1249t08tpz89x28deI79qJ49ak49eh2c+Wz7uj182d4NNt79Z18dp08txv8dpt8dpu8ttv891x89x28tzui5r6AAAAdklEQVQIHVXBOxLBABRA0XuTjBRINpAtWIBeawFWqVFr9dS0ZtLRKIw8iU/COfIiBD3p2GoICDqSpH7dHqP8GpAlhb2pygUySv/UBunsVB2rfDCtQUjm/jgfggRiN+ltx/sAAYvFZmlrfW8YqGVrpdKSD4Hg7Ql/oBwNQMUUyQAAAABJRU5ErkJggg==","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/7Gxv5uyBVNHWaO4HvR4Gj/f0671b79dd25b449a71931c094fee426/text-editor-developers-in-2023_-77-say-a-rich-text-editor-is-critical-to-their-app-2023091920381562.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/7Gxv5uyBVNHWaO4HvR4Gj/f0671b79dd25b449a71931c094fee426/text-editor-developers-in-2023_-77-say-a-rich-text-editor-is-critical-to-their-app-2023091920381562.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/7Gxv5uyBVNHWaO4HvR4Gj/f0671b79dd25b449a71931c094fee426/text-editor-developers-in-2023_-77-say-a-rich-text-editor-is-critical-to-their-app-2023091920381562.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/7Gxv5uyBVNHWaO4HvR4Gj/f0671b79dd25b449a71931c094fee426/text-editor-developers-in-2023_-77-say-a-rich-text-editor-is-critical-to-their-app-2023091920381562.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/7Gxv5uyBVNHWaO4HvR4Gj/f0671b79dd25b449a71931c094fee426/text-editor-developers-in-2023_-77-say-a-rich-text-editor-is-critical-to-their-app-2023091920381562.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/7Gxv5uyBVNHWaO4HvR4Gj/f0671b79dd25b449a71931c094fee426/text-editor-developers-in-2023_-77-say-a-rich-text-editor-is-critical-to-their-app-2023091920381562.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/7Gxv5uyBVNHWaO4HvR4Gj/f0671b79dd25b449a71931c094fee426/text-editor-developers-in-2023_-77-say-a-rich-text-editor-is-critical-to-their-app-2023091920381562.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/7Gxv5uyBVNHWaO4HvR4Gj/f0671b79dd25b449a71931c094fee426/text-editor-developers-in-2023_-77-say-a-rich-text-editor-is-critical-to-their-app-2023091920381562.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/7Gxv5uyBVNHWaO4HvR4Gj/f0671b79dd25b449a71931c094fee426/text-editor-developers-in-2023_-77-say-a-rich-text-editor-is-critical-to-their-app-2023091920381562.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/7Gxv5uyBVNHWaO4HvR4Gj/f0671b79dd25b449a71931c094fee426/text-editor-developers-in-2023_-77-say-a-rich-text-editor-is-critical-to-their-app-2023091920381562.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/7Gxv5uyBVNHWaO4HvR4Gj/f0671b79dd25b449a71931c094fee426/text-editor-developers-in-2023_-77-say-a-rich-text-editor-is-critical-to-their-app-2023091920381562.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/7Gxv5uyBVNHWaO4HvR4Gj/f0671b79dd25b449a71931c094fee426/text-editor-developers-in-2023_-77-say-a-rich-text-editor-is-critical-to-their-app-2023091920381562.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/7Gxv5uyBVNHWaO4HvR4Gj/f0671b79dd25b449a71931c094fee426/text-editor-developers-in-2023_-77-say-a-rich-text-editor-is-critical-to-their-app-2023091920381562.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/7Gxv5uyBVNHWaO4HvR4Gj/f0671b79dd25b449a71931c094fee426/text-editor-developers-in-2023_-77-say-a-rich-text-editor-is-critical-to-their-app-2023091920381562.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Di Mace","slug":"di-mace"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Text editor developers in 2023 | TinyMCE"},"metaDescription":{"metaDescription":"The freshest insights about developers who work with rich text editors: their experience, preferred programming languages as well noticeable changes in comparison to previous year."}},{"title":"Looking for a rich text editor? Start with our Rich Text Editor 2023 Survey","slug":"rte-motivation-expectations","featured":false,"lastUpdated":"Nov 8th, 2023","description":{"description":"<p>Discover glimpses of the future through the rich text editor survey results, with trends showing more on&nbsp; users migrating, new technologies being employed, and more on AI</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Discover glimpses of the future through the rich text editor survey results, with trends showing more on  users migrating, new technologies being employed, and more on AI"}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"charts and documents under investigation representing the survey results analysis","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABBVBMVEXw3j3w3j3w3j3w3jzx3jzx3zzx3j3w3jvx3jLx3i/w3jbu3T3v3j7x3zvx3jHw4G3x4F/i2m7O1mna2V/y3jXt2zLw3znx3zbx3jbw3jnw3A/v6LT7+O7l5sTF1IrQ1Xfv3Ufby2/tzivq3k7o3Vrx3TTf2lKz3cHr9/z5+P3p7d/X13vn2GHNp7HswHTm7dDg4qfx3iPx3jvy3jHN0nO32bHr7M/29vj39vPs3GTs2S/txHTx1XD08+jq46Dx3iLp2EbOw2Pr2zfw3S3v4pHx683p2mHt2i/s2y7s3EXv4ozw30zu3EDt20Hx3zfw3jPw3SDv3j/x3znu3D7w3i3x3jnx3z0vNOPWAAAAAnRSTlP9/o2EjdMAAAB2SURBVAgdXcHLDYJAFIbR77/eMREfOxuwBHrBbo0VkNgH7NywwLlORiPEc4T4Fy5RSAIxU0kCkqqJyEBIAmv0M2bCKc5aMGYk+euitUc4oJNWnuDA7qhFP4DBPB2q2/7eNP0QgMy2KSVvu9avyTdmpoIPBV/xBtTiGuFFO362AAAAAElFTkSuQmCC","aspectRatio":1.7816836262719704,"src":"//images.ctfassets.net/s600jj41gsex/35JZiiZ73QCRDt3soUGowG/e2085e9c0acb478d16752f45569deca0/img-looking-for-a-rich-text-editor_-see-the-future-in-2023-rich-text-editor-developer-survey-report-2023110621420531.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/35JZiiZ73QCRDt3soUGowG/e2085e9c0acb478d16752f45569deca0/img-looking-for-a-rich-text-editor_-see-the-future-in-2023-rich-text-editor-developer-survey-report-2023110621420531.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/35JZiiZ73QCRDt3soUGowG/e2085e9c0acb478d16752f45569deca0/img-looking-for-a-rich-text-editor_-see-the-future-in-2023-rich-text-editor-developer-survey-report-2023110621420531.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/35JZiiZ73QCRDt3soUGowG/e2085e9c0acb478d16752f45569deca0/img-looking-for-a-rich-text-editor_-see-the-future-in-2023-rich-text-editor-developer-survey-report-2023110621420531.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/35JZiiZ73QCRDt3soUGowG/e2085e9c0acb478d16752f45569deca0/img-looking-for-a-rich-text-editor_-see-the-future-in-2023-rich-text-editor-developer-survey-report-2023110621420531.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/35JZiiZ73QCRDt3soUGowG/e2085e9c0acb478d16752f45569deca0/img-looking-for-a-rich-text-editor_-see-the-future-in-2023-rich-text-editor-developer-survey-report-2023110621420531.png?w=1478&h=830&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/35JZiiZ73QCRDt3soUGowG/e2085e9c0acb478d16752f45569deca0/img-looking-for-a-rich-text-editor_-see-the-future-in-2023-rich-text-editor-developer-survey-report-2023110621420531.png?w=1926&h=1081&q=50&fit=scale 1926w","srcWebp":"//images.ctfassets.net/s600jj41gsex/35JZiiZ73QCRDt3soUGowG/e2085e9c0acb478d16752f45569deca0/img-looking-for-a-rich-text-editor_-see-the-future-in-2023-rich-text-editor-developer-survey-report-2023110621420531.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/35JZiiZ73QCRDt3soUGowG/e2085e9c0acb478d16752f45569deca0/img-looking-for-a-rich-text-editor_-see-the-future-in-2023-rich-text-editor-developer-survey-report-2023110621420531.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/35JZiiZ73QCRDt3soUGowG/e2085e9c0acb478d16752f45569deca0/img-looking-for-a-rich-text-editor_-see-the-future-in-2023-rich-text-editor-developer-survey-report-2023110621420531.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/35JZiiZ73QCRDt3soUGowG/e2085e9c0acb478d16752f45569deca0/img-looking-for-a-rich-text-editor_-see-the-future-in-2023-rich-text-editor-developer-survey-report-2023110621420531.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/35JZiiZ73QCRDt3soUGowG/e2085e9c0acb478d16752f45569deca0/img-looking-for-a-rich-text-editor_-see-the-future-in-2023-rich-text-editor-developer-survey-report-2023110621420531.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/35JZiiZ73QCRDt3soUGowG/e2085e9c0acb478d16752f45569deca0/img-looking-for-a-rich-text-editor_-see-the-future-in-2023-rich-text-editor-developer-survey-report-2023110621420531.png?w=1478&h=830&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/35JZiiZ73QCRDt3soUGowG/e2085e9c0acb478d16752f45569deca0/img-looking-for-a-rich-text-editor_-see-the-future-in-2023-rich-text-editor-developer-survey-report-2023110621420531.png?w=1926&h=1081&q=50&fm=webp&fit=scale 1926w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Di Mace","slug":"di-mace"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Motivation behind choosing rich text editors | TinyMCE"},"metaDescription":{"metaDescription":"We cover main motivations and expectations that lay behind the choice of building a rich text editor or using a third-party tool."}},{"title":"Working with rich text editors in 2023: Industry overview and challenges","slug":"rich-text-editors-industry-and-challenges","featured":false,"lastUpdated":"Nov 1st, 2023","description":{"description":"<p>Insights from developers who work with rich text editors on the industry, editing experiences, main challenges and the most important features.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Insights from developers who work with rich text editors on the industry, editing experiences, main challenges and the most important features."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"The words industry overview and challenges with different charts and icons around it, including a happy face and pen","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAA6lBMVEWYovyYovyYov2YovyYov2Xov2Xof2VoP6Xof6an/2XoP2XoP6WoP2YofyXofzIwtrHwtmWov2WpPjJqtadreGRpPmmrOWgpu+Zov2Zo/2Zovvdz8LXzcuVo/ydrO7M5+Dl7szY7NbP6+Ld69Wjr/WapP2fpfmMs+5ou+eno9rx8Ozw8PDw7+/9/Pn///+7u/adn/mao/2Vpvybo/jkoe388/b5+vf7+vj///7U1fWRsfiSrfuZof2Zof6pmtzW1dva2+La2uLU1uLX2eymrvl2vPeFuPmRnfeMl/CMlvGLlvCRm/aVofuYov4vTVW2AAAAA3RSTlP9/v6XUDd1AAAAdklEQVQIHQXBK05DYRhAwTn9r+FRWYEAxUIIjhWjwXQB3UITErCkdXzMZAEA+KsFaGBgwy5jV9W1Qa1u6ndfVfWNDfe1r6rOjz9DLdtTVVV1GmpxeKjqelt1ZGPy9Vx1V3Vp1BrptdLHy+dlqAW84R2YBAID5h84yxxJ2KGlpQAAAABJRU5ErkJggg==","aspectRatio":1.7816836262719704,"src":"//images.ctfassets.net/s600jj41gsex/6buweme8KyJwSadjqtaPCP/238e17f126a484d76a1287802f71f9f0/img-working-with-rich-text-editors-in-2023_-industry-overview-and-challenges-2023101718551676.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6buweme8KyJwSadjqtaPCP/238e17f126a484d76a1287802f71f9f0/img-working-with-rich-text-editors-in-2023_-industry-overview-and-challenges-2023101718551676.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6buweme8KyJwSadjqtaPCP/238e17f126a484d76a1287802f71f9f0/img-working-with-rich-text-editors-in-2023_-industry-overview-and-challenges-2023101718551676.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6buweme8KyJwSadjqtaPCP/238e17f126a484d76a1287802f71f9f0/img-working-with-rich-text-editors-in-2023_-industry-overview-and-challenges-2023101718551676.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6buweme8KyJwSadjqtaPCP/238e17f126a484d76a1287802f71f9f0/img-working-with-rich-text-editors-in-2023_-industry-overview-and-challenges-2023101718551676.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6buweme8KyJwSadjqtaPCP/238e17f126a484d76a1287802f71f9f0/img-working-with-rich-text-editors-in-2023_-industry-overview-and-challenges-2023101718551676.png?w=1478&h=830&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6buweme8KyJwSadjqtaPCP/238e17f126a484d76a1287802f71f9f0/img-working-with-rich-text-editors-in-2023_-industry-overview-and-challenges-2023101718551676.png?w=1926&h=1081&q=50&fit=scale 1926w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6buweme8KyJwSadjqtaPCP/238e17f126a484d76a1287802f71f9f0/img-working-with-rich-text-editors-in-2023_-industry-overview-and-challenges-2023101718551676.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6buweme8KyJwSadjqtaPCP/238e17f126a484d76a1287802f71f9f0/img-working-with-rich-text-editors-in-2023_-industry-overview-and-challenges-2023101718551676.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6buweme8KyJwSadjqtaPCP/238e17f126a484d76a1287802f71f9f0/img-working-with-rich-text-editors-in-2023_-industry-overview-and-challenges-2023101718551676.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6buweme8KyJwSadjqtaPCP/238e17f126a484d76a1287802f71f9f0/img-working-with-rich-text-editors-in-2023_-industry-overview-and-challenges-2023101718551676.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6buweme8KyJwSadjqtaPCP/238e17f126a484d76a1287802f71f9f0/img-working-with-rich-text-editors-in-2023_-industry-overview-and-challenges-2023101718551676.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6buweme8KyJwSadjqtaPCP/238e17f126a484d76a1287802f71f9f0/img-working-with-rich-text-editors-in-2023_-industry-overview-and-challenges-2023101718551676.png?w=1478&h=830&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6buweme8KyJwSadjqtaPCP/238e17f126a484d76a1287802f71f9f0/img-working-with-rich-text-editors-in-2023_-industry-overview-and-challenges-2023101718551676.png?w=1926&h=1081&q=50&fm=webp&fit=scale 1926w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Di Mace","slug":"di-mace"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Working with rich text editors: industry overview and challenges |TinyMCE"},"metaDescription":{"metaDescription":"Insights from developers who work with rich text editors on the industry, editing experiences, main challenges and the most important features."}},{"title":"Rich Text Editors 2023 Developer Survey: Highlights and trends towards AI","slug":"text-editors-highlights-and-trends","featured":false,"lastUpdated":"Sep 13th, 2023","description":{"description":"<p>Find out rich text editing insights and trends gathered from our annual survey, which investigates the varied aspects and facets of rich text editing</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Find out rich text editing insights and trends gathered from our annual survey, which investigates the varied aspects and facets of rich text editing"}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"AI, represented by a robot, reaches out for survey results and data","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAA8FBMVEXssf/ssf/tsf/ssf/tsf/tsP/usP/psf7lsvvlsfvmsvzsr//ssf7rsfnrr/bS2Ou/8N+/7t+87tzD5t7mtvrsrv/usP7tsv/ssvrtsvvft/rbtdb25+v9//34+Pj4/Pn49/P27fnS2uvTserts//ku/bRwebhqe7as+zt4fP3+/f5+Pj0+Pfz+Pf29/jP6efEtufvr//o0PHQ0L/jr/Ltr//z4fr6+fry+PXj6ePY5dna7O214t6+zO3stv3uvO3ts/7tt//qvfq+zNrfvOnowMfi18XVzcfVvvPssP/psf3ur/7srvXrr/vur//ssv/Y1uLrAAAAA3RSTlP9/v6XUDd1AAAAfUlEQVQIHV3BMQrCQBRF0ftmPoRIpjJrsHENrsFNW2hto+5hRFBBAs43McSA5wgxEjhfrshAIOGOA8UYyEOQPKgDB0WgftWaXPFitOQm6edWwNp0J2m2PoLRS5o9AAOWjbTbaHQAYlNVXT4/F6eVBetdwLXdM8kMnCIF/r0/TFMiIUjnCd8AAAAASUVORK5CYII=","aspectRatio":1.7816836262719704,"src":"//images.ctfassets.net/s600jj41gsex/2ln1R1Coal342UkFeYUhw5/07e5096214ee68f276234174ea39a5cb/img-rich-text-editors-2023-developer-survey_-highlights-and-trends-towards-ai-2023090719485963.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/2ln1R1Coal342UkFeYUhw5/07e5096214ee68f276234174ea39a5cb/img-rich-text-editors-2023-developer-survey_-highlights-and-trends-towards-ai-2023090719485963.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2ln1R1Coal342UkFeYUhw5/07e5096214ee68f276234174ea39a5cb/img-rich-text-editors-2023-developer-survey_-highlights-and-trends-towards-ai-2023090719485963.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2ln1R1Coal342UkFeYUhw5/07e5096214ee68f276234174ea39a5cb/img-rich-text-editors-2023-developer-survey_-highlights-and-trends-towards-ai-2023090719485963.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2ln1R1Coal342UkFeYUhw5/07e5096214ee68f276234174ea39a5cb/img-rich-text-editors-2023-developer-survey_-highlights-and-trends-towards-ai-2023090719485963.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2ln1R1Coal342UkFeYUhw5/07e5096214ee68f276234174ea39a5cb/img-rich-text-editors-2023-developer-survey_-highlights-and-trends-towards-ai-2023090719485963.png?w=1478&h=830&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2ln1R1Coal342UkFeYUhw5/07e5096214ee68f276234174ea39a5cb/img-rich-text-editors-2023-developer-survey_-highlights-and-trends-towards-ai-2023090719485963.png?w=1926&h=1081&q=50&fit=scale 1926w","srcWebp":"//images.ctfassets.net/s600jj41gsex/2ln1R1Coal342UkFeYUhw5/07e5096214ee68f276234174ea39a5cb/img-rich-text-editors-2023-developer-survey_-highlights-and-trends-towards-ai-2023090719485963.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/2ln1R1Coal342UkFeYUhw5/07e5096214ee68f276234174ea39a5cb/img-rich-text-editors-2023-developer-survey_-highlights-and-trends-towards-ai-2023090719485963.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2ln1R1Coal342UkFeYUhw5/07e5096214ee68f276234174ea39a5cb/img-rich-text-editors-2023-developer-survey_-highlights-and-trends-towards-ai-2023090719485963.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2ln1R1Coal342UkFeYUhw5/07e5096214ee68f276234174ea39a5cb/img-rich-text-editors-2023-developer-survey_-highlights-and-trends-towards-ai-2023090719485963.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2ln1R1Coal342UkFeYUhw5/07e5096214ee68f276234174ea39a5cb/img-rich-text-editors-2023-developer-survey_-highlights-and-trends-towards-ai-2023090719485963.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2ln1R1Coal342UkFeYUhw5/07e5096214ee68f276234174ea39a5cb/img-rich-text-editors-2023-developer-survey_-highlights-and-trends-towards-ai-2023090719485963.png?w=1478&h=830&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2ln1R1Coal342UkFeYUhw5/07e5096214ee68f276234174ea39a5cb/img-rich-text-editors-2023-developer-survey_-highlights-and-trends-towards-ai-2023090719485963.png?w=1926&h=1081&q=50&fm=webp&fit=scale 1926w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Di Mace","slug":"di-mace"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Rich Text Editors 2023 Developer Survey: Highlights and trends | TinyMCE"},"metaDescription":{"metaDescription":"The freshest insights on rich text editing trends and highlights on what has changed in comparison to previous year survey results."}},{"title":"Technical debt and types: The benefits of TypeScript vs JavaScript","slug":"benefits-of-typescript","featured":true,"lastUpdated":"Jul 26th, 2023","description":{"description":"<p>Heavy technical debt burdens can sink a project. But selecting the right language can help keep debt down. Find out what the results are after weighing up JavaScript vs Typescript, based on TinyMCE's development history</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Heavy technical debt burdens can sink a project. But selecting the right language can help keep debt down. Find out what the results are after weighing up JavaScript vs Typescript, based on TinyMCE's development history"}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"The rich text editor represented as a document symbol with TypeScript and JavaScript logos above it","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAA4VBMVEX+ov/+ov/+of/+ov/+ov//ov//o//+of//of/0nv2ikfzHk/v/n/7+o/z8p/H9of7/oP/1qvrlqu79oP7ql/ugoP3Gofn8nPz4usP12nz6p/D5of3xp/fnsPH/n//6rvX2rfTyufnzu/r4ut/20cj6rPbzsPj5wfr7wvv6svr+oP/9tP758/T18Or69vn59vny9vnt9fj36fr2vvbs1Ozr1uvtu+7+n//8tf358vb48vT4+Pj4+fj6+/v6/fv38/j3rPj6mfv8nf39n/7+pf/+uP/+t///uf//uv/+s///nv8Vl2KaAAAABHRSTlP9/v78RvGEPgAAAGtJREFUCB0FwbttAlEUQME5+64jixSJBojovwKX4MwSEikhKZ/1TANhB+g5CATYtYE2LNYiBqymquqBIeu7qqoeaLQ+p6qq6s9rcDxUVVVh4FBVVf1gcD9H1e26v0VfWMcL/N7f4JVA7ADbP7fqExxdbHuwAAAAAElFTkSuQmCC","aspectRatio":1.7816836262719704,"src":"//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=1478&h=830&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=1926&h=1081&q=50&fit=scale 1926w","srcWebp":"//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=1478&h=830&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=1926&h=1081&q=50&fm=webp&fit=scale 1926w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Millie Macdonald","slug":"millie-macdonald"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Benefits of TypeScript over JavaScript: tech debt and types | TinyMCE"},"metaDescription":{"metaDescription":"Giving a preference to TypeScript vs JavaScript can have long term benefits in terms of dealing with technical debt."}},{"title":"What does it mean to be SOC2 compliant for SaaS?","slug":"soc2-compliance-meaning","featured":false,"lastUpdated":"May 18th, 2023","description":{"description":"<p>Is your data security practice working to protect your customers? Read on to find out how SOC2 compliance contributes to your data security.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Is your data security practice working to protect your customers? Read on to find out how SOC2 compliance contributes to your data security."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"The text \"Compliance\" written alongside a representation of SaaS in a cloud symbol","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAA0lBMVEX7dYP8dYP8dIP8dIL7dYP8dYL9dX/+dHz7dIL7coD7bHz7anv7b37sc5/hgbbvcpj6dIL5cYD5dIH5pqz6zM/5k5z6bXz6c4H+dXzDcM2Vk/zPacH/dXv2dYjqfZf60NP+8/P/+fn75OX5for6cYDnbaDNY7vrcpr0onb4f3/5d4f2wcfwxtHww870xs/6go77dIP+dn/7fH7zsXj1jYP4dIP2aXnzaHnzZ3nwcHjsf3r7c4Lyd4TudYHzb334coD4cYDueX3mh3z6c4L5c4H9dIO0QdYAAAAAAXRSTlP+GuMHfQAAAG1JREFUCB2NwbsNwkAQQMH3dAsOOBIaoABSOqBxp4ROqAKHCAn5tPwsRwTM8Iuy0EzeotBCMzN8mSZaIQA7vW/8GoGgxU7dOhsBg7bau7jVoRBA1svBWT0DBjRwffSjTwoBFFo+Oq8DnpICyp+eWREcKyS9ydsAAAAASUVORK5CYII=","aspectRatio":1.780758556891767,"src":"//images.ctfassets.net/s600jj41gsex/2QUVwzLBzYHfvlnfmr6lXW/492ae4fd65ffe6661c9c33abe80e8941/What_does_it_mean_to_be_SOC2_compliant_for_SaaS___1_.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/2QUVwzLBzYHfvlnfmr6lXW/492ae4fd65ffe6661c9c33abe80e8941/What_does_it_mean_to_be_SOC2_compliant_for_SaaS___1_.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2QUVwzLBzYHfvlnfmr6lXW/492ae4fd65ffe6661c9c33abe80e8941/What_does_it_mean_to_be_SOC2_compliant_for_SaaS___1_.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2QUVwzLBzYHfvlnfmr6lXW/492ae4fd65ffe6661c9c33abe80e8941/What_does_it_mean_to_be_SOC2_compliant_for_SaaS___1_.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2QUVwzLBzYHfvlnfmr6lXW/492ae4fd65ffe6661c9c33abe80e8941/What_does_it_mean_to_be_SOC2_compliant_for_SaaS___1_.png?w=1109&h=623&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2QUVwzLBzYHfvlnfmr6lXW/492ae4fd65ffe6661c9c33abe80e8941/What_does_it_mean_to_be_SOC2_compliant_for_SaaS___1_.png?w=1478&h=830&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2QUVwzLBzYHfvlnfmr6lXW/492ae4fd65ffe6661c9c33abe80e8941/What_does_it_mean_to_be_SOC2_compliant_for_SaaS___1_.png?w=1925&h=1081&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/2QUVwzLBzYHfvlnfmr6lXW/492ae4fd65ffe6661c9c33abe80e8941/What_does_it_mean_to_be_SOC2_compliant_for_SaaS___1_.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/2QUVwzLBzYHfvlnfmr6lXW/492ae4fd65ffe6661c9c33abe80e8941/What_does_it_mean_to_be_SOC2_compliant_for_SaaS___1_.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2QUVwzLBzYHfvlnfmr6lXW/492ae4fd65ffe6661c9c33abe80e8941/What_does_it_mean_to_be_SOC2_compliant_for_SaaS___1_.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2QUVwzLBzYHfvlnfmr6lXW/492ae4fd65ffe6661c9c33abe80e8941/What_does_it_mean_to_be_SOC2_compliant_for_SaaS___1_.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2QUVwzLBzYHfvlnfmr6lXW/492ae4fd65ffe6661c9c33abe80e8941/What_does_it_mean_to_be_SOC2_compliant_for_SaaS___1_.png?w=1109&h=623&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2QUVwzLBzYHfvlnfmr6lXW/492ae4fd65ffe6661c9c33abe80e8941/What_does_it_mean_to_be_SOC2_compliant_for_SaaS___1_.png?w=1478&h=830&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2QUVwzLBzYHfvlnfmr6lXW/492ae4fd65ffe6661c9c33abe80e8941/What_does_it_mean_to_be_SOC2_compliant_for_SaaS___1_.png?w=1925&h=1081&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"John Rau","slug":"john-rau"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"What does it mean to be SOC2 compliant for SaaS? | TinyMCE"},"metaDescription":{"metaDescription":"SOC 2 compliance means that your company has been audited by an independent third party to ensure that your data security practices meet industry standards."}},{"title":"Dangerous examples of technical debt in rich text editors","slug":"technical-debt-examples","featured":false,"lastUpdated":"Dec 19th, 2022","description":{"description":"<p>Read the story of our team's technical debt experience: handling cases of technical debt accrual in rich text editors, and how we approach the issue</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Read the story of our team's technical debt experience: handling cases of technical debt accrual in rich text editors, and how we approach the issue"}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"An exclamation mark as a warning, representing the dangers of technical debt","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABjFBMVEUiNHUiM3UiNHYiNHcjNHcjNXggMG0gMW4fMG4eL24bLW0bLm4gMW8hMXAhMnAdLWQdLWUZKmUAHmEAAl0ABF4AHGEZK2YdLWceLmceLmgbKl4bKl0bKl8YKF4AGFopNGO4usK8vcU0PWgAFVoZKWAcK2EcLGIZJ1cZJ1gZKFgZJ1kNIVYAAEWipK7d3uHa296rrLUAAEcMIVgZKFsbKVwbKV0YJVIXJVIYJVMVJFMAAEo+RGPt7e7W19rQ0NTx8vNMUWwAAEwVJFUXI04XI08XJE8RIE4AADusrbT////r6+zn6Om2t70AAEARIVEYJlMYJlQZJlQVIUoWIksQH0sAADqmp677+/vs7O37+/yvsLYAAD8XJFAXJFEYJFEVIEcVIUgVIUkTH0kAEEQAFUZXW21hZHRhZHVZXG8NHUsAEEcTIU0UH0YUIEgRHkcAFEUAAD4AADwAAD0AFUcSH0sWIUwXIk0UHkQUH0UUH0cSHkcPHEcOG0cOHEgPHUgTH0oVIUsWIUsWIkwXIk7kJeYXAAAAc0lEQVQIHQXBMU5CQQBAwTefjYmB9WslhZ3cgPsfgd4LUBhLrVlnZLVVVcraylOV4HEoizWeUwWgahyt2gCUGjMBQGnsFAD30pixNvA48PZOY0/B/QM/l1hjRrDD61c0Zr+rF/B95tptGcdOf52CT+g6+wf33xSQSPhocgAAAABJRU5ErkJggg==","aspectRatio":1.7767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/1z2X2gKj3AqHd0KdZtgxkN/e6c9c76f477affea75b1817a73f02f00/tech-debt-4-2022121313085824.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/1z2X2gKj3AqHd0KdZtgxkN/e6c9c76f477affea75b1817a73f02f00/tech-debt-4-2022121313085824.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1z2X2gKj3AqHd0KdZtgxkN/e6c9c76f477affea75b1817a73f02f00/tech-debt-4-2022121313085824.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1z2X2gKj3AqHd0KdZtgxkN/e6c9c76f477affea75b1817a73f02f00/tech-debt-4-2022121313085824.png?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1z2X2gKj3AqHd0KdZtgxkN/e6c9c76f477affea75b1817a73f02f00/tech-debt-4-2022121313085824.png?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/1z2X2gKj3AqHd0KdZtgxkN/e6c9c76f477affea75b1817a73f02f00/tech-debt-4-2022121313085824.png?w=1478&h=832&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/1z2X2gKj3AqHd0KdZtgxkN/e6c9c76f477affea75b1817a73f02f00/tech-debt-4-2022121313085824.png?w=1528&h=860&q=50&fit=scale 1528w","srcWebp":"//images.ctfassets.net/s600jj41gsex/1z2X2gKj3AqHd0KdZtgxkN/e6c9c76f477affea75b1817a73f02f00/tech-debt-4-2022121313085824.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/1z2X2gKj3AqHd0KdZtgxkN/e6c9c76f477affea75b1817a73f02f00/tech-debt-4-2022121313085824.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1z2X2gKj3AqHd0KdZtgxkN/e6c9c76f477affea75b1817a73f02f00/tech-debt-4-2022121313085824.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1z2X2gKj3AqHd0KdZtgxkN/e6c9c76f477affea75b1817a73f02f00/tech-debt-4-2022121313085824.png?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1z2X2gKj3AqHd0KdZtgxkN/e6c9c76f477affea75b1817a73f02f00/tech-debt-4-2022121313085824.png?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/1z2X2gKj3AqHd0KdZtgxkN/e6c9c76f477affea75b1817a73f02f00/tech-debt-4-2022121313085824.png?w=1478&h=832&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/1z2X2gKj3AqHd0KdZtgxkN/e6c9c76f477affea75b1817a73f02f00/tech-debt-4-2022121313085824.png?w=1528&h=860&q=50&fm=webp&fit=scale 1528w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Millie Macdonald","slug":"millie-macdonald"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Dangerous examples of technical debt in rich text editors | TinyMCE"},"metaDescription":{"metaDescription":"In this post we talk about the examples of technical debt that our team has the most expertise in: cases of technical debt accrual in rich text editors and share how we approach these issues"}},{"title":"Managing technical debt is difficult in rich text editors","slug":"manage-technical-debt","featured":false,"lastUpdated":"Nov 29th, 2022","description":{"description":"<p>We&rsquo;ve collected the aspects that can make or break your strategy of tech debt management - read on to find how.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We’ve collected the aspects that can make or break your strategy of tech debt management - read on to find how."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Pie chart depicted in contrasting colours","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAA/FBMVEUjNHciNHchM3YfMnQdMXIXLGweMXIiM3YlM3UxN304OH5NUaJES5kkL3AeMHImNHc2Pow0RJ05P5FkduFrh/9aacwqNXcfMXMiM3UvPIkwRJ8rQ58wPY9fdN9oiv9pif9TYsAeLWwrP5MpQJooP5goOIlcc91oif9nif9jfe8sOHwgMXMhM3UmNnpCU6pDVq9CVK1CUqhfeOZniP9lgvgzQIkfMHIhMnUoN3pgeupnh/9nhv9mh/9hfe8pOH0dLW1JX71oiP9MY8IjM3VOZ8lkhPxlhf1Qac4kNXggMXIeLm80R5ZEXLdEXLg1SZgfL3AgMHIbK2oXJmMbKmnWBGX7AAAAg0lEQVQIHQXBMUoDUQBAwXnZ1Z9kQbG0VPAiXjrXsBEPYCOIkEIJC8Y4E1CVfi8XCBhV1bpCYGyrqo4rZnBXVdUnBGN9rKrqFTM8VVUq2MCyLMf9frv73u1+YAMvY2zHxclVXzDB33JzO32c7u/m67czAuO5qjqsMIHz+8OYp+lyWME/4pwdJJVHZF8AAAAASUVORK5CYII=","aspectRatio":1.7767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/6R0dgGR7Une66VCag5E6Bz/3f09fcd022ea9991bb49499d9bbcd9cc/management-2-2022111614140854.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6R0dgGR7Une66VCag5E6Bz/3f09fcd022ea9991bb49499d9bbcd9cc/management-2-2022111614140854.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6R0dgGR7Une66VCag5E6Bz/3f09fcd022ea9991bb49499d9bbcd9cc/management-2-2022111614140854.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6R0dgGR7Une66VCag5E6Bz/3f09fcd022ea9991bb49499d9bbcd9cc/management-2-2022111614140854.png?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6R0dgGR7Une66VCag5E6Bz/3f09fcd022ea9991bb49499d9bbcd9cc/management-2-2022111614140854.png?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6R0dgGR7Une66VCag5E6Bz/3f09fcd022ea9991bb49499d9bbcd9cc/management-2-2022111614140854.png?w=1478&h=832&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6R0dgGR7Une66VCag5E6Bz/3f09fcd022ea9991bb49499d9bbcd9cc/management-2-2022111614140854.png?w=1528&h=860&q=50&fit=scale 1528w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6R0dgGR7Une66VCag5E6Bz/3f09fcd022ea9991bb49499d9bbcd9cc/management-2-2022111614140854.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6R0dgGR7Une66VCag5E6Bz/3f09fcd022ea9991bb49499d9bbcd9cc/management-2-2022111614140854.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6R0dgGR7Une66VCag5E6Bz/3f09fcd022ea9991bb49499d9bbcd9cc/management-2-2022111614140854.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6R0dgGR7Une66VCag5E6Bz/3f09fcd022ea9991bb49499d9bbcd9cc/management-2-2022111614140854.png?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6R0dgGR7Une66VCag5E6Bz/3f09fcd022ea9991bb49499d9bbcd9cc/management-2-2022111614140854.png?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6R0dgGR7Une66VCag5E6Bz/3f09fcd022ea9991bb49499d9bbcd9cc/management-2-2022111614140854.png?w=1478&h=832&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6R0dgGR7Une66VCag5E6Bz/3f09fcd022ea9991bb49499d9bbcd9cc/management-2-2022111614140854.png?w=1528&h=860&q=50&fm=webp&fit=scale 1528w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Millie Macdonald","slug":"millie-macdonald"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"How to manage technical debt in rich text editors | TinyMCE"},"metaDescription":{"metaDescription":"Dealing with the technical debt of rich text editors isn’t easy. We’ve collected the aspects that can make or break your strategy of tech debt management."}},{"title":"What makes a secure text editor?","slug":"secure-text-editor","featured":false,"lastUpdated":"Mar 23rd, 2023","description":{"description":"<p>When selecting a secure text editor one of the most significant considerations is security, which is why it's worth reading on to find out what makes a text editor secure.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"When selecting a secure text editor one of the most significant considerations is security, which is why it's worth reading on to find out what makes a text editor secure."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Security icons together on a blue background","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAB6VBMVEWUq/+VrP+Xrf+Xrf6Yrf6Wrf+Trf+Srf+Urf+fsvyfsvufsfqbrvyWrP6Yrf6Xrf+Vrf+erfayrtq1rtSoremWrf+Yrf/s6+/q6+/4+PrO1fSSqf2UrP+dq/LDrbKzrNKtrNzArbmxrNSTq//s0qzr39D///3Z3vaQp/2XrP6XrPvPtKfkunHkumvduo/duo7fuYPmumDeuYWpq9+Xrf7u6eD28+7V2vWMpf2RqP6Tqf6VrP+Yq/nnvGv6xgj4xSr1wznwwUz4xSX4xS35xACyqcqOqf+Sqf+yv/azwPi0wPiktPfAyPXQ1vbAyvGXq/vlvHT4xSz3xCzLs7Gnq+PvwFT3xDj2wyGwqM22xfvL1fWRp/uTqv+Xq/7k7O/f+Nji7uidsP6Wq/zlvHXWt5ywrNX0wj72xDv2wiWtpMjX4PXr8uiRpfOYrv+Zrf3X3+7f7eTk5/Sar/73xTHhun7Hsa72wzX2xDqtpcnZ3/X18eqSp/SZrv+dr/ybqvKcrvqWrP/mvGr6xQD4xA/4xAv3wwv4xA35xQr4wwCxqMytvv3AyviWq/uZrv6MoO6RpvaTqPiSp/e3rszCsLu/rbu/rrvArru+rLqbp+yTrP+WqvqTp/aZr/+Xrv+Srv+OrP+NrP+PrP+Vrv8Nj/DEAAAACXRSTlP+/v7+/v7+/v4itX5mAAAAjklEQVQIHQXBsU0CYQAG0O8dfyIUeBzQUSAJC1g6gFNQWNpZUTADYYIrncaEGUiwoCQabQghwHsSSJJrB+cqiR5IAjg/nFIe4T/RB/x1T+bgYAJgNy+N3wENAEbKyBi+XgBgIYB9PQSU5vMN7FxmsJ9R6tTtO46vwDNs/KRdAXGrsNYuP5Lp9xMkuVW2uQMC6xyLou1c8wAAAABJRU5ErkJggg==","aspectRatio":1.7775489186405766,"src":"//images.ctfassets.net/s600jj41gsex/6qrNMdgVG6Fe5606ZKnppo/78ad6f291c2a2dc7cdb02b40530add78/what-makes-a-secure-text-editor_-2023031610315788.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6qrNMdgVG6Fe5606ZKnppo/78ad6f291c2a2dc7cdb02b40530add78/what-makes-a-secure-text-editor_-2023031610315788.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6qrNMdgVG6Fe5606ZKnppo/78ad6f291c2a2dc7cdb02b40530add78/what-makes-a-secure-text-editor_-2023031610315788.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6qrNMdgVG6Fe5606ZKnppo/78ad6f291c2a2dc7cdb02b40530add78/what-makes-a-secure-text-editor_-2023031610315788.png?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6qrNMdgVG6Fe5606ZKnppo/78ad6f291c2a2dc7cdb02b40530add78/what-makes-a-secure-text-editor_-2023031610315788.png?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6qrNMdgVG6Fe5606ZKnppo/78ad6f291c2a2dc7cdb02b40530add78/what-makes-a-secure-text-editor_-2023031610315788.png?w=1478&h=831&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6qrNMdgVG6Fe5606ZKnppo/78ad6f291c2a2dc7cdb02b40530add78/what-makes-a-secure-text-editor_-2023031610315788.png?w=1726&h=971&q=50&fit=scale 1726w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6qrNMdgVG6Fe5606ZKnppo/78ad6f291c2a2dc7cdb02b40530add78/what-makes-a-secure-text-editor_-2023031610315788.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6qrNMdgVG6Fe5606ZKnppo/78ad6f291c2a2dc7cdb02b40530add78/what-makes-a-secure-text-editor_-2023031610315788.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6qrNMdgVG6Fe5606ZKnppo/78ad6f291c2a2dc7cdb02b40530add78/what-makes-a-secure-text-editor_-2023031610315788.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6qrNMdgVG6Fe5606ZKnppo/78ad6f291c2a2dc7cdb02b40530add78/what-makes-a-secure-text-editor_-2023031610315788.png?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6qrNMdgVG6Fe5606ZKnppo/78ad6f291c2a2dc7cdb02b40530add78/what-makes-a-secure-text-editor_-2023031610315788.png?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6qrNMdgVG6Fe5606ZKnppo/78ad6f291c2a2dc7cdb02b40530add78/what-makes-a-secure-text-editor_-2023031610315788.png?w=1478&h=831&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6qrNMdgVG6Fe5606ZKnppo/78ad6f291c2a2dc7cdb02b40530add78/what-makes-a-secure-text-editor_-2023031610315788.png?w=1726&h=971&q=50&fm=webp&fit=scale 1726w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Elise Bentley","slug":"elise-bentley"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"What makes a secure text editor? | TinyMCE"},"metaDescription":{"metaDescription":"Discover the key considerations and features you should look for in a secure text editor. Learn why TinyMCE is a reliable and secure option for your text editing needs."}},{"title":"How to track and prioritize technical debt","slug":"technical-debt-tracking","featured":false,"lastUpdated":"Feb 21st, 2023","description":{"description":"<p>The worst technical debt is unidentified technical debt &ndash; find out how to identify, track and prioritize technical debt.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The worst technical debt is unidentified technical debt – find out how to identify, track and prioritize technical debt."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Overlapping rings representing the converging concerns and focus needed for tech debt management","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAALABQDAREAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAQUCBAn/xAAiEAACAgICAgIDAAAAAAAAAAABAgMEABEFMRMhFEFRcfD/xAAaAQACAgMAAAAAAAAAAAAAAAABAwACBAUG/8QAGhEBAQADAQEAAAAAAAAAAAAAAQACESExEv/aAAwDAQACEQMRAD8Az+4HjYbdlvMnkCgER71v9/33nVZiHLXnZp8Cveq2Gbjo6DRMwV4ww6/Oz7wg4p3dOMlWv66zM+Ze6cTtC4aNijDplOiMID7CuSclbuqFsWZplHQkckZYwxx8I7WAUa6xoS7/2Q==","aspectRatio":1.7767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/6hQk4SjPBGK9MIa1F3TTju/d4ccfd4c1f4fe8cbfb2dd3d8c4fe0c97/track-and-prioritize-2023020212375488.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6hQk4SjPBGK9MIa1F3TTju/d4ccfd4c1f4fe8cbfb2dd3d8c4fe0c97/track-and-prioritize-2023020212375488.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6hQk4SjPBGK9MIa1F3TTju/d4ccfd4c1f4fe8cbfb2dd3d8c4fe0c97/track-and-prioritize-2023020212375488.jpg?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6hQk4SjPBGK9MIa1F3TTju/d4ccfd4c1f4fe8cbfb2dd3d8c4fe0c97/track-and-prioritize-2023020212375488.jpg?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6hQk4SjPBGK9MIa1F3TTju/d4ccfd4c1f4fe8cbfb2dd3d8c4fe0c97/track-and-prioritize-2023020212375488.jpg?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6hQk4SjPBGK9MIa1F3TTju/d4ccfd4c1f4fe8cbfb2dd3d8c4fe0c97/track-and-prioritize-2023020212375488.jpg?w=1478&h=832&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6hQk4SjPBGK9MIa1F3TTju/d4ccfd4c1f4fe8cbfb2dd3d8c4fe0c97/track-and-prioritize-2023020212375488.jpg?w=1528&h=860&q=50&fit=scale 1528w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6hQk4SjPBGK9MIa1F3TTju/d4ccfd4c1f4fe8cbfb2dd3d8c4fe0c97/track-and-prioritize-2023020212375488.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6hQk4SjPBGK9MIa1F3TTju/d4ccfd4c1f4fe8cbfb2dd3d8c4fe0c97/track-and-prioritize-2023020212375488.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6hQk4SjPBGK9MIa1F3TTju/d4ccfd4c1f4fe8cbfb2dd3d8c4fe0c97/track-and-prioritize-2023020212375488.jpg?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6hQk4SjPBGK9MIa1F3TTju/d4ccfd4c1f4fe8cbfb2dd3d8c4fe0c97/track-and-prioritize-2023020212375488.jpg?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6hQk4SjPBGK9MIa1F3TTju/d4ccfd4c1f4fe8cbfb2dd3d8c4fe0c97/track-and-prioritize-2023020212375488.jpg?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6hQk4SjPBGK9MIa1F3TTju/d4ccfd4c1f4fe8cbfb2dd3d8c4fe0c97/track-and-prioritize-2023020212375488.jpg?w=1478&h=832&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6hQk4SjPBGK9MIa1F3TTju/d4ccfd4c1f4fe8cbfb2dd3d8c4fe0c97/track-and-prioritize-2023020212375488.jpg?w=1528&h=860&q=50&fm=webp&fit=scale 1528w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Millie Macdonald","slug":"millie-macdonald"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Technical debt tracking and prioritization | TinyMCE"},"metaDescription":{"metaDescription":"The worst technical debt is unidentified technical debt. In this article, we discuss how to identify, track and prioritize technical debt."}},{"title":"Are developer velocity and technical debt impacted by a rich text editor?","slug":"developer-velocity-and-technical-debt","featured":false,"lastUpdated":"Jan 17th, 2023","description":{"description":"<p>Find out how developer velocity is impacted by a technical debt following our rich text editor stories, and what can you do to improve it.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Find out how developer velocity is impacted by a technical debt following our rich text editor stories, and what can you do to improve it."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Time represented in a clock currently set at 3 O' Clock. ","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAArlBMVEUQGDcPFzYQGDYPFzUPFjMPFTMOEzAWIEYXIUkOEzEQFzYPFTQQGDgmQXoxSY8uRIYnQnwRGjsODi0bQW0hRnkhTX4TJkghRHYdRHIPCCwZV38TMlQRXngPc4oSSmcZWIEPCy0PBi0SUW4RYHsPJDsPMkcRX3kSVXIPBCwQEzQQGzgOZ3sMdoYMdYUOaX0QHzsQEjQQETMQCzAPNEkPNUoQDDEQEDMQFzcQFTUQDzOJjvqOAAAAXklEQVQIHQXBsRHCMAAAMb1jSM6LUKVm/x1oWITjaIIEQA2ACWjk6gI2oDnGNl1AYFVVv+sDE9irqi+YwF5VxxdM4KiqgAkcVRUQsB5VvT5gAOf7vt221wkAeK61AP7SdgzQy6dxTAAAAABJRU5ErkJggg==","aspectRatio":1.7767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/pSCoh3sRCzJCGPQ1rLfTi/9d0994f65e8d7732aafecf44302421cc/developer-velocity-2022122007162835.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/pSCoh3sRCzJCGPQ1rLfTi/9d0994f65e8d7732aafecf44302421cc/developer-velocity-2022122007162835.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/pSCoh3sRCzJCGPQ1rLfTi/9d0994f65e8d7732aafecf44302421cc/developer-velocity-2022122007162835.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/pSCoh3sRCzJCGPQ1rLfTi/9d0994f65e8d7732aafecf44302421cc/developer-velocity-2022122007162835.png?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/pSCoh3sRCzJCGPQ1rLfTi/9d0994f65e8d7732aafecf44302421cc/developer-velocity-2022122007162835.png?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/pSCoh3sRCzJCGPQ1rLfTi/9d0994f65e8d7732aafecf44302421cc/developer-velocity-2022122007162835.png?w=1478&h=832&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/pSCoh3sRCzJCGPQ1rLfTi/9d0994f65e8d7732aafecf44302421cc/developer-velocity-2022122007162835.png?w=1528&h=860&q=50&fit=scale 1528w","srcWebp":"//images.ctfassets.net/s600jj41gsex/pSCoh3sRCzJCGPQ1rLfTi/9d0994f65e8d7732aafecf44302421cc/developer-velocity-2022122007162835.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/pSCoh3sRCzJCGPQ1rLfTi/9d0994f65e8d7732aafecf44302421cc/developer-velocity-2022122007162835.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/pSCoh3sRCzJCGPQ1rLfTi/9d0994f65e8d7732aafecf44302421cc/developer-velocity-2022122007162835.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/pSCoh3sRCzJCGPQ1rLfTi/9d0994f65e8d7732aafecf44302421cc/developer-velocity-2022122007162835.png?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/pSCoh3sRCzJCGPQ1rLfTi/9d0994f65e8d7732aafecf44302421cc/developer-velocity-2022122007162835.png?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/pSCoh3sRCzJCGPQ1rLfTi/9d0994f65e8d7732aafecf44302421cc/developer-velocity-2022122007162835.png?w=1478&h=832&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/pSCoh3sRCzJCGPQ1rLfTi/9d0994f65e8d7732aafecf44302421cc/developer-velocity-2022122007162835.png?w=1528&h=860&q=50&fm=webp&fit=scale 1528w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Di Mace","slug":"di-mace"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Developer velocity and technical debt: rich text editor impact | TinyMCE"},"metaDescription":{"metaDescription":"We’ll explore how developer velocity is impacted by a technical debt on the example of rich text editor, as well as what can you do to improve it."}},{"title":"Is your code half-life shorter than your engineering career?","slug":"rte-code-half-life","featured":false,"lastUpdated":"Nov 8th, 2022","description":{"description":"<p>Find out more about Code half-life - a metric that provides interesting perspective on developer&rsquo;s work efficiency and product longevity</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Find out more about Code half-life - a metric that provides interesting perspective on developer’s work efficiency and product longevity"}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"A graph represented as a line on grid background","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.7767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/6cg9iKrkdj6a8hWynmgnZg/56f3a41a4879ef769b82c0bada47ac57/tech-debt-2-2022110213124606-2.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6cg9iKrkdj6a8hWynmgnZg/56f3a41a4879ef769b82c0bada47ac57/tech-debt-2-2022110213124606-2.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6cg9iKrkdj6a8hWynmgnZg/56f3a41a4879ef769b82c0bada47ac57/tech-debt-2-2022110213124606-2.jpg?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6cg9iKrkdj6a8hWynmgnZg/56f3a41a4879ef769b82c0bada47ac57/tech-debt-2-2022110213124606-2.jpg?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6cg9iKrkdj6a8hWynmgnZg/56f3a41a4879ef769b82c0bada47ac57/tech-debt-2-2022110213124606-2.jpg?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6cg9iKrkdj6a8hWynmgnZg/56f3a41a4879ef769b82c0bada47ac57/tech-debt-2-2022110213124606-2.jpg?w=1478&h=832&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6cg9iKrkdj6a8hWynmgnZg/56f3a41a4879ef769b82c0bada47ac57/tech-debt-2-2022110213124606-2.jpg?w=1528&h=860&q=50&fit=scale 1528w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6cg9iKrkdj6a8hWynmgnZg/56f3a41a4879ef769b82c0bada47ac57/tech-debt-2-2022110213124606-2.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6cg9iKrkdj6a8hWynmgnZg/56f3a41a4879ef769b82c0bada47ac57/tech-debt-2-2022110213124606-2.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6cg9iKrkdj6a8hWynmgnZg/56f3a41a4879ef769b82c0bada47ac57/tech-debt-2-2022110213124606-2.jpg?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6cg9iKrkdj6a8hWynmgnZg/56f3a41a4879ef769b82c0bada47ac57/tech-debt-2-2022110213124606-2.jpg?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6cg9iKrkdj6a8hWynmgnZg/56f3a41a4879ef769b82c0bada47ac57/tech-debt-2-2022110213124606-2.jpg?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6cg9iKrkdj6a8hWynmgnZg/56f3a41a4879ef769b82c0bada47ac57/tech-debt-2-2022110213124606-2.jpg?w=1478&h=832&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6cg9iKrkdj6a8hWynmgnZg/56f3a41a4879ef769b82c0bada47ac57/tech-debt-2-2022110213124606-2.jpg?w=1528&h=860&q=50&fm=webp&fit=scale 1528w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Di Mace","slug":"di-mace"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Half-life of the rich text editor code | TinyMCE"},"metaDescription":{"metaDescription":" Code half-life metric provides interesting perspective on developer’s work efficiency and product longevity as its contributes to the technical debt your app is accumulating"}},{"title":"Reduce technical debt with the right rich text editor","slug":"reduce-technical-debt","featured":false,"lastUpdated":"Oct 25th, 2022","description":{"description":"<p>The choice of your software components can either increase or reduce technical debt acquisition.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The choice of your software components can either increase or reduce technical debt acquisition."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"a graph showing a drop in costs associated with technical debt","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.7767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/2xMpI8uNuoFJAcwMcL4KEC/c2a0da85780e387924db38955a0492bf/img-tech-debt-1-2022092912314335.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/2xMpI8uNuoFJAcwMcL4KEC/c2a0da85780e387924db38955a0492bf/img-tech-debt-1-2022092912314335.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2xMpI8uNuoFJAcwMcL4KEC/c2a0da85780e387924db38955a0492bf/img-tech-debt-1-2022092912314335.jpg?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2xMpI8uNuoFJAcwMcL4KEC/c2a0da85780e387924db38955a0492bf/img-tech-debt-1-2022092912314335.jpg?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2xMpI8uNuoFJAcwMcL4KEC/c2a0da85780e387924db38955a0492bf/img-tech-debt-1-2022092912314335.jpg?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2xMpI8uNuoFJAcwMcL4KEC/c2a0da85780e387924db38955a0492bf/img-tech-debt-1-2022092912314335.jpg?w=1478&h=832&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2xMpI8uNuoFJAcwMcL4KEC/c2a0da85780e387924db38955a0492bf/img-tech-debt-1-2022092912314335.jpg?w=1528&h=860&q=50&fit=scale 1528w","srcWebp":"//images.ctfassets.net/s600jj41gsex/2xMpI8uNuoFJAcwMcL4KEC/c2a0da85780e387924db38955a0492bf/img-tech-debt-1-2022092912314335.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/2xMpI8uNuoFJAcwMcL4KEC/c2a0da85780e387924db38955a0492bf/img-tech-debt-1-2022092912314335.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2xMpI8uNuoFJAcwMcL4KEC/c2a0da85780e387924db38955a0492bf/img-tech-debt-1-2022092912314335.jpg?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2xMpI8uNuoFJAcwMcL4KEC/c2a0da85780e387924db38955a0492bf/img-tech-debt-1-2022092912314335.jpg?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2xMpI8uNuoFJAcwMcL4KEC/c2a0da85780e387924db38955a0492bf/img-tech-debt-1-2022092912314335.jpg?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2xMpI8uNuoFJAcwMcL4KEC/c2a0da85780e387924db38955a0492bf/img-tech-debt-1-2022092912314335.jpg?w=1478&h=832&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2xMpI8uNuoFJAcwMcL4KEC/c2a0da85780e387924db38955a0492bf/img-tech-debt-1-2022092912314335.jpg?w=1528&h=860&q=50&fm=webp&fit=scale 1528w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Di Mace","slug":"di-mace"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"How to reduce technical debt with the right rich text editor | TinyMCE"},"metaDescription":{"metaDescription":"The choice of your software components can either increase or reduce technical debt acquisition. Learn how your decision about RTE components can affect your tech debt."}},{"title":"Rich Text Editor developers in 2021: survey says full-stack all the way","slug":"rich-text-editor-developers-in-2021-survey-says-full-stack-all-the-way","featured":false,"lastUpdated":"Nov 2nd, 2021","description":{"description":"<p>Usually considered a&nbsp;front-end UI&nbsp;component and/or API, it&nbsp;appears that rich text editors (RTEs) aren&rsquo;t the shy retiring components we&nbsp;all thought. They&rsquo;re primarily being used by&nbsp;full-stack developers, for more complex major projects.</p>\n<p>&nbsp;</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Usually considered a front-end UI component and/or API, it appears that rich text editors (RTEs) aren’t the shy retiring components we all thought. They’re primarily being used by full-stack developers, for more complex major projects."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":" "}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Post 1 in our series exploring the results of the 2021 rich text editor survey.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAMAAADOQy/fAAAA/FBMVEUXI08VIk8mJU8tJ04tJk4uJ04kJU8SIk8WI08XJFIWJFItKFEuKVMrKFMqKFMyKVI/KlEnJVIVJFIZJlUYJlUXJlUtKlYnLFobKFgZKFgXKFgiKVg3KlIuKFMaKFoZKFoYKFouLVwmMGQcLWMcLGIaLGMkLWI2LFYtKlUcK2AbK2AaKl8vMGUnNHEfMm8eMm8nMm83MF4uLFkaK2EeLmccLWcyNG4sOX8mOH4lOH8tOH44NGguL10cLmgeLmghMnEgMnEfMXAtNXI/Pno8O3U7OnQ5N2YwM2QfMnEjNnojNXohNXosOHczOG0xN20yN20yN24sN3YiNnsjNnsxE16+AAAARUlEQVQI11WNMQ4AIAgDRVmU0f9/U92wKInCUnppgRKGMHqFFjxXhy536c+coKLCEmEJ0OsyHYabMmI9acZRAG7fW4OW3FSZDqx45LiCAAAAAElFTkSuQmCC","aspectRatio":2.4767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/68vHF42PTMjZuY8LEa2Sf6/0fee9ed609ad60c413910c96ef23ca00/Image_Developer_Survey_post_1.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/68vHF42PTMjZuY8LEa2Sf6/0fee9ed609ad60c413910c96ef23ca00/Image_Developer_Survey_post_1.png?w=185&h=75&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/68vHF42PTMjZuY8LEa2Sf6/0fee9ed609ad60c413910c96ef23ca00/Image_Developer_Survey_post_1.png?w=370&h=149&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/68vHF42PTMjZuY8LEa2Sf6/0fee9ed609ad60c413910c96ef23ca00/Image_Developer_Survey_post_1.png?w=739&h=298&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/68vHF42PTMjZuY8LEa2Sf6/0fee9ed609ad60c413910c96ef23ca00/Image_Developer_Survey_post_1.png?w=1109&h=448&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/68vHF42PTMjZuY8LEa2Sf6/0fee9ed609ad60c413910c96ef23ca00/Image_Developer_Survey_post_1.png?w=1478&h=597&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/68vHF42PTMjZuY8LEa2Sf6/0fee9ed609ad60c413910c96ef23ca00/Image_Developer_Survey_post_1.png?w=2130&h=860&q=50&fit=scale 2130w","srcWebp":"//images.ctfassets.net/s600jj41gsex/68vHF42PTMjZuY8LEa2Sf6/0fee9ed609ad60c413910c96ef23ca00/Image_Developer_Survey_post_1.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/68vHF42PTMjZuY8LEa2Sf6/0fee9ed609ad60c413910c96ef23ca00/Image_Developer_Survey_post_1.png?w=185&h=75&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/68vHF42PTMjZuY8LEa2Sf6/0fee9ed609ad60c413910c96ef23ca00/Image_Developer_Survey_post_1.png?w=370&h=149&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/68vHF42PTMjZuY8LEa2Sf6/0fee9ed609ad60c413910c96ef23ca00/Image_Developer_Survey_post_1.png?w=739&h=298&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/68vHF42PTMjZuY8LEa2Sf6/0fee9ed609ad60c413910c96ef23ca00/Image_Developer_Survey_post_1.png?w=1109&h=448&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/68vHF42PTMjZuY8LEa2Sf6/0fee9ed609ad60c413910c96ef23ca00/Image_Developer_Survey_post_1.png?w=1478&h=597&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/68vHF42PTMjZuY8LEa2Sf6/0fee9ed609ad60c413910c96ef23ca00/Image_Developer_Survey_post_1.png?w=2130&h=860&q=50&fm=webp&fit=scale 2130w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Di Mace","slug":"di-mace"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Tech stack used with rich text editors in 2021 | TinyMCE"},"metaDescription":{"metaDescription":"Key findings from developers using rich text editors on programming language and front end frameworks – can you guess what’s used the most often?"}},{"title":"State of Rich Text Editor 2021 Survey uncovers hidden hero of content creation","slug":"state-of-rich-text-editor-2021-survey-results","featured":false,"lastUpdated":"Oct 26th, 2021","description":{"description":"<p>Rich text editors are the silent heroes of the content revolution. The State of Rich Text&nbsp;<br />Editor 2021 Survey encouraged industry-wide feedback from the developer community and product managers. 500 people share their stories, and &nbsp;you can read the full report now, as well as analysis of the results to stay up-to-date with trends in rich text editing.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rich text editors are the silent heroes of the content revolution. The State of Rich Text "},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"Editor 2021 Survey encouraged industry-wide feedback from the developer community and product managers. 500 people share their stories, and  you can read the full report now, as well as analysis of the results to stay up-to-date with trends in rich text editing."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"You can read our analysis, and download the results, of the rich text editor survey 2021.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAMAAADOQy/fAAABpFBMVEUAGT4BGD0DFjoFFjkHFjgFEzUHEzQPGTYOFzQIES8MEy8MEi0AACQ3OENYWV8hITADAh8UECQZEyUWDiIHHkIIHEADHD0IIj8KIj4JIDsLHTkQHzgSHjcRGjMYHjUbHjQDAydjY2iPjpE9OUMXBiEcEiUWESMBGT8CGD0EKkUIMUkONEoTNkoRKD8XLEEcLUEaJTogJTkjJDcpJDYgGS4oIjIcDCUmFigrFycUDiEXDyMAGD4EJEEEHT0GGzoIGzkIGDYLGDUNGDQOFzIQFzARFS4SFCwTEioTDycYEScbEiYoFicWECIZEiUEI0EGI0AIJUALIz4MIDsPIDkTIDgVHzYYGzIbGzAgGy8jGi0lGSsmFSYIHkIFGz4GJkEJJ0EMJj8PJD0SIzsUIjkXITcaIDYdHzQgHjIjHTAmHC4pGywcEycnFicYEiQDGkADGT0GJUEJJkEMJT4OJD0RIjsUITkZHzUeHDEiHDAlGy4nGiwcEyYWDyIFHz4HHzwIHToLHDkNHDcPGzUTGTIUGDAXFy4ZFywbFisdFSkYESYXESMcFifuwZ1MAAAAUUlEQVQI12NkYMQCRDCF3rIIY1HHInLMGkOUhYFBCMo8aQEiPwjcu8UYw/hRAE3hMhYhxvtKYOZ7wQeKIPojQyYzyxoDOXYQWGUlwQECD9U4AE41EFF1T0aYAAAAAElFTkSuQmCC","aspectRatio":2.4767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/j1o8o0rad7oiiBKWiLbHj/5b0ae7aacc305c42cd86cb21accb3bc4/dev-page-summary-2.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/j1o8o0rad7oiiBKWiLbHj/5b0ae7aacc305c42cd86cb21accb3bc4/dev-page-summary-2.png?w=185&h=75&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/j1o8o0rad7oiiBKWiLbHj/5b0ae7aacc305c42cd86cb21accb3bc4/dev-page-summary-2.png?w=370&h=149&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/j1o8o0rad7oiiBKWiLbHj/5b0ae7aacc305c42cd86cb21accb3bc4/dev-page-summary-2.png?w=739&h=298&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/j1o8o0rad7oiiBKWiLbHj/5b0ae7aacc305c42cd86cb21accb3bc4/dev-page-summary-2.png?w=1109&h=448&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/j1o8o0rad7oiiBKWiLbHj/5b0ae7aacc305c42cd86cb21accb3bc4/dev-page-summary-2.png?w=1478&h=597&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/j1o8o0rad7oiiBKWiLbHj/5b0ae7aacc305c42cd86cb21accb3bc4/dev-page-summary-2.png?w=2130&h=860&q=50&fit=scale 2130w","srcWebp":"//images.ctfassets.net/s600jj41gsex/j1o8o0rad7oiiBKWiLbHj/5b0ae7aacc305c42cd86cb21accb3bc4/dev-page-summary-2.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/j1o8o0rad7oiiBKWiLbHj/5b0ae7aacc305c42cd86cb21accb3bc4/dev-page-summary-2.png?w=185&h=75&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/j1o8o0rad7oiiBKWiLbHj/5b0ae7aacc305c42cd86cb21accb3bc4/dev-page-summary-2.png?w=370&h=149&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/j1o8o0rad7oiiBKWiLbHj/5b0ae7aacc305c42cd86cb21accb3bc4/dev-page-summary-2.png?w=739&h=298&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/j1o8o0rad7oiiBKWiLbHj/5b0ae7aacc305c42cd86cb21accb3bc4/dev-page-summary-2.png?w=1109&h=448&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/j1o8o0rad7oiiBKWiLbHj/5b0ae7aacc305c42cd86cb21accb3bc4/dev-page-summary-2.png?w=1478&h=597&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/j1o8o0rad7oiiBKWiLbHj/5b0ae7aacc305c42cd86cb21accb3bc4/dev-page-summary-2.png?w=2130&h=860&q=50&fm=webp&fit=scale 2130w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Di Mace","slug":"di-mace"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":{"metaDescription":"\n"}},{"title":"TinyMCE’s Highlights from AITX Meetup 2025 & What’s Next","slug":"aitx-meetup-2025","featured":true,"lastUpdated":"Apr 15th, 2025","description":{"description":"<p>TinyMCE joined the AITX 2025 Meetup to connect with devs and founders innovating with AI and web tech. See the event highlights and upcoming meetups.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TinyMCE joined the AITX 2025 Meetup to connect with devs and founders innovating with AI and web tech. See the event highlights and upcoming meetups."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"TinyMCE at AITX Austin Meetup","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAALABQDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABAMJ/8QAIhAAAgICAQMFAAAAAAAAAAAAAQIDIQAREgQFIhMUMTKx/8QAGAEAAwEBAAAAAAAAAAAAAAAAAAECAwT/xAAeEQACAQMFAAAAAAAAAAAAAAAAARECITEDEiJBgf/aAAwDAQACEQMRAD8A01l7x1EfdvbRRRzxrRRQBIa3RLAV850rSbp3twvSZGSPOerhfksMBjPOB0BflWvIHQ1dXvYvMsdgRWT10Vw6yAj7KKP7l02VwqhvjgesrcReRCCScnnrleOEEh5BxbQoZohH/9k=","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/1KrBiRKOUdS4x4urYerK7M/135dc1bda04bf83a8984ec5c210cb72a/AITX_Autin_Meetup_Post_Event_Blog_updated.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/1KrBiRKOUdS4x4urYerK7M/135dc1bda04bf83a8984ec5c210cb72a/AITX_Autin_Meetup_Post_Event_Blog_updated.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1KrBiRKOUdS4x4urYerK7M/135dc1bda04bf83a8984ec5c210cb72a/AITX_Autin_Meetup_Post_Event_Blog_updated.jpg?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1KrBiRKOUdS4x4urYerK7M/135dc1bda04bf83a8984ec5c210cb72a/AITX_Autin_Meetup_Post_Event_Blog_updated.jpg?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1KrBiRKOUdS4x4urYerK7M/135dc1bda04bf83a8984ec5c210cb72a/AITX_Autin_Meetup_Post_Event_Blog_updated.jpg?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/1KrBiRKOUdS4x4urYerK7M/135dc1bda04bf83a8984ec5c210cb72a/AITX_Autin_Meetup_Post_Event_Blog_updated.jpg?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/1KrBiRKOUdS4x4urYerK7M/135dc1bda04bf83a8984ec5c210cb72a/AITX_Autin_Meetup_Post_Event_Blog_updated.jpg?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/1KrBiRKOUdS4x4urYerK7M/135dc1bda04bf83a8984ec5c210cb72a/AITX_Autin_Meetup_Post_Event_Blog_updated.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/1KrBiRKOUdS4x4urYerK7M/135dc1bda04bf83a8984ec5c210cb72a/AITX_Autin_Meetup_Post_Event_Blog_updated.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1KrBiRKOUdS4x4urYerK7M/135dc1bda04bf83a8984ec5c210cb72a/AITX_Autin_Meetup_Post_Event_Blog_updated.jpg?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1KrBiRKOUdS4x4urYerK7M/135dc1bda04bf83a8984ec5c210cb72a/AITX_Autin_Meetup_Post_Event_Blog_updated.jpg?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1KrBiRKOUdS4x4urYerK7M/135dc1bda04bf83a8984ec5c210cb72a/AITX_Autin_Meetup_Post_Event_Blog_updated.jpg?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/1KrBiRKOUdS4x4urYerK7M/135dc1bda04bf83a8984ec5c210cb72a/AITX_Autin_Meetup_Post_Event_Blog_updated.jpg?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/1KrBiRKOUdS4x4urYerK7M/135dc1bda04bf83a8984ec5c210cb72a/AITX_Autin_Meetup_Post_Event_Blog_updated.jpg?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Mrina Sugosh","slug":"mrina-sugosh"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"TinyMCE at AITX 2025: Event Highlights & What’s Next | TinyMCE"},"metaDescription":{"metaDescription":"TinyMCE joined the AITX 2025 Meetup to connect with devs and founders innovating with AI and web tech. See the event highlights and upcoming meetups."}},{"title":"Key Takeaways from Umbraco Spark 2025","slug":"key-takeaways-from-umbraco-spark-2025","featured":true,"lastUpdated":"Apr 4th, 2025","description":{"description":"<p>Explore top takeaways from Umbraco Spark 2025, from caching and observability to TinyMCE innovations for Umbraco 14+. Plus, don&rsquo;t miss our May webinar!</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Explore top takeaways from Umbraco Spark 2025, from caching and observability to TinyMCE innovations for Umbraco 14+. Plus, don’t miss our May webinar!"}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Umbraco Spark Event Recap 2025 by TinyMCE","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAA9lBMVEX5+/77/P/8/f/7/f/////+/v/+///8/v/6+/3V1ujw8ff9/v/9///09PTd3d7p6erg4eHe39/j4+Pi4uLh4eHy8vL19vqnqdLh4u/8/f77+/3d2OXi3un6+vrs7Ozx8fHu7vLp6u3q6+7s7O7o6Ov39/j7/P7x8fj4+fz6/P74+Pykj7qzpMX9/f/u7uzv7+/f4PnV1vnU1vnZ2/rZ2vr09f78/P7u7fPw7/X4+f7p6frv7/vs7fzr7Pzk5fr29v7v8/fg7ffT1fjZ2/nh4vrc3vnd3/n39/7T2umtyun3+P7w8v/9/f75+v33+f3g4//6+/79/v7VBOzPAAAAi0lEQVQIHU3BMQrCQBRF0XczY9Lp2EZ3YCF2rsAV27gAwV4QQRBJl8qAhSBmvjFOwHMQaICpYwZOAzCZpNYVpgSXOR/V8aOcpBnTq/EKJE2gNz15KfBjobFKS47ymvMl9tmz5HGvamdeuYNXAbLrjLDichNFqyTbwHlSso3+jZK4y6XFYY0h0B+kaB/JvSfHwtHiJwAAAABJRU5ErkJggg==","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/6zPeaYFT8YEprNdFrf6XvA/8d06d556c7c2e1bee8546f39001d62e1/-BLOG_HEADER-_-BLOG-_Umbraco_Spark_Event_Recap_2025.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6zPeaYFT8YEprNdFrf6XvA/8d06d556c7c2e1bee8546f39001d62e1/-BLOG_HEADER-_-BLOG-_Umbraco_Spark_Event_Recap_2025.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6zPeaYFT8YEprNdFrf6XvA/8d06d556c7c2e1bee8546f39001d62e1/-BLOG_HEADER-_-BLOG-_Umbraco_Spark_Event_Recap_2025.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6zPeaYFT8YEprNdFrf6XvA/8d06d556c7c2e1bee8546f39001d62e1/-BLOG_HEADER-_-BLOG-_Umbraco_Spark_Event_Recap_2025.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6zPeaYFT8YEprNdFrf6XvA/8d06d556c7c2e1bee8546f39001d62e1/-BLOG_HEADER-_-BLOG-_Umbraco_Spark_Event_Recap_2025.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6zPeaYFT8YEprNdFrf6XvA/8d06d556c7c2e1bee8546f39001d62e1/-BLOG_HEADER-_-BLOG-_Umbraco_Spark_Event_Recap_2025.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6zPeaYFT8YEprNdFrf6XvA/8d06d556c7c2e1bee8546f39001d62e1/-BLOG_HEADER-_-BLOG-_Umbraco_Spark_Event_Recap_2025.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6zPeaYFT8YEprNdFrf6XvA/8d06d556c7c2e1bee8546f39001d62e1/-BLOG_HEADER-_-BLOG-_Umbraco_Spark_Event_Recap_2025.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6zPeaYFT8YEprNdFrf6XvA/8d06d556c7c2e1bee8546f39001d62e1/-BLOG_HEADER-_-BLOG-_Umbraco_Spark_Event_Recap_2025.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6zPeaYFT8YEprNdFrf6XvA/8d06d556c7c2e1bee8546f39001d62e1/-BLOG_HEADER-_-BLOG-_Umbraco_Spark_Event_Recap_2025.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6zPeaYFT8YEprNdFrf6XvA/8d06d556c7c2e1bee8546f39001d62e1/-BLOG_HEADER-_-BLOG-_Umbraco_Spark_Event_Recap_2025.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6zPeaYFT8YEprNdFrf6XvA/8d06d556c7c2e1bee8546f39001d62e1/-BLOG_HEADER-_-BLOG-_Umbraco_Spark_Event_Recap_2025.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6zPeaYFT8YEprNdFrf6XvA/8d06d556c7c2e1bee8546f39001d62e1/-BLOG_HEADER-_-BLOG-_Umbraco_Spark_Event_Recap_2025.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6zPeaYFT8YEprNdFrf6XvA/8d06d556c7c2e1bee8546f39001d62e1/-BLOG_HEADER-_-BLOG-_Umbraco_Spark_Event_Recap_2025.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Mrina Sugosh","slug":"mrina-sugosh"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Key Takeaways from Umbraco Spark 2025 | TinyMCE"},"metaDescription":{"metaDescription":"Explore top takeaways from Umbraco Spark 2025, from caching and observability to TinyMCE innovations for Umbraco 14+. Plus, don’t miss our May webinar!"}},{"title":"Learn with TinyMCE at MLH Global Hack Week AI/ML: Workshop Replays","slug":"learn-with-tinymce-mlh-global-hack-week-ai-workshop-replays","featured":true,"lastUpdated":"Mar 13th, 2025","description":{"description":"<p>Missed the MLH Global Hack Week AI/ML? Watch TinyMCE's workshop replays to learn how to enhance your AI/ML projects with a powerful rich text editor!</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Missed the MLH Global Hack Week AI/ML? Watch TinyMCE's workshop replays to learn how to enhance your AI/ML projects with a powerful rich text editor!"}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Global Hack Week AI/ML 2025 Event Recap","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABy1BMVEUXIlAWIVAVIVAUIE8SH08QHk4XIVAVIE8TIE8SIVANIU8UIVAMG00DFUwGGU0OHE4bJFAPHU4UIU8MG04ABkkLHE4hIE83IVATH08AFkwbI083OlkAFEtFSmiSlKcgKVMVHk4pI04IGU00OVuCg5AqM1oiJlQ4HVEHF00BFUwNHE4AAEGgnqjs5OyMjZsAHFlNUnASIVMRHVAjIE4BGE8vNlx3eYonM1wAKFaFipbFzM0+QWACFkwVIU8MHE4AAECjoarx6e6Oj51OUm5nan5eYnhVVG5yb4BucYRlaHpjZXNrboFWWnNzdoetsrczOFoGGE0AFEweKFM+TGcIJFSHipyforSoq7ykpraUlqmlqLenqruVmKqmqbmFiJ0AEFoAAEkMGE0FOlsAKFRpbYd7f5eFiaCBhJtjaIR9gZeHiqF8gJiEiJ9TWXsGJGUOGEw0MUwTIFAvL04AAEqEg5HMxso2PV8AAEUAF00AFk8AD08ADU4QDk8AAEObnKbKys1qbH0AAEYWIU8AAEh0dIO3srg2PFwUKFIYJFIbJlQfJFO5ur/p6emAgo8AAEQQHk8AFUwADEpITGYpMFYPHk4LG00AAEIAC0oRHk9V9pmoAAAAjklEQVQI12NkYGRkBOJ//1h/szECEeO3/0AuEycjGPz8Lgii/jG//M/CLMqIBhheMmoxYgIWEUyxTYwsvmhCe/68ZGQU90RXOYGF4YcgmlgTKxPrNwEQWMrfycfH95gXCBh+Mf36Vc8zgZPrTxVL5c8qQ/a9bOuAjmdgYGPsnXbrL+svBjbziDdAV2f+BwDB5ifRbwSk8wAAAABJRU5ErkJggg==","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/6BGJYvIEUBleufd0Yjt8DN/f4d2b5d3587292001459561171be5f28/-TinyMCE--Blog-_Global_Hack_Week_Event_Recap.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6BGJYvIEUBleufd0Yjt8DN/f4d2b5d3587292001459561171be5f28/-TinyMCE--Blog-_Global_Hack_Week_Event_Recap.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6BGJYvIEUBleufd0Yjt8DN/f4d2b5d3587292001459561171be5f28/-TinyMCE--Blog-_Global_Hack_Week_Event_Recap.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6BGJYvIEUBleufd0Yjt8DN/f4d2b5d3587292001459561171be5f28/-TinyMCE--Blog-_Global_Hack_Week_Event_Recap.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6BGJYvIEUBleufd0Yjt8DN/f4d2b5d3587292001459561171be5f28/-TinyMCE--Blog-_Global_Hack_Week_Event_Recap.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6BGJYvIEUBleufd0Yjt8DN/f4d2b5d3587292001459561171be5f28/-TinyMCE--Blog-_Global_Hack_Week_Event_Recap.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6BGJYvIEUBleufd0Yjt8DN/f4d2b5d3587292001459561171be5f28/-TinyMCE--Blog-_Global_Hack_Week_Event_Recap.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6BGJYvIEUBleufd0Yjt8DN/f4d2b5d3587292001459561171be5f28/-TinyMCE--Blog-_Global_Hack_Week_Event_Recap.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6BGJYvIEUBleufd0Yjt8DN/f4d2b5d3587292001459561171be5f28/-TinyMCE--Blog-_Global_Hack_Week_Event_Recap.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6BGJYvIEUBleufd0Yjt8DN/f4d2b5d3587292001459561171be5f28/-TinyMCE--Blog-_Global_Hack_Week_Event_Recap.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6BGJYvIEUBleufd0Yjt8DN/f4d2b5d3587292001459561171be5f28/-TinyMCE--Blog-_Global_Hack_Week_Event_Recap.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6BGJYvIEUBleufd0Yjt8DN/f4d2b5d3587292001459561171be5f28/-TinyMCE--Blog-_Global_Hack_Week_Event_Recap.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6BGJYvIEUBleufd0Yjt8DN/f4d2b5d3587292001459561171be5f28/-TinyMCE--Blog-_Global_Hack_Week_Event_Recap.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6BGJYvIEUBleufd0Yjt8DN/f4d2b5d3587292001459561171be5f28/-TinyMCE--Blog-_Global_Hack_Week_Event_Recap.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Coco Poley","slug":"coco-poley"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Learn with TinyMCE at MLH Global Hack Week AI/ML: Workshop Replays | TinyMCE"},"metaDescription":{"metaDescription":"Missed the MLH Global Hack Week AI/ML? Watch TinyMCE's workshop replays to learn how to enhance your AI/ML projects with a powerful rich text editor!"}},{"title":"Join TinyMCE at MLH Global Hack Week AI/ML to Build an Email Editor with AI","slug":"join-tinymce-at-mlh-ai-ml-hackweek-build-with-ai","featured":true,"lastUpdated":"Feb 5th, 2025","description":{"description":"<p>TinyMCE welcomes developers to join us for an Angular session and a Laravel session, each on creating an email editor with a different AI IDE.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TinyMCE welcomes developers to join us for an Angular session and a Laravel session, each on creating an email editor with a different AI IDE."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Build an Email Editor with AI at MLH Global Hack Week AI/ML","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAACglBMVEUAAC4vM0olKUUXHj8wM0sIFD4WGEAeI0geJUwVHk4fJlQaJF0lLmcEGmkAFW0AGnAAGW0AGGcBF2EAADWJipGGh46LjJNQUmRqYm93doR4eotsb4VwcoVucZV6fqM+R48AGIoAII4AIIwAH4UAHHsAGnEAADAdGToSCzQTEjYABjkAADgAADwAAEcAAFYADmUAF3YAH4cIJ5YAJ6MAKKgAJaAAJ54AJ50AIY8AHoEAAjUAXHQATHYAPX1DS2tYWmpfYXRfYnpaXoAxOn0AGogAK5wANa0AN7IAJIFEPlIqLU8ALYgALp0AI40AADMxYXY2YIImS39ZXnZlZnVvcIJ1d41kaY1LVZEANZgAQasATrwAOJhBNkTJk2eSZkAAHVcAPJkALJIAADRubXZ7eoFvbndxcn1jZXZydIVtcIprcJR3gKonUaQAVbIAYr4AO49uVF7pq3+zfVsQHUoPRZwANY89QFNCRFY6PVM4O1Q5PVk/Q2NGTHMcNXgTQYwATp8AXK4AZrkAT6RSRGDUnXendVQVIDcUS5YANIUAAjZRVGJfYm5dX21JSl9NT2VUV29fY34mOXIANH8AQ5AATJwAUKUATqUgN3BnTEhHOT8AMmUAPoQAKXIABDYfAEERADgBETgAJ0IfI0crMVQAC08AGl4AKGwAL3gAMoAAMYUZO4tfa51fbJZlcpZSYY0AJmoAGVwADDdZDlZMBEY7M0E3XF9oaHNyc4EoLlMAEE8AGVgBG10AG2EAE2I+RHNlaIdiZoRlaYNjZn4hKlcACEgADTcEDDYACTcAAzsHEkAABD8ADEQBEEcBEEkAD0oACkoAAEkAAEUAAEAAAD0AAD4ABz2CXsb7AAAAKklEQVQI12NkYEQFYL4wI7owIyOLMCMmYBGhTPCNBhZBa4otSmGYi+olAElSA9+Ik1oPAAAAAElFTkSuQmCC","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/1jcdt2u9lnJtYrOlL1Khxy/57b88c2c3e5320dea6b0d28838d009ce/_BLOG_HEADER__Review_MLH_Pre-event_Blog_v1.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/1jcdt2u9lnJtYrOlL1Khxy/57b88c2c3e5320dea6b0d28838d009ce/_BLOG_HEADER__Review_MLH_Pre-event_Blog_v1.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1jcdt2u9lnJtYrOlL1Khxy/57b88c2c3e5320dea6b0d28838d009ce/_BLOG_HEADER__Review_MLH_Pre-event_Blog_v1.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1jcdt2u9lnJtYrOlL1Khxy/57b88c2c3e5320dea6b0d28838d009ce/_BLOG_HEADER__Review_MLH_Pre-event_Blog_v1.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1jcdt2u9lnJtYrOlL1Khxy/57b88c2c3e5320dea6b0d28838d009ce/_BLOG_HEADER__Review_MLH_Pre-event_Blog_v1.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/1jcdt2u9lnJtYrOlL1Khxy/57b88c2c3e5320dea6b0d28838d009ce/_BLOG_HEADER__Review_MLH_Pre-event_Blog_v1.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/1jcdt2u9lnJtYrOlL1Khxy/57b88c2c3e5320dea6b0d28838d009ce/_BLOG_HEADER__Review_MLH_Pre-event_Blog_v1.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/1jcdt2u9lnJtYrOlL1Khxy/57b88c2c3e5320dea6b0d28838d009ce/_BLOG_HEADER__Review_MLH_Pre-event_Blog_v1.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/1jcdt2u9lnJtYrOlL1Khxy/57b88c2c3e5320dea6b0d28838d009ce/_BLOG_HEADER__Review_MLH_Pre-event_Blog_v1.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1jcdt2u9lnJtYrOlL1Khxy/57b88c2c3e5320dea6b0d28838d009ce/_BLOG_HEADER__Review_MLH_Pre-event_Blog_v1.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1jcdt2u9lnJtYrOlL1Khxy/57b88c2c3e5320dea6b0d28838d009ce/_BLOG_HEADER__Review_MLH_Pre-event_Blog_v1.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1jcdt2u9lnJtYrOlL1Khxy/57b88c2c3e5320dea6b0d28838d009ce/_BLOG_HEADER__Review_MLH_Pre-event_Blog_v1.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/1jcdt2u9lnJtYrOlL1Khxy/57b88c2c3e5320dea6b0d28838d009ce/_BLOG_HEADER__Review_MLH_Pre-event_Blog_v1.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/1jcdt2u9lnJtYrOlL1Khxy/57b88c2c3e5320dea6b0d28838d009ce/_BLOG_HEADER__Review_MLH_Pre-event_Blog_v1.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Coco Poley","slug":"coco-poley"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Join TinyMCE at MLH Global Hack Week AI/ML to Build with AI | TinyMCE"},"metaDescription":{"metaDescription":"TinyMCE welcomes developers to join us for an Angular session and a Laravel session, each on creating an email editor with a different AI IDE."}},{"title":"Meet the Top Experts at Frontend Nation 2024 with TinyMCE","slug":"tinymce-frontend-nation-expert-interviews","featured":true,"lastUpdated":"Nov 7th, 2024","description":{"description":"<p>Explore key takeaways from TinyMCE&rsquo;s interviews with tech experts at Frontend Nation.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Explore key takeaways from TinyMCE’s interviews with tech experts at Frontend Nation."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"An image of Mrina Sugosh and a speech bubble that says Key Insights from Industry Experts","artistName":"TinyMCE","image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABXFBMVEX669X769X77NX669b56tb56dX56tX66tT769T77Nb77db469f26tj16tn06Nn16Nr059r06+H17OH27OD37eD67tz75M354sv87df67tn27dn17dn27Nj57Nb07Nnw69vt6t7r6uDy3NLy29Dw6eLv7/Hq6+3p6+zt7/H58uncyb2TfYakk5Pm4NHt8uHr7+Dw7tz37Nfp7uDk7ePg7Obf7Ofk493o3tbs5t/x7Ofx6+Xz7eXz7eb16dt7b4modFxdKTOmqKrp9OXp8OHe8Ofa7+rZ7uva7enf7Obn6uHu5tzu4NDx4s316Nf259X46NOLeoe2fVxiKhmxrafx8uDy7tv67Nba8erZ8Orc7+jg7ebn7OHu6tzz6Nby487159H46dX97dfm1cGznYy4qJbx5dD57tng8Obj7+Po7eHt7N7y7Nv569b97tj+79j87tft7t7w7dv37Nj47NZL2XX0AAAAeUlEQVQIHWXBIQ7CQBRAwfeWTYokBAcn4RQIkuomHIDDVKGQJASB4izoanxT89mKmnZGQIQgmCgQjEQIigyxEiyGyqAPzGntQt67lHfO/chb575Hayf3xtGnM28s3qc2kR4X9NaLV1/nodUgUgX0BB7q7kkRFCmC4g+eBh8ACCRV4AAAAABJRU5ErkJggg==","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/24VeBYN2sU2qt3AyyJ3B4z/aa66e0398cd42bbd2991fe243de8cc2c/Frontend_Nation_Post_Event_Blog_-_Interviews__1_.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/24VeBYN2sU2qt3AyyJ3B4z/aa66e0398cd42bbd2991fe243de8cc2c/Frontend_Nation_Post_Event_Blog_-_Interviews__1_.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/24VeBYN2sU2qt3AyyJ3B4z/aa66e0398cd42bbd2991fe243de8cc2c/Frontend_Nation_Post_Event_Blog_-_Interviews__1_.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/24VeBYN2sU2qt3AyyJ3B4z/aa66e0398cd42bbd2991fe243de8cc2c/Frontend_Nation_Post_Event_Blog_-_Interviews__1_.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/24VeBYN2sU2qt3AyyJ3B4z/aa66e0398cd42bbd2991fe243de8cc2c/Frontend_Nation_Post_Event_Blog_-_Interviews__1_.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/24VeBYN2sU2qt3AyyJ3B4z/aa66e0398cd42bbd2991fe243de8cc2c/Frontend_Nation_Post_Event_Blog_-_Interviews__1_.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/24VeBYN2sU2qt3AyyJ3B4z/aa66e0398cd42bbd2991fe243de8cc2c/Frontend_Nation_Post_Event_Blog_-_Interviews__1_.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/24VeBYN2sU2qt3AyyJ3B4z/aa66e0398cd42bbd2991fe243de8cc2c/Frontend_Nation_Post_Event_Blog_-_Interviews__1_.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/24VeBYN2sU2qt3AyyJ3B4z/aa66e0398cd42bbd2991fe243de8cc2c/Frontend_Nation_Post_Event_Blog_-_Interviews__1_.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/24VeBYN2sU2qt3AyyJ3B4z/aa66e0398cd42bbd2991fe243de8cc2c/Frontend_Nation_Post_Event_Blog_-_Interviews__1_.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/24VeBYN2sU2qt3AyyJ3B4z/aa66e0398cd42bbd2991fe243de8cc2c/Frontend_Nation_Post_Event_Blog_-_Interviews__1_.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/24VeBYN2sU2qt3AyyJ3B4z/aa66e0398cd42bbd2991fe243de8cc2c/Frontend_Nation_Post_Event_Blog_-_Interviews__1_.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/24VeBYN2sU2qt3AyyJ3B4z/aa66e0398cd42bbd2991fe243de8cc2c/Frontend_Nation_Post_Event_Blog_-_Interviews__1_.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/24VeBYN2sU2qt3AyyJ3B4z/aa66e0398cd42bbd2991fe243de8cc2c/Frontend_Nation_Post_Event_Blog_-_Interviews__1_.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Mrina Sugosh","slug":"mrina-sugosh"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Frontend Nation 2024: Key Insights from Industry Experts | TinyMCE"},"metaDescription":{"metaDescription":"Explore key takeaways from TinyMCE’s interviews with tech experts at Frontend Nation."}},{"title":"TinyMCE Sponsors and Presents at Frontend Nation Online Event","slug":"tinymce-at-frontend-nation-online-event","featured":false,"lastUpdated":"Jun 3rd, 2024","description":{"description":"<p>TinyMCE will be attending Frontend Nation, a virtual event that brings together front-end developers, designers, and tech enthusiasts worldwide. As Diamond sponsors, Tiny is excited to present talks and workshops to help attendees understand the power a rich text editor can bring to their applications, and how to do it.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TinyMCE will be attending Frontend Nation, a virtual event that brings together front-end developers, designers, and tech enthusiasts worldwide. As Diamond sponsors, Tiny is excited to present talks and workshops to help attendees understand the power a rich text editor can bring to their applications, and how to do it."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Blog banner promoting TinyMCE at the Frontend Nation event June 4th - 7th 2024 ","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAALABQDAREAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAwYEBwj/xAAmEAABBAEDBAEFAAAAAAAAAAABAgMEBREAEjEGBxMhgRUiMkFh/8QAGAEAAwEBAAAAAAAAAAAAAAAAAwQFBgL/xAAoEQABAwMCBAcBAAAAAAAAAAABAgMEABEhMVESIkFhBRMVMnGBscH/2gAMAwEAAhEDEQA/AMZ9DK6flNVNTN7Xwb6eyFeax+pSkPSTuKsqaQpKT6ITjP6z/NaySl5pC3Q5wgb4A++lKxwHlhtIz2pgrqSrg0NzeMdp4VvWx5aGnHJ0x0IjFW5QSMLUogpxx6+3Up2PMdlNAS/L5TygcQVpk6afNPBpCGFuBsmx7D+n8qtrWrNnZyZcevjVLDy9yIMMK8TKcYCU7iSeMknkk8ca0qIriUgKNzvvUMugkmnmmUqFYsOx1Fl0K9LQcEfOrkiKzJZU08m6T0ocR9xiQhbZsamsX9iirsIaZbiYst1Cn2QcIWRkAkcegSPnRR4fFDja+DKQQNcVz6hKUy7dfuIvp1xtjG1ATGax+A0+EJ2pG5r/2Q==","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/3PAUJnDIil2svWxT6bOGLw/3e7b89a0917699adbc8c76d03c8998bb/Final_TinyMCE_Sponsors_and_Presents_at_Frontend_Nation_Online_Event1.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/3PAUJnDIil2svWxT6bOGLw/3e7b89a0917699adbc8c76d03c8998bb/Final_TinyMCE_Sponsors_and_Presents_at_Frontend_Nation_Online_Event1.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/3PAUJnDIil2svWxT6bOGLw/3e7b89a0917699adbc8c76d03c8998bb/Final_TinyMCE_Sponsors_and_Presents_at_Frontend_Nation_Online_Event1.jpg?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/3PAUJnDIil2svWxT6bOGLw/3e7b89a0917699adbc8c76d03c8998bb/Final_TinyMCE_Sponsors_and_Presents_at_Frontend_Nation_Online_Event1.jpg?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/3PAUJnDIil2svWxT6bOGLw/3e7b89a0917699adbc8c76d03c8998bb/Final_TinyMCE_Sponsors_and_Presents_at_Frontend_Nation_Online_Event1.jpg?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/3PAUJnDIil2svWxT6bOGLw/3e7b89a0917699adbc8c76d03c8998bb/Final_TinyMCE_Sponsors_and_Presents_at_Frontend_Nation_Online_Event1.jpg?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/3PAUJnDIil2svWxT6bOGLw/3e7b89a0917699adbc8c76d03c8998bb/Final_TinyMCE_Sponsors_and_Presents_at_Frontend_Nation_Online_Event1.jpg?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/3PAUJnDIil2svWxT6bOGLw/3e7b89a0917699adbc8c76d03c8998bb/Final_TinyMCE_Sponsors_and_Presents_at_Frontend_Nation_Online_Event1.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/3PAUJnDIil2svWxT6bOGLw/3e7b89a0917699adbc8c76d03c8998bb/Final_TinyMCE_Sponsors_and_Presents_at_Frontend_Nation_Online_Event1.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/3PAUJnDIil2svWxT6bOGLw/3e7b89a0917699adbc8c76d03c8998bb/Final_TinyMCE_Sponsors_and_Presents_at_Frontend_Nation_Online_Event1.jpg?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/3PAUJnDIil2svWxT6bOGLw/3e7b89a0917699adbc8c76d03c8998bb/Final_TinyMCE_Sponsors_and_Presents_at_Frontend_Nation_Online_Event1.jpg?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/3PAUJnDIil2svWxT6bOGLw/3e7b89a0917699adbc8c76d03c8998bb/Final_TinyMCE_Sponsors_and_Presents_at_Frontend_Nation_Online_Event1.jpg?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/3PAUJnDIil2svWxT6bOGLw/3e7b89a0917699adbc8c76d03c8998bb/Final_TinyMCE_Sponsors_and_Presents_at_Frontend_Nation_Online_Event1.jpg?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/3PAUJnDIil2svWxT6bOGLw/3e7b89a0917699adbc8c76d03c8998bb/Final_TinyMCE_Sponsors_and_Presents_at_Frontend_Nation_Online_Event1.jpg?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Team Tiny","slug":"team-tiny"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":null},{"title":"5 steps to build and improve your QA process","slug":"5-steps-to-build-and-improve-your-qa-process","featured":false,"lastUpdated":"Sep 17th, 2024","description":{"description":"<p>Discover the essential steps to build and improve your QA process. Learn best practices and tools to ensure software quality.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Discover the essential steps to build and improve your QA process. Learn best practices and tools to ensure software quality."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Shapes representing the vital steps in a QA process","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAAz1BMVEVv1Z1u1Z1t1p5p1p9v1p1r1Ztl05hk1Jhj1JiE3aiH3apn05y5zHnDzHFu1Zlv15uL2ayv4MKv4cKv4cOr4L972KNm1Z3NyWxawr1ky7Fw1pto1Zqq3L3j4+Pi4+Lj5OPh4uHL1c9rz5po155q2J1jzK4vp+dKtNRt1Zxx1Z530J50zpxzzZuD0qN/1KSQwpLGooZ+zplr1Z2K3Kt82KRu1Zxu1p1t1p1r1Jtp0pmC26eC3qmbvpHVlICEypdr1ZyH3Kl72aJs1p1y05xs154jW/0IAAAAWklEQVQI12NgIAQYGaE0MsnI8J/pD5TLyALkMkLB1z8QQVZuqOB3LiDxDCIozYgEbjH/AQtqIAsynmZgYAEK3jBDEvsCtxdEmwFN/vTp5n8kQSAwY/x/Co8nAFplERv849BpAAAAAElFTkSuQmCC","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/2FE0jPLhO8j8oGnZ3BkXfK/204461c97e571703683da746f1141366/5_steps_to_build_and_improve_your_QA_process.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/2FE0jPLhO8j8oGnZ3BkXfK/204461c97e571703683da746f1141366/5_steps_to_build_and_improve_your_QA_process.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2FE0jPLhO8j8oGnZ3BkXfK/204461c97e571703683da746f1141366/5_steps_to_build_and_improve_your_QA_process.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2FE0jPLhO8j8oGnZ3BkXfK/204461c97e571703683da746f1141366/5_steps_to_build_and_improve_your_QA_process.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2FE0jPLhO8j8oGnZ3BkXfK/204461c97e571703683da746f1141366/5_steps_to_build_and_improve_your_QA_process.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2FE0jPLhO8j8oGnZ3BkXfK/204461c97e571703683da746f1141366/5_steps_to_build_and_improve_your_QA_process.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2FE0jPLhO8j8oGnZ3BkXfK/204461c97e571703683da746f1141366/5_steps_to_build_and_improve_your_QA_process.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/2FE0jPLhO8j8oGnZ3BkXfK/204461c97e571703683da746f1141366/5_steps_to_build_and_improve_your_QA_process.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/2FE0jPLhO8j8oGnZ3BkXfK/204461c97e571703683da746f1141366/5_steps_to_build_and_improve_your_QA_process.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2FE0jPLhO8j8oGnZ3BkXfK/204461c97e571703683da746f1141366/5_steps_to_build_and_improve_your_QA_process.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2FE0jPLhO8j8oGnZ3BkXfK/204461c97e571703683da746f1141366/5_steps_to_build_and_improve_your_QA_process.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2FE0jPLhO8j8oGnZ3BkXfK/204461c97e571703683da746f1141366/5_steps_to_build_and_improve_your_QA_process.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2FE0jPLhO8j8oGnZ3BkXfK/204461c97e571703683da746f1141366/5_steps_to_build_and_improve_your_QA_process.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2FE0jPLhO8j8oGnZ3BkXfK/204461c97e571703683da746f1141366/5_steps_to_build_and_improve_your_QA_process.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Shiridi Gandham","slug":"shiridi-gandham"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"5 steps to build and improve your QA process | TinyMCE"},"metaDescription":{"metaDescription":"Discover the essential steps to build and improve your QA process. Learn best practices and tools to ensure software quality."}},{"title":"Angular vs React vs Vue - Detailed Framework Comparison","slug":"vue-react-angular-js-framework-comparison","featured":false,"lastUpdated":"Aug 30th, 2024","description":{"description":"<p>Discover which framework is best for your project. Our detailed comparison of Angular, React, and Vue covers performance, scalability, and community support.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Discover which framework is best for your project. Our detailed comparison of Angular, React, and Vue covers performance, scalability, and community support."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Angular vs React vs Vue trends for each of the two frameworks and a library represented as symbols","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAAtFBMVEXQ6eHQ6uHR6+HS7OHS6+HR6uHQ6uLQ6+PQ6+DR1uaywO/D4+TT7eDS7ODR7ODQ6eDX3dbT5d3P6uHYqe3Jm8yqtcm1x+i0xee1yOXO5N/ltbLa083P6uLV2NPjyY2jgNeVkfSYhvS1qOTN5OHR4dnS5+HQ5ujR6ePO6ODO6uDO5uLh2ff39v349f75+fjT6uG108fO5uDR5ujR6OPS6uHm8+zp9O/k8ezR6eHP6ODP6N/O6eAMO25wAAAAUUlEQVQI12NgwAIYYcR/EP0fIsgCkQIChj+sjP9//4cLsjPCwAe4dkZBuCDjE7iZMghBxpsw7TxIgnAzbzCYAHkgof9w14CA9VsG4aMwJxEPABz0Dj2e3QHvAAAAAElFTkSuQmCC","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/2zovvGaRy7UQ9jXMreHkR2/9400d5dc095753a0bf86f93888e87340/-Blog_Header-__-Rework_-14-_Angular_vs_React_vs_Vue.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/2zovvGaRy7UQ9jXMreHkR2/9400d5dc095753a0bf86f93888e87340/-Blog_Header-__-Rework_-14-_Angular_vs_React_vs_Vue.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2zovvGaRy7UQ9jXMreHkR2/9400d5dc095753a0bf86f93888e87340/-Blog_Header-__-Rework_-14-_Angular_vs_React_vs_Vue.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2zovvGaRy7UQ9jXMreHkR2/9400d5dc095753a0bf86f93888e87340/-Blog_Header-__-Rework_-14-_Angular_vs_React_vs_Vue.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2zovvGaRy7UQ9jXMreHkR2/9400d5dc095753a0bf86f93888e87340/-Blog_Header-__-Rework_-14-_Angular_vs_React_vs_Vue.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2zovvGaRy7UQ9jXMreHkR2/9400d5dc095753a0bf86f93888e87340/-Blog_Header-__-Rework_-14-_Angular_vs_React_vs_Vue.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2zovvGaRy7UQ9jXMreHkR2/9400d5dc095753a0bf86f93888e87340/-Blog_Header-__-Rework_-14-_Angular_vs_React_vs_Vue.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/2zovvGaRy7UQ9jXMreHkR2/9400d5dc095753a0bf86f93888e87340/-Blog_Header-__-Rework_-14-_Angular_vs_React_vs_Vue.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/2zovvGaRy7UQ9jXMreHkR2/9400d5dc095753a0bf86f93888e87340/-Blog_Header-__-Rework_-14-_Angular_vs_React_vs_Vue.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2zovvGaRy7UQ9jXMreHkR2/9400d5dc095753a0bf86f93888e87340/-Blog_Header-__-Rework_-14-_Angular_vs_React_vs_Vue.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2zovvGaRy7UQ9jXMreHkR2/9400d5dc095753a0bf86f93888e87340/-Blog_Header-__-Rework_-14-_Angular_vs_React_vs_Vue.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2zovvGaRy7UQ9jXMreHkR2/9400d5dc095753a0bf86f93888e87340/-Blog_Header-__-Rework_-14-_Angular_vs_React_vs_Vue.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2zovvGaRy7UQ9jXMreHkR2/9400d5dc095753a0bf86f93888e87340/-Blog_Header-__-Rework_-14-_Angular_vs_React_vs_Vue.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2zovvGaRy7UQ9jXMreHkR2/9400d5dc095753a0bf86f93888e87340/-Blog_Header-__-Rework_-14-_Angular_vs_React_vs_Vue.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Coco Poley","slug":"coco-poley"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Angular vs React vs Vue: Detailed Framework Comparison | TinyMCE"},"metaDescription":{"metaDescription":"Discover which framework is best for your project. Our detailed comparison of Angular, React, and Vue covers performance, scalability, and community support."}},{"title":"Supercharge Your Learning Management System with TinyMCE 7","slug":"supercharge-your-lms-in-tinymce-7-webinar","featured":false,"lastUpdated":"Aug 27th, 2024","description":{"description":"<p>Learn how TinyMCE 7 enhances your Learning Management System in our webinar. Get expert tips and see the features in action.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Learn how TinyMCE 7 enhances your Learning Management System in our webinar. Get expert tips and see the features in action."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"A picture of a book, media, spellcheck, and revision history to show learning management systems with TinyMCE","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAAolBMVEXf4//f5P/g5P/h5P7j5//o6v/o6//q7P3w8Pfg5P7h3vng4/7i3/ng4fzL0PvJy/fHyPTFyvjj5Pnp6/vi5fzk2O/j3fTk5f3Izv7HtODRp8fCx/bo6Orr6+vs7e7h5Pnb3/zo4/fV1vvNy/XOyfLL0Pzi5Pbi5PXk5vPj5vbf4/zg4v7l2u/i4/zi5f/k5//k5v7n6f/b3vzc4Pjk5vfh5f/UCT6BAAAATklEQVQI12NgIBYwQqn/TEDiLyPDf7ggUICJEQK+/wPyWUASXIww8AOsDyT4HyHI/RkmyPhGHi4KV8mgCRf7hrAdSDAa/2RgP/OfgUQAABv3DW0TW+g0AAAAAElFTkSuQmCC","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/7l6vsSzRu7xyED9vZgAn1G/5eddb92a34cff554382e07daab6c10a7/Supercharge_Your_Learning_Management_System_with_TinyMCE_7.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/7l6vsSzRu7xyED9vZgAn1G/5eddb92a34cff554382e07daab6c10a7/Supercharge_Your_Learning_Management_System_with_TinyMCE_7.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/7l6vsSzRu7xyED9vZgAn1G/5eddb92a34cff554382e07daab6c10a7/Supercharge_Your_Learning_Management_System_with_TinyMCE_7.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/7l6vsSzRu7xyED9vZgAn1G/5eddb92a34cff554382e07daab6c10a7/Supercharge_Your_Learning_Management_System_with_TinyMCE_7.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/7l6vsSzRu7xyED9vZgAn1G/5eddb92a34cff554382e07daab6c10a7/Supercharge_Your_Learning_Management_System_with_TinyMCE_7.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/7l6vsSzRu7xyED9vZgAn1G/5eddb92a34cff554382e07daab6c10a7/Supercharge_Your_Learning_Management_System_with_TinyMCE_7.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/7l6vsSzRu7xyED9vZgAn1G/5eddb92a34cff554382e07daab6c10a7/Supercharge_Your_Learning_Management_System_with_TinyMCE_7.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/7l6vsSzRu7xyED9vZgAn1G/5eddb92a34cff554382e07daab6c10a7/Supercharge_Your_Learning_Management_System_with_TinyMCE_7.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/7l6vsSzRu7xyED9vZgAn1G/5eddb92a34cff554382e07daab6c10a7/Supercharge_Your_Learning_Management_System_with_TinyMCE_7.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/7l6vsSzRu7xyED9vZgAn1G/5eddb92a34cff554382e07daab6c10a7/Supercharge_Your_Learning_Management_System_with_TinyMCE_7.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/7l6vsSzRu7xyED9vZgAn1G/5eddb92a34cff554382e07daab6c10a7/Supercharge_Your_Learning_Management_System_with_TinyMCE_7.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/7l6vsSzRu7xyED9vZgAn1G/5eddb92a34cff554382e07daab6c10a7/Supercharge_Your_Learning_Management_System_with_TinyMCE_7.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/7l6vsSzRu7xyED9vZgAn1G/5eddb92a34cff554382e07daab6c10a7/Supercharge_Your_Learning_Management_System_with_TinyMCE_7.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/7l6vsSzRu7xyED9vZgAn1G/5eddb92a34cff554382e07daab6c10a7/Supercharge_Your_Learning_Management_System_with_TinyMCE_7.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Bee Lawless","slug":"bee-lawless"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Supercharge Your Learning Management System with TinyMCE 7"},"metaDescription":{"metaDescription":"Learn how TinyMCE 7 enhances your Learning Management System in our webinar. Get expert tips and see the features in action."}},{"title":"Frontend Nation 2024: Exploring DevRel, Full Stack, and AI-Powered Apps","slug":"frontend-conference-wrapup","featured":true,"lastUpdated":"Jul 3rd, 2024","description":{"description":"<p>This year&rsquo;s Frontend Nation conference was held from June 4th through 7th and showcased an impressive array of technical sessions and discussions, establishing itself as a must-attend event for front-end and full-stack developers globally. As Diamond sponsors for this year's event, TinyMCE had a front-row seat for this completely free, virtual conference. Read about the highlights that caught our attention!</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"This year’s Frontend Nation conference was held from June 4th through 7th and showcased an impressive array of technical sessions and discussions, establishing itself as a must-attend event for front-end and full-stack developers globally. As Diamond sponsors for this year's event, TinyMCE had a front-row seat for this completely free, virtual conference. Read about the highlights that caught our attention!"}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Header image for the TinyMCE Fronend Nation 2024 Conference wrap up post that displays the logos for TinyMCE and Frontend Nation. ","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAACEFBMVEUADDMADTQADjUADjYADjgADzkAEDoAETsAETwAEjwAEz0AEz4AFEAAFUEAFkIAF0QAF0UAGEYAGUcADjcADzgAEj0AFD8AF0MAGEUAGUYAGkgAG0kAG0oAEDsAET0AEj4AEz8AE0AAFEEAFUIAFkQAF0YAGEcAGEgAGUgAGUkAHEsAHUwAHk0ADT0AADgAADkAAD0ABD8AAD8AAD4AAEEAFEYAFUcAEUkAAEsAAEcAAEYACkkAHE4AH1AACz8ADUBaXW1LUGQ3PlgkLlA+RF1NUmdHTWQAF0kNI1AjLUtjX0NiX0lWXHNZX3haYXlXXXQFJFQAIFMAAkAqM1K2t7ymqK+dn6efoamipaylp6+TlqBFTGZrcINWVk21qRaoni2cmXmenIKXlYFqcIMKKFkAIlcAE0YAFUhPVWo4QF0rNlg/R2IlMlYzPV0yPV0SKFQmNVwWKVJZWU9PUU9CR05ARU08Qk8AE1QAI1kAJlsAG0sAGUsAB0gADkoAEksAEUwAFk4AFU8AGVAAH1MAH1QAH1cAFFgAFVkAGVoAHFsAH1wAJlwAKF0AKV4AH08AIFAAIFEAIFIAIVMAIlQAI1UAJFYAJFcAJVgAJlkAJloAJ1sAJ1wAKV8AKmAAK2EALGIAJVcAKFwAKV0AKl4AKl8ALWMALWQALmUAL2YAJ1oAKFsAK2AALGEAMGcAMWgAMWmGjW3SAAAAYUlEQVQI163Luw6CQAAF0T2wIgtGCpTOx///2toQEsBKCy00tk5352YEn7xXb6TYze1MWpN7jVMOw+u+HWHa49x914+CePVLPPxTjjrEiHbBNg+UKsSyXUNqFrm5mKqaDU8OtRHYujecmwAAAABJRU5ErkJggg==","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/27GgjDXGXoRRLWmBjVtOXv/624a5780405e8338b0278dc7a69bc2c9/Frontend_Nation_Wrapup_Post.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/27GgjDXGXoRRLWmBjVtOXv/624a5780405e8338b0278dc7a69bc2c9/Frontend_Nation_Wrapup_Post.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/27GgjDXGXoRRLWmBjVtOXv/624a5780405e8338b0278dc7a69bc2c9/Frontend_Nation_Wrapup_Post.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/27GgjDXGXoRRLWmBjVtOXv/624a5780405e8338b0278dc7a69bc2c9/Frontend_Nation_Wrapup_Post.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/27GgjDXGXoRRLWmBjVtOXv/624a5780405e8338b0278dc7a69bc2c9/Frontend_Nation_Wrapup_Post.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/27GgjDXGXoRRLWmBjVtOXv/624a5780405e8338b0278dc7a69bc2c9/Frontend_Nation_Wrapup_Post.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/27GgjDXGXoRRLWmBjVtOXv/624a5780405e8338b0278dc7a69bc2c9/Frontend_Nation_Wrapup_Post.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/27GgjDXGXoRRLWmBjVtOXv/624a5780405e8338b0278dc7a69bc2c9/Frontend_Nation_Wrapup_Post.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/27GgjDXGXoRRLWmBjVtOXv/624a5780405e8338b0278dc7a69bc2c9/Frontend_Nation_Wrapup_Post.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/27GgjDXGXoRRLWmBjVtOXv/624a5780405e8338b0278dc7a69bc2c9/Frontend_Nation_Wrapup_Post.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/27GgjDXGXoRRLWmBjVtOXv/624a5780405e8338b0278dc7a69bc2c9/Frontend_Nation_Wrapup_Post.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/27GgjDXGXoRRLWmBjVtOXv/624a5780405e8338b0278dc7a69bc2c9/Frontend_Nation_Wrapup_Post.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/27GgjDXGXoRRLWmBjVtOXv/624a5780405e8338b0278dc7a69bc2c9/Frontend_Nation_Wrapup_Post.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/27GgjDXGXoRRLWmBjVtOXv/624a5780405e8338b0278dc7a69bc2c9/Frontend_Nation_Wrapup_Post.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Mrina Sugosh","slug":"mrina-sugosh"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Frontend Nation 2024: TinyMCE Wrap-up"},"metaDescription":{"metaDescription":"Explore the highlights from Frontend Nation 2024, featuring DevRel insights, full stack and front end development, and OpenAI integration."}},{"title":"Understanding Uncaught TypeErrors in JavaScript","slug":"javascript-uncaught-typeerror","featured":false,"lastUpdated":"Mar 7th, 2024","description":{"description":"<p>It's time for a refresh (or an introduction) to understanding and solving JavaScript Uncaught TypeErrors.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"It's time for a refresh (or an introduction) to understanding and solving JavaScript Uncaught TypeErrors."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Uncaught TypeErrors appears inside an editor with the JavaScript Icon, with colors capturing the error handling phase","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAAw1BMVEX/8PD/8fH/7u7/7+/95+b+4uL+4OD+4eH+5eX+7e3+8PD/7u/75ubz8fD39PX49fX59fX59vb49PX/5+b85eb89PX98PL/8fL/8/T//v/8/P397/D64dz75+b87+/+6en+6Oj95+f+7Oz//P779Mz36aP97uv+5OP66ej5+vr5+fn7/Pz7/v76/v35/P338cnr3Z387Oj/8PH/6en86ur68vL78/P89fX99vb27/D28PH68/T97+//7e3z2tz97e397Ox8UJH1AAAAX0lEQVQIHQXBsQ3CUBBAMb/oN0DHKLRZH4aAETJAaJAOOxAwgA1i2kaAkLaqOoEF16qUL0PkXqnqdxgW5lJVVQ4suFVV1afGwqOqqs4MoXZe7d4HhgXzxNRhQCATDPAHf1YZ8QTlufwAAAAASUVORK5CYII=","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/4M7RjXxIVOXAHZphdOOR0Q/d92f16510de2bfbcce97ac77a9212661/img-Understanding_uncaught_type_errors.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/4M7RjXxIVOXAHZphdOOR0Q/d92f16510de2bfbcce97ac77a9212661/img-Understanding_uncaught_type_errors.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4M7RjXxIVOXAHZphdOOR0Q/d92f16510de2bfbcce97ac77a9212661/img-Understanding_uncaught_type_errors.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4M7RjXxIVOXAHZphdOOR0Q/d92f16510de2bfbcce97ac77a9212661/img-Understanding_uncaught_type_errors.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4M7RjXxIVOXAHZphdOOR0Q/d92f16510de2bfbcce97ac77a9212661/img-Understanding_uncaught_type_errors.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4M7RjXxIVOXAHZphdOOR0Q/d92f16510de2bfbcce97ac77a9212661/img-Understanding_uncaught_type_errors.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4M7RjXxIVOXAHZphdOOR0Q/d92f16510de2bfbcce97ac77a9212661/img-Understanding_uncaught_type_errors.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/4M7RjXxIVOXAHZphdOOR0Q/d92f16510de2bfbcce97ac77a9212661/img-Understanding_uncaught_type_errors.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/4M7RjXxIVOXAHZphdOOR0Q/d92f16510de2bfbcce97ac77a9212661/img-Understanding_uncaught_type_errors.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4M7RjXxIVOXAHZphdOOR0Q/d92f16510de2bfbcce97ac77a9212661/img-Understanding_uncaught_type_errors.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4M7RjXxIVOXAHZphdOOR0Q/d92f16510de2bfbcce97ac77a9212661/img-Understanding_uncaught_type_errors.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4M7RjXxIVOXAHZphdOOR0Q/d92f16510de2bfbcce97ac77a9212661/img-Understanding_uncaught_type_errors.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4M7RjXxIVOXAHZphdOOR0Q/d92f16510de2bfbcce97ac77a9212661/img-Understanding_uncaught_type_errors.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4M7RjXxIVOXAHZphdOOR0Q/d92f16510de2bfbcce97ac77a9212661/img-Understanding_uncaught_type_errors.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Understanding JavaScript uncaught type errors | TinyMCE"},"metaDescription":{"metaDescription":"Discover all you need to know to solve JavaScript Uncaught TypeError messages, the most common kind of error you'll face learning JavaScript"}},{"title":"Understanding byte offset and WYSIWYG cursor position","slug":"byte-offset","featured":false,"lastUpdated":"Apr 18th, 2024","description":{"description":"<p>Byte offsets, and how they affect WYSIWYGs, is important to know. Read on to find out more.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Byte offsets, and how they affect WYSIWYGs, is important to know. Read on to find out more."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"images representing javascript and numbers around the rich text editor","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.7833333333333334,"src":"//images.ctfassets.net/s600jj41gsex/4IVzxBAQGLCegTCvwqBpSr/ec866cf7e42753fb7d7f9995307dacd2/Design_1.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/4IVzxBAQGLCegTCvwqBpSr/ec866cf7e42753fb7d7f9995307dacd2/Design_1.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4IVzxBAQGLCegTCvwqBpSr/ec866cf7e42753fb7d7f9995307dacd2/Design_1.jpg?w=370&h=207&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4IVzxBAQGLCegTCvwqBpSr/ec866cf7e42753fb7d7f9995307dacd2/Design_1.jpg?w=739&h=414&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4IVzxBAQGLCegTCvwqBpSr/ec866cf7e42753fb7d7f9995307dacd2/Design_1.jpg?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4IVzxBAQGLCegTCvwqBpSr/ec866cf7e42753fb7d7f9995307dacd2/Design_1.jpg?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4IVzxBAQGLCegTCvwqBpSr/ec866cf7e42753fb7d7f9995307dacd2/Design_1.jpg?w=1926&h=1080&q=50&fit=scale 1926w","srcWebp":"//images.ctfassets.net/s600jj41gsex/4IVzxBAQGLCegTCvwqBpSr/ec866cf7e42753fb7d7f9995307dacd2/Design_1.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/4IVzxBAQGLCegTCvwqBpSr/ec866cf7e42753fb7d7f9995307dacd2/Design_1.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4IVzxBAQGLCegTCvwqBpSr/ec866cf7e42753fb7d7f9995307dacd2/Design_1.jpg?w=370&h=207&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4IVzxBAQGLCegTCvwqBpSr/ec866cf7e42753fb7d7f9995307dacd2/Design_1.jpg?w=739&h=414&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4IVzxBAQGLCegTCvwqBpSr/ec866cf7e42753fb7d7f9995307dacd2/Design_1.jpg?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4IVzxBAQGLCegTCvwqBpSr/ec866cf7e42753fb7d7f9995307dacd2/Design_1.jpg?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4IVzxBAQGLCegTCvwqBpSr/ec866cf7e42753fb7d7f9995307dacd2/Design_1.jpg?w=1926&h=1080&q=50&fm=webp&fit=scale 1926w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Understanding byte offset and byte offset meaning | TinyMCE"},"metaDescription":{"metaDescription":"Find out the important byte offset information you need to know to understand more about byte offsets in your WYSIWYG"}},{"title":"Understanding cross platform app development","slug":"cross-platform-app-development","featured":false,"lastUpdated":"Feb 21st, 2024","description":{"description":"<p>Getting started with cross platform app development is not without challenges. Find out the essentials in our new guide.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Getting started with cross platform app development is not without challenges. Find out the essentials in our new guide."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"The steps of cross platform app development shown with Android icons, a phone interface, and iOS icons","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAAyVBMVEX+3OD/3OD/3eH/3OH+3uL+3N/+29//3N/93uH93OD74uX48fHN2tqy1NK61tXr1NH61tPy3d/s3t752Nf73+L73uH529r229nj5vHk7vLU0Nze19z42Nr03d/r3Nn008r929392t7+2t7+2uDz6/n87eTd2N/r5uvn09D+2tr45en44+X/29/72tz32Nna4e3V2dPC2+DX1djSwcb619z65On64+b/2+D/3eLhz7vYy7DI1tSu1dGu087x2dz109j62N3729z829ySwQDnAAAAZElEQVQIHQXBsRFBURRAwT38GQ3IFKAEodoVoQEzMtGPedduQAADQRBaDCEcS+ur1tjIqaqq2v1Ec66qqnrNbGi/VFVVLRuT97WqqhYht6qqz5MRHOfeY4lhCDoMshgI5LBggD+plh9Dd3iiZwAAAABJRU5ErkJggg==","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/6VjjHZN8Kr1nKHY4SJJerz/60d0ed9bae480cbf511582778f7796eb/img-Understanding-cross-platform-app-development-1.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6VjjHZN8Kr1nKHY4SJJerz/60d0ed9bae480cbf511582778f7796eb/img-Understanding-cross-platform-app-development-1.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6VjjHZN8Kr1nKHY4SJJerz/60d0ed9bae480cbf511582778f7796eb/img-Understanding-cross-platform-app-development-1.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6VjjHZN8Kr1nKHY4SJJerz/60d0ed9bae480cbf511582778f7796eb/img-Understanding-cross-platform-app-development-1.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6VjjHZN8Kr1nKHY4SJJerz/60d0ed9bae480cbf511582778f7796eb/img-Understanding-cross-platform-app-development-1.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6VjjHZN8Kr1nKHY4SJJerz/60d0ed9bae480cbf511582778f7796eb/img-Understanding-cross-platform-app-development-1.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6VjjHZN8Kr1nKHY4SJJerz/60d0ed9bae480cbf511582778f7796eb/img-Understanding-cross-platform-app-development-1.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6VjjHZN8Kr1nKHY4SJJerz/60d0ed9bae480cbf511582778f7796eb/img-Understanding-cross-platform-app-development-1.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6VjjHZN8Kr1nKHY4SJJerz/60d0ed9bae480cbf511582778f7796eb/img-Understanding-cross-platform-app-development-1.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6VjjHZN8Kr1nKHY4SJJerz/60d0ed9bae480cbf511582778f7796eb/img-Understanding-cross-platform-app-development-1.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6VjjHZN8Kr1nKHY4SJJerz/60d0ed9bae480cbf511582778f7796eb/img-Understanding-cross-platform-app-development-1.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6VjjHZN8Kr1nKHY4SJJerz/60d0ed9bae480cbf511582778f7796eb/img-Understanding-cross-platform-app-development-1.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6VjjHZN8Kr1nKHY4SJJerz/60d0ed9bae480cbf511582778f7796eb/img-Understanding-cross-platform-app-development-1.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6VjjHZN8Kr1nKHY4SJJerz/60d0ed9bae480cbf511582778f7796eb/img-Understanding-cross-platform-app-development-1.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"What is cross platform app development | TinyMCE"},"metaDescription":{"metaDescription":"Cross platform app development can save time and resources, but it's not without challenges. Find out more about cross platform app development in our new guide."}},{"title":"Is there anything better than React? Discovering React alternatives","slug":"react-alternatives","featured":false,"lastUpdated":"Feb 8th, 2024","description":{"description":"<p>What are the React alternatives? Find out what frameworks provide an answer when React isn't the right choice.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"What are the React alternatives? Find out what frameworks provide an answer when React isn't the right choice."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"A rocket launch showing the power of React","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAAz1BMVEUA4KwA4awA4KsA4asA4KoA36pA3qsA4LcA4LMA3qqk49Kf6dIA5beq4sTp6eGE37YX4a2Y38ts4MYA2LCo087y7vyf3dVV48Sw5Mzs6uSF37YA4a2I3cZa4bk74LPg6OvO5uRW18J/3bdx4rmw5N574cU/3qho26Jr3qua5snu8/OS3cYA1q2U2J+W4LvG6fel5Nxc3KWW152a0qDe5dj//f7P5txzxaiV0KRs5Ltw58tM4rgA4q8A4K9i4rl25r5c4LVn4bg14rQA4rEA4KmoahRXAAAATElEQVQI12NgIAgYUSgmRgbGfwzMjH/+wQUZmVgYoeAzSJQFJMjPCAdf4YLcCEGwYSBBaWyCyCoRFkkrQoV+Hv2P7EIWFxYmIMDjBwBWfAvNNMVjIAAAAABJRU5ErkJggg==","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/4hsGQMZeid58sjsjKPwbw1/8a4af88ccd3792f3e764fcf7c6a36348/img-anything-better-than-React-1.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/4hsGQMZeid58sjsjKPwbw1/8a4af88ccd3792f3e764fcf7c6a36348/img-anything-better-than-React-1.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4hsGQMZeid58sjsjKPwbw1/8a4af88ccd3792f3e764fcf7c6a36348/img-anything-better-than-React-1.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4hsGQMZeid58sjsjKPwbw1/8a4af88ccd3792f3e764fcf7c6a36348/img-anything-better-than-React-1.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4hsGQMZeid58sjsjKPwbw1/8a4af88ccd3792f3e764fcf7c6a36348/img-anything-better-than-React-1.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4hsGQMZeid58sjsjKPwbw1/8a4af88ccd3792f3e764fcf7c6a36348/img-anything-better-than-React-1.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4hsGQMZeid58sjsjKPwbw1/8a4af88ccd3792f3e764fcf7c6a36348/img-anything-better-than-React-1.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/4hsGQMZeid58sjsjKPwbw1/8a4af88ccd3792f3e764fcf7c6a36348/img-anything-better-than-React-1.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/4hsGQMZeid58sjsjKPwbw1/8a4af88ccd3792f3e764fcf7c6a36348/img-anything-better-than-React-1.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4hsGQMZeid58sjsjKPwbw1/8a4af88ccd3792f3e764fcf7c6a36348/img-anything-better-than-React-1.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4hsGQMZeid58sjsjKPwbw1/8a4af88ccd3792f3e764fcf7c6a36348/img-anything-better-than-React-1.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4hsGQMZeid58sjsjKPwbw1/8a4af88ccd3792f3e764fcf7c6a36348/img-anything-better-than-React-1.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4hsGQMZeid58sjsjKPwbw1/8a4af88ccd3792f3e764fcf7c6a36348/img-anything-better-than-React-1.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4hsGQMZeid58sjsjKPwbw1/8a4af88ccd3792f3e764fcf7c6a36348/img-anything-better-than-React-1.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Is there anything better than React? Discovering React alternatives | TinyMCE"},"metaDescription":{"metaDescription":"Explore top alternatives to React JS, evaluate its competitors, and learn how to choose the right framework for your needs."}},{"title":"Improving our engineering best practices with semantic versioning","slug":"improving-our-engineering-best-practices-with-semantic-versioning","featured":false,"lastUpdated":"Feb 7th, 2024","description":{"description":"<p>What is semantic versioning, and what does it mean for you? Switching to semantic versioning is just one step you can take for engineering best practice.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"What is semantic versioning, and what does it mean for you? Switching to semantic versioning is just one step you can take for engineering best practice."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"The different stages and levels representing the specific numbering found in semantic versioning","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAAwFBMVEX/yxf/yxb/yxX/yxP/yw3/ywT/yw//yxT/ywD/ygD9yif/ywP/yxD/zBf7zUbT1LO8ycPe0pj9yy//yx7/yxr/zBn6zEbM17yu1dPIxJr8yib7yjH/yxn5vTb5vzX/zRb/zA/6ySrrw0rd0JS10c7HyLnyyF//yxL6ykD/xwD9xx79yh/sz3q/2MzGx6zovHfIz8G6ysjh0JL/zBb/zAf7yBT+yQD5zUvM1ry3zcTjyHr/zAj/zAb7yBr/yw7/ywwGo4veAAAAQHRSTlPl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl3t+NJQAAAH9JREFUCB1dwYcawTAUBtD/puilYtemasVeoUaN938rPsToOXghQYggKxZP2IQ/NidT7KQFJD7IyWRzeS4UqeS6eCMuV6q1eqPJrbYHo+N3e/3BUI3GEwlDTv3ZfLFcrTesYbh6y7tgfzieWOOLVHjm4MJXwi8S1i1UAhH0gKc7tSUJ29tKf+kAAAAASUVORK5CYII=","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/Bd9ENssvqhYSiDbIORoTr/269ba3a4694f50bfe57506ecc8e4d3ca/img-Software-Versioning-best-1.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/Bd9ENssvqhYSiDbIORoTr/269ba3a4694f50bfe57506ecc8e4d3ca/img-Software-Versioning-best-1.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/Bd9ENssvqhYSiDbIORoTr/269ba3a4694f50bfe57506ecc8e4d3ca/img-Software-Versioning-best-1.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/Bd9ENssvqhYSiDbIORoTr/269ba3a4694f50bfe57506ecc8e4d3ca/img-Software-Versioning-best-1.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/Bd9ENssvqhYSiDbIORoTr/269ba3a4694f50bfe57506ecc8e4d3ca/img-Software-Versioning-best-1.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/Bd9ENssvqhYSiDbIORoTr/269ba3a4694f50bfe57506ecc8e4d3ca/img-Software-Versioning-best-1.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/Bd9ENssvqhYSiDbIORoTr/269ba3a4694f50bfe57506ecc8e4d3ca/img-Software-Versioning-best-1.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/Bd9ENssvqhYSiDbIORoTr/269ba3a4694f50bfe57506ecc8e4d3ca/img-Software-Versioning-best-1.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/Bd9ENssvqhYSiDbIORoTr/269ba3a4694f50bfe57506ecc8e4d3ca/img-Software-Versioning-best-1.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/Bd9ENssvqhYSiDbIORoTr/269ba3a4694f50bfe57506ecc8e4d3ca/img-Software-Versioning-best-1.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/Bd9ENssvqhYSiDbIORoTr/269ba3a4694f50bfe57506ecc8e4d3ca/img-Software-Versioning-best-1.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/Bd9ENssvqhYSiDbIORoTr/269ba3a4694f50bfe57506ecc8e4d3ca/img-Software-Versioning-best-1.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/Bd9ENssvqhYSiDbIORoTr/269ba3a4694f50bfe57506ecc8e4d3ca/img-Software-Versioning-best-1.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/Bd9ENssvqhYSiDbIORoTr/269ba3a4694f50bfe57506ecc8e4d3ca/img-Software-Versioning-best-1.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Millie Macdonald","slug":"millie-macdonald"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":null},{"title":"Agile at Tiny: How we’ve adapted agile principles to work for us","slug":"agile-principles-at-tiny","featured":false,"lastUpdated":"Jan 17th, 2024","description":{"description":"<p>How do we use agile principles at Tiny? Find out how we put agile into practice and adapt the concepts to work for our teams.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"How do we use agile principles at Tiny? Find out how we put agile into practice and adapt the concepts to work for our teams."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"A collection of Agile related imagery such as notebooks, pinned cards, and a stop watch","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAA0lBMVEVk86Rk9KRj9KRg9KNf86Ji9KRf9KNe9KNf9aOJ67iQ5Lpe8qFg86Jl8qR37Kp57Kph86Vc9KRZ7qKJ6LSO67hY8p1/26ps6KWO8rby8Ors8+yT6qei4Y5e9KWB4pfaxkalyKVh4LmIzats56SV8rn/4tbz7OOW45+u3Ipf9KV765nXzVCttLduzc1e8p5S3qZ8xcTn7+zd9eeE6qCQ45Vi8aRj9KVh9KVk9KNh8alj8qdf7aVW3KtW261n7ad38Kql6ZyE7Zxh86Ri9KVj9aJg9KKHdYJiAAAAZklEQVQIHW3BywkCMRRA0XszQcQPWIAN2IH70f7X9jHgRvN8GRGy8Bz+kU5SCEEnydTCSds7AiogG9Nza1peQSW5M+3tFgMBzw4ejUo6OAAq6egg+LLMpXi93afTpQiykpUEwUh+PriNFKHJEqftAAAAAElFTkSuQmCC","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/2deNFqN8uYnV3qCLfs4nR0/c9d8e0c108baa1cf58b0eaab0b748174/img-Using-agile-principles-adopt-or-adapt-1.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/2deNFqN8uYnV3qCLfs4nR0/c9d8e0c108baa1cf58b0eaab0b748174/img-Using-agile-principles-adopt-or-adapt-1.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2deNFqN8uYnV3qCLfs4nR0/c9d8e0c108baa1cf58b0eaab0b748174/img-Using-agile-principles-adopt-or-adapt-1.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2deNFqN8uYnV3qCLfs4nR0/c9d8e0c108baa1cf58b0eaab0b748174/img-Using-agile-principles-adopt-or-adapt-1.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2deNFqN8uYnV3qCLfs4nR0/c9d8e0c108baa1cf58b0eaab0b748174/img-Using-agile-principles-adopt-or-adapt-1.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2deNFqN8uYnV3qCLfs4nR0/c9d8e0c108baa1cf58b0eaab0b748174/img-Using-agile-principles-adopt-or-adapt-1.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2deNFqN8uYnV3qCLfs4nR0/c9d8e0c108baa1cf58b0eaab0b748174/img-Using-agile-principles-adopt-or-adapt-1.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/2deNFqN8uYnV3qCLfs4nR0/c9d8e0c108baa1cf58b0eaab0b748174/img-Using-agile-principles-adopt-or-adapt-1.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/2deNFqN8uYnV3qCLfs4nR0/c9d8e0c108baa1cf58b0eaab0b748174/img-Using-agile-principles-adopt-or-adapt-1.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2deNFqN8uYnV3qCLfs4nR0/c9d8e0c108baa1cf58b0eaab0b748174/img-Using-agile-principles-adopt-or-adapt-1.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2deNFqN8uYnV3qCLfs4nR0/c9d8e0c108baa1cf58b0eaab0b748174/img-Using-agile-principles-adopt-or-adapt-1.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2deNFqN8uYnV3qCLfs4nR0/c9d8e0c108baa1cf58b0eaab0b748174/img-Using-agile-principles-adopt-or-adapt-1.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2deNFqN8uYnV3qCLfs4nR0/c9d8e0c108baa1cf58b0eaab0b748174/img-Using-agile-principles-adopt-or-adapt-1.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2deNFqN8uYnV3qCLfs4nR0/c9d8e0c108baa1cf58b0eaab0b748174/img-Using-agile-principles-adopt-or-adapt-1.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ben Long","slug":"ben-long"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Using Agile principles: To adopt or adapt? | Tiny"},"metaDescription":{"metaDescription":"How do we use agile principles at Tiny? Find out how we put agile into practice and adapt the concepts to work for our teams."}},{"title":"How to work with PHP escape quotes","slug":"php-escape","featured":false,"lastUpdated":"Dec 7th, 2023","description":{"description":"<p>There's more to PHP escape quote procedures than using a backslash. Read on to find out the essentials of handling PHP escape characters.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"There's more to PHP escape quote procedures than using a backslash. Read on to find out the essentials of handling PHP escape characters."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"PHP content escaping a page, representing the PHP escape quote process","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAAnFBMVEWqtP+rtP+ps/+qtf+os/+Wr/Kbvuaotf2ptf+ptP+puP+qtv+pt/+Wre293d3i7vCvuPzY2fLV1/Kptv+qt/+quf+quP+mtf+qtOzs7+jn6e6xuPvf3u3a2u+ptPmlruilruaosvSnsv+rs+zq6ufk5O6ps/ertv+ZotScosabosamr++rtf+osv+wufPT2PKxuu+drvCnsvmos/5DvsiFAAAATElEQVQI12NgIBUwMoFIZigHwmQEAQYQ+vGXgYEFJMPOxAgHPxigglzMCMG3cO3yEL4IiLwCVcnADeJdZpW7yKB5BclyBl1juOUkAADBjQlbDxm0tgAAAABJRU5ErkJggg==","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/3EihLXXBO1fnatkO9ozUld/884edeb3c23d2335cc3c4e56e9c36a38/img-Howto-work-with-PHP-escape-quotes.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/3EihLXXBO1fnatkO9ozUld/884edeb3c23d2335cc3c4e56e9c36a38/img-Howto-work-with-PHP-escape-quotes.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/3EihLXXBO1fnatkO9ozUld/884edeb3c23d2335cc3c4e56e9c36a38/img-Howto-work-with-PHP-escape-quotes.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/3EihLXXBO1fnatkO9ozUld/884edeb3c23d2335cc3c4e56e9c36a38/img-Howto-work-with-PHP-escape-quotes.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/3EihLXXBO1fnatkO9ozUld/884edeb3c23d2335cc3c4e56e9c36a38/img-Howto-work-with-PHP-escape-quotes.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/3EihLXXBO1fnatkO9ozUld/884edeb3c23d2335cc3c4e56e9c36a38/img-Howto-work-with-PHP-escape-quotes.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/3EihLXXBO1fnatkO9ozUld/884edeb3c23d2335cc3c4e56e9c36a38/img-Howto-work-with-PHP-escape-quotes.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/3EihLXXBO1fnatkO9ozUld/884edeb3c23d2335cc3c4e56e9c36a38/img-Howto-work-with-PHP-escape-quotes.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/3EihLXXBO1fnatkO9ozUld/884edeb3c23d2335cc3c4e56e9c36a38/img-Howto-work-with-PHP-escape-quotes.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/3EihLXXBO1fnatkO9ozUld/884edeb3c23d2335cc3c4e56e9c36a38/img-Howto-work-with-PHP-escape-quotes.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/3EihLXXBO1fnatkO9ozUld/884edeb3c23d2335cc3c4e56e9c36a38/img-Howto-work-with-PHP-escape-quotes.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/3EihLXXBO1fnatkO9ozUld/884edeb3c23d2335cc3c4e56e9c36a38/img-Howto-work-with-PHP-escape-quotes.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/3EihLXXBO1fnatkO9ozUld/884edeb3c23d2335cc3c4e56e9c36a38/img-Howto-work-with-PHP-escape-quotes.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/3EihLXXBO1fnatkO9ozUld/884edeb3c23d2335cc3c4e56e9c36a38/img-Howto-work-with-PHP-escape-quotes.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"How to work with PHP escape quotes and characters | TinyMCE"},"metaDescription":{"metaDescription":"Master PHP escape sequences with our guide. Learn string escape basics, single vs double quote usage, and how to navigate heredoc syntax."}},{"title":"How to get content and set content in TinyMCE","slug":"how-to-get-content-and-set-content-in-tinymce","featured":true,"lastUpdated":"Jan 24th, 2024","description":{"description":"<p>A brief guide on how to get and set content in TinyMCE, including related FAQs like how to set content on initialization and how to get content without any HTML tags.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A brief guide on how to get and set content in TinyMCE, including related FAQs like how to set content on initialization and how to get content without any HTML tags."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"All kinds of content including text, video, and images being collected and set in an editor","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAAz1BMVEX5q/P6q/P6q/P6q/T5q/P7qvT6qfT4q/T6qvTyrvD2rfLkx/HI0vDawPHrpfHxr/H4p/P7q/TPvOPivezS39nP4bbX2d3hxb/XtuDzo/Pvr/H5qPP6qPT6qvPup+3rsO3jxtjDxLK2uMy1q8ajjeDnte7szO70yfH2xfL4rPL5qvPtpu3sqOzkm+xudOygrPC0v/NScevNuOTj0d7o2ubn0uX0rO/7q/Pzp/GPguqQjuuomuujh+vinu34p/D2pvDvpvHxpvH3qPL7rPT6rPSbYVaoAAAAAnRSTlP+/qap3hAAAABoSURBVAgdBcGxMQRgFIDB/d79BMY1oA6x2q8NGhDIzIiMe3YBAEBDACzMGe6Z6u/yy0CH9VhV9W2HDvvwVFVVn9JhX6qqqj5y4FpVVeU+B969VlX5MjpY9q1+nm+QgVaX6XqDCBBY4B/PDBUc0FJGtAAAAABJRU5ErkJggg==","aspectRatio":1.780758556891767,"src":"//images.ctfassets.net/s600jj41gsex/6ElZ819XSaYszxbXjWNQIm/0b9d3a3f5f46c2a6ecccb3b3d3db954b/How_to_get_content_and_set_content_in_TinyMCE.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6ElZ819XSaYszxbXjWNQIm/0b9d3a3f5f46c2a6ecccb3b3d3db954b/How_to_get_content_and_set_content_in_TinyMCE.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6ElZ819XSaYszxbXjWNQIm/0b9d3a3f5f46c2a6ecccb3b3d3db954b/How_to_get_content_and_set_content_in_TinyMCE.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6ElZ819XSaYszxbXjWNQIm/0b9d3a3f5f46c2a6ecccb3b3d3db954b/How_to_get_content_and_set_content_in_TinyMCE.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6ElZ819XSaYszxbXjWNQIm/0b9d3a3f5f46c2a6ecccb3b3d3db954b/How_to_get_content_and_set_content_in_TinyMCE.png?w=1109&h=623&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6ElZ819XSaYszxbXjWNQIm/0b9d3a3f5f46c2a6ecccb3b3d3db954b/How_to_get_content_and_set_content_in_TinyMCE.png?w=1478&h=830&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6ElZ819XSaYszxbXjWNQIm/0b9d3a3f5f46c2a6ecccb3b3d3db954b/How_to_get_content_and_set_content_in_TinyMCE.png?w=1925&h=1081&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6ElZ819XSaYszxbXjWNQIm/0b9d3a3f5f46c2a6ecccb3b3d3db954b/How_to_get_content_and_set_content_in_TinyMCE.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6ElZ819XSaYszxbXjWNQIm/0b9d3a3f5f46c2a6ecccb3b3d3db954b/How_to_get_content_and_set_content_in_TinyMCE.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6ElZ819XSaYszxbXjWNQIm/0b9d3a3f5f46c2a6ecccb3b3d3db954b/How_to_get_content_and_set_content_in_TinyMCE.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6ElZ819XSaYszxbXjWNQIm/0b9d3a3f5f46c2a6ecccb3b3d3db954b/How_to_get_content_and_set_content_in_TinyMCE.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6ElZ819XSaYszxbXjWNQIm/0b9d3a3f5f46c2a6ecccb3b3d3db954b/How_to_get_content_and_set_content_in_TinyMCE.png?w=1109&h=623&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6ElZ819XSaYszxbXjWNQIm/0b9d3a3f5f46c2a6ecccb3b3d3db954b/How_to_get_content_and_set_content_in_TinyMCE.png?w=1478&h=830&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6ElZ819XSaYszxbXjWNQIm/0b9d3a3f5f46c2a6ecccb3b3d3db954b/How_to_get_content_and_set_content_in_TinyMCE.png?w=1925&h=1081&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"How to get content from the editor and set content | TinyMCE"},"metaDescription":{"metaDescription":"How to get content from the TinyMCE editor in JavaScript. How to set content in TinyMCE. How to get content out of TinyMCE without HTML tags."}},{"title":"2024 State of Rich Text Editors Developer Survey is open – have your say!","slug":"tinys-developer-survey","featured":false,"lastUpdated":"Mar 8th, 2024","description":{"description":"<p>Announcing our developer survey! Tiny aims to lead innovation, and with your help, we hope to learn what the best practices are and how to cater to future needs of our community.&nbsp;</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Announcing our developer survey! Tiny aims to lead innovation, and with your help, we hope to learn what the best practices are and how to cater to future needs of our community. "}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"A symbolic version of a survey, with star rating, emoji, questions, and results represented.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABNVBMVEWVrf+VrP+SrP+WrP+Trf+Qq/+RrP+NrfuGsPGws9exstWIr/KCsPKCsPGIr/aUrP+Urf+drfbVvsK4seGNv+qg3LPD2puyybSSxsaT47uT4buU47qW0cyhq+aksO2csfuRrf+ureT/zGDZtqu9yfzr6/jO3/bGtvXg1Prv6vvu6Pzv6f3y7Pvf4PaYqPeYqvmVrv6VrP6urOGbpuzR2Pjr5Png2/re1fno4vvv7fTq4/3s5P/i0PnPj/jCgfuumfmTrP+Nqf+Lpvrh5Pnr5Prh2vbl3vnn4fXm4Pvp4v3KyOyEtPeNy/6Lv/iUrP6PqPzV2vXq4/bl3fjm3vnl3fnq4fzb2vKozet/uvGKtPeSq/+kt/24wv21v/60v/22wP62wP+4wv+6w/+zwPyUqv6Vq/+Qqv+Mn4RUAAAAZUlEQVQIHQXBwQ1BQQBAwTeyNxG/ABcXbdCKytxEWzpYiausmaqqqqqqVBWtXdWvSg2AglkaBwCBzxydAADejeYZAFCjeQQCKNV2RawdvFajmnsgsEpVt0uPe9X3WaWqtqpqVvUHgrARVvIC/egAAAAASUVORK5CYII=","aspectRatio":1.7790178571428572,"src":"//images.ctfassets.net/s600jj41gsex/5RkV4KkTsTDLYV5q0UwlHY/f0669377994d735f6a01ec7becfde967/image__1_.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/5RkV4KkTsTDLYV5q0UwlHY/f0669377994d735f6a01ec7becfde967/image__1_.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5RkV4KkTsTDLYV5q0UwlHY/f0669377994d735f6a01ec7becfde967/image__1_.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5RkV4KkTsTDLYV5q0UwlHY/f0669377994d735f6a01ec7becfde967/image__1_.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5RkV4KkTsTDLYV5q0UwlHY/f0669377994d735f6a01ec7becfde967/image__1_.png?w=1109&h=623&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/5RkV4KkTsTDLYV5q0UwlHY/f0669377994d735f6a01ec7becfde967/image__1_.png?w=1478&h=831&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/5RkV4KkTsTDLYV5q0UwlHY/f0669377994d735f6a01ec7becfde967/image__1_.png?w=1594&h=896&q=50&fit=scale 1594w","srcWebp":"//images.ctfassets.net/s600jj41gsex/5RkV4KkTsTDLYV5q0UwlHY/f0669377994d735f6a01ec7becfde967/image__1_.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/5RkV4KkTsTDLYV5q0UwlHY/f0669377994d735f6a01ec7becfde967/image__1_.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5RkV4KkTsTDLYV5q0UwlHY/f0669377994d735f6a01ec7becfde967/image__1_.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5RkV4KkTsTDLYV5q0UwlHY/f0669377994d735f6a01ec7becfde967/image__1_.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5RkV4KkTsTDLYV5q0UwlHY/f0669377994d735f6a01ec7becfde967/image__1_.png?w=1109&h=623&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/5RkV4KkTsTDLYV5q0UwlHY/f0669377994d735f6a01ec7becfde967/image__1_.png?w=1478&h=831&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/5RkV4KkTsTDLYV5q0UwlHY/f0669377994d735f6a01ec7becfde967/image__1_.png?w=1594&h=896&q=50&fm=webp&fit=scale 1594w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Di Mace","slug":"di-mace"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Annual developer survey for rich text editors opens now | TinyMCE"},"metaDescription":{"metaDescription":"The TinyMCE annual developer survey for the state of rich text editors is now open! Have your say on how you develop software with rich text editors."}},{"title":"Angular Change Detection and the OnPush strategy","slug":"angular-change-detection-onpush-strategy","featured":false,"lastUpdated":"Mar 7th, 2023","description":{"description":"<p>There is an alternative method for detecting value changes faster in Angular applications with immutable reference types and the OnPush strategy. Read on to find out how this works.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"There is an alternative method for detecting value changes faster in Angular applications with immutable reference types and the OnPush strategy. Read on to find out how this works."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Angular logo on a yellow background with process elements","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAAqFBMVEX42r/52r/527/728D628D528D53cH53sL53MH428La2MDn2sP63MHxxq7usZvzybD52sD02sKszrHM1r7lqpbmgYLqhYvnjHz12sH32sD117z028P23cTalYLnhYrzur7qmZL23Mb43sf017zqzrTv0bf12L3vz7XclYvhcm7utqH02sDz17322L3v0rjz1rv01Lr22b7x0rfy1Lrz1bvy1brw07j53MAPx842AAAAaUlEQVQIHQXBwUlDARBAwXnfv6BR8O4hbdh/GWILIl6FxHUmCFiAE0GwQMRR1f1mwQmPVfWL5x8kvVZVfXFbTvp7qqp6uNNK57Wqqm8vn+yJS/q4Xqq32qCOmZl5n5kZRQQAWAcLFmD5B8m3FsOkv4dTAAAAAElFTkSuQmCC","aspectRatio":1.7777777777777777,"src":"//images.ctfassets.net/s600jj41gsex/1LXmifcjJCDfpxF9LDdwnI/849dce013c1618601b0333fdc7a093f5/An_Angular_5_tutorial__step-by-step_guide_to_your_first_Angular_5_app.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/1LXmifcjJCDfpxF9LDdwnI/849dce013c1618601b0333fdc7a093f5/An_Angular_5_tutorial__step-by-step_guide_to_your_first_Angular_5_app.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1LXmifcjJCDfpxF9LDdwnI/849dce013c1618601b0333fdc7a093f5/An_Angular_5_tutorial__step-by-step_guide_to_your_first_Angular_5_app.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1LXmifcjJCDfpxF9LDdwnI/849dce013c1618601b0333fdc7a093f5/An_Angular_5_tutorial__step-by-step_guide_to_your_first_Angular_5_app.png?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1LXmifcjJCDfpxF9LDdwnI/849dce013c1618601b0333fdc7a093f5/An_Angular_5_tutorial__step-by-step_guide_to_your_first_Angular_5_app.png?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/1LXmifcjJCDfpxF9LDdwnI/849dce013c1618601b0333fdc7a093f5/An_Angular_5_tutorial__step-by-step_guide_to_your_first_Angular_5_app.png?w=1478&h=831&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/1LXmifcjJCDfpxF9LDdwnI/849dce013c1618601b0333fdc7a093f5/An_Angular_5_tutorial__step-by-step_guide_to_your_first_Angular_5_app.png?w=1920&h=1080&q=50&fit=scale 1920w","srcWebp":"//images.ctfassets.net/s600jj41gsex/1LXmifcjJCDfpxF9LDdwnI/849dce013c1618601b0333fdc7a093f5/An_Angular_5_tutorial__step-by-step_guide_to_your_first_Angular_5_app.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/1LXmifcjJCDfpxF9LDdwnI/849dce013c1618601b0333fdc7a093f5/An_Angular_5_tutorial__step-by-step_guide_to_your_first_Angular_5_app.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1LXmifcjJCDfpxF9LDdwnI/849dce013c1618601b0333fdc7a093f5/An_Angular_5_tutorial__step-by-step_guide_to_your_first_Angular_5_app.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1LXmifcjJCDfpxF9LDdwnI/849dce013c1618601b0333fdc7a093f5/An_Angular_5_tutorial__step-by-step_guide_to_your_first_Angular_5_app.png?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1LXmifcjJCDfpxF9LDdwnI/849dce013c1618601b0333fdc7a093f5/An_Angular_5_tutorial__step-by-step_guide_to_your_first_Angular_5_app.png?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/1LXmifcjJCDfpxF9LDdwnI/849dce013c1618601b0333fdc7a093f5/An_Angular_5_tutorial__step-by-step_guide_to_your_first_Angular_5_app.png?w=1478&h=831&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/1LXmifcjJCDfpxF9LDdwnI/849dce013c1618601b0333fdc7a093f5/An_Angular_5_tutorial__step-by-step_guide_to_your_first_Angular_5_app.png?w=1920&h=1080&q=50&fm=webp&fit=scale 1920w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ahmet Shapiro-Erciyas","slug":"ahmet-shapiro-erciyas"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Angular change detection: how it works and strategies explained | TinyMCE"},"metaDescription":{"metaDescription":"AngularJS's change detection is one of its most powerful features. In this article we explain how it works and review some strategies for using it effectively."}},{"title":"Lessons learned over 20 years as a web developer","slug":"lessons-learned-over-20-years-as-a-web-developer","featured":false,"lastUpdated":"Oct 5th, 2020","description":{"description":"<p>A discussion of the top five areas of expertise that no web developer should be without, covering performance and optimization, tools, image compression, testing, and approaches to learning.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A discussion of the top five areas of expertise that no web developer should be without, covering performance and optimization, tools, image compression, testing, and approaches to learning."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"The number 20.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAADh0lEQVQYGR3BTUwcVRwA8P9782Zmdz52Z3e2O/vBR4GCbJGkxGjQtCqxFTRROPSstNx782g8GA+mUQ8meLBFaJNi0oMx2prYEA8UG0Ji0kYOFoILC8x+wLJ0dmd33nszY+Lvhz45SySfSxSMCiRfy8LFD4+svJHN5c2EQMTmi1Mh8B2Pp/3OyNFmevc7pALoAKoG6jDxuR8yCCuAZ640xi/Fzw2OZqyUkVCjCkKYMq4rkYB6jtP6x+6jyVz++afYhRA1AYrCKxKQGmgzk+HbV1JDhYyVKR/aTrOpKEqUiBIhB3Z5e+ffuKr19vZtQcyHAcP+AwGA7xJ+BDDSRcYvqemsqqiLCz/cu7UAALNzs9OXJ0JEZm/cYM3jrp6Xbs3PFwYG/+64icZ1016AEDAHUN56j2oxy8pUKxWv1Vr68e7nX36xeHuxuFN8tHzn8sTEysrqO2++8fODB5IsdfcObOfGGRagA1iMALayqqYjjDK57Edz16NhWCmXJ96f6uo/267tm6YZj8dyudyBbXucpU2zEc+exqaDNmBp7AIjoqoqnDFOKe+0d5aX7n/z7dTUZDKTSfb27Ty8f1zalSMRj3PKGBZQNG7UtT6/DRgnUj5GgiAwRlnHRUQ8DvHLr786fL6AI1HJzKSL9erTv1AY+IxRn/HQl2W5rZ5hLmAQJYQQhAGjHiKSXa3e/OXRxekZTdMAIBaRhwE6D5drG094GDCv3em4POA8xKwJmL04DX2fMQYAPAjWVh+PjBaGzxf8IGDUq1fKHoCX6hbTls88r93yaMdpNWVK2Qlgb3MtcFtNxyGiWLbL976//cHVq6quB0HAOeOuiwcg+e6kku+q16oe5x6jjXotrJVpCwivgl+rnsSNpGnuFYsAQCndfPZMkqR8KkmapycRa6vurP653tPdLRBSqdf5kc0OtzoIhDEApIhK/znKueM466uPn6ytrfz2+/bu7lhhKHkmtS3Fv/p6vru/b3bumqZrxdJ+/95O9Nc7IAG6ZkJ4DJm5j6XBISQIRiJBCMEYi6IouE4C89DqctueEdMkWd7dK/W4zfjSzUijJCogXDBkEPzW+lOjMIx13WPM+J+m662TeiphID1GiNhoNPZLB5bTkH+6yzafCwkgMgijMTkMWeDCyfqGlrPiVuagUrEPD91Wq7ZXDBgt1Y5L+wfY95MVGxY+8zbKQQywCAjDf4ZOwjSZZuE9AAAAAElFTkSuQmCC","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/6amp8fmeVDhXPf8o6nxzBC/65575f34ce81cc2cca8e7dba6c5d68d8/Image_default_LessonsLearned.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6amp8fmeVDhXPf8o6nxzBC/65575f34ce81cc2cca8e7dba6c5d68d8/Image_default_LessonsLearned.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6amp8fmeVDhXPf8o6nxzBC/65575f34ce81cc2cca8e7dba6c5d68d8/Image_default_LessonsLearned.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6amp8fmeVDhXPf8o6nxzBC/65575f34ce81cc2cca8e7dba6c5d68d8/Image_default_LessonsLearned.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6amp8fmeVDhXPf8o6nxzBC/65575f34ce81cc2cca8e7dba6c5d68d8/Image_default_LessonsLearned.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6amp8fmeVDhXPf8o6nxzBC/65575f34ce81cc2cca8e7dba6c5d68d8/Image_default_LessonsLearned.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6amp8fmeVDhXPf8o6nxzBC/65575f34ce81cc2cca8e7dba6c5d68d8/Image_default_LessonsLearned.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6amp8fmeVDhXPf8o6nxzBC/65575f34ce81cc2cca8e7dba6c5d68d8/Image_default_LessonsLearned.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6amp8fmeVDhXPf8o6nxzBC/65575f34ce81cc2cca8e7dba6c5d68d8/Image_default_LessonsLearned.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6amp8fmeVDhXPf8o6nxzBC/65575f34ce81cc2cca8e7dba6c5d68d8/Image_default_LessonsLearned.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Marty Friedel","slug":"marty-friedel"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":null},{"title":"A how-to guide to SVG animation","slug":"guide-svg-animation","featured":false,"lastUpdated":"Aug 29th, 2022","description":{"description":"<p>Find out different ways you can animate SVG with HTML, CSS, and JavaScript.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Find out different ways you can animate SVG with HTML, CSS, and JavaScript."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"SVG animation","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.7767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/AmJMd7T2Cbyjxwx8g4YrA/a2246d2d63ffe3542c5a5490991ab6fa/img-svg-howto-tinymce.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/AmJMd7T2Cbyjxwx8g4YrA/a2246d2d63ffe3542c5a5490991ab6fa/img-svg-howto-tinymce.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/AmJMd7T2Cbyjxwx8g4YrA/a2246d2d63ffe3542c5a5490991ab6fa/img-svg-howto-tinymce.jpg?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/AmJMd7T2Cbyjxwx8g4YrA/a2246d2d63ffe3542c5a5490991ab6fa/img-svg-howto-tinymce.jpg?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/AmJMd7T2Cbyjxwx8g4YrA/a2246d2d63ffe3542c5a5490991ab6fa/img-svg-howto-tinymce.jpg?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/AmJMd7T2Cbyjxwx8g4YrA/a2246d2d63ffe3542c5a5490991ab6fa/img-svg-howto-tinymce.jpg?w=1478&h=832&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/AmJMd7T2Cbyjxwx8g4YrA/a2246d2d63ffe3542c5a5490991ab6fa/img-svg-howto-tinymce.jpg?w=1528&h=860&q=50&fit=scale 1528w","srcWebp":"//images.ctfassets.net/s600jj41gsex/AmJMd7T2Cbyjxwx8g4YrA/a2246d2d63ffe3542c5a5490991ab6fa/img-svg-howto-tinymce.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/AmJMd7T2Cbyjxwx8g4YrA/a2246d2d63ffe3542c5a5490991ab6fa/img-svg-howto-tinymce.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/AmJMd7T2Cbyjxwx8g4YrA/a2246d2d63ffe3542c5a5490991ab6fa/img-svg-howto-tinymce.jpg?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/AmJMd7T2Cbyjxwx8g4YrA/a2246d2d63ffe3542c5a5490991ab6fa/img-svg-howto-tinymce.jpg?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/AmJMd7T2Cbyjxwx8g4YrA/a2246d2d63ffe3542c5a5490991ab6fa/img-svg-howto-tinymce.jpg?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/AmJMd7T2Cbyjxwx8g4YrA/a2246d2d63ffe3542c5a5490991ab6fa/img-svg-howto-tinymce.jpg?w=1478&h=832&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/AmJMd7T2Cbyjxwx8g4YrA/a2246d2d63ffe3542c5a5490991ab6fa/img-svg-howto-tinymce.jpg?w=1528&h=860&q=50&fm=webp&fit=scale 1528w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Juan Calou","slug":"juan-calou"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"How to create SVG animations | TinyMCE"},"metaDescription":{"metaDescription":"Guide on different ways you can animate SVG with HTML, CSS, JavaScript with detailed instructions and examples."}},{"title":"Software development trends 2023: Stack Overflow survey analysis","slug":"software-development-trends","featured":false,"lastUpdated":"Oct 4th, 2023","description":{"description":"<p>Curious about your career direction? Stack Overflow's software developer survey has some useful career insights. Read on to find out about education, business size, and AI adoption.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Curious about your career direction? Stack Overflow's software developer survey has some useful career insights. Read on to find out about education, business size, and AI adoption."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Charts and code brackets are arrayed together with a robot character completing results analysis","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAALABQDAREAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAQQHCP/EACUQAAICAQMDBAMAAAAAAAAAAAECAwQRAAUGEhMxByFBYQgikf/EABgBAAMBAQAAAAAAAAAAAAAAAAIEBQcG/8QAJhEAAgEDAgQHAAAAAAAAAAAAAQIRAAMEISIFEjFhBkFRcaGxwf/aAAwDAQACEQMRAD8ArXo5xTh/Il3ibmN9aFWt2hXJs9juM3V1DP1hf7raeOZOfYCLw8HmMzAnQR2PepOLZtsrXLo2j7+Ko+/fjbsFqtYucf3etFQtVopduee40hY+/U2Av7K2QB4xjXO43iLLtALlqWKk820DT08oI9qYbFsONhiY7/tZvKsjFXUo4OGU/B+RrSVYOoZTINR2UqSrdRQBMbB19nHhh50RAYQaHprT0XJt4ghSKPdr0cUYCpGtlwqqPAAzgD60s+Di3CWe0pJ66CjFx1GhpJpGlYu56nYkkn5OmFVUAVRAFBM6mv/Z","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/wpK4Dky9vEeRjCrUC76HV/66974732f1d0f49234f332fbc669e579/TinyMCE___-Blog_Header-_-Rework_-34-_v1.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/wpK4Dky9vEeRjCrUC76HV/66974732f1d0f49234f332fbc669e579/TinyMCE___-Blog_Header-_-Rework_-34-_v1.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/wpK4Dky9vEeRjCrUC76HV/66974732f1d0f49234f332fbc669e579/TinyMCE___-Blog_Header-_-Rework_-34-_v1.jpg?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/wpK4Dky9vEeRjCrUC76HV/66974732f1d0f49234f332fbc669e579/TinyMCE___-Blog_Header-_-Rework_-34-_v1.jpg?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/wpK4Dky9vEeRjCrUC76HV/66974732f1d0f49234f332fbc669e579/TinyMCE___-Blog_Header-_-Rework_-34-_v1.jpg?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/wpK4Dky9vEeRjCrUC76HV/66974732f1d0f49234f332fbc669e579/TinyMCE___-Blog_Header-_-Rework_-34-_v1.jpg?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/wpK4Dky9vEeRjCrUC76HV/66974732f1d0f49234f332fbc669e579/TinyMCE___-Blog_Header-_-Rework_-34-_v1.jpg?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/wpK4Dky9vEeRjCrUC76HV/66974732f1d0f49234f332fbc669e579/TinyMCE___-Blog_Header-_-Rework_-34-_v1.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/wpK4Dky9vEeRjCrUC76HV/66974732f1d0f49234f332fbc669e579/TinyMCE___-Blog_Header-_-Rework_-34-_v1.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/wpK4Dky9vEeRjCrUC76HV/66974732f1d0f49234f332fbc669e579/TinyMCE___-Blog_Header-_-Rework_-34-_v1.jpg?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/wpK4Dky9vEeRjCrUC76HV/66974732f1d0f49234f332fbc669e579/TinyMCE___-Blog_Header-_-Rework_-34-_v1.jpg?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/wpK4Dky9vEeRjCrUC76HV/66974732f1d0f49234f332fbc669e579/TinyMCE___-Blog_Header-_-Rework_-34-_v1.jpg?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/wpK4Dky9vEeRjCrUC76HV/66974732f1d0f49234f332fbc669e579/TinyMCE___-Blog_Header-_-Rework_-34-_v1.jpg?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/wpK4Dky9vEeRjCrUC76HV/66974732f1d0f49234f332fbc669e579/TinyMCE___-Blog_Header-_-Rework_-34-_v1.jpg?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Latest software development trends 2023: Stack Overflow survey | TinyMCE"},"metaDescription":{"metaDescription":"The most recent info on software development trends based Stack Overflow survey results for developers"}},{"title":"How to add rich text editor in Django ","slug":"django-tinymce","featured":false,"lastUpdated":"May 13th, 2020","description":{"description":"<p>Thanks to the django-tinymce project, built and maintained by a dedicated community of open source contributors, developers can enhance their Django apps with the power and flexibility that comes with our TinyMCE rich text editor.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Thanks to the django-tinymce project, built and maintained by a dedicated community of open source contributors, developers can enhance their Django apps with the power and flexibility that comes with our TinyMCE rich text editor."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Text \"django-tinymce\".","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAMAAAAhxq8pAAAC9FBMVEUHougGougNpekRqOkSqOkKpOgEoOgYs+siw+8eu+0GoegIo+gIn+cOo+gRpegSpegLoegHn+cFnecWr+ogvu4bt+wGnucJoOcPpOgInOcOn+cRoecSoecLnecHm+YEmOYVrOkevO0atOsIm+YNnucImOYOmuYRnOYSm+YRm+YLmeYPougXruoduewbtOsVpegTpegJmuYPluYRluYRlOYUnecNmOcHkeYHkuYIkeUIkuUTo+gctuwbtuwet+weuOwXrOoKluYRkeURkeYYp+oky+kdstwQm+QOm+gRoekPnegRoOgNmecRoOkbsuwdtOwctOwVp+oKkeYMj+UQiuUXoukn0eYo1OQjxNwix+Aj1eck0uUkzuYkzeQl0OYky+Ml0eYUoOESm+gZsOwSpOkHjOUMjOURjuURiuYPkechvuQhvtocyt0AuNkkutYQqdUAq9oOyeQZ1eEAst0AudkAidYAg+YAk+cAh+YAheUFiuYMiuYVpusKhucGfOMAjOMtodiVr+aSrONxmN9WlOhGs+Q1ptNPjOJdluZYlekpiOhZlelAjudUl+kAhuYXr+0TousIhecAhuhDqebT2+y+x9/M0+XN1Oi5xejAyujFzePU2urQ1+jCzui0wd/CzufU2uZUkOEAgecWre0RmOoIf+cAgOcAid+it+WquNyottiWqtqftOHL0uOPptmbrtqltt2puuCnuuSyvNQ0gdwAf+gQlusJeugIeegEeugAd+kAd+YAdeMAdOQAdOV/oeV7ltUAceUAdeUAd+UAeOUAe+QAeuMAfOcAfegJd+kJeOkIeOkFeOkAeOkAhuoAheoAdOkAeekAe+kCfOkHeukHeOkJduoIduoIdeoKd+oMduoKhusMou8Nou8MiOsNd+oNeeoNeuoMeOoJdOsIdOsLdesMdesMhuwPoO8Po+8RpO8So+8PiewNdusNeOsMdusIcu0Kc+0MdO0Mh+4OpPEPpvEQpvERp/ERqPERpvEOie4LdO1vg87MAAAAeElEQVQYGQXBQUrDABRAwTfhG7Q0ICb3P2JxEypUiTPKtZBXtcLz5l6IV7UCs4X89l5v4HmbO3hVtQab2QC64Fown4Br4W+A+QIAwBwAAJgDAIBmBwDAHAAQMDsA4FqYPTyuPVBhtsodQDmbrQRAzi3fFQA/H2f1D4+IFQEAslCnAAAAAElFTkSuQmCC","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/7C0UgRv1Jnh4eKxONOcOoU/615f7b30daaea58215eb692c0672c96c/Image_default_Django.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/7C0UgRv1Jnh4eKxONOcOoU/615f7b30daaea58215eb692c0672c96c/Image_default_Django.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/7C0UgRv1Jnh4eKxONOcOoU/615f7b30daaea58215eb692c0672c96c/Image_default_Django.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/7C0UgRv1Jnh4eKxONOcOoU/615f7b30daaea58215eb692c0672c96c/Image_default_Django.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/7C0UgRv1Jnh4eKxONOcOoU/615f7b30daaea58215eb692c0672c96c/Image_default_Django.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/7C0UgRv1Jnh4eKxONOcOoU/615f7b30daaea58215eb692c0672c96c/Image_default_Django.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/7C0UgRv1Jnh4eKxONOcOoU/615f7b30daaea58215eb692c0672c96c/Image_default_Django.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/7C0UgRv1Jnh4eKxONOcOoU/615f7b30daaea58215eb692c0672c96c/Image_default_Django.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/7C0UgRv1Jnh4eKxONOcOoU/615f7b30daaea58215eb692c0672c96c/Image_default_Django.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/7C0UgRv1Jnh4eKxONOcOoU/615f7b30daaea58215eb692c0672c96c/Image_default_Django.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ben Long","slug":"ben-long"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"How to add rich text editor in Django | TinyMCE"},"metaDescription":{"metaDescription":"Enhance your Django apps with the power of a WYSIWYG rich text editor, thanks to the django-tinymce project."}},{"title":"React accessibility: making your React app accessible","slug":"react-accessibility","featured":false,"lastUpdated":"Sep 6th, 2023","description":{"description":"<p>A11y best practices are essential. For a guide on getting started with accessibility in your React app, read on.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A11y best practices are essential. For a guide on getting started with accessibility in your React app, read on."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"The text area and a react app expressed in symbols on a green background","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAA5FBMVEUPqlgOqlgMqlgNqlgJqlcAqVUAqVMAqFIAqVQCqlYKqlcLqlcMqlcIqVcvq2AsqV4pq14AqE4Ap0kAqE8EqlYBqlcApUiyxKHs8uvZ59xVsHNEr2lhtYCFwqJnt4QAqEwHqlYAqlcApETMx6/f3//d3v/w9fVNr208rGS22tnR7v+62905rGMOqlcApkq+upjSzNvPydrZ3tIwrF8xq1+73eDS7/+/2+NEq2gIqlgAqlVDplFYqVJXqFFAqFMAqFEApklyuY2XxbR2tpAGqVYGqlcAqlYAqlQBqlYAp0cAqE0IqlcLeSYnAAAAdUlEQVQIHW3BsQ7BQACA4f+/qzS9dhSDZ/AA3sEz2ztKbDazwSQSoecapYvv4x8pRBwyXwJGP3K4ZQqBNCzUu416fQGCSxUn5wwV0Dk7bY5QUXTOKAS3/lxW+wwBct+2Q3o2j0Ndr/vMxBhCMKZdioxkJmRGb2rwGStd8qt6AAAAAElFTkSuQmCC","aspectRatio":1.7824074074074074,"src":"//images.ctfassets.net/s600jj41gsex/336v6qodKUybJ7KZztKyiL/cb4079e45a50a4bb3c6b0a8bd082c1ec/How_to_enrich_React_textarea_with_TinyMCE.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/336v6qodKUybJ7KZztKyiL/cb4079e45a50a4bb3c6b0a8bd082c1ec/How_to_enrich_React_textarea_with_TinyMCE.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/336v6qodKUybJ7KZztKyiL/cb4079e45a50a4bb3c6b0a8bd082c1ec/How_to_enrich_React_textarea_with_TinyMCE.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/336v6qodKUybJ7KZztKyiL/cb4079e45a50a4bb3c6b0a8bd082c1ec/How_to_enrich_React_textarea_with_TinyMCE.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/336v6qodKUybJ7KZztKyiL/cb4079e45a50a4bb3c6b0a8bd082c1ec/How_to_enrich_React_textarea_with_TinyMCE.png?w=1109&h=622&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/336v6qodKUybJ7KZztKyiL/cb4079e45a50a4bb3c6b0a8bd082c1ec/How_to_enrich_React_textarea_with_TinyMCE.png?w=1478&h=829&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/336v6qodKUybJ7KZztKyiL/cb4079e45a50a4bb3c6b0a8bd082c1ec/How_to_enrich_React_textarea_with_TinyMCE.png?w=1925&h=1080&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/336v6qodKUybJ7KZztKyiL/cb4079e45a50a4bb3c6b0a8bd082c1ec/How_to_enrich_React_textarea_with_TinyMCE.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/336v6qodKUybJ7KZztKyiL/cb4079e45a50a4bb3c6b0a8bd082c1ec/How_to_enrich_React_textarea_with_TinyMCE.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/336v6qodKUybJ7KZztKyiL/cb4079e45a50a4bb3c6b0a8bd082c1ec/How_to_enrich_React_textarea_with_TinyMCE.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/336v6qodKUybJ7KZztKyiL/cb4079e45a50a4bb3c6b0a8bd082c1ec/How_to_enrich_React_textarea_with_TinyMCE.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/336v6qodKUybJ7KZztKyiL/cb4079e45a50a4bb3c6b0a8bd082c1ec/How_to_enrich_React_textarea_with_TinyMCE.png?w=1109&h=622&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/336v6qodKUybJ7KZztKyiL/cb4079e45a50a4bb3c6b0a8bd082c1ec/How_to_enrich_React_textarea_with_TinyMCE.png?w=1478&h=829&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/336v6qodKUybJ7KZztKyiL/cb4079e45a50a4bb3c6b0a8bd082c1ec/How_to_enrich_React_textarea_with_TinyMCE.png?w=1925&h=1080&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"React accessibility: making your React app accessible | TinyMCE"},"metaDescription":{"metaDescription":"Dive into React accessibility: Understand web standards, build accessible components, learn a11y best practices, and master"}},{"title":"HTML editor with preview: single screen or side-by-side editing?","slug":"side-by-side-single-screen-wysiwyg-html-editing","featured":false,"lastUpdated":"Sep 20th, 2021","description":{"description":"<p>Side-by-side and single screen editing are two separate ways you can edit source code. WYSIWYG HTML editors running in web applications or websites typically use the single screen method for modifying any source code inside the editor. VS Code uses Side-by-side editing. An issue of trust and resources appear when thinking about implementing a side-by-side editing view in a WYSIWYG. It&rsquo;s possible to optimize TinyMCE for single screen HTML editing, and this article explains how.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Side-by-side and single screen editing are two separate ways you can edit source code. WYSIWYG HTML editors running in web applications or websites typically use the single screen method for modifying any source code inside the editor. VS Code uses Side-by-side editing. An issue of trust and resources appear when thinking about implementing a side-by-side editing view in a WYSIWYG. It’s possible to optimize TinyMCE for single screen HTML editing, and this article explains how."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"A laptop and notebook on a table, representing the single scree and side-by-side WYSIWYG HTML editing","artistName":"Mel Poole","image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.8120481927710843,"src":"//images.ctfassets.net/s600jj41gsex/59sYysl1s64w37koGAoUN9/4dd8044db633f6824cc6a39fba9c2b07/mel-poole-nuFOLbZn6KA-unsplash-BW.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/59sYysl1s64w37koGAoUN9/4dd8044db633f6824cc6a39fba9c2b07/mel-poole-nuFOLbZn6KA-unsplash-BW.jpg?w=185&h=102&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/59sYysl1s64w37koGAoUN9/4dd8044db633f6824cc6a39fba9c2b07/mel-poole-nuFOLbZn6KA-unsplash-BW.jpg?w=370&h=204&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/59sYysl1s64w37koGAoUN9/4dd8044db633f6824cc6a39fba9c2b07/mel-poole-nuFOLbZn6KA-unsplash-BW.jpg?w=739&h=408&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/59sYysl1s64w37koGAoUN9/4dd8044db633f6824cc6a39fba9c2b07/mel-poole-nuFOLbZn6KA-unsplash-BW.jpg?w=1109&h=612&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/59sYysl1s64w37koGAoUN9/4dd8044db633f6824cc6a39fba9c2b07/mel-poole-nuFOLbZn6KA-unsplash-BW.jpg?w=1478&h=816&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/59sYysl1s64w37koGAoUN9/4dd8044db633f6824cc6a39fba9c2b07/mel-poole-nuFOLbZn6KA-unsplash-BW.jpg?w=2217&h=1223&q=50&fit=scale 2217w","srcWebp":"//images.ctfassets.net/s600jj41gsex/59sYysl1s64w37koGAoUN9/4dd8044db633f6824cc6a39fba9c2b07/mel-poole-nuFOLbZn6KA-unsplash-BW.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/59sYysl1s64w37koGAoUN9/4dd8044db633f6824cc6a39fba9c2b07/mel-poole-nuFOLbZn6KA-unsplash-BW.jpg?w=185&h=102&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/59sYysl1s64w37koGAoUN9/4dd8044db633f6824cc6a39fba9c2b07/mel-poole-nuFOLbZn6KA-unsplash-BW.jpg?w=370&h=204&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/59sYysl1s64w37koGAoUN9/4dd8044db633f6824cc6a39fba9c2b07/mel-poole-nuFOLbZn6KA-unsplash-BW.jpg?w=739&h=408&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/59sYysl1s64w37koGAoUN9/4dd8044db633f6824cc6a39fba9c2b07/mel-poole-nuFOLbZn6KA-unsplash-BW.jpg?w=1109&h=612&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/59sYysl1s64w37koGAoUN9/4dd8044db633f6824cc6a39fba9c2b07/mel-poole-nuFOLbZn6KA-unsplash-BW.jpg?w=1478&h=816&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/59sYysl1s64w37koGAoUN9/4dd8044db633f6824cc6a39fba9c2b07/mel-poole-nuFOLbZn6KA-unsplash-BW.jpg?w=2217&h=1223&q=50&fm=webp&fit=scale 2217w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"HTML editor with preview: single screen or side-by-side editing? | TinyMCE"},"metaDescription":{"metaDescription":"There are two ways to check HTML code changes in real time: with the help of a single screen or a side-by-side editing preview. We'll talk about both methods and considerations for their use."}},{"title":"Easy comparison of IDE vs text editors for developers","slug":"text-editor-vs-ide-vs-code-editor","featured":false,"lastUpdated":"Jan 12th, 2023","description":{"description":"<p>Confused how IDE differs from text editor? Get clarity in this article, which explores the major differences between the two.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Confused how IDE differs from text editor? Get clarity in this article, which explores the major differences between the two."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"IDE and Text Editors separated by a large slash character to represent the divide","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABHVBMVEUMEywKESsGDioACSgABycBCygIECoMEiwLEisHDyoABCYACCgSFy4FDioAACIAAB4AABkAACECCykAACUkJzdVV143OUUbHzJUVl55e3+am556e4ABCigABSdAQkxcXmQ9P0kJESsIESsWGzBGSFFsbXOJio5tbnQAACQeIjRUVV1UVl0AASYIECsGDyoAACMAABsAABE7PUhcXWQ+QEoAAiYKEisEDSlRU1pWWF8iJjYACihFRlARFy2HiIyPkJOQkpVBQ00AAB8ABicSGC5OUFhZWmEqLTsAACBISlNub3SDhIhyc3lLTFUvMT8wM0BbXWNJS1MAABp7fIGio6acnaCFhotXWGAEDik8PkkxNEEYHDEgIzUkKDgpLDsiQMDLAAAAtElEQVQIHQXBzUoCYRhA4XOcV2f8xgqin01K1CIIail449Gqfd5BP1gGFUUmgUiT49jzCKiqVaG6bioCiraq88KkzlsQ0CTVpXuqs6MnEE5U/TxUm8z7ClrwVpZl+TFIKUVv2q2ADOqffHuR78TkoF73x3kNAkMfs373a1/V5wkIwy3V6bGqXsUvQW5Pr1fNuaKmP8iIUadzs7l8fVncnUVE+70mYLxieTEumt3v2e3g4XQD/17JNp95bZJAAAAAAElFTkSuQmCC","aspectRatio":1.7767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/0yNGl6CZizsVGScJAIfXz/08db183d82e5cc2285830849c35f1dbf/img-ide-vs-text-edtor-version2.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/0yNGl6CZizsVGScJAIfXz/08db183d82e5cc2285830849c35f1dbf/img-ide-vs-text-edtor-version2.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/0yNGl6CZizsVGScJAIfXz/08db183d82e5cc2285830849c35f1dbf/img-ide-vs-text-edtor-version2.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/0yNGl6CZizsVGScJAIfXz/08db183d82e5cc2285830849c35f1dbf/img-ide-vs-text-edtor-version2.png?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/0yNGl6CZizsVGScJAIfXz/08db183d82e5cc2285830849c35f1dbf/img-ide-vs-text-edtor-version2.png?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/0yNGl6CZizsVGScJAIfXz/08db183d82e5cc2285830849c35f1dbf/img-ide-vs-text-edtor-version2.png?w=1478&h=832&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/0yNGl6CZizsVGScJAIfXz/08db183d82e5cc2285830849c35f1dbf/img-ide-vs-text-edtor-version2.png?w=1528&h=860&q=50&fit=scale 1528w","srcWebp":"//images.ctfassets.net/s600jj41gsex/0yNGl6CZizsVGScJAIfXz/08db183d82e5cc2285830849c35f1dbf/img-ide-vs-text-edtor-version2.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/0yNGl6CZizsVGScJAIfXz/08db183d82e5cc2285830849c35f1dbf/img-ide-vs-text-edtor-version2.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/0yNGl6CZizsVGScJAIfXz/08db183d82e5cc2285830849c35f1dbf/img-ide-vs-text-edtor-version2.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/0yNGl6CZizsVGScJAIfXz/08db183d82e5cc2285830849c35f1dbf/img-ide-vs-text-edtor-version2.png?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/0yNGl6CZizsVGScJAIfXz/08db183d82e5cc2285830849c35f1dbf/img-ide-vs-text-edtor-version2.png?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/0yNGl6CZizsVGScJAIfXz/08db183d82e5cc2285830849c35f1dbf/img-ide-vs-text-edtor-version2.png?w=1478&h=832&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/0yNGl6CZizsVGScJAIfXz/08db183d82e5cc2285830849c35f1dbf/img-ide-vs-text-edtor-version2.png?w=1528&h=860&q=50&fm=webp&fit=scale 1528w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Difference between text editor and IDE and code editor | TinyMCE"},"metaDescription":{"metaDescription":"Confused how IDE differs from text editor? We’ve covered the major differences and provided examples to clarify this"}},{"title":"Modular programming: beyond the spaghetti mess","slug":"modular-programming-principle","featured":true,"lastUpdated":"Jun 28th, 2023","description":{"description":"<p>Considering a modular programming approach? We unpack this programming principle with everything software developers need to know.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Considering a modular programming approach? We unpack this programming principle with everything software developers need to know."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"A bowl of spaghetti contrasted with modular code blocks","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAABHVBMVEUW1eoV1eoU1eoW1eoV1esR1esI1esP1esU1esS1esN1esA1esV1eoO1eoA1Ooc1eoA1eoP1eoJ1esA1exR2O0z1usF1etI1ObB5u2G1eQW0ucI1epu1eaY2uOo08di094Q1esM1esA0+mI1+H29fLh4ehD0eVS1+pU0t2fzsmvz7SOzbpxz9RA0ucB1esO0+Xb7+z/+vnH4eur4+rI6vEA1OiP0Na9x6K+xpqQzc4A1uwQ1eoE1esf1eXE6emk4OwA0OWy5ObA5u0C1OZtrdyjl9uilNhosd4A1usS1utdzN4AzuQAyt9WzNtGydtbyM1AwtVLquFMreILzOUP1usU1usU1eoO1esb1OkC1esE1usA1+oO1usT1esV1utx4B6YAAAAA3RSTlP+/v6VFoksAAAAg0lEQVQIHWXBoQ6CUABA0Xt5wCTADNr8A4PfQfYvDXa/wWQyGpyBos5ZHMoTkmyeIwMhgkKMgAFw8CbTNmkBAxTqO9PXRH20YIA8K9Rnae+yOIOBYu7ItYmkQOlI1UAKVI5FSIH9bOUPYIC17qY3asXXFggJHE/Lw72ru+6Tu6Fn4N8XDY0gAXlft78AAAAASUVORK5CYII=","aspectRatio":1.780758556891767,"src":"//images.ctfassets.net/s600jj41gsex/2ZBzMsB6nN3dZynFMfQSiJ/1e98de5f4623c4866183c9c126f7f404/Modular_programming__beyond_the_spaghetti_mess.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/2ZBzMsB6nN3dZynFMfQSiJ/1e98de5f4623c4866183c9c126f7f404/Modular_programming__beyond_the_spaghetti_mess.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2ZBzMsB6nN3dZynFMfQSiJ/1e98de5f4623c4866183c9c126f7f404/Modular_programming__beyond_the_spaghetti_mess.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2ZBzMsB6nN3dZynFMfQSiJ/1e98de5f4623c4866183c9c126f7f404/Modular_programming__beyond_the_spaghetti_mess.png?w=739&h=415&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2ZBzMsB6nN3dZynFMfQSiJ/1e98de5f4623c4866183c9c126f7f404/Modular_programming__beyond_the_spaghetti_mess.png?w=1109&h=623&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2ZBzMsB6nN3dZynFMfQSiJ/1e98de5f4623c4866183c9c126f7f404/Modular_programming__beyond_the_spaghetti_mess.png?w=1478&h=830&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2ZBzMsB6nN3dZynFMfQSiJ/1e98de5f4623c4866183c9c126f7f404/Modular_programming__beyond_the_spaghetti_mess.png?w=1925&h=1081&q=50&fit=scale 1925w","srcWebp":"//images.ctfassets.net/s600jj41gsex/2ZBzMsB6nN3dZynFMfQSiJ/1e98de5f4623c4866183c9c126f7f404/Modular_programming__beyond_the_spaghetti_mess.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/2ZBzMsB6nN3dZynFMfQSiJ/1e98de5f4623c4866183c9c126f7f404/Modular_programming__beyond_the_spaghetti_mess.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2ZBzMsB6nN3dZynFMfQSiJ/1e98de5f4623c4866183c9c126f7f404/Modular_programming__beyond_the_spaghetti_mess.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2ZBzMsB6nN3dZynFMfQSiJ/1e98de5f4623c4866183c9c126f7f404/Modular_programming__beyond_the_spaghetti_mess.png?w=739&h=415&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2ZBzMsB6nN3dZynFMfQSiJ/1e98de5f4623c4866183c9c126f7f404/Modular_programming__beyond_the_spaghetti_mess.png?w=1109&h=623&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/2ZBzMsB6nN3dZynFMfQSiJ/1e98de5f4623c4866183c9c126f7f404/Modular_programming__beyond_the_spaghetti_mess.png?w=1478&h=830&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/2ZBzMsB6nN3dZynFMfQSiJ/1e98de5f4623c4866183c9c126f7f404/Modular_programming__beyond_the_spaghetti_mess.png?w=1925&h=1081&q=50&fm=webp&fit=scale 1925w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Millie Macdonald","slug":"millie-macdonald"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Modular programming: Definitions, benefits, and predictions"},"metaDescription":{"metaDescription":"Considering a modular programming approach? We unpack this programming principle with everything software developers need to know."}},{"title":"Javascript vs Python: A comparison for new web developers and rich text editors","slug":"python-vs-javascript","featured":false,"lastUpdated":"Dec 15th, 2022","description":{"description":"<p>Find out whether Python or JavaScript is better for web development and rich text editor integration</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Find out whether Python or JavaScript is better for web development and rich text editor integration"}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"JavaScript vs Python text displayed over a background with a pattern of diagonal lines","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.7767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/5bvY0hnEYIbnWk5guqtJiZ/65aa65f60cb3f14abda14145229fc1ef/img-js-v-python-ver0.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/5bvY0hnEYIbnWk5guqtJiZ/65aa65f60cb3f14abda14145229fc1ef/img-js-v-python-ver0.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5bvY0hnEYIbnWk5guqtJiZ/65aa65f60cb3f14abda14145229fc1ef/img-js-v-python-ver0.jpg?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5bvY0hnEYIbnWk5guqtJiZ/65aa65f60cb3f14abda14145229fc1ef/img-js-v-python-ver0.jpg?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5bvY0hnEYIbnWk5guqtJiZ/65aa65f60cb3f14abda14145229fc1ef/img-js-v-python-ver0.jpg?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/5bvY0hnEYIbnWk5guqtJiZ/65aa65f60cb3f14abda14145229fc1ef/img-js-v-python-ver0.jpg?w=1478&h=832&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/5bvY0hnEYIbnWk5guqtJiZ/65aa65f60cb3f14abda14145229fc1ef/img-js-v-python-ver0.jpg?w=1528&h=860&q=50&fit=scale 1528w","srcWebp":"//images.ctfassets.net/s600jj41gsex/5bvY0hnEYIbnWk5guqtJiZ/65aa65f60cb3f14abda14145229fc1ef/img-js-v-python-ver0.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/5bvY0hnEYIbnWk5guqtJiZ/65aa65f60cb3f14abda14145229fc1ef/img-js-v-python-ver0.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5bvY0hnEYIbnWk5guqtJiZ/65aa65f60cb3f14abda14145229fc1ef/img-js-v-python-ver0.jpg?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5bvY0hnEYIbnWk5guqtJiZ/65aa65f60cb3f14abda14145229fc1ef/img-js-v-python-ver0.jpg?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5bvY0hnEYIbnWk5guqtJiZ/65aa65f60cb3f14abda14145229fc1ef/img-js-v-python-ver0.jpg?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/5bvY0hnEYIbnWk5guqtJiZ/65aa65f60cb3f14abda14145229fc1ef/img-js-v-python-ver0.jpg?w=1478&h=832&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/5bvY0hnEYIbnWk5guqtJiZ/65aa65f60cb3f14abda14145229fc1ef/img-js-v-python-ver0.jpg?w=1528&h=860&q=50&fm=webp&fit=scale 1528w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Javascript vs Python: which is better for web development and rich text editors | TinyMCE"},"metaDescription":{"metaDescription":"We compare Python and JavaScript programming languages to help you decide which one to choose for web development and rich text editor integration."}},{"title":"How effective is your web application testing process? ","slug":"web-application-testing-process","featured":false,"lastUpdated":"Aug 11th, 2021","description":{"description":"<p>In this article, we take a look at normalization. A large part of the automated testing is making sure your app or website looks the same and works the same, across different browsers and operating systems. This process is called normalization.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"In this article, we take a look at normalization. A large part of the automated testing is making sure your app or website looks the same and works the same, across different browsers and operating systems. This process is called normalization."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Woman coding in her city apartment","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.4976353126642143,"src":"//images.ctfassets.net/s600jj41gsex/4SqRagiKVtUJM9PqLWrf6j/e597ec44d9103b0a42f1ed4877e73f8b/photo-1573495612937-f01934eeaaa7.jpeg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/4SqRagiKVtUJM9PqLWrf6j/e597ec44d9103b0a42f1ed4877e73f8b/photo-1573495612937-f01934eeaaa7.jpeg?w=185&h=124&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4SqRagiKVtUJM9PqLWrf6j/e597ec44d9103b0a42f1ed4877e73f8b/photo-1573495612937-f01934eeaaa7.jpeg?w=370&h=247&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4SqRagiKVtUJM9PqLWrf6j/e597ec44d9103b0a42f1ed4877e73f8b/photo-1573495612937-f01934eeaaa7.jpeg?w=739&h=493&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4SqRagiKVtUJM9PqLWrf6j/e597ec44d9103b0a42f1ed4877e73f8b/photo-1573495612937-f01934eeaaa7.jpeg?w=1109&h=741&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4SqRagiKVtUJM9PqLWrf6j/e597ec44d9103b0a42f1ed4877e73f8b/photo-1573495612937-f01934eeaaa7.jpeg?w=1478&h=987&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4SqRagiKVtUJM9PqLWrf6j/e597ec44d9103b0a42f1ed4877e73f8b/photo-1573495612937-f01934eeaaa7.jpeg?w=2217&h=1480&q=50&fit=scale 2217w,\n//images.ctfassets.net/s600jj41gsex/4SqRagiKVtUJM9PqLWrf6j/e597ec44d9103b0a42f1ed4877e73f8b/photo-1573495612937-f01934eeaaa7.jpeg?w=2850&h=1903&q=50&fit=scale 2850w","srcWebp":"//images.ctfassets.net/s600jj41gsex/4SqRagiKVtUJM9PqLWrf6j/e597ec44d9103b0a42f1ed4877e73f8b/photo-1573495612937-f01934eeaaa7.jpeg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/4SqRagiKVtUJM9PqLWrf6j/e597ec44d9103b0a42f1ed4877e73f8b/photo-1573495612937-f01934eeaaa7.jpeg?w=185&h=124&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4SqRagiKVtUJM9PqLWrf6j/e597ec44d9103b0a42f1ed4877e73f8b/photo-1573495612937-f01934eeaaa7.jpeg?w=370&h=247&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4SqRagiKVtUJM9PqLWrf6j/e597ec44d9103b0a42f1ed4877e73f8b/photo-1573495612937-f01934eeaaa7.jpeg?w=739&h=493&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4SqRagiKVtUJM9PqLWrf6j/e597ec44d9103b0a42f1ed4877e73f8b/photo-1573495612937-f01934eeaaa7.jpeg?w=1109&h=741&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4SqRagiKVtUJM9PqLWrf6j/e597ec44d9103b0a42f1ed4877e73f8b/photo-1573495612937-f01934eeaaa7.jpeg?w=1478&h=987&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4SqRagiKVtUJM9PqLWrf6j/e597ec44d9103b0a42f1ed4877e73f8b/photo-1573495612937-f01934eeaaa7.jpeg?w=2217&h=1480&q=50&fm=webp&fit=scale 2217w,\n//images.ctfassets.net/s600jj41gsex/4SqRagiKVtUJM9PqLWrf6j/e597ec44d9103b0a42f1ed4877e73f8b/photo-1573495612937-f01934eeaaa7.jpeg?w=2850&h=1903&q=50&fm=webp&fit=scale 2850w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"How effective is your web application testing process? "},"metaDescription":{"metaDescription":"In this article, we take a look at normalization. A large part of the automated testing is making sure your app or website looks the same and works the same, across different browsers and operating systems. This process is called normalization.\n"}},{"title":"A quick guide to browser selection models","slug":"a-quick-guide-to-browser-selection-models","featured":false,"lastUpdated":"Feb 20th, 2017","description":{"description":"<p>One of the complexities of writing a web-based text editor is accounting for differences between browser selection APIs.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"One of the complexities of writing a web-based text editor is accounting for differences between browser selection APIs."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Abstract image of browser tab and content.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAANABQDAREAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAABwUGCP/EACsQAAEDAwMCAwkAAAAAAAAAAAECAxEEBQYABxIhQQgUIhMVIzEzUVJhcf/EABgBAAMBAQAAAAAAAAAAAAAAAAMFBgIE/8QAKBEAAQIEAwgDAAAAAAAAAAAAAQIEAAMREgUhMRMVQVFhocHhBpLi/9oADAMBAAIRAxEAPwDaGHYCLw2uqerDSUDIKXCloEhXSPUT+/lGppu2E4XE0EXbp4G4sCaqPXxTzEyrZure+nk9KsL6oSKCTHafi66N38l9vcB3xIAzbn7/AJigXHH/ACtY6w4UuONKLalpTAUQYmO2lak2qKeUMkrC0hYFAc4XMl2mXedrshxdm9u0DtzRwTcGmfWwZSeSU8hJ6fcafhoNiqTdrxifaYyWmJSX+zCtma2nQ9Dl4gs2a8Jdz20z2mvtbuRc8mZbZda8jW0xCJUmOQJdVBH876yhimWsTAo5RT4383XjLIsy0ly6kGqRQ5cNIVqzaZNVVvPe9Cnmsqj2ExJn8tDUwuUVXdolEYqUJCbNOvqP/9k=","aspectRatio":1.5633587786259542,"src":"//images.ctfassets.net/s600jj41gsex/6zfHmjbMtiVMcClusKRcHB/086ad9a0a8049df10d1fc4dd8d887df8/iStock-609056396_A-quick-guide-to-browser-selection-models-1024x655.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6zfHmjbMtiVMcClusKRcHB/086ad9a0a8049df10d1fc4dd8d887df8/iStock-609056396_A-quick-guide-to-browser-selection-models-1024x655.jpg?w=185&h=118&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6zfHmjbMtiVMcClusKRcHB/086ad9a0a8049df10d1fc4dd8d887df8/iStock-609056396_A-quick-guide-to-browser-selection-models-1024x655.jpg?w=370&h=237&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6zfHmjbMtiVMcClusKRcHB/086ad9a0a8049df10d1fc4dd8d887df8/iStock-609056396_A-quick-guide-to-browser-selection-models-1024x655.jpg?w=739&h=473&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6zfHmjbMtiVMcClusKRcHB/086ad9a0a8049df10d1fc4dd8d887df8/iStock-609056396_A-quick-guide-to-browser-selection-models-1024x655.jpg?w=1024&h=655&q=50&fit=scale 1024w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6zfHmjbMtiVMcClusKRcHB/086ad9a0a8049df10d1fc4dd8d887df8/iStock-609056396_A-quick-guide-to-browser-selection-models-1024x655.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6zfHmjbMtiVMcClusKRcHB/086ad9a0a8049df10d1fc4dd8d887df8/iStock-609056396_A-quick-guide-to-browser-selection-models-1024x655.jpg?w=185&h=118&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6zfHmjbMtiVMcClusKRcHB/086ad9a0a8049df10d1fc4dd8d887df8/iStock-609056396_A-quick-guide-to-browser-selection-models-1024x655.jpg?w=370&h=237&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6zfHmjbMtiVMcClusKRcHB/086ad9a0a8049df10d1fc4dd8d887df8/iStock-609056396_A-quick-guide-to-browser-selection-models-1024x655.jpg?w=739&h=473&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6zfHmjbMtiVMcClusKRcHB/086ad9a0a8049df10d1fc4dd8d887df8/iStock-609056396_A-quick-guide-to-browser-selection-models-1024x655.jpg?w=1024&h=655&q=50&fm=webp&fit=scale 1024w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Team Tiny","slug":"team-tiny"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":null},{"title":"Handling undo functions in rich text editors","slug":"undo-function-handling","featured":false,"lastUpdated":"May 16th, 2022","description":{"description":"<p>Undo redo in a rich text editor can be complicated, so this article explains how it works, and how to implement undo in TinyMCE with the Undo Manager API.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Undo redo in a rich text editor can be complicated, so this article explains how it works, and how to implement undo in TinyMCE with the Undo Manager API."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Undo functionality represented by writing and circular arrow symbols","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.7767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/IICBKTjU9L8gUFJukA9Uf/962ce44ac46123e01dcb3472d516359b/Image_TInyMCE_Undo_Functionality2.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/IICBKTjU9L8gUFJukA9Uf/962ce44ac46123e01dcb3472d516359b/Image_TInyMCE_Undo_Functionality2.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/IICBKTjU9L8gUFJukA9Uf/962ce44ac46123e01dcb3472d516359b/Image_TInyMCE_Undo_Functionality2.jpg?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/IICBKTjU9L8gUFJukA9Uf/962ce44ac46123e01dcb3472d516359b/Image_TInyMCE_Undo_Functionality2.jpg?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/IICBKTjU9L8gUFJukA9Uf/962ce44ac46123e01dcb3472d516359b/Image_TInyMCE_Undo_Functionality2.jpg?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/IICBKTjU9L8gUFJukA9Uf/962ce44ac46123e01dcb3472d516359b/Image_TInyMCE_Undo_Functionality2.jpg?w=1478&h=832&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/IICBKTjU9L8gUFJukA9Uf/962ce44ac46123e01dcb3472d516359b/Image_TInyMCE_Undo_Functionality2.jpg?w=1528&h=860&q=50&fit=scale 1528w","srcWebp":"//images.ctfassets.net/s600jj41gsex/IICBKTjU9L8gUFJukA9Uf/962ce44ac46123e01dcb3472d516359b/Image_TInyMCE_Undo_Functionality2.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/IICBKTjU9L8gUFJukA9Uf/962ce44ac46123e01dcb3472d516359b/Image_TInyMCE_Undo_Functionality2.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/IICBKTjU9L8gUFJukA9Uf/962ce44ac46123e01dcb3472d516359b/Image_TInyMCE_Undo_Functionality2.jpg?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/IICBKTjU9L8gUFJukA9Uf/962ce44ac46123e01dcb3472d516359b/Image_TInyMCE_Undo_Functionality2.jpg?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/IICBKTjU9L8gUFJukA9Uf/962ce44ac46123e01dcb3472d516359b/Image_TInyMCE_Undo_Functionality2.jpg?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/IICBKTjU9L8gUFJukA9Uf/962ce44ac46123e01dcb3472d516359b/Image_TInyMCE_Undo_Functionality2.jpg?w=1478&h=832&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/IICBKTjU9L8gUFJukA9Uf/962ce44ac46123e01dcb3472d516359b/Image_TInyMCE_Undo_Functionality2.jpg?w=1528&h=860&q=50&fm=webp&fit=scale 1528w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ravgeet Dhillon","slug":"ravgeet-dhillon"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Handling undo function in rich text editors | TinyMCE"},"metaDescription":{"metaDescription":"Undo redo function implementation in a rich text editor can be complicated. Learn how to implement undo in TinyMCE with Undo Manager API"}},{"title":"Benefits of gradual strong typing in JavaScript","slug":"benefits-of-gradual-strong-typing-in-javascript","featured":false,"lastUpdated":"Jan 24th, 2019","description":{"description":"<p>Engineer Andy Herron tells the story of the migration to vanilla ES5 at Tiny, and explores the future of TinyMCE with TypeScript. We also share Millie Macdonald's presentation at ForwardJS 2019.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Engineer Andy Herron tells the story of the migration to vanilla ES5 at Tiny, and explores the future of TinyMCE with TypeScript. We also share Millie Macdonald's presentation at ForwardJS 2019."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Developer coding on mac","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAANABQDAREAAhEBAxEB/8QAFgAAAwAAAAAAAAAAAAAAAAAABQYH/8QAJxAAAQQBBAECBwAAAAAAAAAAAQIDBBEFAAYHEiETMRQiMkFCYYH/xAAZAQACAwEAAAAAAAAAAAAAAAAEBQECAwb/xAAhEQACAgIBBAMAAAAAAAAAAAABAgADBBEhEjFBUYGRwf/aAAwDAQACEQMRAD8AXuNZ0XYe68TkDKE1t/vCkMMG1lKx2SqgRdKQB7/kdK8OxjYUI4MdZ1StWG9Sn5znU7ecMaNhZCJgaU70n9WKTfhRAs1760uayngjcHw8FchSzPoD7k03tuHa3MeVZzuS2w1Ifbjoihxbqz2CSVeCEURaz5Gq2WVo3S7AH5M0qw8ll3Rsqe3j9gHinHRpm4bksNyWwk206nsk/wA1FPB3CrORqGOVMCmVhn4kWS9AZWikhshfp+b+TtfUfoUNEXXMB0+IPTUpbY4izxvkVYzacXHugzfgiWEPOkBRQPpvx9ga0ltALE6nRYzkVgep/9k=","aspectRatio":1.510185185185185,"src":"//images.ctfassets.net/s600jj41gsex/U4IZCLq00wIhd4eQe9yd6/d2895fc649d487c792bf2e6864a80277/pexels-photo-574071-1.jpeg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/U4IZCLq00wIhd4eQe9yd6/d2895fc649d487c792bf2e6864a80277/pexels-photo-574071-1.jpeg?w=185&h=123&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/U4IZCLq00wIhd4eQe9yd6/d2895fc649d487c792bf2e6864a80277/pexels-photo-574071-1.jpeg?w=370&h=245&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/U4IZCLq00wIhd4eQe9yd6/d2895fc649d487c792bf2e6864a80277/pexels-photo-574071-1.jpeg?w=739&h=489&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/U4IZCLq00wIhd4eQe9yd6/d2895fc649d487c792bf2e6864a80277/pexels-photo-574071-1.jpeg?w=1109&h=734&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/U4IZCLq00wIhd4eQe9yd6/d2895fc649d487c792bf2e6864a80277/pexels-photo-574071-1.jpeg?w=1478&h=979&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/U4IZCLq00wIhd4eQe9yd6/d2895fc649d487c792bf2e6864a80277/pexels-photo-574071-1.jpeg?w=1631&h=1080&q=50&fit=scale 1631w","srcWebp":"//images.ctfassets.net/s600jj41gsex/U4IZCLq00wIhd4eQe9yd6/d2895fc649d487c792bf2e6864a80277/pexels-photo-574071-1.jpeg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/U4IZCLq00wIhd4eQe9yd6/d2895fc649d487c792bf2e6864a80277/pexels-photo-574071-1.jpeg?w=185&h=123&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/U4IZCLq00wIhd4eQe9yd6/d2895fc649d487c792bf2e6864a80277/pexels-photo-574071-1.jpeg?w=370&h=245&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/U4IZCLq00wIhd4eQe9yd6/d2895fc649d487c792bf2e6864a80277/pexels-photo-574071-1.jpeg?w=739&h=489&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/U4IZCLq00wIhd4eQe9yd6/d2895fc649d487c792bf2e6864a80277/pexels-photo-574071-1.jpeg?w=1109&h=734&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/U4IZCLq00wIhd4eQe9yd6/d2895fc649d487c792bf2e6864a80277/pexels-photo-574071-1.jpeg?w=1478&h=979&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/U4IZCLq00wIhd4eQe9yd6/d2895fc649d487c792bf2e6864a80277/pexels-photo-574071-1.jpeg?w=1631&h=1080&q=50&fm=webp&fit=scale 1631w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Andrew Herron","slug":"andrew-herron"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":null},{"title":"How to select and highlight text in rich text editors","slug":"select-and-highlight-text","featured":false,"lastUpdated":"Jun 20th, 2022","description":{"description":"<p>Dive into the complex cases of text selection and highlighting in text editors, find out how they work, and solutions to common problems.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Dive into the complex cases of text selection and highlighting in text editors, find out how they work, and solutions to common problems."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Highlight and select text show with highlighting and selection elements","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.7767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/4t4ougkRDOLfpI4ybW1MYA/97d3818532313f3fdaf94f68ac39cf88/img-without-background-icons-tinymce-selection.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/4t4ougkRDOLfpI4ybW1MYA/97d3818532313f3fdaf94f68ac39cf88/img-without-background-icons-tinymce-selection.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4t4ougkRDOLfpI4ybW1MYA/97d3818532313f3fdaf94f68ac39cf88/img-without-background-icons-tinymce-selection.jpg?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4t4ougkRDOLfpI4ybW1MYA/97d3818532313f3fdaf94f68ac39cf88/img-without-background-icons-tinymce-selection.jpg?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4t4ougkRDOLfpI4ybW1MYA/97d3818532313f3fdaf94f68ac39cf88/img-without-background-icons-tinymce-selection.jpg?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4t4ougkRDOLfpI4ybW1MYA/97d3818532313f3fdaf94f68ac39cf88/img-without-background-icons-tinymce-selection.jpg?w=1478&h=832&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4t4ougkRDOLfpI4ybW1MYA/97d3818532313f3fdaf94f68ac39cf88/img-without-background-icons-tinymce-selection.jpg?w=1528&h=860&q=50&fit=scale 1528w","srcWebp":"//images.ctfassets.net/s600jj41gsex/4t4ougkRDOLfpI4ybW1MYA/97d3818532313f3fdaf94f68ac39cf88/img-without-background-icons-tinymce-selection.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/4t4ougkRDOLfpI4ybW1MYA/97d3818532313f3fdaf94f68ac39cf88/img-without-background-icons-tinymce-selection.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4t4ougkRDOLfpI4ybW1MYA/97d3818532313f3fdaf94f68ac39cf88/img-without-background-icons-tinymce-selection.jpg?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4t4ougkRDOLfpI4ybW1MYA/97d3818532313f3fdaf94f68ac39cf88/img-without-background-icons-tinymce-selection.jpg?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4t4ougkRDOLfpI4ybW1MYA/97d3818532313f3fdaf94f68ac39cf88/img-without-background-icons-tinymce-selection.jpg?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4t4ougkRDOLfpI4ybW1MYA/97d3818532313f3fdaf94f68ac39cf88/img-without-background-icons-tinymce-selection.jpg?w=1478&h=832&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4t4ougkRDOLfpI4ybW1MYA/97d3818532313f3fdaf94f68ac39cf88/img-without-background-icons-tinymce-selection.jpg?w=1528&h=860&q=50&fm=webp&fit=scale 1528w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Keanan Koppenhaver","slug":"keanan-koppenhaver"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"How to select and highlight text in rich text editors | TinyMCE"},"metaDescription":{"metaDescription":"In this article we have a deep dive into complex cases of text selection and highlighting in text editors and explain possible solutions."}},{"title":"Five common mistakes to avoid when using Angular","slug":"five-common-mistakes-to-avoid-when-using-angular","featured":false,"lastUpdated":"Jul 1st, 2020","description":{"description":"<p>Front-end frameworks like Angular enable developers to build scalable applications that can run on multiple device types. This article highlights five common mistakes to avoid when using Angular.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Front-end frameworks like Angular enable developers to build scalable applications that can run on multiple device types. This article highlights five common mistakes to avoid when using Angular."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Angular logo and a number 5.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAMAAAAhxq8pAAACwVBMVEUGFDgGEzcFATIAAAAmtbk5/v84+vw4+/04/f8dkZYIEjgMGTwHFTkHFDkFADMCAAotzdE5//84/P4WdXsEABkMFjwIFjoIFjsHFDoGADEMFT0y4eQ29PY06+007e817/Ey4+UPUVsMADEIFDsIFzwIFDwLADEUTmA17/IkrrIFEDILOEsMPU4MP1AMQ1MOQlIIADEIDToLGT4OHEEIFz4JGD4OGUEMAC0bdYA3+fsahosEABsCAAAIACwMADcIDjsPHkMSIUYIGD8JGUAMHUMMGUMAACAblp43/v8x4OIx3+Iw294pvsMZcn4KACoIADcJFT4OHkQQIEURIEUJGUEKHEQAFkIAADQArbMi//8v/v82/f84//839fchm6IGACUPE0ERIEYRIUYLHkYAFUQACUBYWmqloqiwwsh7zNJI4uUu9PY1+vw18fMVX2sPADgRH0cRIUgPH0YGHUgAADWPkZn5+fn//v65t77Py9TAw8tWgYsAdn8jp6006+4hoqYMACUSHkgPH0cLG0QAGUcAACqVlp7////e3uCAgo7AwszP0NlTS2MAABYEAAAdiJI4+fsms7YJABoQG0gMHEYLG0YAFUUAADJ6fIj8/Pylpq2LjpmUl6TGyNI7P1sAAD4EACsUWWs5/f8ipKgGABkMGEYMHEcCGUcAADxgYnPf3uHW1Nfe3uOkoq6vrbghAEIAADEEAAIjmKEXd30GAC0MGkgMHkkJHUoAEUaDl6Df7O3j3+SlwstewskAZXYKPVohjpk17O8v2NoFBS8LAEINHUoNHksPIU0JHEsAXHA94+Zl4OQq8fQo//8z8/U07fAWdHoGACgNGUsOH0wOIE4PIU8LFUoZrbYq/P40//83/P4y5ugZgIYNEkoOH04OIU8RHk8PAEYKADoflqEw3+M29vk39vgy4uUKOUgNAEcOHE7hp+U3AAAAvElEQVQYGQXBsS4DcQAH4N8X/0S4O64dPQSJRbvWaqytW3eGLhIPYOgbeAOJ1TuoUbCbmpgk2hskcr5PEiBJgt9d6gR01U+SuqtRqgQ6+5XEITalSeArDYC2tAE7/WA1eh5jWzMBXjbnAJji8RKekgsQcwDfD00/AxYAuGv6KygDACxv9oZQhgC4vb8eImUAgG6+bJHSWh8B9PUppLTWLXBWZXaAxBuvJzj+Sz6MVrqkVDGG/tOkmb7bVsk/aYcqACyFa5sAAAAASUVORK5CYII=","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/5jvgQr5vdDWm9WguPC86YD/28a889ef6992534b85997557aa5ef664/Image_default_5angular-mistakes.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/5jvgQr5vdDWm9WguPC86YD/28a889ef6992534b85997557aa5ef664/Image_default_5angular-mistakes.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5jvgQr5vdDWm9WguPC86YD/28a889ef6992534b85997557aa5ef664/Image_default_5angular-mistakes.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5jvgQr5vdDWm9WguPC86YD/28a889ef6992534b85997557aa5ef664/Image_default_5angular-mistakes.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5jvgQr5vdDWm9WguPC86YD/28a889ef6992534b85997557aa5ef664/Image_default_5angular-mistakes.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/5jvgQr5vdDWm9WguPC86YD/28a889ef6992534b85997557aa5ef664/Image_default_5angular-mistakes.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/5jvgQr5vdDWm9WguPC86YD/28a889ef6992534b85997557aa5ef664/Image_default_5angular-mistakes.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5jvgQr5vdDWm9WguPC86YD/28a889ef6992534b85997557aa5ef664/Image_default_5angular-mistakes.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5jvgQr5vdDWm9WguPC86YD/28a889ef6992534b85997557aa5ef664/Image_default_5angular-mistakes.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5jvgQr5vdDWm9WguPC86YD/28a889ef6992534b85997557aa5ef664/Image_default_5angular-mistakes.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ben Long","slug":"ben-long"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":null},{"title":"An Angular 5 tutorial: step-by-step guide to your first Angular 5 app","slug":"angular-5-tutorial-step-step-guide-first-angular-5-app","featured":false,"lastUpdated":"Feb 21st, 2018","description":{"description":"<p>Get to know Angular 5 by building a simple notes application in this tutorial. Guest author Sergey Moiseev walks through the basics of using the Angular CLI, working with forms, and more.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Get to know Angular 5 by building a simple notes application in this tutorial. Guest author Sergey Moiseev walks through the basics of using the Angular CLI, working with forms, and more."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Build a simple notes app with Angular 5","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAMAAACDi47UAAABVlBMVEUPJW4PJG4OJW4LJG4AJW4AJG4AJW8AI28AIW8GJG4PJG0PLHIOLHMBKnIbKnQxIm0AM3QAMXRfNm6BOmkmIGsPJW8PJ28PK3IPK3MOKHQAI3ZYPHq0Kk6cJlZlFWGsRmHWbnNnGGIAJnINJW4PJnAPKXEQMHUQKnQNKHkAD3RvdpvYlJnJAAC3ADlxKmeINWUxKHAAKXgPKHUPJm8PJXAPKHAPKXAMKHgAFXViWojnyczLM0GwADgAJ3EAJ3IAJ3AMKHYPJ3MNKHgAFnNfVYXw3uDfmZylADQAIW4MJG0QKXcQKHYQJ3MPJnEQL3UQLXQOKnoAJHhRGW7QdX3mr7CWCE8EJW4RKXcPJnIPJ3AOKXMAJ3dVIHC1ADaOJlo2HmoLJW4QKHUOJG4PLnQAKnIqLXVCJGsAIG4IJG4OJG0RJm4eLnEOJm8KJW4AJm8NJG4eLXBBSnwKquyNAAAAl0lEQVQI12NkAAHG/0yMjIwMQPyX5ec/BhawGCcjHHwE8YFYlBEF3AUKivIzoAp+esbCIPdRgJHxHzNCTPYZE8NHhg8M7xm4IeA4F5ckNwMzA7Phn4+afBxg8Mtgs+Ev3pvMDN/eM/B/FWcDg03Gn1W+CwgzQpzkzwUybl7yrH+MGYyMzGDH/7lszco65zzL63cMDNYsLAB9+CYdo6OwpAAAAABJRU5ErkJggg==","aspectRatio":1.9104477611940298,"src":"//images.ctfassets.net/s600jj41gsex/2T9SRFBlKsWAuFrOFm2YQR/1a4843866b0cf3642e355e17a332e03a/toptal-blog-image-1518187252525-03f6db7b1c131066061024c236c7e3ff-1024x536.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/2T9SRFBlKsWAuFrOFm2YQR/1a4843866b0cf3642e355e17a332e03a/toptal-blog-image-1518187252525-03f6db7b1c131066061024c236c7e3ff-1024x536.png?w=185&h=97&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2T9SRFBlKsWAuFrOFm2YQR/1a4843866b0cf3642e355e17a332e03a/toptal-blog-image-1518187252525-03f6db7b1c131066061024c236c7e3ff-1024x536.png?w=370&h=194&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2T9SRFBlKsWAuFrOFm2YQR/1a4843866b0cf3642e355e17a332e03a/toptal-blog-image-1518187252525-03f6db7b1c131066061024c236c7e3ff-1024x536.png?w=739&h=387&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2T9SRFBlKsWAuFrOFm2YQR/1a4843866b0cf3642e355e17a332e03a/toptal-blog-image-1518187252525-03f6db7b1c131066061024c236c7e3ff-1024x536.png?w=1024&h=536&q=50&fit=scale 1024w","srcWebp":"//images.ctfassets.net/s600jj41gsex/2T9SRFBlKsWAuFrOFm2YQR/1a4843866b0cf3642e355e17a332e03a/toptal-blog-image-1518187252525-03f6db7b1c131066061024c236c7e3ff-1024x536.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/2T9SRFBlKsWAuFrOFm2YQR/1a4843866b0cf3642e355e17a332e03a/toptal-blog-image-1518187252525-03f6db7b1c131066061024c236c7e3ff-1024x536.png?w=185&h=97&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2T9SRFBlKsWAuFrOFm2YQR/1a4843866b0cf3642e355e17a332e03a/toptal-blog-image-1518187252525-03f6db7b1c131066061024c236c7e3ff-1024x536.png?w=370&h=194&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2T9SRFBlKsWAuFrOFm2YQR/1a4843866b0cf3642e355e17a332e03a/toptal-blog-image-1518187252525-03f6db7b1c131066061024c236c7e3ff-1024x536.png?w=739&h=387&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2T9SRFBlKsWAuFrOFm2YQR/1a4843866b0cf3642e355e17a332e03a/toptal-blog-image-1518187252525-03f6db7b1c131066061024c236c7e3ff-1024x536.png?w=1024&h=536&q=50&fm=webp&fit=scale 1024w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Sergey Moiseev","slug":"sergey-moiseev"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":null},{"title":"Six common mistakes to avoid when using React","slug":"six-common-mistakes-to-avoid-when-using-react","featured":false,"lastUpdated":"Jun 1st, 2020","description":{"description":"<p>React is an excellent JavaScript library for building user interfaces. However, if you don't use React properly, you could end up creating more problems than you solve. So, here are six common mistakes to avoid when using React.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"React is an excellent JavaScript library for building user interfaces. However, if you don't use React properly, you could end up creating more problems than you solve. So, here are six common mistakes to avoid when using React."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Number 6 with React logo inside.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAMAAAAhxq8pAAACTFBMVEUGFDgGETcFAC8AAAAXhIwv9/ow+/4w+v0x/v8Ue4EEACEGEjcHFTgJFzoKGDsHFTkHDjcEACIKNksq3uIx/f8huLwDABAGADIHEzkIFjoKFzsMGT0LGT0IFjsIEzoEAA0ht70p2t0FAy8DAAAGAC4HCDcHEjkIFTsMGz8OHEAIFz0IFjwICjkEABEXfogv9fkx/P8v9fgcn6QTbHcRYW4IH0AEAA8HADAMFD4MGT8NG0AIFz4IEz0ML0oq3eEx//8v+Psv9Pcw+Psv9Pgq4OQeo6oNJEUKAC0IDTsLGT8PH0QIFj8ICDsIABwhq7Iw/P4w/P8nz9QMPVQJADAPG0MQH0UIEj8KADQUTGAt6u4w/f8u9/olxcoOADcQC0ARHUUMDkAOACofm6Qs7vAUp60AbnwAbn8XqLEs7vEZfokPADIRGEURC0IQADEnyM4u9fgDgosnAD9eVHReU3MoAEYQhZYkvsMOB0ESAEIOAEAp3OAm19oAADhxcIiztLuzs7lxbXwAADUo2N0p2d0LADcKADwOAD4MFkUr4eUiy88VAEONjZrBwsaNjJUUACQjzNEq4OMJET8KAD0MAEAp2d4p4uYAF1RWS2WdnaRWS2AADEEq4uco2dwIADUMAEEPDUYLADAju8Iw+/0ftr8NBUglACglACkIAD4etbwiu78IACcMCUYNF0oOADwYdYUo3OAbuL8n2+Av+/4Uc3wLADkOHU0ODkkjtr4htbkIAC4OD0oOHk0OIE8OGU0MAD4RAEgnx84kxsoIADEOGk6yTaD4AAAA9UlEQVQYGS3BMU4CQRiG4e9dx4UM889CYWEMFZ3G0nADA3QGb2BjYqW3MV7BWJgoQT0AHMDYWhILo4sJkijrIjwPklj7dZSmimQSS9MiMWDmARfFvMpkQTRKEfhyxlL9RU3WPpuuwWQbRlLGWh1Xp8HDAilDr9m4S8nVAKGuR8Xude+9CWwcpOngm35M07RSbd3uv+1UKkkIYY/Olv177gwKm4UkhDDWMKz0h5K1oosgKQICpPEROCuS9igEQECYtgMkIZqu8nMzizGe5YXMLDGzjwu6J7Wa975HzL2HO2b+8p7i+EYhp+idUnqidIhWikd+Nud/Q2E7t+RGtD4AAAAASUVORK5CYII=","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/1KcZaJy3VX0YikyVL3rN6e/27e982f3f25644551ec376bf54b0950d/Image_default_ReactMistakes.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/1KcZaJy3VX0YikyVL3rN6e/27e982f3f25644551ec376bf54b0950d/Image_default_ReactMistakes.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1KcZaJy3VX0YikyVL3rN6e/27e982f3f25644551ec376bf54b0950d/Image_default_ReactMistakes.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1KcZaJy3VX0YikyVL3rN6e/27e982f3f25644551ec376bf54b0950d/Image_default_ReactMistakes.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1KcZaJy3VX0YikyVL3rN6e/27e982f3f25644551ec376bf54b0950d/Image_default_ReactMistakes.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/1KcZaJy3VX0YikyVL3rN6e/27e982f3f25644551ec376bf54b0950d/Image_default_ReactMistakes.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/1KcZaJy3VX0YikyVL3rN6e/27e982f3f25644551ec376bf54b0950d/Image_default_ReactMistakes.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1KcZaJy3VX0YikyVL3rN6e/27e982f3f25644551ec376bf54b0950d/Image_default_ReactMistakes.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1KcZaJy3VX0YikyVL3rN6e/27e982f3f25644551ec376bf54b0950d/Image_default_ReactMistakes.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1KcZaJy3VX0YikyVL3rN6e/27e982f3f25644551ec376bf54b0950d/Image_default_ReactMistakes.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ben Long","slug":"ben-long"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Six common mistakes to avoid when using React"},"metaDescription":null},{"title":"A guide to npm: The node.js package manager","slug":"a-guide-to-npm-the-node-js-package-manager","featured":false,"lastUpdated":"Feb 22nd, 2023","description":{"description":"<p>Toptal Developer Martin Gouws walks through the in's and out's of working with npm. Read on to find out how to get the most out of npm.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toptal Developer Martin Gouws walks through the in's and out's of working with npm. Read on to find out how to get the most out of npm."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"npm logo appearing on a grid background.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAAolBMVEUXIk8WIk8TIU8OIE8JH04IHk4RIU8AGk0AAEMAAEAAAD4AAD8AAEQSIU8AHU5HIEu6kJW+j5S/l5u8i5DDn6O5i5BII00VIU8AG01dMVHtysryyMf95uXyzcz10dDmtbRdNVMAG04CH08xG0t/S1+YWWa2iI6IUGGCSV1/Q1gxHkwUIU8AHk4ADUsAAEgAAEIAB0oAE0wAH04PIE8QIE8VIk9NEVuMAAAAVUlEQVQI12NgwAIYkRn/UQQZQYDhPwiAuCxgQVaw6H+m32yf4YKMHIwQwPWD8T9MuzgjHHx7CRNkVISJ/bj/H6b9PyfESBCB5DJxJmNmE14mUwYSAQAJkhP45oV4xAAAAABJRU5ErkJggg==","aspectRatio":1.7777777777777777,"src":"//images.ctfassets.net/s600jj41gsex/73Ay6sAygYK8Yzyf2i5z0j/e8ec8c9f403a22f0388820da22222c81/npm_guide.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/73Ay6sAygYK8Yzyf2i5z0j/e8ec8c9f403a22f0388820da22222c81/npm_guide.png?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/73Ay6sAygYK8Yzyf2i5z0j/e8ec8c9f403a22f0388820da22222c81/npm_guide.png?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/73Ay6sAygYK8Yzyf2i5z0j/e8ec8c9f403a22f0388820da22222c81/npm_guide.png?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/73Ay6sAygYK8Yzyf2i5z0j/e8ec8c9f403a22f0388820da22222c81/npm_guide.png?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/73Ay6sAygYK8Yzyf2i5z0j/e8ec8c9f403a22f0388820da22222c81/npm_guide.png?w=1478&h=831&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/73Ay6sAygYK8Yzyf2i5z0j/e8ec8c9f403a22f0388820da22222c81/npm_guide.png?w=1920&h=1080&q=50&fit=scale 1920w","srcWebp":"//images.ctfassets.net/s600jj41gsex/73Ay6sAygYK8Yzyf2i5z0j/e8ec8c9f403a22f0388820da22222c81/npm_guide.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/73Ay6sAygYK8Yzyf2i5z0j/e8ec8c9f403a22f0388820da22222c81/npm_guide.png?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/73Ay6sAygYK8Yzyf2i5z0j/e8ec8c9f403a22f0388820da22222c81/npm_guide.png?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/73Ay6sAygYK8Yzyf2i5z0j/e8ec8c9f403a22f0388820da22222c81/npm_guide.png?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/73Ay6sAygYK8Yzyf2i5z0j/e8ec8c9f403a22f0388820da22222c81/npm_guide.png?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/73Ay6sAygYK8Yzyf2i5z0j/e8ec8c9f403a22f0388820da22222c81/npm_guide.png?w=1478&h=831&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/73Ay6sAygYK8Yzyf2i5z0j/e8ec8c9f403a22f0388820da22222c81/npm_guide.png?w=1920&h=1080&q=50&fm=webp&fit=scale 1920w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Martin Gouws","slug":"martin-gouws"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"A guide to npm: How to install & configure npm for your project | TinyMCE"},"metaDescription":{"metaDescription":"npm is an essential tool for modern web development. It allows us to install and manage packages from npmjs.org. In this guide, we'll show you how to install and configure it for your project. A guide to npm: How to install & configure npm for your project"}},{"title":"4 essential skills developers can learn from doing QA","slug":"software-developer-skills-learned-from-qa","featured":false,"lastUpdated":"Aug 26th, 2020","description":{"description":"<p>Whether you&rsquo;re looking to improve your software developer skills, starting your first software developer job, or thinking about switching from QA to development, here are 4 essential developer skills you can learn from doing QA.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Whether you’re looking to improve your software developer skills, starting your first software developer job, or thinking about switching from QA to development, here are 4 essential developer skills you can learn from doing QA."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Photograph of chess pieces on a chess board. Image by Wooden Earth Ltd (https://www.woodenearth.com/)","artistName":"Image by Wooden Earth Ltd","image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAD2ElEQVQYGQXBWY8aBQDA8T/DDAMMsMuyLLuw3Ysea2rr1o2N9Ypp1USfmpr65GvjB/DF+Cn8DNr6YqI1JvrSRI090jQ9d7vdwlLOcg4DDDAHMzD+fr5+v+/alkG9XuW/23/z6MkzVjOb7J6/wM7ZsyQWFhAEAdMY02o1qFSKRGMLZNIZXNchf5Rnfj5BSJYpvTxAtEzDr/W71BtVOp0G81GFSEhGkXxMDB1dAFGS8PCQZYlYNEo4JCP6fXjTGWqjjN7rsbS0TKFYQayUC+TzLynk9lBrNWQ5QlyyiL2+R/3uTwQkP5HYHKOTlxj5AmidJqLoZ9hfwjJH5PYeoKoG6bUtqpUKYnHvLr3qEVKvTdg1MMZDpokJE72Mc3SXaAxCCrxo98hPFygWDogoQdaXE/S6HTwvwLISwmzmsDUVcSeb5lHxMdPWAevxNK2gQ0tzyCgicVFkaro0/ZB6/xLiJMCN67/y1okM6ZlNVoG13Q8YeTKWabLSVhHHh3/SeHgTo22xdRra4TBda8Rjv8ylZJbI7CUPfW/SfLTPi1ybw1qDw1qD/naGby7vEvNGDFw/A2PG1B9GNLsVMnGZlm7hOUOqTZueNcFLJRDWFAI+cHWL2v4tfvt9HwCAUFhgNLbptlU6MyipFmIwjMDKRWZLH1LqgBt8g1R4g0DgBMnoJsLMh2vDavojrly9xvffXgMAICpJjI0pPd1hPhIhu5ZiagwQnz58itTe41gG1o8leO/iFYgkkLGp3/yBvgo7n3xMbeJH1YYAALR0k0BQZvvtHWaSwsj1o6tNxJVFCduQEQ2RmRyk8uwBieQiyuoWw/GEYRecf35B8/xQfA7A7kqQTWWEo1UZNYpoA5tGd0AhX0LczGYpjzX65Rxur0mlVIXjccyDvwjpt0lmIR75g5j/M9KZDWBAcm7KxlIA7C7aqz3MmYCtjRDtPsLyqXdoa2NKDXAmFhc/3eL0uTM4yklKFahWoV6LsLyWYmlRAkwauktnYNPqqOgjm9VEkOOLcDzuIdQKBbTmIZ4Cxee3wduA0Cla1fsISXBDoFkSe81j/Jv3AUPKA4/eZA6HCEf795CTG7x7+Ws+v/ol4v2fv2NqAT7o1UFIZEltn+GLr84zdVLMvDDdlo8f72jcuPMagP54Qk4XUEQFp9bFim5jJy/g+FSEV5NzlPsxGj3oVaBRazMyfKglgfqTIt18g3lxijJ6AIMnAIBFrlxmoDcxmlDLHzCxDHTTRaibLkpygaEfHpvwrG5QH0u0pAvcut5lqENwcR3DFwcAACAgy9izIMMZjB0Pz7WZEwb8D0cf9Q/ExMdbAAAAAElFTkSuQmCC","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/7zZ4oY9AQgCkpPpdUfH8Hl/999b3e7a97cb7a6e4cfa0dd5069fe102/Image_default_4-dev-skills.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/7zZ4oY9AQgCkpPpdUfH8Hl/999b3e7a97cb7a6e4cfa0dd5069fe102/Image_default_4-dev-skills.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/7zZ4oY9AQgCkpPpdUfH8Hl/999b3e7a97cb7a6e4cfa0dd5069fe102/Image_default_4-dev-skills.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/7zZ4oY9AQgCkpPpdUfH8Hl/999b3e7a97cb7a6e4cfa0dd5069fe102/Image_default_4-dev-skills.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/7zZ4oY9AQgCkpPpdUfH8Hl/999b3e7a97cb7a6e4cfa0dd5069fe102/Image_default_4-dev-skills.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/7zZ4oY9AQgCkpPpdUfH8Hl/999b3e7a97cb7a6e4cfa0dd5069fe102/Image_default_4-dev-skills.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/7zZ4oY9AQgCkpPpdUfH8Hl/999b3e7a97cb7a6e4cfa0dd5069fe102/Image_default_4-dev-skills.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/7zZ4oY9AQgCkpPpdUfH8Hl/999b3e7a97cb7a6e4cfa0dd5069fe102/Image_default_4-dev-skills.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/7zZ4oY9AQgCkpPpdUfH8Hl/999b3e7a97cb7a6e4cfa0dd5069fe102/Image_default_4-dev-skills.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/7zZ4oY9AQgCkpPpdUfH8Hl/999b3e7a97cb7a6e4cfa0dd5069fe102/Image_default_4-dev-skills.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Millie Macdonald","slug":"millie-macdonald"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"4 essential skills developers can learn from doing QA"},"metaDescription":{"metaDescription":"Whether you’re looking to improve your software developer skills, starting your first software developer job, or thinking about switching from QA to development, here are 4 essential developer skills you can learn from doing QA, covering problem solving, creative analysis, product understanding, and empathy."}},{"title":"The why and how behind Tiny’s RTC end-to-end encryption","slug":"real-time-collaboration-end-to-end-encryption","featured":false,"lastUpdated":"Jan 13th, 2021","description":{"description":"<p>Find out more about how Tiny implements end-to-end encryption for real-time collaboration in TinyMCE, including a discussion of operational transformation methods. Secure real-time collaboration for document sharing and other team-based productivity and communication tools.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Find out more about how Tiny implements end-to-end encryption for real-time collaboration in TinyMCE, including a discussion of operational transformation methods. Secure real-time collaboration for document sharing and other team-based productivity and communication tools."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Text: \"Real-time Collaboration & End-to-end Encryption\"","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAADK0lEQVQYGXXByU8kVRwH8O/v915V9UJvdMMwS2CGAWxkGGVcJoJxi0ui0ajReDbRxBivatTE+BfMf+BJb8bEgydvJqKIigQVxFkgwNDddNPd1VR1dS3vPR3P+vmQXbmK/6MVIh/eFu6QVJgjKwVm8y8AkogN/osxpGKjlF76OClNcn1D//ylLFZY2qA7AAjKjMcaylPKkNJQkVEaKjbqH72WevGavv/10VMzg6knq2OVxtpXqp82KSmYiFhoeQ4a995dqe+6CL3SSH7QiiAJ/i1gAc+9O99aqV7/qFS859zkwtzwnqao1QjIFkws0dMPPHT6g/feqNcb7Y5bLORc96RUHAoHJwqZTWG2a/tba8uvLm498sS0ePj93Rubb7/1SaItIUhAjIsUVUopgARzp+MeHtaEXegNPWOVLtd98TXNdy+9OX929pvd7Lc7mfUbJ/3by4EXsiUFnPPS4amJyg+rvydJ3G67fa/zh39lNfPoei9HIr1YtkqpIVc5ByEeP8PfJRMLhaC7u9LXjsQAMxPl6l0X5+erlXJJa51OicCMxVbND5LhHMVxrA0nijZbpaem3JutUpvyI+V0qwaJIbHyU+PUyGrzuNftBZXhbNxv9qffSaYWjhRGWBUkWaS7CbXhrB+n1gbyMhQRAyTRN1eXxl55+enbh3VLWtpo6EHfKTfSYiI/SBSGM+EXf6Y3IgcqOAgIpBgaLCBYwhbNdrCzsx9GUTabbTaPU7ZJjXqI/SRwB4lwE90OGN3DkdqPlgp9uwjZA9tgkhAUK+P5wa8bNw/qbi5rd47280sPji/ktpvZo4QHGtcNUC40h8+DCADtfUZEIJZQPH66eN+VS7PViwaIwrCQz9qZbGLvRkoQib22/eFfFRBADAb7HTvYUcYBJ0Rnnk1LWpwb9fyQmRxbzs6cdd2uryu50WoUx/3Erk9fyNR6IkxgtHO0HnV++2W7N1Cg/IUXYm0CX0EbKANl4ClAQ+rJKSfjCHHi47XHci89zyyM5/Wufbq/fNhPW5ZkSUwOsxgibQwAbWBKxhhoY251NCKFDuPzVafuEbOOkuj7eoqELQUL+htGE53NcW8wrwAAAABJRU5ErkJggg==","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/6enckfqO3a0fP0KlTPeNS5/d9ad146a33a4796f527b554f6b77e7a5/BlogImage_default_RTC-Encryption.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6enckfqO3a0fP0KlTPeNS5/d9ad146a33a4796f527b554f6b77e7a5/BlogImage_default_RTC-Encryption.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6enckfqO3a0fP0KlTPeNS5/d9ad146a33a4796f527b554f6b77e7a5/BlogImage_default_RTC-Encryption.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6enckfqO3a0fP0KlTPeNS5/d9ad146a33a4796f527b554f6b77e7a5/BlogImage_default_RTC-Encryption.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6enckfqO3a0fP0KlTPeNS5/d9ad146a33a4796f527b554f6b77e7a5/BlogImage_default_RTC-Encryption.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6enckfqO3a0fP0KlTPeNS5/d9ad146a33a4796f527b554f6b77e7a5/BlogImage_default_RTC-Encryption.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6enckfqO3a0fP0KlTPeNS5/d9ad146a33a4796f527b554f6b77e7a5/BlogImage_default_RTC-Encryption.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6enckfqO3a0fP0KlTPeNS5/d9ad146a33a4796f527b554f6b77e7a5/BlogImage_default_RTC-Encryption.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6enckfqO3a0fP0KlTPeNS5/d9ad146a33a4796f527b554f6b77e7a5/BlogImage_default_RTC-Encryption.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6enckfqO3a0fP0KlTPeNS5/d9ad146a33a4796f527b554f6b77e7a5/BlogImage_default_RTC-Encryption.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Tim Dettrick","slug":"tim-dettrick"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"TinyMCE’s real-time collaboration solution is end-to-end encrypted"},"metaDescription":{"metaDescription":"Find out why (and how) Tiny implements end-to-end encryption for real-time collaboration in TinyMCE, including a discussion of operational transformation methods. Secure real-time collaboration for document sharing and other team-based productivity and communication tools.\n"}},{"title":"Collaboration needs a clean Slate","slug":"real-time-collaborative-editing-slate-js","featured":false,"lastUpdated":"Feb 20th, 2020","description":{"description":"<p>Real-time collaboration in a rich text editing environment is a hard problem. In this article, we discuss why we have settled on Slate as the library that we will use to build a high-quality collaborative editing solution.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Real-time collaboration in a rich text editing environment is a hard problem. In this article, we discuss why we have settled on Slate as the library that we will use to build a high-quality collaborative editing solution."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Abstract browser window with six online avatars overlaid and the word Slate appearing above.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAACyUlEQVQYGQXBS2tcZRjA8f/zXuacmZOZyTSNl1xIQosIRqxdSAVBt92JK/0arvRDuPUTuHXhQooLbRFBEKEootRALDapaSaZZJI5M3Mu7/P4+8n6N2MzlolkAGa0CiCCFwAA8ELmaY1aATqO6AhWW6UkQ8AAuNn3GKp6fm0ieBHMvKNNNIZAFKJBIlQVyXAAqDJa9bu3m9mzK9fxOb1Q5P2RXR7VoRtfnKqpZUJwkMAI2pgAAKBUpdZL131lxWZXG7tzcbUlzXd97MwWx1zbIDhIBgCBFgwAEMMaqvG8PR2r73ZWtLmcSn+oSUN7WU0HsRCSAQCCFF+eGmgCBVBF26TgnMuw1mgMgegsi94JYDgRj0GwRkKq+mszyRwKDgzACYgoghlmTgAAEbTW8qyoXB60kW6vvLG/FPH0cn97BxEARKtG5wvfLyR4MDAAES3n9Vcn81k3iEpz2V7/C95DK8dHqCFCNeXpnzHPmlbZ3SdkYgaYCHXVTFSCBDGpr/zJr0N12WBbBjtl+bw3ObD820dbnw7WPvnw+LMvJt+v2v7boikprQp1CFbKmjhLzrfzFZ5Hp1lvHs5/C73a5zF7oytii78OwqvD4p2u60bLosZIJ+abuR9EXRJS2ayOjkbvrhw/OJz+vVdOttqRC5H8/gfDj4YuSri1Xf9Y179gzlmyl97PeqMr8/2LPzrevff5zXvD4s2NRTWYnfVSccOJd1DPYzLXip8euOlPkxX3tL3ybth7+X6n/u5hXMs6r22GGOP5Y67HneujiKYYKfZ8WrB4puMfaqRpW1mtn2x8XLx4cHAxv7v8+QlCc/hfdbYVvJPlSVOeN9KNXl3/dT/YPLRsdDofNWfJBIXw1h3Z7mT32uZRNv7a8sf/pPWN8i4hqUOcBOedYK49mdQnv1t/R5erqqLgRMYHxezSVRcdwartO9X6HvWcfPA/nUt0AwiPspUAAAAASUVORK5CYII=","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/5joAuBjNUxkzxpmEuJxy6J/ff51e43bd540899ec12a9b93e125ecd6/Image_default_slate.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/5joAuBjNUxkzxpmEuJxy6J/ff51e43bd540899ec12a9b93e125ecd6/Image_default_slate.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5joAuBjNUxkzxpmEuJxy6J/ff51e43bd540899ec12a9b93e125ecd6/Image_default_slate.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5joAuBjNUxkzxpmEuJxy6J/ff51e43bd540899ec12a9b93e125ecd6/Image_default_slate.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5joAuBjNUxkzxpmEuJxy6J/ff51e43bd540899ec12a9b93e125ecd6/Image_default_slate.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/5joAuBjNUxkzxpmEuJxy6J/ff51e43bd540899ec12a9b93e125ecd6/Image_default_slate.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/5joAuBjNUxkzxpmEuJxy6J/ff51e43bd540899ec12a9b93e125ecd6/Image_default_slate.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5joAuBjNUxkzxpmEuJxy6J/ff51e43bd540899ec12a9b93e125ecd6/Image_default_slate.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5joAuBjNUxkzxpmEuJxy6J/ff51e43bd540899ec12a9b93e125ecd6/Image_default_slate.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5joAuBjNUxkzxpmEuJxy6J/ff51e43bd540899ec12a9b93e125ecd6/Image_default_slate.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Andrew Herron","slug":"andrew-herron"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Collaborative editing: real-time collaboration with Slate.js"},"metaDescription":{"metaDescription":"Real-time collaboration in a rich text editing environment is a hard problem. In this article, we discuss why we have settled on Slate as the library that we will use to build a high-quality collaborative editing solution."}},{"title":"Functional Programming and Category Theory at Tiny","slug":"category-theory-functional-programming","featured":false,"lastUpdated":"Jun 7th, 2021","description":{"description":"<p>Because Category Theory is abstract, it can be difficult to learn. At Tiny, we use Functional Programming, which is based on Category Theory. We have some recommendations for learning Category Theory: a book, a lecture series, and a talk recording.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Because Category Theory is abstract, it can be difficult to learn. At Tiny, we use Functional Programming, which is based on Category Theory. We have some recommendations for learning Category Theory: a book, a lecture series, and a talk recording."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Woman teaching and drawing diagrams on a whiteboard ","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.526542324246772,"src":"//images.ctfassets.net/s600jj41gsex/5thrJiM0BoBnbhtsZcVduF/c8c4bd7c8873370b135c1070f9e5a8ae/Category_theory.jpeg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/5thrJiM0BoBnbhtsZcVduF/c8c4bd7c8873370b135c1070f9e5a8ae/Category_theory.jpeg?w=185&h=121&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5thrJiM0BoBnbhtsZcVduF/c8c4bd7c8873370b135c1070f9e5a8ae/Category_theory.jpeg?w=370&h=242&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5thrJiM0BoBnbhtsZcVduF/c8c4bd7c8873370b135c1070f9e5a8ae/Category_theory.jpeg?w=739&h=484&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5thrJiM0BoBnbhtsZcVduF/c8c4bd7c8873370b135c1070f9e5a8ae/Category_theory.jpeg?w=1064&h=697&q=50&fit=scale 1064w","srcWebp":"//images.ctfassets.net/s600jj41gsex/5thrJiM0BoBnbhtsZcVduF/c8c4bd7c8873370b135c1070f9e5a8ae/Category_theory.jpeg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/5thrJiM0BoBnbhtsZcVduF/c8c4bd7c8873370b135c1070f9e5a8ae/Category_theory.jpeg?w=185&h=121&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5thrJiM0BoBnbhtsZcVduF/c8c4bd7c8873370b135c1070f9e5a8ae/Category_theory.jpeg?w=370&h=242&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5thrJiM0BoBnbhtsZcVduF/c8c4bd7c8873370b135c1070f9e5a8ae/Category_theory.jpeg?w=739&h=484&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5thrJiM0BoBnbhtsZcVduF/c8c4bd7c8873370b135c1070f9e5a8ae/Category_theory.jpeg?w=1064&h=697&q=50&fm=webp&fit=scale 1064w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Team Tiny","slug":"team-tiny"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Functional Programming and Category Theory at Tiny"},"metaDescription":{"metaDescription":"Because Category Theory is abstract, it can be difficult to learn. At Tiny, we use Functional Programming, which is based on Category Theory. We have some recommendations for learning Category Theory: a book, a lecture series, and a talk recording."}},{"title":"New TinyMCE integration: How to get started with Blazor","slug":"how-to-get-started-with-blazor","featured":false,"lastUpdated":"Mar 24th, 2021","description":{"description":"<p>Blazor is now supported by TinyMCE and this article we go through the why's and how's about getting started with Blazor.&nbsp;</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Blazor is now supported by TinyMCE and this article we go through the why's and how's about getting started with Blazor. "}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Tessellating wires ","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.3332195288494366,"src":"//images.ctfassets.net/s600jj41gsex/5kHg6dSDavyVM59QHWQNXI/1f72da1dd6564c63b4e6f31efac4902e/jj-ying-7JX0-bfiuxQ-unsplash.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/5kHg6dSDavyVM59QHWQNXI/1f72da1dd6564c63b4e6f31efac4902e/jj-ying-7JX0-bfiuxQ-unsplash.jpg?w=185&h=139&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5kHg6dSDavyVM59QHWQNXI/1f72da1dd6564c63b4e6f31efac4902e/jj-ying-7JX0-bfiuxQ-unsplash.jpg?w=370&h=278&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5kHg6dSDavyVM59QHWQNXI/1f72da1dd6564c63b4e6f31efac4902e/jj-ying-7JX0-bfiuxQ-unsplash.jpg?w=739&h=554&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5kHg6dSDavyVM59QHWQNXI/1f72da1dd6564c63b4e6f31efac4902e/jj-ying-7JX0-bfiuxQ-unsplash.jpg?w=1109&h=832&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/5kHg6dSDavyVM59QHWQNXI/1f72da1dd6564c63b4e6f31efac4902e/jj-ying-7JX0-bfiuxQ-unsplash.jpg?w=1478&h=1109&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/5kHg6dSDavyVM59QHWQNXI/1f72da1dd6564c63b4e6f31efac4902e/jj-ying-7JX0-bfiuxQ-unsplash.jpg?w=2217&h=1663&q=50&fit=scale 2217w,\n//images.ctfassets.net/s600jj41gsex/5kHg6dSDavyVM59QHWQNXI/1f72da1dd6564c63b4e6f31efac4902e/jj-ying-7JX0-bfiuxQ-unsplash.jpg?w=3905&h=2929&q=50&fit=scale 3905w","srcWebp":"//images.ctfassets.net/s600jj41gsex/5kHg6dSDavyVM59QHWQNXI/1f72da1dd6564c63b4e6f31efac4902e/jj-ying-7JX0-bfiuxQ-unsplash.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/5kHg6dSDavyVM59QHWQNXI/1f72da1dd6564c63b4e6f31efac4902e/jj-ying-7JX0-bfiuxQ-unsplash.jpg?w=185&h=139&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5kHg6dSDavyVM59QHWQNXI/1f72da1dd6564c63b4e6f31efac4902e/jj-ying-7JX0-bfiuxQ-unsplash.jpg?w=370&h=278&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5kHg6dSDavyVM59QHWQNXI/1f72da1dd6564c63b4e6f31efac4902e/jj-ying-7JX0-bfiuxQ-unsplash.jpg?w=739&h=554&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5kHg6dSDavyVM59QHWQNXI/1f72da1dd6564c63b4e6f31efac4902e/jj-ying-7JX0-bfiuxQ-unsplash.jpg?w=1109&h=832&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/5kHg6dSDavyVM59QHWQNXI/1f72da1dd6564c63b4e6f31efac4902e/jj-ying-7JX0-bfiuxQ-unsplash.jpg?w=1478&h=1109&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/5kHg6dSDavyVM59QHWQNXI/1f72da1dd6564c63b4e6f31efac4902e/jj-ying-7JX0-bfiuxQ-unsplash.jpg?w=2217&h=1663&q=50&fm=webp&fit=scale 2217w,\n//images.ctfassets.net/s600jj41gsex/5kHg6dSDavyVM59QHWQNXI/1f72da1dd6564c63b4e6f31efac4902e/jj-ying-7JX0-bfiuxQ-unsplash.jpg?w=3905&h=2929&q=50&fm=webp&fit=scale 3905w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Elise Bentley","slug":"elise-bentley"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"How to integrate TinyMCE with Blazor"},"metaDescription":{"metaDescription":"Blazor is now supported by TinyMCE. Learn how to get TinyMCE started with Blazor today. "}},{"title":"It’s hard to find a good chameleon","slug":"reduce-software-development-costs","featured":false,"lastUpdated":"Apr 27th, 2021","description":{"description":"<p>When you are building products that depend on other third party software components, think about choosing chameleon components that help you reduce software development costs.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"When you are building products that depend on other third party software components, think about choosing chameleon components that help you reduce software development costs."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Image of someone holding a green chameleon in their hand. ","artistName":"Amy Humphries","image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.3333333333333333,"src":"//images.ctfassets.net/s600jj41gsex/6aXhFgcTFlwOguPJuI6s4X/159fc74f55c7adabbae2f4ecfd344638/amy-humphries-Qb_eemSJg0k-unsplash.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6aXhFgcTFlwOguPJuI6s4X/159fc74f55c7adabbae2f4ecfd344638/amy-humphries-Qb_eemSJg0k-unsplash.jpg?w=185&h=139&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6aXhFgcTFlwOguPJuI6s4X/159fc74f55c7adabbae2f4ecfd344638/amy-humphries-Qb_eemSJg0k-unsplash.jpg?w=370&h=278&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6aXhFgcTFlwOguPJuI6s4X/159fc74f55c7adabbae2f4ecfd344638/amy-humphries-Qb_eemSJg0k-unsplash.jpg?w=739&h=554&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6aXhFgcTFlwOguPJuI6s4X/159fc74f55c7adabbae2f4ecfd344638/amy-humphries-Qb_eemSJg0k-unsplash.jpg?w=1109&h=832&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6aXhFgcTFlwOguPJuI6s4X/159fc74f55c7adabbae2f4ecfd344638/amy-humphries-Qb_eemSJg0k-unsplash.jpg?w=1478&h=1109&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6aXhFgcTFlwOguPJuI6s4X/159fc74f55c7adabbae2f4ecfd344638/amy-humphries-Qb_eemSJg0k-unsplash.jpg?w=2217&h=1663&q=50&fit=scale 2217w,\n//images.ctfassets.net/s600jj41gsex/6aXhFgcTFlwOguPJuI6s4X/159fc74f55c7adabbae2f4ecfd344638/amy-humphries-Qb_eemSJg0k-unsplash.jpg?w=3264&h=2448&q=50&fit=scale 3264w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6aXhFgcTFlwOguPJuI6s4X/159fc74f55c7adabbae2f4ecfd344638/amy-humphries-Qb_eemSJg0k-unsplash.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6aXhFgcTFlwOguPJuI6s4X/159fc74f55c7adabbae2f4ecfd344638/amy-humphries-Qb_eemSJg0k-unsplash.jpg?w=185&h=139&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6aXhFgcTFlwOguPJuI6s4X/159fc74f55c7adabbae2f4ecfd344638/amy-humphries-Qb_eemSJg0k-unsplash.jpg?w=370&h=278&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6aXhFgcTFlwOguPJuI6s4X/159fc74f55c7adabbae2f4ecfd344638/amy-humphries-Qb_eemSJg0k-unsplash.jpg?w=739&h=554&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6aXhFgcTFlwOguPJuI6s4X/159fc74f55c7adabbae2f4ecfd344638/amy-humphries-Qb_eemSJg0k-unsplash.jpg?w=1109&h=832&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6aXhFgcTFlwOguPJuI6s4X/159fc74f55c7adabbae2f4ecfd344638/amy-humphries-Qb_eemSJg0k-unsplash.jpg?w=1478&h=1109&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6aXhFgcTFlwOguPJuI6s4X/159fc74f55c7adabbae2f4ecfd344638/amy-humphries-Qb_eemSJg0k-unsplash.jpg?w=2217&h=1663&q=50&fm=webp&fit=scale 2217w,\n//images.ctfassets.net/s600jj41gsex/6aXhFgcTFlwOguPJuI6s4X/159fc74f55c7adabbae2f4ecfd344638/amy-humphries-Qb_eemSJg0k-unsplash.jpg?w=3264&h=2448&q=50&fm=webp&fit=scale 3264w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ben Long","slug":"ben-long"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Reduce software development costs with chameleon components"},"metaDescription":{"metaDescription":"When you are building products that depend on other third party software components, think about choosing chameleon components that help you reduce software development costs."}},{"title":"Top 10 JavaScript how-tos","slug":"javascript-how-to-top-ten","featured":false,"lastUpdated":"May 20th, 2020","description":{"description":"<p>What are the top ten JavaScript how-tos? Check out this list of popular JavaScript FAQs with answers.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"What are the top ten JavaScript how-tos? Check out this list of popular JavaScript FAQs with answers."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Text \"How-tos\" with JavaScript logo nestled in the top of the 'H'.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAMAAAAhxq8pAAAC91BMVEUGFDgFFDcIFzoNGz4OHD8MGTwHFTgJFzoHFDgLGTwHFTkGFTkEFDkCEzkBEjkEFTsLGz8OHUAMGj4HFToIFjoKGDwKGTwIFjsHFjsBEzoAADUAADIAADsAADoAATsEFz4EFDsFFTsGFjsNG0ANGz8IFz0EFTw+Q1hlZWlxZihpZ2JMUWUAADAAADYABjgACzkADjoADToAETsGGD8IGT8OHEEIFz4BFD0AACSRlJ7a1cHZwADUzKqqrLQAAAAkK0cAAC4AACwAAC8AFD4AETwKGkEQH0UIGEAAEz4AACWUlp/p6OPLxKfg39mwsbehoqjV1de+vsKwsbVzdX+7vL+Eho+mp6xpa3cAADgOH0UQIEUIGUEEGEIAAC2WmKDd3uGVl6LQ0dXFxsnLzM9OUmPT09XS0tXJys3h4ePPz9JESV0ACUAPIEYRIUcNHUUMH0cAADSZm6LCwsanqK66u7/ExciwsLXW1tiDhY7q6uump63d3t+7u8AAGUUQIUgRIUgSIkoQIUoAAUBUWGlucH0AACmZmqHBwsZpbHlGS2F+gIoZJEiGiJFrbnwGHUgRIUkNHUYTJEwOH0kEGUUAAD8AE0O/wMTu7/B/gYy5ur7Y2NvDxMeRk5vV1tmlp64AD0UBG0gMHUcLG0YPIEoMHUgKHEgEGUcAAEGfoKeXmKDHyMxdYXPX19orM1K2t7zQ0dS6u8AkL1IADkQJHEcOH0oMHkkIHEkAEkZCR19HTGJ0doTf4OKHiZTGx8vMzdGNj5nCw8jZ2dxFSmEABkMKHUkMHkoPIUwPIEwNH0sMHksHHEoAD0YAAEMAHExzdoNPU2k4P1x+gY5LUWktN1l7fotXW28CGUkOIE0PIU4NH00MH0wNIE0OIk8AF0sAAEIABUgAEUsAAEYADEsAEksAAEQBGksLH0wOIU4OIE4PIk8PIlATJVIPIU8MIE4QI1ETJVMSJVMRJFIMIE8KHk4LH04NIE4PIVAOIVASJFIWJ1UWKFUUJlQPIlFxTLwjAAAAp0lEQVQYGQXBPU4CUQAGwG+WFxNXTFj84QTaURoLQ02hl/MMXoF4AkJhLO04gInakFUwIfKckSQJ2Cc54jDQBsAuSVp/xQQA2yR1qHfl+xSA2rAZlc4Y4Ovi83J9rWMOAIByDgAEyhm83gBY3VHGMD8MfEzA+gGPWM5qAwCewNsUnu/BxkIAXm4BVgCAXdvX0gkAlrMR8U6AAH2NrfBz/HtS09gnqck/cvYp3w9fWEcAAAAASUVORK5CYII=","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/7H0fdAxUhe8rvniGHk2j7h/5d47ce6a732e1143c5ea2bb35d138ce9/Image_default_JShow-tos.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/7H0fdAxUhe8rvniGHk2j7h/5d47ce6a732e1143c5ea2bb35d138ce9/Image_default_JShow-tos.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/7H0fdAxUhe8rvniGHk2j7h/5d47ce6a732e1143c5ea2bb35d138ce9/Image_default_JShow-tos.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/7H0fdAxUhe8rvniGHk2j7h/5d47ce6a732e1143c5ea2bb35d138ce9/Image_default_JShow-tos.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/7H0fdAxUhe8rvniGHk2j7h/5d47ce6a732e1143c5ea2bb35d138ce9/Image_default_JShow-tos.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/7H0fdAxUhe8rvniGHk2j7h/5d47ce6a732e1143c5ea2bb35d138ce9/Image_default_JShow-tos.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/7H0fdAxUhe8rvniGHk2j7h/5d47ce6a732e1143c5ea2bb35d138ce9/Image_default_JShow-tos.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/7H0fdAxUhe8rvniGHk2j7h/5d47ce6a732e1143c5ea2bb35d138ce9/Image_default_JShow-tos.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/7H0fdAxUhe8rvniGHk2j7h/5d47ce6a732e1143c5ea2bb35d138ce9/Image_default_JShow-tos.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/7H0fdAxUhe8rvniGHk2j7h/5d47ce6a732e1143c5ea2bb35d138ce9/Image_default_JShow-tos.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ben Long","slug":"ben-long"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Top 10 JavaScript how-tos | JavaScript FAQ"},"metaDescription":{"metaDescription":"What are the top ten JavaScript how-tos? Check out this list of popular JavaScript FAQs with answers."}},{"title":"How to integrate React with TinyMCE","slug":"how-to-integrate-react-with-tinymce","featured":false,"lastUpdated":"Mar 26th, 2017","description":{"description":"<p>In this tutorial, I'll walk you through how to integrate React.js with TinyMCE. Without further ado, let's get started!</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"In this tutorial, I'll walk you through how to integrate React.js with TinyMCE. Without further ado, let's get started!"}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"React and Tiny MCE","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.7767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/jC7yKmwpLMQQnMbORx6xn/fcc229b86e617c1e7becf3f74276462e/img-react-improvements-01.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/jC7yKmwpLMQQnMbORx6xn/fcc229b86e617c1e7becf3f74276462e/img-react-improvements-01.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/jC7yKmwpLMQQnMbORx6xn/fcc229b86e617c1e7becf3f74276462e/img-react-improvements-01.jpg?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/jC7yKmwpLMQQnMbORx6xn/fcc229b86e617c1e7becf3f74276462e/img-react-improvements-01.jpg?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/jC7yKmwpLMQQnMbORx6xn/fcc229b86e617c1e7becf3f74276462e/img-react-improvements-01.jpg?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/jC7yKmwpLMQQnMbORx6xn/fcc229b86e617c1e7becf3f74276462e/img-react-improvements-01.jpg?w=1478&h=832&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/jC7yKmwpLMQQnMbORx6xn/fcc229b86e617c1e7becf3f74276462e/img-react-improvements-01.jpg?w=1528&h=860&q=50&fit=scale 1528w","srcWebp":"//images.ctfassets.net/s600jj41gsex/jC7yKmwpLMQQnMbORx6xn/fcc229b86e617c1e7becf3f74276462e/img-react-improvements-01.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/jC7yKmwpLMQQnMbORx6xn/fcc229b86e617c1e7becf3f74276462e/img-react-improvements-01.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/jC7yKmwpLMQQnMbORx6xn/fcc229b86e617c1e7becf3f74276462e/img-react-improvements-01.jpg?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/jC7yKmwpLMQQnMbORx6xn/fcc229b86e617c1e7becf3f74276462e/img-react-improvements-01.jpg?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/jC7yKmwpLMQQnMbORx6xn/fcc229b86e617c1e7becf3f74276462e/img-react-improvements-01.jpg?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/jC7yKmwpLMQQnMbORx6xn/fcc229b86e617c1e7becf3f74276462e/img-react-improvements-01.jpg?w=1478&h=832&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/jC7yKmwpLMQQnMbORx6xn/fcc229b86e617c1e7becf3f74276462e/img-react-improvements-01.jpg?w=1528&h=860&q=50&fm=webp&fit=scale 1528w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Team Tiny","slug":"team-tiny"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":{"metaDescription":"In this tutorial, I’ll walk you through how to integrate React.js with TinyMCE. Without further ado, let’s get started!"}},{"title":"A multi-language spell checker for our rich text editor","slug":"a-multi-language-spell-checker-for-our-rich-text-editor","featured":false,"lastUpdated":"Mar 29th, 2020","description":{"description":"<p>More situations are arising where more than one language needs to be included in a single piece of content. With the release of TinyMCE 5.2, you can check up to thirteen languages simultaneously.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"More situations are arising where more than one language needs to be included in a single piece of content. With the release of TinyMCE 5.2, you can check up to thirteen languages simultaneously."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Text 'Hello' in foreground with greetings in several languages in the background.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAC/klEQVQYGQ3B3WpcVRQA4LXW3ud/pmcmk8RJSLQasAmCRUEpeCFSQb3wXm99Fh/BB/DCJ+gjFBQUKvXvooopSZpkYnPm5/zvffZey34fHj+6nqWqq7swDnNtUWsQOV0TIyHRUe60guK/xiT5fmqsB0IAwPOSKNB61XA96F1S1bo3JJ4dEhW9cjqIlPzbuizEtiXrvdm4gIRZlKKNIRcS6h9eOgEQ2dNw6+QgotZxSHgxACDCKyIRAQLuafECKw+xwm3Nzy3pj+84IkBEYO8GH4WaCJzjExWwCHjXOXXRKS9wPIEQBmM8hRHa7mgU6X65UVoLi1IoItWqRkIACKIA/KAIoWNnMwEo2BO7LNHYGBFIEkb47gZE4BWk8fnT2WFZP7kYnm2EEBHIepUHtJVxZXnViRL36ZfD/K5lLyx6DpKG2rI4IClLnZp02iffnHBrhuuX5sez7OG7yQf36se/2t+X3U/XR1+4OJWrTimF+sGcFXaeFYAsMrdY1hTE2YP7Mgy+bvRXn7t1RVk0fvghfhY0vz3bWTfTrLubkzVeX934zridXLx1L0odn4yGq035+GfetOGbe2yNObtU45F4DmaT4fbmsphtclJsyx70L5sEEOYFL6zkQazbqr1Y2e//wZDIPFF7itc+nChXeLcb6EVz9vVHsBmBeEBA+LZ4bwvf2HFXBeqhrpdVI1Ec4mREy9JddpSHeP/AvVgMopNJ1J/3W/Pt9LZ0Zx3pdyITYWjKahaShLQ922Hv0oQGjwPC6+OocaDGcBibOBI/hFMRonqo5O000X+V4VaPwFlECtjHGhh0qsUy9owLDyOFp2fWWlYk1qtIYztQx7TwSr+VBbsj/ruIrg3tRvB8AEAEBwDy/hT2kZ8W+EeXACKAgEAewL2p1AZDw/r4Na98c2ceOgmmY+6MIJEiOF3gOKAUq0/2EyRCkD8vFREeTnGkm4OtaFm0tCwDpEBLP9JVvekUW+yWtizJdos1rSsdU59gnSd9wI6cW9WodFivyr71/wOTlcVH5OBhgwAAAABJRU5ErkJggg==","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/1AY9IY1ZyN0JlYtxBktwsW/fbca674d8cbfdb45cc52d213eb11f1de/Image_default_multilingual.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/1AY9IY1ZyN0JlYtxBktwsW/fbca674d8cbfdb45cc52d213eb11f1de/Image_default_multilingual.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1AY9IY1ZyN0JlYtxBktwsW/fbca674d8cbfdb45cc52d213eb11f1de/Image_default_multilingual.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1AY9IY1ZyN0JlYtxBktwsW/fbca674d8cbfdb45cc52d213eb11f1de/Image_default_multilingual.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1AY9IY1ZyN0JlYtxBktwsW/fbca674d8cbfdb45cc52d213eb11f1de/Image_default_multilingual.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/1AY9IY1ZyN0JlYtxBktwsW/fbca674d8cbfdb45cc52d213eb11f1de/Image_default_multilingual.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/1AY9IY1ZyN0JlYtxBktwsW/fbca674d8cbfdb45cc52d213eb11f1de/Image_default_multilingual.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1AY9IY1ZyN0JlYtxBktwsW/fbca674d8cbfdb45cc52d213eb11f1de/Image_default_multilingual.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1AY9IY1ZyN0JlYtxBktwsW/fbca674d8cbfdb45cc52d213eb11f1de/Image_default_multilingual.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1AY9IY1ZyN0JlYtxBktwsW/fbca674d8cbfdb45cc52d213eb11f1de/Image_default_multilingual.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ben Long","slug":"ben-long"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":null},{"title":"API integrations and getting the most from TinyMCE’s APIs","slug":"api-release","featured":false,"lastUpdated":"Dec 14th, 2022","description":{"description":"<p>Looking for API guides? This guide shows some of the essential API integrations availble with TinyMCE's APIs</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Looking for API guides? This guide shows some of the essential API integrations availble with TinyMCE's APIs"}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"A cross icon and a cog icon representing APIs on a hexagon pattern background","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.7767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/4aSJRwwfIUTbit3A6YGxFR/e147350256ecf89f26b014102e1c3a00/img-api-basics-guide-0.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/4aSJRwwfIUTbit3A6YGxFR/e147350256ecf89f26b014102e1c3a00/img-api-basics-guide-0.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4aSJRwwfIUTbit3A6YGxFR/e147350256ecf89f26b014102e1c3a00/img-api-basics-guide-0.jpg?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4aSJRwwfIUTbit3A6YGxFR/e147350256ecf89f26b014102e1c3a00/img-api-basics-guide-0.jpg?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4aSJRwwfIUTbit3A6YGxFR/e147350256ecf89f26b014102e1c3a00/img-api-basics-guide-0.jpg?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4aSJRwwfIUTbit3A6YGxFR/e147350256ecf89f26b014102e1c3a00/img-api-basics-guide-0.jpg?w=1478&h=832&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4aSJRwwfIUTbit3A6YGxFR/e147350256ecf89f26b014102e1c3a00/img-api-basics-guide-0.jpg?w=1528&h=860&q=50&fit=scale 1528w","srcWebp":"//images.ctfassets.net/s600jj41gsex/4aSJRwwfIUTbit3A6YGxFR/e147350256ecf89f26b014102e1c3a00/img-api-basics-guide-0.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/4aSJRwwfIUTbit3A6YGxFR/e147350256ecf89f26b014102e1c3a00/img-api-basics-guide-0.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4aSJRwwfIUTbit3A6YGxFR/e147350256ecf89f26b014102e1c3a00/img-api-basics-guide-0.jpg?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4aSJRwwfIUTbit3A6YGxFR/e147350256ecf89f26b014102e1c3a00/img-api-basics-guide-0.jpg?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4aSJRwwfIUTbit3A6YGxFR/e147350256ecf89f26b014102e1c3a00/img-api-basics-guide-0.jpg?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4aSJRwwfIUTbit3A6YGxFR/e147350256ecf89f26b014102e1c3a00/img-api-basics-guide-0.jpg?w=1478&h=832&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4aSJRwwfIUTbit3A6YGxFR/e147350256ecf89f26b014102e1c3a00/img-api-basics-guide-0.jpg?w=1528&h=860&q=50&fm=webp&fit=scale 1528w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joel Olawanle","slug":"joel-olawanle"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"API integrations and getting the most from TinyMCE’s APIs | TinyMCE"},"metaDescription":{"metaDescription":"API integrations can be confusing, but this guide shows API integration with TinyMCE APIs with API examples you can see to get started"}},{"title":"Using HTML and contenteditable to build a rich text editor","slug":"using-html-contenteditable","featured":false,"lastUpdated":"Apr 18th, 2022","description":{"description":"<p>Learn about <code>contenteditable</code> attribute, how it is used in text editors, its limitations, and how to overcome those limits with rich text editors.</p>\n<p>&nbsp;</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Learn about "},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"contenteditable"}]},{"type":"text","value":" attribute, how it is used in text editors, its limitations, and how to overcome those limits with rich text editors."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":" "}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"An online HTML editor and the HTML displayed in real-time.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAMAAAAhxq8pAAACZFBMVEUHG0wDGEsAD0kAAEUAAEQAAEMAAEcAC00ADU4AAEIAFEsEGUwGGksEGUsAE0kAAUQAAEEAADwAADsAAD8AAEYAAEAAADkAFkoIHE0AFkhvc4TEytbEydXCyNTDydXBx9PCx9PL0d3L0NxvdIUMIVAAE0YAADCFiZfn7fnp7/rw9f/o7vrq8Pvl6/bk6fXi6PTq8Pzm7Pjk6vWCh5YAADgAFUgAEUQAACuFipft8//o7//p8P/p8P7q8f/n7/7r8f/u9P/v9f+Dh5YAAC0AEkUAEEMAACeGipfn7//V4frb5fva5fvd5vvc5vvw9v+Ch5QAACkAGUcAEUEAACWHjJnp7/vl7Pjo7vvx9//y+P+EiZYAAC4DG0cAE0CAhJLk6vbj6fXj6PTi6PV+gpAAADMGHEUEFj8ADD0hKEJLUGNNVnJYXHJTWG9WWnBVWnBIUnBGTGhFS2VESmRFS2ZKUGkfKEgAEj8MHkQNHEEMHUIABzMAOGUxVWxGPls5PWIpQmsAQmgENFctGEo8Ql8vNlYzOVg0OlkoL1IOHEEJG0EMHEESIEIQHkEIFTQEFDsAI1AALVEeH0sIGU0AIFIAK1AUK1AhIU0qMlUnL1IoMFMnL1MhKlASHkELGj0JFzsPHT4NGjwJFDIIFTkJGUoIFkkEGEkGGUkIGEgJF0gHF0kBFkgCF0kIFzwJFzgJFzkKFzcJFjcJFDEIFjoKG0wKG0sJG0sIFzsJFjYIFTMIFDAIFTcKGUQJGUMKGUMLGUQIEy8JFDAJFC8KFTALFTEMFzIIEi0LFS8IEy0MFi8MFjAKFC4IEizODDOKAAAAt0lEQVQYGQXBMWpUYQCAwW92/2SzwUU22niAEJAlhfexFey9hZVdbpGjWGlh4QUUEoigSd6+54xAhXk9NW+wA+V+T03ru1e8+bclzOvnU7Ws7vcuAZhOIow9AD3WBsZLgB7alB3Gjt+/3n7veP3z8LfOwfsfV3yt3mWupYEPAFBgXHDzEQDgMwAAxmsApk9f8rTBLahK1bLS2H47oGW1mFsf9ees4dAJTEY1H9vWeFGl5YziqdP6D+0HK9sR51AKAAAAAElFTkSuQmCC","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/hBZlqB7HMp6MD6i1LQMdL/7d62ec1165ff209d9ec5c9af839ff5ce/Image_default_OnlineHTMLEditor.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/hBZlqB7HMp6MD6i1LQMdL/7d62ec1165ff209d9ec5c9af839ff5ce/Image_default_OnlineHTMLEditor.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/hBZlqB7HMp6MD6i1LQMdL/7d62ec1165ff209d9ec5c9af839ff5ce/Image_default_OnlineHTMLEditor.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/hBZlqB7HMp6MD6i1LQMdL/7d62ec1165ff209d9ec5c9af839ff5ce/Image_default_OnlineHTMLEditor.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/hBZlqB7HMp6MD6i1LQMdL/7d62ec1165ff209d9ec5c9af839ff5ce/Image_default_OnlineHTMLEditor.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/hBZlqB7HMp6MD6i1LQMdL/7d62ec1165ff209d9ec5c9af839ff5ce/Image_default_OnlineHTMLEditor.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/hBZlqB7HMp6MD6i1LQMdL/7d62ec1165ff209d9ec5c9af839ff5ce/Image_default_OnlineHTMLEditor.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/hBZlqB7HMp6MD6i1LQMdL/7d62ec1165ff209d9ec5c9af839ff5ce/Image_default_OnlineHTMLEditor.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/hBZlqB7HMp6MD6i1LQMdL/7d62ec1165ff209d9ec5c9af839ff5ce/Image_default_OnlineHTMLEditor.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/hBZlqB7HMp6MD6i1LQMdL/7d62ec1165ff209d9ec5c9af839ff5ce/Image_default_OnlineHTMLEditor.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Shahed Nasser","slug":"shahed-nasser"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Using HTML Contententeditable to build a RTE | TinyMCE"},"metaDescription":{"metaDescription":"Learn about contenteditable attribute, how it is used in text editors, its limitations and how to overcome those.\n"}},{"title":"HTML compliance and rich text editors","slug":"html-compliance","featured":false,"lastUpdated":"Mar 21st, 2022","description":{"description":"<p>HTML compliance and validity is an essential part of web development. RTE can introduce possible HTML issues &ndash; compliance features and best practices keep the HTML validity of the web content.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HTML compliance and validity is an essential part of web development. RTE can introduce possible HTML issues – compliance features and best practices keep the HTML validity of the web content."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Rich Text Editor HTML compliance and validity representation","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.7767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/42G3GpDezOShsBGbMDqQWi/83d067e9f3af4af9ed0d68d2ec11250e/Image_HTML_Compliance_Valid_explore.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/42G3GpDezOShsBGbMDqQWi/83d067e9f3af4af9ed0d68d2ec11250e/Image_HTML_Compliance_Valid_explore.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/42G3GpDezOShsBGbMDqQWi/83d067e9f3af4af9ed0d68d2ec11250e/Image_HTML_Compliance_Valid_explore.jpg?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/42G3GpDezOShsBGbMDqQWi/83d067e9f3af4af9ed0d68d2ec11250e/Image_HTML_Compliance_Valid_explore.jpg?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/42G3GpDezOShsBGbMDqQWi/83d067e9f3af4af9ed0d68d2ec11250e/Image_HTML_Compliance_Valid_explore.jpg?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/42G3GpDezOShsBGbMDqQWi/83d067e9f3af4af9ed0d68d2ec11250e/Image_HTML_Compliance_Valid_explore.jpg?w=1478&h=832&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/42G3GpDezOShsBGbMDqQWi/83d067e9f3af4af9ed0d68d2ec11250e/Image_HTML_Compliance_Valid_explore.jpg?w=1528&h=860&q=50&fit=scale 1528w","srcWebp":"//images.ctfassets.net/s600jj41gsex/42G3GpDezOShsBGbMDqQWi/83d067e9f3af4af9ed0d68d2ec11250e/Image_HTML_Compliance_Valid_explore.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/42G3GpDezOShsBGbMDqQWi/83d067e9f3af4af9ed0d68d2ec11250e/Image_HTML_Compliance_Valid_explore.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/42G3GpDezOShsBGbMDqQWi/83d067e9f3af4af9ed0d68d2ec11250e/Image_HTML_Compliance_Valid_explore.jpg?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/42G3GpDezOShsBGbMDqQWi/83d067e9f3af4af9ed0d68d2ec11250e/Image_HTML_Compliance_Valid_explore.jpg?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/42G3GpDezOShsBGbMDqQWi/83d067e9f3af4af9ed0d68d2ec11250e/Image_HTML_Compliance_Valid_explore.jpg?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/42G3GpDezOShsBGbMDqQWi/83d067e9f3af4af9ed0d68d2ec11250e/Image_HTML_Compliance_Valid_explore.jpg?w=1478&h=832&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/42G3GpDezOShsBGbMDqQWi/83d067e9f3af4af9ed0d68d2ec11250e/Image_HTML_Compliance_Valid_explore.jpg?w=1528&h=860&q=50&fm=webp&fit=scale 1528w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Prakash Verma","slug":"prakash-verma"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"HTML compliance and compliance features of RTE editors | TinyMCE"},"metaDescription":{"metaDescription":"Learn more about HTML compliance of RTE editors: possible issues, compliance features and best practices to keep the html validity of the web content."}},{"title":"How HTML focus works in rich text editors","slug":"text-editor-focus","featured":false,"lastUpdated":"Mar 2nd, 2022","description":{"description":"<p>HTML focus can be complex &ndash; this is especially true for the textarea HTML element. Find out what HTML focus means, and how HTML focus works in rich text editors.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HTML focus can be complex – this is especially true for the textarea HTML element. Find out what HTML focus means, and how HTML focus works in rich text editors."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"How HTML focus works in rich text editors.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.7767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/64w7Q9hY2R5s7AiLyzkqR1/93897c5aad3bb563440429b810bb1561/Image_Focus_HTML_Textarea__1_.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/64w7Q9hY2R5s7AiLyzkqR1/93897c5aad3bb563440429b810bb1561/Image_Focus_HTML_Textarea__1_.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/64w7Q9hY2R5s7AiLyzkqR1/93897c5aad3bb563440429b810bb1561/Image_Focus_HTML_Textarea__1_.jpg?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/64w7Q9hY2R5s7AiLyzkqR1/93897c5aad3bb563440429b810bb1561/Image_Focus_HTML_Textarea__1_.jpg?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/64w7Q9hY2R5s7AiLyzkqR1/93897c5aad3bb563440429b810bb1561/Image_Focus_HTML_Textarea__1_.jpg?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/64w7Q9hY2R5s7AiLyzkqR1/93897c5aad3bb563440429b810bb1561/Image_Focus_HTML_Textarea__1_.jpg?w=1478&h=832&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/64w7Q9hY2R5s7AiLyzkqR1/93897c5aad3bb563440429b810bb1561/Image_Focus_HTML_Textarea__1_.jpg?w=1528&h=860&q=50&fit=scale 1528w","srcWebp":"//images.ctfassets.net/s600jj41gsex/64w7Q9hY2R5s7AiLyzkqR1/93897c5aad3bb563440429b810bb1561/Image_Focus_HTML_Textarea__1_.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/64w7Q9hY2R5s7AiLyzkqR1/93897c5aad3bb563440429b810bb1561/Image_Focus_HTML_Textarea__1_.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/64w7Q9hY2R5s7AiLyzkqR1/93897c5aad3bb563440429b810bb1561/Image_Focus_HTML_Textarea__1_.jpg?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/64w7Q9hY2R5s7AiLyzkqR1/93897c5aad3bb563440429b810bb1561/Image_Focus_HTML_Textarea__1_.jpg?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/64w7Q9hY2R5s7AiLyzkqR1/93897c5aad3bb563440429b810bb1561/Image_Focus_HTML_Textarea__1_.jpg?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/64w7Q9hY2R5s7AiLyzkqR1/93897c5aad3bb563440429b810bb1561/Image_Focus_HTML_Textarea__1_.jpg?w=1478&h=832&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/64w7Q9hY2R5s7AiLyzkqR1/93897c5aad3bb563440429b810bb1561/Image_Focus_HTML_Textarea__1_.jpg?w=1528&h=860&q=50&fm=webp&fit=scale 1528w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Keanan Koppenhaver","slug":"keanan-koppenhaver"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"What is HTML focus, and how focus works for rich text editors | TinyMCE"},"metaDescription":{"metaDescription":"HTML focus can be complex, especially in textarea focus cases. Find out what HTML focus means, and how HTML focus works in rich text editors."}},{"title":"HTML content models in rich text editors","slug":"html-content-models","featured":false,"lastUpdated":"Feb 21st, 2022","description":{"description":"<p>HTML content models are essential for rich text editors. They define what HTML element the content should have. Knowing how they work makes producing content in a rich text editor easier, and improves your flow.&nbsp;</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HTML content models are essential for rich text editors. They define what HTML element the content should have. Knowing how they work makes producing content in a rich text editor easier, and improves your flow. "}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"HTML mapping is important to understand for writing quickly in rich text editors","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.7767441860465116,"src":"//images.ctfassets.net/s600jj41gsex/6ohdvJvwCih51h92ht2eEd/7f9a8d9953f402ef97dfbd212260b98f/Image_HTML_Mapping__1_.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6ohdvJvwCih51h92ht2eEd/7f9a8d9953f402ef97dfbd212260b98f/Image_HTML_Mapping__1_.jpg?w=185&h=104&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6ohdvJvwCih51h92ht2eEd/7f9a8d9953f402ef97dfbd212260b98f/Image_HTML_Mapping__1_.jpg?w=370&h=208&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6ohdvJvwCih51h92ht2eEd/7f9a8d9953f402ef97dfbd212260b98f/Image_HTML_Mapping__1_.jpg?w=739&h=416&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6ohdvJvwCih51h92ht2eEd/7f9a8d9953f402ef97dfbd212260b98f/Image_HTML_Mapping__1_.jpg?w=1109&h=624&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6ohdvJvwCih51h92ht2eEd/7f9a8d9953f402ef97dfbd212260b98f/Image_HTML_Mapping__1_.jpg?w=1478&h=832&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6ohdvJvwCih51h92ht2eEd/7f9a8d9953f402ef97dfbd212260b98f/Image_HTML_Mapping__1_.jpg?w=1528&h=860&q=50&fit=scale 1528w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6ohdvJvwCih51h92ht2eEd/7f9a8d9953f402ef97dfbd212260b98f/Image_HTML_Mapping__1_.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6ohdvJvwCih51h92ht2eEd/7f9a8d9953f402ef97dfbd212260b98f/Image_HTML_Mapping__1_.jpg?w=185&h=104&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6ohdvJvwCih51h92ht2eEd/7f9a8d9953f402ef97dfbd212260b98f/Image_HTML_Mapping__1_.jpg?w=370&h=208&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6ohdvJvwCih51h92ht2eEd/7f9a8d9953f402ef97dfbd212260b98f/Image_HTML_Mapping__1_.jpg?w=739&h=416&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6ohdvJvwCih51h92ht2eEd/7f9a8d9953f402ef97dfbd212260b98f/Image_HTML_Mapping__1_.jpg?w=1109&h=624&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6ohdvJvwCih51h92ht2eEd/7f9a8d9953f402ef97dfbd212260b98f/Image_HTML_Mapping__1_.jpg?w=1478&h=832&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6ohdvJvwCih51h92ht2eEd/7f9a8d9953f402ef97dfbd212260b98f/Image_HTML_Mapping__1_.jpg?w=1528&h=860&q=50&fm=webp&fit=scale 1528w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ochuko Onojakpor","slug":"ochuko-onojakpor"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"HTML content models in rich text editors | TinyMCE"},"metaDescription":{"metaDescription":"HTML content models define the type of content each element is allowed to have. Learn about how rich text editors convert content to HTML."}},{"title":"Open source security pros and cons","slug":"open-source-software-security","featured":false,"lastUpdated":"Jan 27th, 2022","description":{"description":"<p>How can you know if an open source software dependency you&rsquo;d like to use is secure (or not)? Find out more..</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"How can you know if an open source software dependency you’d like to use is secure (or not)? Find out more.."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Learn more on how to assess the security of the open source project, possible risks and best practices on how to avoid those.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.0979142526071843,"src":"//images.ctfassets.net/s600jj41gsex/4cFCQEovjuciYoGlvAtYda/00ab5c450ecafff220d3b3108e3c3cc6/Image_Github_Security.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/4cFCQEovjuciYoGlvAtYda/00ab5c450ecafff220d3b3108e3c3cc6/Image_Github_Security.png?w=185&h=169&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4cFCQEovjuciYoGlvAtYda/00ab5c450ecafff220d3b3108e3c3cc6/Image_Github_Security.png?w=370&h=337&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4cFCQEovjuciYoGlvAtYda/00ab5c450ecafff220d3b3108e3c3cc6/Image_Github_Security.png?w=739&h=673&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4cFCQEovjuciYoGlvAtYda/00ab5c450ecafff220d3b3108e3c3cc6/Image_Github_Security.png?w=1109&h=1010&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4cFCQEovjuciYoGlvAtYda/00ab5c450ecafff220d3b3108e3c3cc6/Image_Github_Security.png?w=1478&h=1346&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4cFCQEovjuciYoGlvAtYda/00ab5c450ecafff220d3b3108e3c3cc6/Image_Github_Security.png?w=1895&h=1726&q=50&fit=scale 1895w","srcWebp":"//images.ctfassets.net/s600jj41gsex/4cFCQEovjuciYoGlvAtYda/00ab5c450ecafff220d3b3108e3c3cc6/Image_Github_Security.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/4cFCQEovjuciYoGlvAtYda/00ab5c450ecafff220d3b3108e3c3cc6/Image_Github_Security.png?w=185&h=169&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4cFCQEovjuciYoGlvAtYda/00ab5c450ecafff220d3b3108e3c3cc6/Image_Github_Security.png?w=370&h=337&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4cFCQEovjuciYoGlvAtYda/00ab5c450ecafff220d3b3108e3c3cc6/Image_Github_Security.png?w=739&h=673&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4cFCQEovjuciYoGlvAtYda/00ab5c450ecafff220d3b3108e3c3cc6/Image_Github_Security.png?w=1109&h=1010&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4cFCQEovjuciYoGlvAtYda/00ab5c450ecafff220d3b3108e3c3cc6/Image_Github_Security.png?w=1478&h=1346&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4cFCQEovjuciYoGlvAtYda/00ab5c450ecafff220d3b3108e3c3cc6/Image_Github_Security.png?w=1895&h=1726&q=50&fm=webp&fit=scale 1895w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Open source software security: better or bad from the start? "},"metaDescription":{"metaDescription":"Learn more on how to assess the security of the open source project, possible risks and best practices on how to avoid those."}},{"title":"Tracking engineering performance with analytics","slug":"tracking-engineering-performance-with-analytics","featured":false,"lastUpdated":"Jan 10th, 2022","description":{"description":"<p>Engineering performance metrics are essential for supporting software development.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Engineering performance metrics are essential for supporting software development."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Engineering performance and culture are better with analytics","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.0979142526071843,"src":"//images.ctfassets.net/s600jj41gsex/48GmaUah7PNcm3jKAxP9KT/16251ff0f9d7cceb46ebbba7cff5dec2/Image_engineering_Analytics_Header.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/48GmaUah7PNcm3jKAxP9KT/16251ff0f9d7cceb46ebbba7cff5dec2/Image_engineering_Analytics_Header.png?w=185&h=169&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/48GmaUah7PNcm3jKAxP9KT/16251ff0f9d7cceb46ebbba7cff5dec2/Image_engineering_Analytics_Header.png?w=370&h=337&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/48GmaUah7PNcm3jKAxP9KT/16251ff0f9d7cceb46ebbba7cff5dec2/Image_engineering_Analytics_Header.png?w=739&h=673&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/48GmaUah7PNcm3jKAxP9KT/16251ff0f9d7cceb46ebbba7cff5dec2/Image_engineering_Analytics_Header.png?w=1109&h=1010&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/48GmaUah7PNcm3jKAxP9KT/16251ff0f9d7cceb46ebbba7cff5dec2/Image_engineering_Analytics_Header.png?w=1478&h=1346&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/48GmaUah7PNcm3jKAxP9KT/16251ff0f9d7cceb46ebbba7cff5dec2/Image_engineering_Analytics_Header.png?w=1895&h=1726&q=50&fit=scale 1895w","srcWebp":"//images.ctfassets.net/s600jj41gsex/48GmaUah7PNcm3jKAxP9KT/16251ff0f9d7cceb46ebbba7cff5dec2/Image_engineering_Analytics_Header.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/48GmaUah7PNcm3jKAxP9KT/16251ff0f9d7cceb46ebbba7cff5dec2/Image_engineering_Analytics_Header.png?w=185&h=169&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/48GmaUah7PNcm3jKAxP9KT/16251ff0f9d7cceb46ebbba7cff5dec2/Image_engineering_Analytics_Header.png?w=370&h=337&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/48GmaUah7PNcm3jKAxP9KT/16251ff0f9d7cceb46ebbba7cff5dec2/Image_engineering_Analytics_Header.png?w=739&h=673&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/48GmaUah7PNcm3jKAxP9KT/16251ff0f9d7cceb46ebbba7cff5dec2/Image_engineering_Analytics_Header.png?w=1109&h=1010&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/48GmaUah7PNcm3jKAxP9KT/16251ff0f9d7cceb46ebbba7cff5dec2/Image_engineering_Analytics_Header.png?w=1478&h=1346&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/48GmaUah7PNcm3jKAxP9KT/16251ff0f9d7cceb46ebbba7cff5dec2/Image_engineering_Analytics_Header.png?w=1895&h=1726&q=50&fm=webp&fit=scale 1895w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Tracking engineering performance with analytics | TinyMCE"},"metaDescription":{"metaDescription":"Learn about why it’s important to track your engineering performance and what software development metrics you can use."}},{"title":"Open source software and managing technical debt ","slug":"open-source-manage-technical-debt","featured":false,"lastUpdated":"Oct 4th, 2021","description":{"description":"<p>While technical debt may appear to be an issue for large, private software products, open source software projects can experience it when they expand in size, or when volunteers depart projects. It's possible to identify the skill set needed to manage it, apply for funding resources to attract contributors with the relevant skills, or even create an associated business to garner attention and resources for an open source project.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"While technical debt may appear to be an issue for large, private software products, open source software projects can experience it when they expand in size, or when volunteers depart projects. It's possible to identify the skill set needed to manage it, apply for funding resources to attract contributors with the relevant skills, or even create an associated business to garner attention and resources for an open source project."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"An hour glass, a pair of hands holding it, and a computer screen. The hour glass represents the time pressures associated with technical debt.","artistName":"Fakurian Design","image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.4922222222222221,"src":"//images.ctfassets.net/s600jj41gsex/658ocwXKWBWtrGwltiTxmx/c4f6c0bd42690c0fee34705a2bcb18ba/fakurian-design-mqm-Ze_q_9A-unsplash-technical-debt.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/658ocwXKWBWtrGwltiTxmx/c4f6c0bd42690c0fee34705a2bcb18ba/fakurian-design-mqm-Ze_q_9A-unsplash-technical-debt.png?w=185&h=124&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/658ocwXKWBWtrGwltiTxmx/c4f6c0bd42690c0fee34705a2bcb18ba/fakurian-design-mqm-Ze_q_9A-unsplash-technical-debt.png?w=370&h=248&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/658ocwXKWBWtrGwltiTxmx/c4f6c0bd42690c0fee34705a2bcb18ba/fakurian-design-mqm-Ze_q_9A-unsplash-technical-debt.png?w=739&h=495&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/658ocwXKWBWtrGwltiTxmx/c4f6c0bd42690c0fee34705a2bcb18ba/fakurian-design-mqm-Ze_q_9A-unsplash-technical-debt.png?w=1109&h=743&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/658ocwXKWBWtrGwltiTxmx/c4f6c0bd42690c0fee34705a2bcb18ba/fakurian-design-mqm-Ze_q_9A-unsplash-technical-debt.png?w=1478&h=990&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/658ocwXKWBWtrGwltiTxmx/c4f6c0bd42690c0fee34705a2bcb18ba/fakurian-design-mqm-Ze_q_9A-unsplash-technical-debt.png?w=2217&h=1486&q=50&fit=scale 2217w,\n//images.ctfassets.net/s600jj41gsex/658ocwXKWBWtrGwltiTxmx/c4f6c0bd42690c0fee34705a2bcb18ba/fakurian-design-mqm-Ze_q_9A-unsplash-technical-debt.png?w=2686&h=1800&q=50&fit=scale 2686w","srcWebp":"//images.ctfassets.net/s600jj41gsex/658ocwXKWBWtrGwltiTxmx/c4f6c0bd42690c0fee34705a2bcb18ba/fakurian-design-mqm-Ze_q_9A-unsplash-technical-debt.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/658ocwXKWBWtrGwltiTxmx/c4f6c0bd42690c0fee34705a2bcb18ba/fakurian-design-mqm-Ze_q_9A-unsplash-technical-debt.png?w=185&h=124&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/658ocwXKWBWtrGwltiTxmx/c4f6c0bd42690c0fee34705a2bcb18ba/fakurian-design-mqm-Ze_q_9A-unsplash-technical-debt.png?w=370&h=248&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/658ocwXKWBWtrGwltiTxmx/c4f6c0bd42690c0fee34705a2bcb18ba/fakurian-design-mqm-Ze_q_9A-unsplash-technical-debt.png?w=739&h=495&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/658ocwXKWBWtrGwltiTxmx/c4f6c0bd42690c0fee34705a2bcb18ba/fakurian-design-mqm-Ze_q_9A-unsplash-technical-debt.png?w=1109&h=743&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/658ocwXKWBWtrGwltiTxmx/c4f6c0bd42690c0fee34705a2bcb18ba/fakurian-design-mqm-Ze_q_9A-unsplash-technical-debt.png?w=1478&h=990&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/658ocwXKWBWtrGwltiTxmx/c4f6c0bd42690c0fee34705a2bcb18ba/fakurian-design-mqm-Ze_q_9A-unsplash-technical-debt.png?w=2217&h=1486&q=50&fm=webp&fit=scale 2217w,\n//images.ctfassets.net/s600jj41gsex/658ocwXKWBWtrGwltiTxmx/c4f6c0bd42690c0fee34705a2bcb18ba/fakurian-design-mqm-Ze_q_9A-unsplash-technical-debt.png?w=2686&h=1800&q=50&fm=webp&fit=scale 2686w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":null},{"title":"Learn JavaScript in 2021: Hassib Moddasser’s recommendation ","slug":"learn-javascript-guide-2021","featured":false,"lastUpdated":"Sep 21st, 2021","description":{"description":"<p>To learn JavaScript in 2021, we have a resource to share - a twitter thread from Hassib Moddasser. Their recommendations can help users to start to learn JavaScript with the best resources in 2021.&nbsp;</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"To learn JavaScript in 2021, we have a resource to share - a twitter thread from Hassib Moddasser. Their recommendations can help users to start to learn JavaScript with the best resources in 2021. "}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"The twitter handle of @hassibmoddasser who's tweets are showcased in this blog to learn JavaScript","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.4169570267131242,"src":"//images.ctfassets.net/s600jj41gsex/5YYKT2puI3GQH5cMJcj2j0/c0cbe2799bdd2ff7c8a3141892d2fc10/twitter-showcase-blog2.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/5YYKT2puI3GQH5cMJcj2j0/c0cbe2799bdd2ff7c8a3141892d2fc10/twitter-showcase-blog2.png?w=185&h=131&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5YYKT2puI3GQH5cMJcj2j0/c0cbe2799bdd2ff7c8a3141892d2fc10/twitter-showcase-blog2.png?w=370&h=261&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5YYKT2puI3GQH5cMJcj2j0/c0cbe2799bdd2ff7c8a3141892d2fc10/twitter-showcase-blog2.png?w=739&h=522&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5YYKT2puI3GQH5cMJcj2j0/c0cbe2799bdd2ff7c8a3141892d2fc10/twitter-showcase-blog2.png?w=1109&h=783&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/5YYKT2puI3GQH5cMJcj2j0/c0cbe2799bdd2ff7c8a3141892d2fc10/twitter-showcase-blog2.png?w=1220&h=861&q=50&fit=scale 1220w","srcWebp":"//images.ctfassets.net/s600jj41gsex/5YYKT2puI3GQH5cMJcj2j0/c0cbe2799bdd2ff7c8a3141892d2fc10/twitter-showcase-blog2.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/5YYKT2puI3GQH5cMJcj2j0/c0cbe2799bdd2ff7c8a3141892d2fc10/twitter-showcase-blog2.png?w=185&h=131&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5YYKT2puI3GQH5cMJcj2j0/c0cbe2799bdd2ff7c8a3141892d2fc10/twitter-showcase-blog2.png?w=370&h=261&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5YYKT2puI3GQH5cMJcj2j0/c0cbe2799bdd2ff7c8a3141892d2fc10/twitter-showcase-blog2.png?w=739&h=522&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5YYKT2puI3GQH5cMJcj2j0/c0cbe2799bdd2ff7c8a3141892d2fc10/twitter-showcase-blog2.png?w=1109&h=783&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/5YYKT2puI3GQH5cMJcj2j0/c0cbe2799bdd2ff7c8a3141892d2fc10/twitter-showcase-blog2.png?w=1220&h=861&q=50&fm=webp&fit=scale 1220w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joe Robinson","slug":"joseph-robinson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":null},{"title":"How tiny.cloud uses free monads for testing","slug":"tiny-cloud-free-monads","featured":false,"lastUpdated":"Jul 19th, 2021","description":{"description":"<p>At Tiny, we devised a solution to a file system problem using a solution from mathematics: Free Monads. In this deep dive into our process, we walk through what went into implementing Free Monads for testing our rich text editor.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"At Tiny, we devised a solution to a file system problem using a solution from mathematics: Free Monads. In this deep dive into our process, we walk through what went into implementing Free Monads for testing our rich text editor."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Graphics of TinyMCE and the Cloud","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAMAAAAhxq8pAAACc1BMVEUMEywMEiwMESsMGy4MIS8MHC4MEisMHi8MIC8MFSwMITAKGC0LEisNGy4NIjEMFiwMIjAXIzEMHi4IESoLEysQJDIMFi0MEioMESkLESoMECk3IDwxJjsbFCgHESgJEisMEysRIDESIjILECoLDycJESEMHzYMFi8MECQwIEIjKF8wIT4qGjMSEyoJEikWIzQUIjIMEykJDiAKGysYL18lPYgTIEsLDRMxJFUwUtonQKUhIUckIEUYGTcKESkKESsWHzIXITEIDCIIFyQTKk4iOX4rQpksQpwTH0sLDBEwIEg5WeExUtkhIkkrJE4eI08XH0YQFzUeJTQMFyUPJUIeNXEoPo4rQZgtQ5ssQpoMDhswHjgbKmkeM4YZI04pJE0zKU8lJ1AXIlARFSsiLkAZMWQmO4YrP5MsQZUrQZYrQZclOIQRG0ANESUwHz8bJlQZJlIjJVEoJE4dI08iJk8VIU8KESoRFigmN1cnO4kqPo8qPpAqPpEmOYYcKmQSGz4QGTcOEysvIEIbJ1gbKFkaJFMrJU4yKU4iJU8UIU8MESQlNlYnO4coPIslN38XIUkYIkkWH0QRGTorHz8gJlYZJlgiJVMlI08eJE8kJk4JDyMWLE8nOYUpPIohMnQSGjkYIksWIEYTGz4LEy0TFCwfHT4eJVIdJFMvJk8xKE8gJE8KECQSK04mOYMoO4kqPo4hMXETGz0ZJE8QGDcKEioKEikRFjAXH0QWI1AiJVAnKE8WIU8TK04lOIIlN4AcK2UQGTwOFjEOFjMNFC4LEioLEikVIEkWIlELECUSLE0eLmsRGj8IDBYKECMKEScSGz0XI0/uMlZ+AAAArElEQVQYGW3BTQoBcQDG4fc3/kYkzaCEkoWNE9hxASucQzkLO0tsbe2dw8IBfJU0RYz5aJR4npQiWJKlBAohC8HDVwSFbMDLPQ03XwEUsDNc08oSOkhCEipzcUnsZSTSdSjwYdeM8Nt8cRvQ5Vf+3id2LpLotfhhOvxRnQDHMoHxlMjOvBzg6BBYEBOVGbFTabgmZiSHiDuq9ZtLTiXm2FtCw9Ugu5ea3sbL8QaJ9CFZflaXeQAAAABJRU5ErkJggg==","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/sQsL5FErxkutJXb8qwwFy/5d0f772e5c09dec7689b38b895717830/How_Cloud_used_Free_Monads_for_testability.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/sQsL5FErxkutJXb8qwwFy/5d0f772e5c09dec7689b38b895717830/How_Cloud_used_Free_Monads_for_testability.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/sQsL5FErxkutJXb8qwwFy/5d0f772e5c09dec7689b38b895717830/How_Cloud_used_Free_Monads_for_testability.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/sQsL5FErxkutJXb8qwwFy/5d0f772e5c09dec7689b38b895717830/How_Cloud_used_Free_Monads_for_testability.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/sQsL5FErxkutJXb8qwwFy/5d0f772e5c09dec7689b38b895717830/How_Cloud_used_Free_Monads_for_testability.png?w=1109&h=911&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/sQsL5FErxkutJXb8qwwFy/5d0f772e5c09dec7689b38b895717830/How_Cloud_used_Free_Monads_for_testability.png?w=1478&h=1214&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/sQsL5FErxkutJXb8qwwFy/5d0f772e5c09dec7689b38b895717830/How_Cloud_used_Free_Monads_for_testability.png?w=1792&h=1472&q=50&fit=scale 1792w","srcWebp":"//images.ctfassets.net/s600jj41gsex/sQsL5FErxkutJXb8qwwFy/5d0f772e5c09dec7689b38b895717830/How_Cloud_used_Free_Monads_for_testability.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/sQsL5FErxkutJXb8qwwFy/5d0f772e5c09dec7689b38b895717830/How_Cloud_used_Free_Monads_for_testability.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/sQsL5FErxkutJXb8qwwFy/5d0f772e5c09dec7689b38b895717830/How_Cloud_used_Free_Monads_for_testability.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/sQsL5FErxkutJXb8qwwFy/5d0f772e5c09dec7689b38b895717830/How_Cloud_used_Free_Monads_for_testability.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/sQsL5FErxkutJXb8qwwFy/5d0f772e5c09dec7689b38b895717830/How_Cloud_used_Free_Monads_for_testability.png?w=1109&h=911&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/sQsL5FErxkutJXb8qwwFy/5d0f772e5c09dec7689b38b895717830/How_Cloud_used_Free_Monads_for_testability.png?w=1478&h=1214&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/sQsL5FErxkutJXb8qwwFy/5d0f772e5c09dec7689b38b895717830/How_Cloud_used_Free_Monads_for_testability.png?w=1792&h=1472&q=50&fm=webp&fit=scale 1792w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Morgan Smith","slug":"morgan-smith"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"How tiny.cloud uses free monads for testing"},"metaDescription":{"metaDescription":"At Tiny, we devised a solution to a file system problem using mathematics: a concept called Free Monads. In this deep dive into our process, we walk through what went into implementing Free Monads for testing our rich text editor."}},{"title":"The essential git stash and git reset guide","slug":"the-essential-git-stash-and-git-reset-guide","featured":false,"lastUpdated":"Jun 9th, 2021","description":{"description":"<p>In this guide, we take you through two essential git commands. Git stash saves your work and lets you switch branches.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"In this guide, we take you through two essential git commands. Git stash saves your work and lets you switch branches."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":" An octocat figurine stands in front of a computer screen","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.5316091954022988,"src":"//images.ctfassets.net/s600jj41gsex/3kGjWY2aHvXl6Hjad2Ch7V/3bb82ab03e8e0e44db961e742cb3505f/GitHub_reset.jpeg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/3kGjWY2aHvXl6Hjad2Ch7V/3bb82ab03e8e0e44db961e742cb3505f/GitHub_reset.jpeg?w=185&h=121&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/3kGjWY2aHvXl6Hjad2Ch7V/3bb82ab03e8e0e44db961e742cb3505f/GitHub_reset.jpeg?w=370&h=242&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/3kGjWY2aHvXl6Hjad2Ch7V/3bb82ab03e8e0e44db961e742cb3505f/GitHub_reset.jpeg?w=739&h=482&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/3kGjWY2aHvXl6Hjad2Ch7V/3bb82ab03e8e0e44db961e742cb3505f/GitHub_reset.jpeg?w=1066&h=696&q=50&fit=scale 1066w","srcWebp":"//images.ctfassets.net/s600jj41gsex/3kGjWY2aHvXl6Hjad2Ch7V/3bb82ab03e8e0e44db961e742cb3505f/GitHub_reset.jpeg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/3kGjWY2aHvXl6Hjad2Ch7V/3bb82ab03e8e0e44db961e742cb3505f/GitHub_reset.jpeg?w=185&h=121&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/3kGjWY2aHvXl6Hjad2Ch7V/3bb82ab03e8e0e44db961e742cb3505f/GitHub_reset.jpeg?w=370&h=242&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/3kGjWY2aHvXl6Hjad2Ch7V/3bb82ab03e8e0e44db961e742cb3505f/GitHub_reset.jpeg?w=739&h=482&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/3kGjWY2aHvXl6Hjad2Ch7V/3bb82ab03e8e0e44db961e742cb3505f/GitHub_reset.jpeg?w=1066&h=696&q=50&fm=webp&fit=scale 1066w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Team Tiny","slug":"team-tiny"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"The essential git stash and git reset guide | TinyMCE"},"metaDescription":{"metaDescription":"Guide to git stash and get reset - essential git commands. Git stash makes a temporary, local save of your code. Git reset lets you tidy up your code before doing a commit."}},{"title":"3 reasons why a great developer experience is crucial","slug":"why-have-a-great-developer-experience","featured":false,"lastUpdated":"Apr 14th, 2021","description":{"description":"<p>More often than not, we cater to our users by creating an intuitive user experience, but we should also focus on building a great developer experience. Learn the benefits of having a great developer experience in our latest blog.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"More often than not, we cater to our users by creating an intuitive user experience, but we should also focus on building a great developer experience. Learn the benefits of having a great developer experience in our latest blog."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Laptop at a desk office","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.5,"src":"//images.ctfassets.net/s600jj41gsex/4wRTVDqpVEIDf4C7Q0bNxx/c2b0d83dd4770065cbb9dd1e23ed5322/christopher-gower-vjMgqUkS8q8-unsplash.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/4wRTVDqpVEIDf4C7Q0bNxx/c2b0d83dd4770065cbb9dd1e23ed5322/christopher-gower-vjMgqUkS8q8-unsplash.jpg?w=185&h=123&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4wRTVDqpVEIDf4C7Q0bNxx/c2b0d83dd4770065cbb9dd1e23ed5322/christopher-gower-vjMgqUkS8q8-unsplash.jpg?w=370&h=247&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4wRTVDqpVEIDf4C7Q0bNxx/c2b0d83dd4770065cbb9dd1e23ed5322/christopher-gower-vjMgqUkS8q8-unsplash.jpg?w=739&h=493&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4wRTVDqpVEIDf4C7Q0bNxx/c2b0d83dd4770065cbb9dd1e23ed5322/christopher-gower-vjMgqUkS8q8-unsplash.jpg?w=1109&h=739&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4wRTVDqpVEIDf4C7Q0bNxx/c2b0d83dd4770065cbb9dd1e23ed5322/christopher-gower-vjMgqUkS8q8-unsplash.jpg?w=1478&h=985&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4wRTVDqpVEIDf4C7Q0bNxx/c2b0d83dd4770065cbb9dd1e23ed5322/christopher-gower-vjMgqUkS8q8-unsplash.jpg?w=2217&h=1478&q=50&fit=scale 2217w","srcWebp":"//images.ctfassets.net/s600jj41gsex/4wRTVDqpVEIDf4C7Q0bNxx/c2b0d83dd4770065cbb9dd1e23ed5322/christopher-gower-vjMgqUkS8q8-unsplash.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/4wRTVDqpVEIDf4C7Q0bNxx/c2b0d83dd4770065cbb9dd1e23ed5322/christopher-gower-vjMgqUkS8q8-unsplash.jpg?w=185&h=123&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4wRTVDqpVEIDf4C7Q0bNxx/c2b0d83dd4770065cbb9dd1e23ed5322/christopher-gower-vjMgqUkS8q8-unsplash.jpg?w=370&h=247&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4wRTVDqpVEIDf4C7Q0bNxx/c2b0d83dd4770065cbb9dd1e23ed5322/christopher-gower-vjMgqUkS8q8-unsplash.jpg?w=739&h=493&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4wRTVDqpVEIDf4C7Q0bNxx/c2b0d83dd4770065cbb9dd1e23ed5322/christopher-gower-vjMgqUkS8q8-unsplash.jpg?w=1109&h=739&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/4wRTVDqpVEIDf4C7Q0bNxx/c2b0d83dd4770065cbb9dd1e23ed5322/christopher-gower-vjMgqUkS8q8-unsplash.jpg?w=1478&h=985&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/4wRTVDqpVEIDf4C7Q0bNxx/c2b0d83dd4770065cbb9dd1e23ed5322/christopher-gower-vjMgqUkS8q8-unsplash.jpg?w=2217&h=1478&q=50&fm=webp&fit=scale 2217w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Qiran Gabrielle-Grace","slug":"qiran-gabrielle-grace"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"The importance of a great developer experience?"},"metaDescription":{"metaDescription":"More often than not, we cater to our users by creating an intuitive user experience, but we should also focus on building a great developer experience. Learn the benefits of having a great developer experience in our latest blog. "}},{"title":"Collecting and analyzing metrics in engineering","slug":"collecting-and-analyzing-engineering-metrics","featured":false,"lastUpdated":"Feb 10th, 2021","description":{"description":"<p>Software development metrics done right can be extremely fascinating and illuminating. They can save your development teams from myriad unnecessary costs and frustrations, and improve performance as a result.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Software development metrics done right can be extremely fascinating and illuminating. They can save your development teams from myriad unnecessary costs and frustrations, and improve performance as a result."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Series of graphs on a screen ","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAADbUlEQVQYGQXBy24bVRgA4P9c5ubx+BZnbMeO08R1moYQS1XUtLShRDQLoGxbsUPsYAMb3oAFEq/AkiVPgFARIlIkAlUSgZI6iZ3E93vs8Vw8c+ZMvw/ByjOomJt7W9sPNzO6HpJlgiklBFNCCAaAWEiNqIogUlkSZEmQJEGWRFEUMMIUKgPQ0ztPt7Lp5Mz1PcZUTUGEEIxlUVRlSVVkURIoxQgC0zL7Q9ucWoPBuNsbUYDQoycbuYWkKiuxMA0rIVEQAQHBhHnMmEybzfZwdKtpocp1++yi6fmwf9iBugvgUQBl7f4dRRECzhnz2r1+rzvq9EZaRLus9fdP29O/x5BC33y1dXLRFgkmga+lBAP7nz7J0Px2NpmMHhydVuqjOU3rje1/GxOwZi8/KJ63htz3IAOfPMsxj/1X7WgSrQ9sEAi47vMPS3T70TrzvXKtCxwrEm4NDXBne+u661qXg36UAqRZoaBfdcwxlixJjuTVCWNSXLx77x4tFHO1egcjtrI4b1qsOWMgCfPz0ePTazDZ2A8kVVBk6a+jY2iYXsC9AKDjf/wqH0stUUWm7swtraSKS+l6q/+Cxx0n0MIiQPB+PuJ5/vqKDoinQ6iwESMIAQQj29vdKQVCFP3w8y/A+GJ6LpdKMMZMx5t52HK4MTEJIQAQj2kIAWNMEkVRoAIhsoTzi/l/ajL97eDopmPsllay6YSAfds2U8n0yWX7qnE7NWzHdD7/6MF5reNzznkgCLTVn2Ri8vfffv222saN/m3A2YyxN2c3JxdNx+UYB4BcxmeHlbYmYcb5YGwgFPx+Wvv1+Gq/3E5ockDV03INc24u69rYMF+XG/tvm56HylfNRrc7taeA/PdWF3vj6djjjYkdiSoLmggSerBZnDjo4qxDMXWiidD/TcsRZcdxGPMPyxcz7hpWUFgAXY+9PqpWplZEEsKawjEBma4Wi9dd4+ECpV+++Ax8FCYNfWhTHJ9MJ2+qVTUuR0RUymcggIN6MykQzok7wx3P39PVpL7wx5+t3cdZOjGc7Pz83s4WIYRzPhqOMolEtz+46rSykVy91QXTceJqmGCREttjT0tFLGo31aMvXhbpT9/9CPnC88dr62t3lwuL6XR6eekO5wFzGcG41+/PxULH57XKyBAw1kSycX916oBgmbls4h1y9LwoBnnxQQAAAABJRU5ErkJggg==","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/6PhK9JTfUHcfDbO6sE4S6J/b60deb9f420181df16d4fc311d799cb5/BlogImage_Feb2021_default_analytics.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6PhK9JTfUHcfDbO6sE4S6J/b60deb9f420181df16d4fc311d799cb5/BlogImage_Feb2021_default_analytics.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6PhK9JTfUHcfDbO6sE4S6J/b60deb9f420181df16d4fc311d799cb5/BlogImage_Feb2021_default_analytics.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6PhK9JTfUHcfDbO6sE4S6J/b60deb9f420181df16d4fc311d799cb5/BlogImage_Feb2021_default_analytics.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6PhK9JTfUHcfDbO6sE4S6J/b60deb9f420181df16d4fc311d799cb5/BlogImage_Feb2021_default_analytics.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6PhK9JTfUHcfDbO6sE4S6J/b60deb9f420181df16d4fc311d799cb5/BlogImage_Feb2021_default_analytics.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6PhK9JTfUHcfDbO6sE4S6J/b60deb9f420181df16d4fc311d799cb5/BlogImage_Feb2021_default_analytics.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6PhK9JTfUHcfDbO6sE4S6J/b60deb9f420181df16d4fc311d799cb5/BlogImage_Feb2021_default_analytics.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6PhK9JTfUHcfDbO6sE4S6J/b60deb9f420181df16d4fc311d799cb5/BlogImage_Feb2021_default_analytics.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6PhK9JTfUHcfDbO6sE4S6J/b60deb9f420181df16d4fc311d799cb5/BlogImage_Feb2021_default_analytics.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Dylan Just","slug":"dylan-just"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Collecting and analyzing metrics in engineering"},"metaDescription":{"metaDescription":"Software development metrics done right can be extremely fascinating and illuminating. They can save your development teams from myriad unnecessary costs and frustrations, and improve performance as a result."}},{"title":"Tiny Programming Principles: The concept of Optionals","slug":"javascript-optionals","featured":false,"lastUpdated":"Feb 8th, 2021","description":{"description":"<p>Just because you can use null or undefined doesn&rsquo;t mean you should. We talk about the problems that come up and how Optionals can help overcome them.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Just because you can use null or undefined doesn’t mean you should. We talk about the problems that come up and how Optionals can help overcome them."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"People discussing at a table in an office ","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAANABQDAREAAhEBAxEB/8QAGQAAAQUAAAAAAAAAAAAAAAAAAwQFBgcI/8QAJRAAAQMDBAICAwAAAAAAAAAAAQIDBAUGEQAHEiEIMTJBE1GB/8QAGAEAAwEBAAAAAAAAAAAAAAAAAwQFBgL/xAAjEQACAQMDBAMAAAAAAAAAAAABAgMABBEhQVESFCMxYXGR/9oADAMBAAIRAxEAPwCl6f44W3cdh1Nqz6hKnP3GmNNeaD6FhlhhQWeK1pBCTz55++JH1jTErRJKwbOAM52qn2cgg8ZyWOg3I2I4ph3E8J5FhRJEwPVKp05uKzJTLjhtQy4pKQhSQOQIKgPX6/hbZEvCFQ4J5pC5ga1Y51HPNQ2lbaUil09pt+qPxlr5L4PJGfkRn49DrXM6rbSGJ3GRQ40MqBwDSvY/d2oWtbVehTmDWqNNirhmmuu/jaSXB0vpJzwJJSn13oVw3WiuygnX39VUs5HkPbliB8e/3BrX3jTuRJ3621gyLihRH1wn3YIMiMxIU4EKyFKUtvPogYz9aQE7oOpNKYW2SQZYnQnehX/ZtuO3Cst0ViMgIADTPSE9n0DnGs3cu8spdjqa0FuojjCDav/Z","aspectRatio":1.5,"src":"//images.ctfassets.net/s600jj41gsex/6kqW0LP4TCJbdW2de79axH/b8ab73e7c040b67c0caf3667069d33d7/Optionals.jpeg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/6kqW0LP4TCJbdW2de79axH/b8ab73e7c040b67c0caf3667069d33d7/Optionals.jpeg?w=185&h=123&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6kqW0LP4TCJbdW2de79axH/b8ab73e7c040b67c0caf3667069d33d7/Optionals.jpeg?w=370&h=247&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6kqW0LP4TCJbdW2de79axH/b8ab73e7c040b67c0caf3667069d33d7/Optionals.jpeg?w=739&h=493&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6kqW0LP4TCJbdW2de79axH/b8ab73e7c040b67c0caf3667069d33d7/Optionals.jpeg?w=1109&h=739&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6kqW0LP4TCJbdW2de79axH/b8ab73e7c040b67c0caf3667069d33d7/Optionals.jpeg?w=1478&h=985&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6kqW0LP4TCJbdW2de79axH/b8ab73e7c040b67c0caf3667069d33d7/Optionals.jpeg?w=1950&h=1300&q=50&fit=scale 1950w","srcWebp":"//images.ctfassets.net/s600jj41gsex/6kqW0LP4TCJbdW2de79axH/b8ab73e7c040b67c0caf3667069d33d7/Optionals.jpeg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/6kqW0LP4TCJbdW2de79axH/b8ab73e7c040b67c0caf3667069d33d7/Optionals.jpeg?w=185&h=123&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/6kqW0LP4TCJbdW2de79axH/b8ab73e7c040b67c0caf3667069d33d7/Optionals.jpeg?w=370&h=247&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/6kqW0LP4TCJbdW2de79axH/b8ab73e7c040b67c0caf3667069d33d7/Optionals.jpeg?w=739&h=493&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/6kqW0LP4TCJbdW2de79axH/b8ab73e7c040b67c0caf3667069d33d7/Optionals.jpeg?w=1109&h=739&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/6kqW0LP4TCJbdW2de79axH/b8ab73e7c040b67c0caf3667069d33d7/Optionals.jpeg?w=1478&h=985&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/6kqW0LP4TCJbdW2de79axH/b8ab73e7c040b67c0caf3667069d33d7/Optionals.jpeg?w=1950&h=1300&q=50&fm=webp&fit=scale 1950w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Millie Macdonald","slug":"millie-macdonald"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Programming Principles: Optionals Vs Null Or Undefined"},"metaDescription":{"metaDescription":"Just because you can use null or undefined doesn’t mean you should. We talk about the problems that come up and how Optionals can help overcome them."}},{"title":"Tiny Programming Principles: Immutability","slug":"mutable-vs-immutable-javascript","featured":false,"lastUpdated":"Jan 26th, 2021","description":{"description":"<p>We share key benefits of immutability, and why JavaScript developers (in particular) should choose immutable objects over mutating functions.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We share key benefits of immutability, and why JavaScript developers (in particular) should choose immutable objects over mutating functions."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Five eggs are stacked precariously on top of each other.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":0.6669390614055568,"src":"//images.ctfassets.net/s600jj41gsex/5b81UPp1646TlwGYqCwI2U/8a0d08a26791a54e23998303dfa9a0f2/jiangxulei1990-eIzzzwtkBjU-unsplash.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/5b81UPp1646TlwGYqCwI2U/8a0d08a26791a54e23998303dfa9a0f2/jiangxulei1990-eIzzzwtkBjU-unsplash.jpg?w=185&h=277&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5b81UPp1646TlwGYqCwI2U/8a0d08a26791a54e23998303dfa9a0f2/jiangxulei1990-eIzzzwtkBjU-unsplash.jpg?w=370&h=555&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5b81UPp1646TlwGYqCwI2U/8a0d08a26791a54e23998303dfa9a0f2/jiangxulei1990-eIzzzwtkBjU-unsplash.jpg?w=739&h=1108&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5b81UPp1646TlwGYqCwI2U/8a0d08a26791a54e23998303dfa9a0f2/jiangxulei1990-eIzzzwtkBjU-unsplash.jpg?w=1109&h=1663&q=50&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/5b81UPp1646TlwGYqCwI2U/8a0d08a26791a54e23998303dfa9a0f2/jiangxulei1990-eIzzzwtkBjU-unsplash.jpg?w=1478&h=2216&q=50&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/5b81UPp1646TlwGYqCwI2U/8a0d08a26791a54e23998303dfa9a0f2/jiangxulei1990-eIzzzwtkBjU-unsplash.jpg?w=2217&h=3324&q=50&fit=scale 2217w","srcWebp":"//images.ctfassets.net/s600jj41gsex/5b81UPp1646TlwGYqCwI2U/8a0d08a26791a54e23998303dfa9a0f2/jiangxulei1990-eIzzzwtkBjU-unsplash.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/5b81UPp1646TlwGYqCwI2U/8a0d08a26791a54e23998303dfa9a0f2/jiangxulei1990-eIzzzwtkBjU-unsplash.jpg?w=185&h=277&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5b81UPp1646TlwGYqCwI2U/8a0d08a26791a54e23998303dfa9a0f2/jiangxulei1990-eIzzzwtkBjU-unsplash.jpg?w=370&h=555&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5b81UPp1646TlwGYqCwI2U/8a0d08a26791a54e23998303dfa9a0f2/jiangxulei1990-eIzzzwtkBjU-unsplash.jpg?w=739&h=1108&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5b81UPp1646TlwGYqCwI2U/8a0d08a26791a54e23998303dfa9a0f2/jiangxulei1990-eIzzzwtkBjU-unsplash.jpg?w=1109&h=1663&q=50&fm=webp&fit=scale 1109w,\n//images.ctfassets.net/s600jj41gsex/5b81UPp1646TlwGYqCwI2U/8a0d08a26791a54e23998303dfa9a0f2/jiangxulei1990-eIzzzwtkBjU-unsplash.jpg?w=1478&h=2216&q=50&fm=webp&fit=scale 1478w,\n//images.ctfassets.net/s600jj41gsex/5b81UPp1646TlwGYqCwI2U/8a0d08a26791a54e23998303dfa9a0f2/jiangxulei1990-eIzzzwtkBjU-unsplash.jpg?w=2217&h=3324&q=50&fm=webp&fit=scale 2217w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Millie Macdonald","slug":"millie-macdonald"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Immutable vs mutable: Definitions, benefits & practical tips"},"metaDescription":{"metaDescription":"We share key benefits of immutability, and why JavaScript developers (in particular) should choose immutable objects over mutating functions."}},{"title":"What is DevOps?","slug":"what-is-devops","featured":false,"lastUpdated":"Sep 20th, 2020","description":{"description":"<p>DevOps is a mashup of &ldquo;development&rdquo; and &ldquo;operations&rdquo;, but it has become shorthand for a significant culture shift that, done right, can drive meaningful organizational change.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"DevOps is a mashup of “development” and “operations”, but it has become shorthand for a significant culture shift that, done right, can drive meaningful organizational change."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"At least three cogs interlocked.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAMAAAAhxq8pAAAC6FBMVEXx8vWhpLAAAAATFR8gIy0KDhmbnqn////S09qIh5fMx8mXlZ3Y19na2dq2truamqSqpqjV09Dq6+66u8PHyM37+vy3t8BPVW7QzMzDv8HX1tipqaxlZWp1dH5RTViAgIrIyc3i4eS1trpyc3dRUldYWl+FiIzO0NP09PbPz9NSV2ZFSmDNysvY1tfY19jIxsibnKAAAA55e4VDR1KenqPY19rW1NbZ2dzg4OTX19qlpqpCRlIAAB18fYfV09Ti4OC2tLdhYWU8PUE8PkZlZmt5eHx4d3phYWYxMz1dX2/EwsampKW0sbKVlZhfZHQhJzlKTVqPkJjEw8bHxMXT0NCSkZMAAwmDhIiipa+ytb6eoaqLjpiNj5eYm6S3uL6zs7fGxcfRzs5VVFVgX2FzdHguMTZ0dXhRUlWpp6h7foSFh46Eh47MzdObm5+Nj5XMzNF6enw7PT+amJpVVFZrbXDf3d3Gw8SenqJsbnZzc3hMTld+f4chIyhnaW45Oj5ydHp0dHuurbO7ub6bmpzJyMvMycvc2duAfoEdHCF3d3rKxMfAur61r7WqpKrJyMjl4+De29nMycbW0s7FwsI+PkVpanGsqKmYk5W/t7fMwb/HurjGu7qFgYIQGiHDwL3n4d3q5uDx7unIxcNWU1NkYmIoKS1gYmi2sLHAtbbAs7LCtLC7rKjIubWzqqySkI7l3trZ08/RzMrc2dXf3NjY1NJ3dnxram+NiYmakpS6ra2/r6rEsqzEsavJtq/AsK0GDxbFvrnf1tLGv77Y0czo493o5eC7t7VNSEc6ODgAAA+Sk5zHwMHTxsTMvLbAr6nOvLXTwrnMubCyo6HKw77g19Hb0s7Zz8va0Mvb1M/X0Mzf2dTW0Muyr7EyN0JKSEmQi465r7K2qKmnnJuroJuimJapm5uwoqTf2NLd2dPg2dPm3NXd1dDh3tng2tXf2NPY089raW1pa3XSzMq8tri0q66TiotGREetoaF10cWDAAAAqElEQVQYGWXBoQ4BARzH8d/X/sm4w64qHsBsmiZJJEyRdE26aYgEbyCfhKLwCp5A0QlE4xyG+XwQCLgaH5bhqNtNcvgwB5dfuwJFLgm+bSViKvOwVoVDFlaSqLFQqOTxMK8HUsPitEC8KOgAlj6leJtIctnnzHEJjXwGCvVXCfJYEvBHGioSbwI9xkS6Ck15MpfIjLaU5iUW8FTVkrcN/8zjn3n8SEpn7nFxHj+FrHhdAAAAAElFTkSuQmCC","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/1OC5CO8rBreAg4edplgfGY/d323567754d2a63829544c582c9be790/Image_default_WhatIsDevOps.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/1OC5CO8rBreAg4edplgfGY/d323567754d2a63829544c582c9be790/Image_default_WhatIsDevOps.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1OC5CO8rBreAg4edplgfGY/d323567754d2a63829544c582c9be790/Image_default_WhatIsDevOps.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1OC5CO8rBreAg4edplgfGY/d323567754d2a63829544c582c9be790/Image_default_WhatIsDevOps.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1OC5CO8rBreAg4edplgfGY/d323567754d2a63829544c582c9be790/Image_default_WhatIsDevOps.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/1OC5CO8rBreAg4edplgfGY/d323567754d2a63829544c582c9be790/Image_default_WhatIsDevOps.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/1OC5CO8rBreAg4edplgfGY/d323567754d2a63829544c582c9be790/Image_default_WhatIsDevOps.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1OC5CO8rBreAg4edplgfGY/d323567754d2a63829544c582c9be790/Image_default_WhatIsDevOps.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1OC5CO8rBreAg4edplgfGY/d323567754d2a63829544c582c9be790/Image_default_WhatIsDevOps.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1OC5CO8rBreAg4edplgfGY/d323567754d2a63829544c582c9be790/Image_default_WhatIsDevOps.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Cameron Bowden","slug":"cameron-bowden"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":null},{"title":"XSS security issue - Tiny’s commitment","slug":"xss-security-issue-tinys-commitment","featured":false,"lastUpdated":"Aug 12th, 2020","description":{"description":"<p>Tiny has released a security update for its open source HTML editor based on a cross-site scripting (XSS) vulnerability discovered by Bishop Fox Labs.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiny has released a security update for its open source HTML editor based on a cross-site scripting (XSS) vulnerability discovered by Bishop Fox Labs."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Laptop keyboard viewed from the side with screen half closed.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAMAAAAhxq8pAAACtVBMVEUAAAAEAAABCCQAR28AeqYAm74AlLccja0+kKhPkp89eoYGRFYACBcBAAABAQECAAAHAwAKGi4COFwAWYcAdqYAhqwFgaI5iJ9IhpNAc34mUVsAHicEAgQcIjEWNlUCRW8ARG0AR3UETnoQUHYpXno0YG0ZPUkABBUBAQArKjkpNk8TPWAHOmEAJEgAJUgQQWAdTGQRPVEHJjMAAAMlLkkhMU0IHT0EDiwAGjYCMEkKMkMEGSUEHjwABTIACDEACioACB8AAhEMNlsAETsBDCkABBECFycBCAsRNT0AKTEDAQAgHSEUExwcHCYDCBktNDwVKDYPLDYYNDwySU86Tk8wSVIAN0oKMkUIKToFIjEDGygiRlEqQUwxNkgvM0kuM0oqNU4MLEk+VGU2VmceWm1jho5Fd4BCeoMnam8ua3Q9hJYudo8nYnwhUWobRFxRX29GVnAmOmJHUGs0P1wAN1w9YXhGb4InbIA4gJBqoKdQk5tem6EhfYM9en5fo6wxmLEXf6ATaIsRVnckOWFJUnJYX3okOV4ANFxGYHpZeo4YaYIzhppam6dlqa9gpat9tLdToKJ7qat8rrM4qr4AiKoAapEAUngtO2VcYnotPV8AKVcAMltFZX89cYpIh507jKBXoK1wsrmBu8CKwcM/padpq66Er7VFr70AkLAAa5IAT3dWWnk/SW0AKVgALVsYQ2pOd5RMhaBOlK0Ai6Y8pLd/wsyWzdWKyM0/sbY9q7NXp7MvobQIkbEAbJYAU3wAGUwAIVYAKl4ANmgASHgAX44AeKMAjbMAnb8Arsctu81VxdJbx9JMw84vusgAq70AlrEAhKcAapMAUnsAEjgAGUEAIUsAK1QAOWIAS3MAXoUAcJQAgaAAj6gAma4Pn68coK8XnasAk6MAhZgAcYoAYH4ATW4AOFrOWP21AAAAZklEQVQY08XOMQ4BURhG0fMlf0QiLwoqbMBObFkUKqWeBZgNzAYUiDexALc81Q1E+hTLHh4asevoTtsOsv/SFS2oxVsuPkTNkyRnGmwMqFmSE4xwo1GVo0kjObzWJqO1ym+1/ic+Ae+2DOEd8QKdAAAAAElFTkSuQmCC","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/RfipD0YfixdLF2pYVYTZd/059012812c4fa3815751fc619c66ef02/Image_default_security__1_.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/RfipD0YfixdLF2pYVYTZd/059012812c4fa3815751fc619c66ef02/Image_default_security__1_.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/RfipD0YfixdLF2pYVYTZd/059012812c4fa3815751fc619c66ef02/Image_default_security__1_.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/RfipD0YfixdLF2pYVYTZd/059012812c4fa3815751fc619c66ef02/Image_default_security__1_.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/RfipD0YfixdLF2pYVYTZd/059012812c4fa3815751fc619c66ef02/Image_default_security__1_.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/RfipD0YfixdLF2pYVYTZd/059012812c4fa3815751fc619c66ef02/Image_default_security__1_.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/RfipD0YfixdLF2pYVYTZd/059012812c4fa3815751fc619c66ef02/Image_default_security__1_.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/RfipD0YfixdLF2pYVYTZd/059012812c4fa3815751fc619c66ef02/Image_default_security__1_.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/RfipD0YfixdLF2pYVYTZd/059012812c4fa3815751fc619c66ef02/Image_default_security__1_.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/RfipD0YfixdLF2pYVYTZd/059012812c4fa3815751fc619c66ef02/Image_default_security__1_.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Dylan Just","slug":"dylan-just"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":null},{"title":"Full-stack developer skills and the importance of learning","slug":"full-stack-developer-skills-and-the-importance-of-learning","featured":false,"lastUpdated":"Jun 29th, 2020","description":{"description":"<p>What skills are required for a full-stack developer? We list 12 essential skills, and discuss the importance of learning, theory vs practice, depth vs breadth, and more.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"What skills are required for a full-stack developer? We list 12 essential skills, and discuss the importance of learning, theory vs practice, depth vs breadth, and more."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Laptop with hands poised ready to type code.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAADeklEQVQYGT3BW0xbZRwA8P/3ne9cOD1t6Wl7uBTEcW1hkrhN57QkWwbbg+7BS5zJNPHN6Ksmanz3ae8+aLwkJiYuXuKy6SIu2iAbAhMGG6ygbaWjF9jKDufQc/+LJvr7kco9XeA4SgmlZB/sQ0BAAPD8AAEB4b6+O7two1vTCCGu5zqO5fqeHyADIAiA8K8AABABgiAAQggAILi+73pe4HsEkALhCHCUYkCB+OyTLy6IsuJYTd/xpJAiyi30H8JToyMHOtRiuTp5LafIfFiWKQFCkACQ/7DJXK5zoP/zKzNwy1SfSHUnVNsOXj11IqYozT3nux+nNmrr586cIpQn/4N9iBiwgd5+SeGPHWgvOFtdsuyoaqcqjx0ZDYn89PW5j678kApR0zTVeAKR7AsoJQCIAQY+HRhKi5zU09XuEOp7wDx3fPiRtmS8tFH/4MOPqdPAWFulviXwTOCZyASBMUIAEBCBam2a1fRUNdI/0G4R6FNaRx/uM2z3wuXvL1389I+ruXqpnF8vUsqJgkAZFwAGiAQQEJkXoK6byVTbS+eeW1gqjA0elETx4uLM+/PfAqgiR2pLK7/L8Mzpk0hooVyW0dU4SAR+IMvc2++8JzC2US77hKvUmxNHD5uG/tr587BSyp59fpeSxp1r67qQfbTPMHdLpfX2Sin/02SzWkiEJS47MR4grq39OZjJ3ClVbNOam73+OG289cqLL5w8/uzxLOXYwtSlaDwuRSOKrldzV2tIeh/qlnmOe2zsSVkJb9XqiWR8+mbpy6++yYbvv/7y2cxgv6Yltc7O9MhI44GxuLxkuX5rYzvTEY/ydHOrsVzc5ERJ4CV517Bc9H3KDabCT2d6uuMRY8/MzS/MzM4xAqlUSke+LzPiRBKLa+XLKxs3mn5+zyYAEI/GDo+fOXjkWCgaEyhod28Pdyh3DXfbNE5MnG7VOjzKfl1es5hMCdkzzdrm5vz0Lz9//Rl548131UQyGo04lrWYL8aSHYXV1bRXjUVC6Uzf8KGjrZ094bhm+1C8t1vbMX6bnb15+5a5XSeew2hEfeBDpVypFourM1OWbQMv5glNcJwgQnuqm8W7PBsZL3RpiWRrVOH8ZFzNFzfcwGfbuim3SKZu7FSqEi/IosRRNGxrrlA/NJTs9QXbJsqOIQl8iyCEZGkknR7qH/irWi9Wt/4GTjShYZiAiZYAAAAASUVORK5CYII=","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/2mHaYURLMpWxhkwcb3T4m7/9568def5d5cfe4003dd8cb9838febc85/Image_default_fullstackdevskills.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/2mHaYURLMpWxhkwcb3T4m7/9568def5d5cfe4003dd8cb9838febc85/Image_default_fullstackdevskills.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2mHaYURLMpWxhkwcb3T4m7/9568def5d5cfe4003dd8cb9838febc85/Image_default_fullstackdevskills.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2mHaYURLMpWxhkwcb3T4m7/9568def5d5cfe4003dd8cb9838febc85/Image_default_fullstackdevskills.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2mHaYURLMpWxhkwcb3T4m7/9568def5d5cfe4003dd8cb9838febc85/Image_default_fullstackdevskills.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/2mHaYURLMpWxhkwcb3T4m7/9568def5d5cfe4003dd8cb9838febc85/Image_default_fullstackdevskills.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/2mHaYURLMpWxhkwcb3T4m7/9568def5d5cfe4003dd8cb9838febc85/Image_default_fullstackdevskills.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2mHaYURLMpWxhkwcb3T4m7/9568def5d5cfe4003dd8cb9838febc85/Image_default_fullstackdevskills.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2mHaYURLMpWxhkwcb3T4m7/9568def5d5cfe4003dd8cb9838febc85/Image_default_fullstackdevskills.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2mHaYURLMpWxhkwcb3T4m7/9568def5d5cfe4003dd8cb9838febc85/Image_default_fullstackdevskills.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Dylan Just","slug":"dylan-just"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"12 essential skills for full-stack developers and the importance of learning"},"metaDescription":{"metaDescription":"What skills are required for a full-stack developer? We list 12 essential skills, and discuss the importance of learning, theory vs practice, depth vs breadth, and more."}},{"title":"Tiny takes security seriously","slug":"tinymce-security-tiny-takes-security-seriously","featured":false,"lastUpdated":"Jun 18th, 2020","description":{"description":"<p>When it comes to developing software for commercial use, more and more developers understand the importance of security. That&rsquo;s why, at Tiny, security is a top priority.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"When it comes to developing software for commercial use, more and more developers understand the importance of security. That’s why, at Tiny, security is a top priority."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Blurred code on a screen in shades of blue and purple.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAC3UlEQVQYGQXBWXIbVRQA0HvvG7s1tIbIsl0hwWX45CMbAJbC5tgLK+CDpChXKA+yJMtSD6/feDkHv/z0Z1L/htIq48/juvf86Spz8d5DcIG4num5RVOB9uE/RW4RbwxLCH6WrYRKCr2NXo9o1TxVSexDzjgBKChcLdTFK8+yy2eLVmsKyoWYhIwWSEymvwXp1CRrfZqu1GJjZFWkIYDcTM2miSkrQkclT+XK6BLimM9WhWosrbz93Nilr2ZY3JMxF5IyJMFoE6/2u/fHXTS4ksJnsc8Cz23K3gV6qIqcw1Jub9dJtiV/43gUuurf3pbLdYaOrJneX0P6x2BKPbQh+eQQxuVk0wUHaRjSkby/EMVFjZW1JLW2NQNgiZyHSsft9gdbT3JZBj9HqACwCyfOGGPq0kk0zRdrkjGCtDa2koILYGIq1LjQKDHVQKF/SSEQvkkGoXxRhwpmE5jLl13cbnqrts99XYnEBQAogI2nlkR/6WnYP/LYlmKAA6JJMVCeK64EZUl8/fe3/Uu86tMlcz+bbFPiflSa52UInGepba6nHMM1jEtM3OhFPR/5RBCSXJrVw/5xgMNmpST3h2758zYahIcXklkrdjpvgk8Kk6CJFcBdarvxGpcGUXxa/6Ht449XUdBUoTyf3Ptxh2wgBIgTlTPF6NuILl7RnUoip8vg9yqjAhJz/vXm47D54A+v34feiCwlcCUwO1fjZj31xEf0eWXWhc+ZDw1NyHReHUf9Jj/fWizr/dPj2J6QdIlcV0hlpmk305V3uzH/lS0dYbVQm1S6NiQWQ4/Pb/2zbD48PLx+jTmXchzHrwh6KJ0n7N25p+ucOZdXAtGVp5ZqJu/TxeAUi1jwR/zl7ncXWucjMFaVdcEpoRmCFLJ376v6DhFLLAKE4YmUiF7M8yrzSFzkyt6Mcg2VKFnUtjlcdmtzPwY/xL3FsuF7zEyFY+k4Bx2FT5e2HA/xe1sO/wOzBta69+xBfAAAAABJRU5ErkJggg==","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/2Zcdq5Pd0z0UVsJbHukFqR/54e32cfad87249c4c86e6cd5edf09405/Image_default_Security.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/2Zcdq5Pd0z0UVsJbHukFqR/54e32cfad87249c4c86e6cd5edf09405/Image_default_Security.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2Zcdq5Pd0z0UVsJbHukFqR/54e32cfad87249c4c86e6cd5edf09405/Image_default_Security.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2Zcdq5Pd0z0UVsJbHukFqR/54e32cfad87249c4c86e6cd5edf09405/Image_default_Security.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2Zcdq5Pd0z0UVsJbHukFqR/54e32cfad87249c4c86e6cd5edf09405/Image_default_Security.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/2Zcdq5Pd0z0UVsJbHukFqR/54e32cfad87249c4c86e6cd5edf09405/Image_default_Security.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/2Zcdq5Pd0z0UVsJbHukFqR/54e32cfad87249c4c86e6cd5edf09405/Image_default_Security.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2Zcdq5Pd0z0UVsJbHukFqR/54e32cfad87249c4c86e6cd5edf09405/Image_default_Security.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2Zcdq5Pd0z0UVsJbHukFqR/54e32cfad87249c4c86e6cd5edf09405/Image_default_Security.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2Zcdq5Pd0z0UVsJbHukFqR/54e32cfad87249c4c86e6cd5edf09405/Image_default_Security.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ben Long","slug":"ben-long"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"TinyMCE security: Tiny takes security seriously"},"metaDescription":{"metaDescription":"When it comes to developing software for commercial use, more and more developers understand the importance of security. That’s why, at Tiny, security is a top priority."}},{"title":"8 habits of successful development teams","slug":"habits-successful-developers","featured":false,"lastUpdated":"Jun 8th, 2020","description":{"description":"<p>Successful developers work well with other people, continually learn new skills, and build up their team. We talk about 8 regular habits for success as a developer.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Successful developers work well with other people, continually learn new skills, and build up their team. We talk about 8 regular habits for success as a developer."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Two developers working at a laptop.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAADeklEQVQYGQXB209bdQAH8O/vcm7taSltEToog7aUlg2miRbRTLPEeHlYjEs0vvlkjL6ZmBjjn+Db4ptvPpgZjcZkcxvbHERkGWQXrl0ZrJQWKPS0O2vp5fTc/HxIsLcXVOgJ9H//1Wf7+4WPP/8ynUofHB5c/e3W9GtvCCJnlDBKCUCNtsM5lwRKAODG9RvUcWzT7JQKedHsXrr4kXZ0BECRFUJcTohACaeUU8IoIaJICaGAQGlD16/P/k0d12kbHZ994vcp3lCgVCwAkBVZ4IS6LieUgzJQTqgASh2XOCAuyW5m/5z9i1uWZRndU31e7lr7hcLS8vKlTz4VRdF2zVrlWFZkAAAcx3Gsru3aTBBl2iw9vQmAd00bQDTSH/B7B2KJ3JMfNU0DyObRcf55QxS5LImEuJZpOrZrmt13L5zvuMLiykMA3DItAH6Jeny+odHY2Hi6fHio9gTF8KhXVS2bbVQsSqWhoPz6RG+rWU8mk6Ztb1VVABxwB3s8oWDIAkBIPDG2urqWSKVnJqOl506h4vxcbMIkX0zJo4NBveY8y+c1TfN4lbff+YADmEzG25b5ePNeyWA9geCpyEvFUikQGfo3V7uyZUARwBy/AkLcjmEcl/WNbHZx/vbQSJIDCAYC2sl+OnOhb+hcdOS0RxbvLT94nD9QqTMTJgKjeyb1K6xr2o1GY272ai6XBVDZz3MAtXLVAlfUwXhi1AUs25Ylsfp0rb9e9zOPqiq6jbbWs7DUS1r17779ZuG/hbm7dwzTZGAIl7uHxwfk1lZ8Mu4fiQqc91MrHomQk7orCWFVCooO6zQUxl6ZOnfm7ERVb+6UKnvPcvR9FnoTAylEC32kWq9z2+0cFMoL114Ud7fyxZmI+l4sEGPmbr6UyUyfnXqZAJIkp8fHAbAp4m8ztyDZN/fWW5ouPniydfnKbuV4OPNqKjOdGg679SOiBhOZ87HEGGfMNbvbO/n7y8vrKw/JhCfECZVMq9PtOmjOABIGNMhf//LD1IcXxdqutrGoh1KhWIoSqq/d316av/Zo+/Ift4cHAlx3OjOWd9j2Vbm1yuVFxnbadcMpv/XT7/5kIqq0OobtSKrRbrf0Wm1lrpx7VFzfRKdWrdk0DCEMUSKUwS3D2LObBjUBzN/9dfPOP+SkSrigBnoJF3zBkHT6TMsmhw0T4M36i/8BOASjZXmvKmUAAAAASUVORK5CYII=","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/2NQfs1Q4jjau62Xjmesxqk/88c25f3e7f6c73c45f7b2cbcbce04153/Image_default_8Habits.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/2NQfs1Q4jjau62Xjmesxqk/88c25f3e7f6c73c45f7b2cbcbce04153/Image_default_8Habits.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2NQfs1Q4jjau62Xjmesxqk/88c25f3e7f6c73c45f7b2cbcbce04153/Image_default_8Habits.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2NQfs1Q4jjau62Xjmesxqk/88c25f3e7f6c73c45f7b2cbcbce04153/Image_default_8Habits.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2NQfs1Q4jjau62Xjmesxqk/88c25f3e7f6c73c45f7b2cbcbce04153/Image_default_8Habits.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/2NQfs1Q4jjau62Xjmesxqk/88c25f3e7f6c73c45f7b2cbcbce04153/Image_default_8Habits.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/2NQfs1Q4jjau62Xjmesxqk/88c25f3e7f6c73c45f7b2cbcbce04153/Image_default_8Habits.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/2NQfs1Q4jjau62Xjmesxqk/88c25f3e7f6c73c45f7b2cbcbce04153/Image_default_8Habits.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/2NQfs1Q4jjau62Xjmesxqk/88c25f3e7f6c73c45f7b2cbcbce04153/Image_default_8Habits.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/2NQfs1Q4jjau62Xjmesxqk/88c25f3e7f6c73c45f7b2cbcbce04153/Image_default_8Habits.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Lee Newson","slug":"lee-newson"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"8 habits of highly successful developers and their teams"},"metaDescription":{"metaDescription":"Successful developers work well with other people, continually learn new skills, and build up their team. We talk about 8 regular habits for success as a developer. "}},{"title":"How to stay relevant as a software developer","slug":"software-developer-skills-stay-relevant","featured":false,"lastUpdated":"Jun 2nd, 2020","description":{"description":"<p>What skills do software developers need to stay relevant and up-to-date with the industry? Find out how to stay on top of the changes.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"What skills do software developers need to stay relevant and up-to-date with the industry? Find out how to stay on top of the changes."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Man sips a hot beverage from a yellow teacup, while sitting in front of an open laptop on a yellow table and reading a book.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAADQ0lEQVQYGQXBSW8bZRgA4Hf7vIztmYm3OCEGO5XTtKQ0BaJSFQISRUKoSIhLDz3CqRdOSAg4Fglx4weAygEOHBBSUbkgGkFVbFWQraUkRXGT1Dj1knoZe2zHMx/Pg+VfLhrmvJl9MxCkG7d2Hw1SSggRmVlERBSzEhFhZhEmBoD/du6Pho4oJRpCg856e2Pntw3r9v0ja+ZkNpePJ5NKKRFhFmEREWJmYmYBBAkw+IpUQNpd76lJu/hH5f0PfwCAuXQqfXzh8pUPIuk0EzOLYhFmFCZiYQYAJQJKESvxxn30w7VG70zqTHbeuPzW68qMDydsYRYWJhEWFkZmYWIWBC3MWhiFZcKKDIa635N3XyvMzMQsgqGdCYRjiEAkRERMzISMRMxEoH1m9kWQSFbuNLfLjvOvmk27u/uHdigSKQyN+EGzlUFAJAJCBEQkQgJE0IiIBKQB5b1P2gDRZ1K9825zrbwVMuPL48PgqIGY8QEYEJA0EQGNeq2wYWphANbISMw4MQsRqz3qb+48eOPcs6+8tMRmphUs+BglImYWZmHlOq2/bnzdrY4ms9Ou62jfR0IKMQUlHFBBAApHstv1cT2aP6JJ0AQAGrQG8LS3Wbr54OFaZ3DUdwelYqn2uIYoxLrpYRAxCFbuq5/hoy9Wy/tVAgJArRERibhWrdy8fs02nnt++ewTt3/104+73T4i04TUTF0dcxqMJYgSwNq3134sl3cAkViIlO/7W3/eSUli+fxyJDNZ2X80lZhPpqc8TeL73Smj1xsnPEcuvGqGQxeuf//NZ/XDi2+/bNkmESRgyOV/Tpw66yfNVnN/6+764tKMZXRwPGBSATOArp8cNJrHF4x3Ll2KmYnir9+tllaKtw/SUsoZm9bc09kXU63evb/Xt+9t7J077ZzK/x7wb2HISgonPc67wxB09q9+eWX+5EKjXkeiSDTmVn5KHX0+plzh9Fxq2m51FisPDxSsmvah5484GMkhRYnCSOL19ZP23rHCbCBsAGgkXN2o3C2uPO7a5er0XnOx4aRb3ZAzyg/whSEsYTS+gJJBPfA1OV0PhkMAC8ABKEEsA9o4ZmpFbddJ7rYyciKVjMdMIxK3bdM0/wckHD7pk1V58gAAAABJRU5ErkJggg==","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/PJYmjB39Nlq96Z4vODIYE/18726eacd95cd7302069bef2f488be9b/Image_default_StayRelevant.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/PJYmjB39Nlq96Z4vODIYE/18726eacd95cd7302069bef2f488be9b/Image_default_StayRelevant.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/PJYmjB39Nlq96Z4vODIYE/18726eacd95cd7302069bef2f488be9b/Image_default_StayRelevant.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/PJYmjB39Nlq96Z4vODIYE/18726eacd95cd7302069bef2f488be9b/Image_default_StayRelevant.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/PJYmjB39Nlq96Z4vODIYE/18726eacd95cd7302069bef2f488be9b/Image_default_StayRelevant.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/PJYmjB39Nlq96Z4vODIYE/18726eacd95cd7302069bef2f488be9b/Image_default_StayRelevant.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/PJYmjB39Nlq96Z4vODIYE/18726eacd95cd7302069bef2f488be9b/Image_default_StayRelevant.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/PJYmjB39Nlq96Z4vODIYE/18726eacd95cd7302069bef2f488be9b/Image_default_StayRelevant.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/PJYmjB39Nlq96Z4vODIYE/18726eacd95cd7302069bef2f488be9b/Image_default_StayRelevant.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/PJYmjB39Nlq96Z4vODIYE/18726eacd95cd7302069bef2f488be9b/Image_default_StayRelevant.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ben Long","slug":"ben-long"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"How to stay relevant as a software developer: Skills, habits & more"},"metaDescription":{"metaDescription":"What skills do software developers need to stay relevant and up-to-date with the industry? Find out how to stay on top of the changes."}},{"title":"13 soft skills that will future proof your career as a developer","slug":"developer-soft-skills-career","featured":false,"lastUpdated":"May 24th, 2020","description":{"description":"<p>How can developers benefit from soft skills? Learn about the soft skills that can help software developers work better in teams and deliver better outcomes.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"How can developers benefit from soft skills? Learn about the soft skills that can help software developers work better in teams and deliver better outcomes."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"A stack of colored plastic cups, each a different color, forming a pyramid.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAMAAAAhxq8pAAACnVBMVEXd2tLg3tfi4drk493k497m5eDp6OPt7enq6uft7Onx8e/x8fDz8/H19vT3+Pj4+vr5+vv6+/z8/f7e3dbm5d/o5+Ls6+fs7OnFp43myqr19fT19/X3+Pf5+vr7/P39/v/h4Nnn5uHr6ubv7+zt6+jAgzftxZT6/Pn3+fj4+fn+///q6eTv7uva2NW4j2fpyq7x7vb4+fz6+/3////m5uDn5+aGioHIysfp4u3QvOj39/39/v7o5+Pr6+fy8vH5+Pjd3Nx3d23Q0tTn3/LKs+b39v7o6Obs7Ovu7ezu7uz29fXU3dabu6Krtayzz7LS4dHd0u3Mw+nl4Pjp6ejt7ezv7+7w8O/z9PP19vWCqI4AqkHE58t+2DPI+Y319veFXMnAqO7p6unt7uzx8vHv8O9amHMAr0Kl2q+D3ADG+2jl6uV7RMO6m+/9/P/p6+nt7+3v8PDx9fX05uX0kn/Tp5PK2r/dx1va5ZHJ6suu0OXNzuqmw+6t6vb6///q7Oru7+/w8fLy9/j01tX7PwD/r5b/6dX/0AD/9aPR3/Kh0fXs/P991+5n5fP2///s7e3v8PHx8vTx9ffvwL36UwD6mnj4z6n+0wD/64HBzeGi0/ba7ftvy+hv5vPr/P/t7u/z9vfi19jNPEHynpvUo6PUWWf507z8k5brl9Hp2O71vtvu5PGZueZ7puvy9//y9PX1+frawsTSAADxkJXCkJnfAG73t8j8SqD9kdz+v9r+stD/6/d9ieAXgOrq8/7s7evr6+rp6ujHqKfPAADkc3eycnvdR37oj5/2Vpn6jtT4ncH7ttD02OqAi9Vom+3o8P3g393f3tvg4N3Y1NPdysvn1tfg19np2t/v5Obz4uj46vX38Pb58vf9+v32+Pr1+P0Xd05GAAAAuElEQVQYGV3BMUoDQRiG4e/V32Ky/usGIYgJEWzERhCsRDyA2OZKOUaO4QEsPEQ6w4LYaMKOTCPqmKgwPg8i+9yisP9KX+JbdCB6dPPlOGo1IqvhCTjQdjfuVdVH0w52svZ45VV45yKl2B0+n7LWqgpKXDFfjoZsvChLsh7n3J+w4Y9SksyBW35pzWo6f9vlx+WDQpI5NXv8ubmTZA0lKSRrKCljtjiiMFWyxRklKdg1/0iyPqWJpC+fnCphPHehMgAAAABJRU5ErkJggg==","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/5JI6NTpdUsbj4rD49IyJJK/a7ac4ceed24edb35de056299e55b71d2/Image_default_DeveloperSoftSkills.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/5JI6NTpdUsbj4rD49IyJJK/a7ac4ceed24edb35de056299e55b71d2/Image_default_DeveloperSoftSkills.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5JI6NTpdUsbj4rD49IyJJK/a7ac4ceed24edb35de056299e55b71d2/Image_default_DeveloperSoftSkills.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5JI6NTpdUsbj4rD49IyJJK/a7ac4ceed24edb35de056299e55b71d2/Image_default_DeveloperSoftSkills.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5JI6NTpdUsbj4rD49IyJJK/a7ac4ceed24edb35de056299e55b71d2/Image_default_DeveloperSoftSkills.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/5JI6NTpdUsbj4rD49IyJJK/a7ac4ceed24edb35de056299e55b71d2/Image_default_DeveloperSoftSkills.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/5JI6NTpdUsbj4rD49IyJJK/a7ac4ceed24edb35de056299e55b71d2/Image_default_DeveloperSoftSkills.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/5JI6NTpdUsbj4rD49IyJJK/a7ac4ceed24edb35de056299e55b71d2/Image_default_DeveloperSoftSkills.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/5JI6NTpdUsbj4rD49IyJJK/a7ac4ceed24edb35de056299e55b71d2/Image_default_DeveloperSoftSkills.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/5JI6NTpdUsbj4rD49IyJJK/a7ac4ceed24edb35de056299e55b71d2/Image_default_DeveloperSoftSkills.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ben Long","slug":"ben-long"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Future proof your career as a developer with soft skills"},"metaDescription":{"metaDescription":"How can developers benefit from soft skills? Learn about the soft skills that can help software developers work better in teams and deliver better outcomes."}},{"title":"Facing your fears: marketing for developers","slug":"marketing-for-developers-facing-your-fears","featured":false,"lastUpdated":"May 17th, 2020","description":{"description":"<p>These days, everyone&rsquo;s a marketer - even developers. But that doesn&rsquo;t mean marketing comes easy. We talk about the fear of marketing and how devs can overcome it.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"These days, everyone’s a marketer - even developers. But that doesn’t mean marketing comes easy. We talk about the fear of marketing and how devs can overcome it."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Person standing on a rickety wooden bridge over rushing water.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAADN0lEQVQYGQXBSXPbVAAA4LfqvSdZkuU6jp3GdZuQkpYpHMp0ynKAwgCX/hL+BEd+DqdeywUO0Bn2dCENTeM4XiVrtaW38X0QffX43m6ng4tIF48+/PqHpz998+izdDU92usFQaCNraoqy/Pu8NYkSYbRzqyov/3ue8BccGOPhDuR3/H3WqLHD1p+cHx8G1gloEL1ul4lUus0LwkLHIKVrBlzDgc3Pv70wc/zJdntkA9Gg0FLHHaj0bWeq8DRO7dkntebQmoRZ9tGWSFaNYCtVnBzAAgEQoj37tyud/xeOyD3R8PdIDgcjELhllcX3Ohhr49H+z6U3G9vypJQWikruCi3tbVmlixJyN51+9pCMoiirt92hYsQghAooCmjrUCkr56l66WBKJ6Oewf3jJKUINDI385f5aZR0KZNQzp+yBynljVGGGHkCTcrM9RoolJGpQW4stk2nVZCvLy6PN4ZMEoYxR0qhgEh3OGUEIwwdxh0+M3+sFzHnSgwjqBeCCDkvVhTHpfFWjYIEU6J65CQc5+5KCnWCCHOOLAWQogRjoJ25LWCoE1N42IbtdsIAkCY53rUcdpey3OYNkYaRcaLBUUkr8rrfqiUxErKpl6um/TN6QYg3vJhVUnhGUS5w4ySDiaMUAyRMgb3Hz5YlwVBsCtcWZWFlKtkNZ5egHRpINQQlsnaUAdTR0Hraas4q43hxFFGY3B8Rxszr/KjMFosJrOyKLebeDEJAdhUuS841mqjpPAjQKjJcuC1tkZbaxlm6GS+Ok2ySVY0dRPnOYBIWb2/d/08LV9n20ma/f78X869pq6VNvNVjCwgiBBE4qJAo/5OA0y5bZpGptVGa1PVNdUypHwXgO3lxTQtqNF1medVcXE1s9oEwncd92y1JB6A60aerLIqyyfxWrS7s8vLl2/P8WR59+F9TboUVH88fxHu7dswnMdJmud/vn0zzbKqlmQ8jym0vFJlmp7Nlpj5vzz56+RvDfavsc3s/cD95zyrLl58+Xn37hefxOtksVo+G19e5ZsAYpKVW8od7rmTxWo8j0+XZnYmwcABuKn/S361FjAHdPs/vq4OPtoqqaC2kSOoi8qq+R9UwczQPWD9rwAAAABJRU5ErkJggg==","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/1itszOsRAXmbc7Zac7noOy/4121db9f80d7cca4e9753b5b9aae5696/Image_default_FaceFears.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/1itszOsRAXmbc7Zac7noOy/4121db9f80d7cca4e9753b5b9aae5696/Image_default_FaceFears.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1itszOsRAXmbc7Zac7noOy/4121db9f80d7cca4e9753b5b9aae5696/Image_default_FaceFears.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1itszOsRAXmbc7Zac7noOy/4121db9f80d7cca4e9753b5b9aae5696/Image_default_FaceFears.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1itszOsRAXmbc7Zac7noOy/4121db9f80d7cca4e9753b5b9aae5696/Image_default_FaceFears.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/1itszOsRAXmbc7Zac7noOy/4121db9f80d7cca4e9753b5b9aae5696/Image_default_FaceFears.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/1itszOsRAXmbc7Zac7noOy/4121db9f80d7cca4e9753b5b9aae5696/Image_default_FaceFears.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1itszOsRAXmbc7Zac7noOy/4121db9f80d7cca4e9753b5b9aae5696/Image_default_FaceFears.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1itszOsRAXmbc7Zac7noOy/4121db9f80d7cca4e9753b5b9aae5696/Image_default_FaceFears.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1itszOsRAXmbc7Zac7noOy/4121db9f80d7cca4e9753b5b9aae5696/Image_default_FaceFears.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ben Long","slug":"ben-long"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Marketing for developers: How to face your fears"},"metaDescription":{"metaDescription":"These days, everyone’s a marketer - even developers. But that doesn’t mean marketing comes easy. We talk about the fear of marketing and how devs can overcome it."}},{"title":"Why every developer should write a blog","slug":"developer-blog-writing-social-networks","featured":false,"lastUpdated":"May 5th, 2020","description":{"description":"<p>Why should developers write blogs or post on social media? Whether you&rsquo;re freelance or looking to advance your career, creating your own content has a lot of benefits.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Why should developers write blogs or post on social media? Whether you’re freelance or looking to advance your career, creating your own content has a lot of benefits."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Woman with red hair, black top, and blue jeans sits on a blue armchair and looks at her laptop screen. The back of the screen is covered in stickers including the hashtag #LoveTwitter.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAADXElEQVQYGTXBy2tcVRwA4N8595z7zkwyN5nJJM6kaRttE2shlmARxOJCFyVFRFxYEIRu3AuCG/+DKkgXCoo7oYhdiKAIdSGlhoRJmkQnNrEmM0nam3ncuTNzH+d17abfh775/GMVdjqp9tWd1d3tB8vvvH39g/de8lj77q3GPluv1+3XbuBckSWxFIJzxjkXnKcJS9OUSCnhKWp6pdLJSaVcLpXyJvb/6KeFxatvli48rK2ub0pvqBDKMiUlAHDOg26YxjFhjGOlMk33isWJyU7B8yYcI1rf6Hdpt59glVXLeTXxArYcJTjnQjccztmd73+4v1Ijw2FCpGA6s2yozE7mR8cIxv/t7kWdMm+1bWq1h/zUK8+NT00LxjjnhBhRPKzNTt1fqREuJMF4OAykaI2OScuxmMy2Dw6Okokzjstkst9o6k+OLlycx4AzJTOAQUQrU2MAQJTKEMXUtWdyRZ5GlNKEqXs78GN97dXlq3OnZ5oD9fvNL03bnls4pzRtxB0lhEqlCgBYSglIi1NBdD0ViqgQVNzAswCwtbbRawd3Hxzd22nvrtbQk0bOzaciC/oJ1ogDgCHLQCMScLvlb29vTuQtnWJgPgCs1VY2/q43Tk4AgFomCN4LesNYmIycxmM5AKJpCBM6iAb5wviN6x95laoy6Puf3LqWcIJBUvzZFy/rbDBnJQkaMag97lWD7HFkIrcCJAMAqiOsowxfen4h0GSiWReXLg2Dtmu7hmFKqdzeYeGvX5q9kbXN3ShcpzqpP/bDEAhXwBU2bYdxHoedFIFWsE1QiGKHIoozrgQz3FZ5kRPtt9u/3v7uW3gGywzFLIvjAUaqb+lYd32/mwqYmpzOFDyFEZa6OSifVZZtKAbPEADMkiSJU9vxELWBoajPcwZkcRCGfSUlACAEmVKCSS5UYIzC0hUzPwYAAoDkF9/SX1ySTPS31oJ2iAVmQB/t1KdmZ+YX5qOEKwX7Pv/XT0eoqi6/++mH442Y+3sPd76+SaqX33jkesdbG37j8MqZ6tm5uZTzlBqmaQ4S1g6SLFPjI8jJuUfNlk7puelyVXdXyxXpN4nQyF4Q/nPS/fOwU/zp5/OLl6Xlse5xz2+ipE/yRQ6aaB0QjJrHx9Hry+dnT5UsR2cJ1+j/mL7YsyV93EYAAAAASUVORK5CYII=","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/lOZNyY8P0M6dnhhv2GrYZ/1d90b43562d44cc60a524570b11b9c04/Image_default_DevelopersBlogging.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/lOZNyY8P0M6dnhhv2GrYZ/1d90b43562d44cc60a524570b11b9c04/Image_default_DevelopersBlogging.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/lOZNyY8P0M6dnhhv2GrYZ/1d90b43562d44cc60a524570b11b9c04/Image_default_DevelopersBlogging.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/lOZNyY8P0M6dnhhv2GrYZ/1d90b43562d44cc60a524570b11b9c04/Image_default_DevelopersBlogging.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/lOZNyY8P0M6dnhhv2GrYZ/1d90b43562d44cc60a524570b11b9c04/Image_default_DevelopersBlogging.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/lOZNyY8P0M6dnhhv2GrYZ/1d90b43562d44cc60a524570b11b9c04/Image_default_DevelopersBlogging.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/lOZNyY8P0M6dnhhv2GrYZ/1d90b43562d44cc60a524570b11b9c04/Image_default_DevelopersBlogging.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/lOZNyY8P0M6dnhhv2GrYZ/1d90b43562d44cc60a524570b11b9c04/Image_default_DevelopersBlogging.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/lOZNyY8P0M6dnhhv2GrYZ/1d90b43562d44cc60a524570b11b9c04/Image_default_DevelopersBlogging.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/lOZNyY8P0M6dnhhv2GrYZ/1d90b43562d44cc60a524570b11b9c04/Image_default_DevelopersBlogging.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ben Long","slug":"ben-long"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Why developers should write: From developer blogs to social media"},"metaDescription":{"metaDescription":"Why should developers write blogs or post on social media? Whether you’re freelance or looking to advance your career, creating your own content has a lot of benefits."}},{"title":"How to increase developer productivity: 15 tips to get more done","slug":"developer-productivity","featured":false,"lastUpdated":"Apr 30th, 2020","description":{"description":"<p>Looking for ways to boost your team&rsquo;s productivity? We share 15 ideas including how to measure developer productivity, along with useful tools and best practices.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Looking for ways to boost your team’s productivity? We share 15 ideas including how to measure developer productivity, along with useful tools and best practices."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Photograph of honeycomb with honey bee at work on top.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAQABQDAREAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAABQEECP/EACgQAAICAQMCBAcAAAAAAAAAAAECAxESAAQhBjEFIkFRE2FxgdHw8f/EABkBAQACAwAAAAAAAAAAAAAAAAMCBAUHCP/EACYRAAEDAwMCBwAAAAAAAAAAAAEAAhEDITESUfAUQQQicZGxwdH/2gAMAwEAAhEDEQA/ANYTbvKPNnZaoC75N+vl9TwflWuNhrqMlh57d+62mIBwiB1NAvU8XgkaLuNyYvjT5OmUKm8SylbIYjG/xrKM8K7pOoqugTF8k7YwN4RFw16Wpg4IfJuFiB54iU5el9vah9tUC5lO1uchKJOUGrxzRFGjBDAgrVivrj+gaKkGuHnzz5+glMjCnbGHbTtMqASSKFZsaJUdgTX8076rmuGkyNtub/iiGSLhU9z1BOJmCkpXexVn35XVCrUl2b+itNpiF//Z","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/3M114CzdkBjj5Maljt3vOA/3b051a266bda0a85bed916d64ec5b4ab/Bee.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/3M114CzdkBjj5Maljt3vOA/3b051a266bda0a85bed916d64ec5b4ab/Bee.jpg?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/3M114CzdkBjj5Maljt3vOA/3b051a266bda0a85bed916d64ec5b4ab/Bee.jpg?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/3M114CzdkBjj5Maljt3vOA/3b051a266bda0a85bed916d64ec5b4ab/Bee.jpg?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/3M114CzdkBjj5Maljt3vOA/3b051a266bda0a85bed916d64ec5b4ab/Bee.jpg?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/3M114CzdkBjj5Maljt3vOA/3b051a266bda0a85bed916d64ec5b4ab/Bee.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/3M114CzdkBjj5Maljt3vOA/3b051a266bda0a85bed916d64ec5b4ab/Bee.jpg?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/3M114CzdkBjj5Maljt3vOA/3b051a266bda0a85bed916d64ec5b4ab/Bee.jpg?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/3M114CzdkBjj5Maljt3vOA/3b051a266bda0a85bed916d64ec5b4ab/Bee.jpg?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/3M114CzdkBjj5Maljt3vOA/3b051a266bda0a85bed916d64ec5b4ab/Bee.jpg?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ben Long","slug":"ben-long"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"15 tips to increase developer productivity | TinyMCE"},"metaDescription":{"metaDescription":"Looking for ways to boost your team’s productivity? We share 15 tips on how to improve developer productivity from our own software developers and team leaders."}},{"title":"Continuously refactoring 100000 lines of code","slug":"modern-javascript-refactoring-tinymce","featured":false,"lastUpdated":"Apr 28th, 2020","description":{"description":"<p>Tiny has adopted a continuous improvement process to move TinyMCE to modern JavaScript. Read how we are continuously refactoring 100000 lines of code.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiny has adopted a continuous improvement process to move TinyMCE to modern JavaScript. Read how we are continuously refactoring 100000 lines of code."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"An evolution of the JavaScript logo (JS) to the TypeScript logo (TS), with a made up logo that looks like a combination of the two in between.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAACmklEQVQYGU3BQWtcVRgG4Pf9zrl3ZpLppDVJaULEhSml0E1woSLYf+DGjeDWH1Vw4x8Qdyq4FetGG7WV0DZq0SYanYakmczce873vSbgwufh1s5HAPq+RMjdAZAEIAn/Y2Y5pwsSpJBkyXIpXa0RHgA8wkgBNCokgISEZExG99J3XUhNTimnqJ5rX0p1EpckgW3bmlmttZRCs0HTNG0CWPrKbBFuJkWVlFMiaQAHg7bvewDJSGPOyQxm1uTk7qWvEWGJyUiqaRpF5Fp6kAAWi8g5Cexrra7zvi41aTRAP++6k1O45yaxMeQG7TAIGrPkZmlRfDYPhCEATzgmEKfwU/Tp1rq9/U4yBi8Yz160T7+TXED2Whe1zl9iPGEynZz76hX/5ONu6Wp6Mp08mb7y1f2NHzffLbAFAEs4/u3az98geQ1kjzovxDx9dm966/WXVHz7YHzz9gqu3jg6vN6OV2cPFttZH95ePpk7LX3+A/a7ujy0nJKlRJhhHq9uzDbWD5rm2WQ8++noxjw+WB29d2fl7v7ZcOrx1s3JzmvL77+5/sZaW/86VzjkpqioPVAkf/5nfbQ3O/zbfz3dejGb7B+ltdHmznBy3GnvYPHoYNFXba8PgRpR3UsOL5CQ+OkXV5aG27X6L7+3jx8+373/5dMjbg5Wdh/uYW16749m5tr9evD9s0NcawlRwcnW3eIxL8Q/GQhAgIACdLgUk+tDq93srJa+A8DReLQySimRzIqaoMnA+o3eQwTabIkNkAnQSIAcLC9FXwoAkkDIQ2RWVDOGV5MSaBcQECQBiEBcECAZCRIKAQIgZKPCPSJAmBkVkJEE9J8QCZJmBESjh0cEwey1Ey4ZCQmA3EVCCskjABgJMoKXYFRkQyj+BQZQpzRxkkpaAAAAAElFTkSuQmCC","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/3194qQ7O0Fx9mJSzNE3nUx/07e28e06b2cb9573186a2586d8786bd6/Image_default_ModernJavascript.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/3194qQ7O0Fx9mJSzNE3nUx/07e28e06b2cb9573186a2586d8786bd6/Image_default_ModernJavascript.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/3194qQ7O0Fx9mJSzNE3nUx/07e28e06b2cb9573186a2586d8786bd6/Image_default_ModernJavascript.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/3194qQ7O0Fx9mJSzNE3nUx/07e28e06b2cb9573186a2586d8786bd6/Image_default_ModernJavascript.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/3194qQ7O0Fx9mJSzNE3nUx/07e28e06b2cb9573186a2586d8786bd6/Image_default_ModernJavascript.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/3194qQ7O0Fx9mJSzNE3nUx/07e28e06b2cb9573186a2586d8786bd6/Image_default_ModernJavascript.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/3194qQ7O0Fx9mJSzNE3nUx/07e28e06b2cb9573186a2586d8786bd6/Image_default_ModernJavascript.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/3194qQ7O0Fx9mJSzNE3nUx/07e28e06b2cb9573186a2586d8786bd6/Image_default_ModernJavascript.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/3194qQ7O0Fx9mJSzNE3nUx/07e28e06b2cb9573186a2586d8786bd6/Image_default_ModernJavascript.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/3194qQ7O0Fx9mJSzNE3nUx/07e28e06b2cb9573186a2586d8786bd6/Image_default_ModernJavascript.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Joakim Lindkvist","slug":"joakim-lindkvist"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Moving TinyMCE to Modern Javascript"},"metaDescription":null},{"title":"5 tips for building successful agile development teams","slug":"tips-for-agile-development-teams","featured":false,"lastUpdated":"Apr 16th, 2020","description":{"description":"<p>What is agile development? How are agile teams structured? We cover all the basics and 5 key tips to agile success within your dev teams.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"What is agile development? How are agile teams structured? We cover all the basics and 5 key tips to agile success within your dev teams."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Four people meet in a room in front of a cork board covered in notes. They’re smiling at each other as they sit or stand at a table with laptops, notepads, and pens.","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,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","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/4Hlc7ucsf6Mu8kyW56XL39/2fa25f943eb0d408e5476f7e498b35c8/woman-wearing-gray-shirt-3184298-cropped.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/4Hlc7ucsf6Mu8kyW56XL39/2fa25f943eb0d408e5476f7e498b35c8/woman-wearing-gray-shirt-3184298-cropped.jpg?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4Hlc7ucsf6Mu8kyW56XL39/2fa25f943eb0d408e5476f7e498b35c8/woman-wearing-gray-shirt-3184298-cropped.jpg?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4Hlc7ucsf6Mu8kyW56XL39/2fa25f943eb0d408e5476f7e498b35c8/woman-wearing-gray-shirt-3184298-cropped.jpg?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4Hlc7ucsf6Mu8kyW56XL39/2fa25f943eb0d408e5476f7e498b35c8/woman-wearing-gray-shirt-3184298-cropped.jpg?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/4Hlc7ucsf6Mu8kyW56XL39/2fa25f943eb0d408e5476f7e498b35c8/woman-wearing-gray-shirt-3184298-cropped.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/4Hlc7ucsf6Mu8kyW56XL39/2fa25f943eb0d408e5476f7e498b35c8/woman-wearing-gray-shirt-3184298-cropped.jpg?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4Hlc7ucsf6Mu8kyW56XL39/2fa25f943eb0d408e5476f7e498b35c8/woman-wearing-gray-shirt-3184298-cropped.jpg?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4Hlc7ucsf6Mu8kyW56XL39/2fa25f943eb0d408e5476f7e498b35c8/woman-wearing-gray-shirt-3184298-cropped.jpg?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4Hlc7ucsf6Mu8kyW56XL39/2fa25f943eb0d408e5476f7e498b35c8/woman-wearing-gray-shirt-3184298-cropped.jpg?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Ben Long","slug":"ben-long"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":{"metaTitle":"Agile development teams: Practices, roles, and structure"},"metaDescription":{"metaDescription":"What is agile development? How are agile teams structured? We cover all the basics and 5 key tips to agile success within your dev teams."}},{"title":"3 tips to improve TinyMCE performance in the cloud","slug":"3-tips-to-improve-tinymce-performance-in-the-cloud","featured":false,"lastUpdated":"Nov 18th, 2019","description":{"description":"<p>Three tips to increase the performance of TinyMCE running on the cloud and take full advantage of our new CDN infrastructure.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Three tips to increase the performance of TinyMCE running on the cloud and take full advantage of our new CDN infrastructure."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Abstract illustration of a person standing at production line","artistName":"Sanni Sahil","image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAACtUlEQVQoz1XMOW9cZRSH8f9Z7jKLfccTsBNT2KBEICJFIhVFoIKCkg/AB6SjRVTUhkA6FMlgBQWHwR57PMtd3vecQwESovlVjx768dOfRcACkWAJYTCHCFiDI0TAFUSC9Z/gf6obEQIAHDBAwW9LIHxtelJxCX/dUwAAgYD4Twp2gxt5AjVCR4UneFAQ5YH62YiORmGIpoiCPcON3OFO7nAjdiczWIfiYTX7bB61pDdmV7br+fzrtn+xlMqDyIy2pOukaUf/XgzqRgAg2D7v8sK8Dw7qelqlav8pFSeua1v9ardrHX9eyy7HnY6HoUqGIHaDO4LIB+ovsgfTsVyFLv6Q6eNGT+ZV7ZMTq59S+9Nt8deq/oBTITYtnEidiIXkkNmDA8xonu1PGh19c737/nL9TpIPtf7k/uzVhrDTVNKLG21YH8/kF1NP8JIiEY1FKkhByTQv49GXk2wjW2H00UwbxcpbIVfncc20pfPX5axUy4FNIILHrPNSFO1vm9mjrimq/mAynDbmA51dytLldIIu2aJzH7sV3i/VnQiRV7H+vfeP4/4XZXd7s7i5rC72dkeHUTmfXTXFRp7s05i689bPu9GzveJ4v/3O1Z0QGHY0/6qYHgVyV+dMfvDybFqN+nK5OHh3iIeFNVVeWb5xBHXPt/mioxTqhmyUnMsmdNNuf8h3XL11zx48qdqbVB9b8X7T35u6KVKq3pvmcevXQ/4zSwF1g45pb07p22HXSDxocrYhVZPTaX2QfGetjeKVo2+RjYaQPUUgVoObq4NCOAVCy34gvczlPu+83p61vkyx8uowVXNlBsGJnTrnCAY7hXpFxh53sBV0DJtQuvPYOu1CCkiJ4U22ZdYJacNkzimYgymEoe6RriFAFOEd+NYZIQopEEweAIMMeRORTSaIiBgCAgj+BljOvHkI1NZsAAAAAElFTkSuQmCC","aspectRatio":1.2173913043478262,"src":"//images.ctfassets.net/s600jj41gsex/4tMojlaPQtZyX7oiawtwXu/fdcee45a2bd08b2d1c7bfa74e46e6ff5/Image_default_machine.png?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/4tMojlaPQtZyX7oiawtwXu/fdcee45a2bd08b2d1c7bfa74e46e6ff5/Image_default_machine.png?w=185&h=152&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4tMojlaPQtZyX7oiawtwXu/fdcee45a2bd08b2d1c7bfa74e46e6ff5/Image_default_machine.png?w=370&h=304&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4tMojlaPQtZyX7oiawtwXu/fdcee45a2bd08b2d1c7bfa74e46e6ff5/Image_default_machine.png?w=739&h=607&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4tMojlaPQtZyX7oiawtwXu/fdcee45a2bd08b2d1c7bfa74e46e6ff5/Image_default_machine.png?w=896&h=736&q=50&fit=scale 896w","srcWebp":"//images.ctfassets.net/s600jj41gsex/4tMojlaPQtZyX7oiawtwXu/fdcee45a2bd08b2d1c7bfa74e46e6ff5/Image_default_machine.png?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/4tMojlaPQtZyX7oiawtwXu/fdcee45a2bd08b2d1c7bfa74e46e6ff5/Image_default_machine.png?w=185&h=152&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/4tMojlaPQtZyX7oiawtwXu/fdcee45a2bd08b2d1c7bfa74e46e6ff5/Image_default_machine.png?w=370&h=304&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/4tMojlaPQtZyX7oiawtwXu/fdcee45a2bd08b2d1c7bfa74e46e6ff5/Image_default_machine.png?w=739&h=607&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/4tMojlaPQtZyX7oiawtwXu/fdcee45a2bd08b2d1c7bfa74e46e6ff5/Image_default_machine.png?w=896&h=736&q=50&fm=webp&fit=scale 896w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Tim Dettrick","slug":"tim-dettrick"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":null},{"title":"Charting with TinyMCE and Highcharts","slug":"charting-with-tinymce-and-highcharts","featured":false,"lastUpdated":"Oct 10th, 2018","description":{"description":"<p>Highcharts makes it easy to add beautiful, interactive charts to TinyMCE. The Tiny team is proud to introduce Highcharts as one of our Technical Partner Program launch partners.</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Highcharts makes it easy to add beautiful, interactive charts to TinyMCE. The Tiny team is proud to introduce Highcharts as one of our Technical Partner Program launch partners."}]}],"data":{"quirksMode":false}}}},"heroImage":{"alt":"Tiny Partner Highcharts","artistName":null,"image":{"fluid":{"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAGABQDAREAAhEBAxEB/8QAFgAAAwAAAAAAAAAAAAAAAAAABQcI/8QAIxAAAgEDAwUBAQAAAAAAAAAAAQIDBAURBgchABIiMWEIE//EABcBAQADAAAAAAAAAAAAAAAAAAcEBgj/xAAlEQACAAUDAwUAAAAAAAAAAAABAgADBBFBBSFRBhIxE2GBofH/2gAMAwEAAhEDEQA/ADWxP651xYdyp73qS61GobZeqgLXW928IskBWgUnEfbnGBgEe+eelzWdJozTCVIQKUGxyeb83/IHpHUdTS1oeeSyObEccW4t95i693ty6rQNkpVpQZq+7SslLKyALTr2gnPPkRzj6fnRQig3JxFq6p119FpV9IXeYe1TgbXufjx7wkYKh50/rMxllclndzksT7J6jPUsTtGf2mtMYu5uT5JyY//Z","aspectRatio":3.5555555555555554,"src":"//images.ctfassets.net/s600jj41gsex/1dfahjeX2JWq6jfH9340oH/01042bca83f8eac5257135ccdfe53f50/tiny-partner-blog-header-highcharts-1024x288.jpg?w=739&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/1dfahjeX2JWq6jfH9340oH/01042bca83f8eac5257135ccdfe53f50/tiny-partner-blog-header-highcharts-1024x288.jpg?w=185&h=52&q=50&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1dfahjeX2JWq6jfH9340oH/01042bca83f8eac5257135ccdfe53f50/tiny-partner-blog-header-highcharts-1024x288.jpg?w=370&h=104&q=50&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1dfahjeX2JWq6jfH9340oH/01042bca83f8eac5257135ccdfe53f50/tiny-partner-blog-header-highcharts-1024x288.jpg?w=739&h=208&q=50&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1dfahjeX2JWq6jfH9340oH/01042bca83f8eac5257135ccdfe53f50/tiny-partner-blog-header-highcharts-1024x288.jpg?w=1024&h=288&q=50&fit=scale 1024w","srcWebp":"//images.ctfassets.net/s600jj41gsex/1dfahjeX2JWq6jfH9340oH/01042bca83f8eac5257135ccdfe53f50/tiny-partner-blog-header-highcharts-1024x288.jpg?w=739&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/1dfahjeX2JWq6jfH9340oH/01042bca83f8eac5257135ccdfe53f50/tiny-partner-blog-header-highcharts-1024x288.jpg?w=185&h=52&q=50&fm=webp&fit=scale 185w,\n//images.ctfassets.net/s600jj41gsex/1dfahjeX2JWq6jfH9340oH/01042bca83f8eac5257135ccdfe53f50/tiny-partner-blog-header-highcharts-1024x288.jpg?w=370&h=104&q=50&fm=webp&fit=scale 370w,\n//images.ctfassets.net/s600jj41gsex/1dfahjeX2JWq6jfH9340oH/01042bca83f8eac5257135ccdfe53f50/tiny-partner-blog-header-highcharts-1024x288.jpg?w=739&h=208&q=50&fm=webp&fit=scale 739w,\n//images.ctfassets.net/s600jj41gsex/1dfahjeX2JWq6jfH9340oH/01042bca83f8eac5257135ccdfe53f50/tiny-partner-blog-header-highcharts-1024x288.jpg?w=1024&h=288&q=50&fm=webp&fit=scale 1024w","sizes":"(max-width: 739px) 100vw, 739px"}}},"author":{"name":"Christer Vasseng","slug":"christer-vasseng"},"category":{"title":"Developer Insights","slug":"engineering"},"metaTitle":null,"metaDescription":null}]},"description":{"description":"<p>Heavy technical debt burdens can sink a project. But selecting the right language can help keep debt down. Find out what the results are after weighing up JavaScript vs Typescript, based on TinyMCE's development history</p>","childMarkdownRemark":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Heavy technical debt burdens can sink a project. But selecting the right language can help keep debt down. Find out what the results are after weighing up JavaScript vs Typescript, based on TinyMCE's development history"}]}],"data":{"quirksMode":false}}}},"tags":[{"slug":"technical-debt","title":"Technical Debt"},{"slug":"buy-vs-build","title":"Buy-vs-build"},{"slug":"javascript","title":"Javascript"}],"body":{"body":"<div class=\"stk-grid stk-theme_44178__mb_2\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"12\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"10\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset stk-theme_44178__color_44178_custom_color_2 ce-element--empty stk-element_no-text\" data-ce-tag=\"paragraph\">&nbsp;</p>\n<p class=\"stk-reset stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__color_44178_custom_color_2 stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\"><strong class=\"stk-reset\">developer insights</strong></strong></p>\n<h1 class=\"stk-reset stk-theme_44178__color_44178_custom_color_1 stk-theme_44178__style_font_style-1635835947787\" data-ce-tag=\"paragraph\">Technical debt and types: The benefits of TypeScript vs JavaScript</h1>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"3\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__color_44178_custom_color_3\" data-ce-tag=\"paragraph\">Published {{setkaPost.lastUpdated}}</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"9\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__color_44178_custom_color_3\" data-ce-tag=\"paragraph\"><img class=\"stk-reset stk-theme_44178__symbol_custom_image_3740221 stk-icon\" src=\"https://ceditor.setka.io/clients/D3SuW9_Vtk6NhYeFXfduUy55A4Dromkt/css/assets/44178/img/icon_clock-2022112504394454.svg\" alt=\"\" />&nbsp;{{setkaPost.readTime}}</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-grid stk-theme_44178__mb_15\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"9\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628517294418 stk-reset stk-theme_44178__color_44178_custom_color_1\" data-ce-tag=\"paragraph\">Changing programming languages is always a torturous decision. But with a product as complex as a rich text editor, that&rsquo;s so prone to technical debt, the right programming language is vital to its longevity. Thankfully, for TinyMCE, converting from JavaScript to TypeScript was easy &ndash; and carried with it a lot of benefits for an editor with heavy technical debt burdens.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid stk-grid__layout_columns\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">&nbsp;</div>\n<div class=\"stk-grid-col stk-grid-col_last valign-middle\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset stk-theme_44178__style_font_style-1628517714937 stk-theme_44178__mb_0 stk-theme_44178__color_44178_custom_color_1\" data-ce-tag=\"paragraph\">Millie Macdonald</p>\n<p class=\"stk-reset stk-theme_44178__style_small_text stk-theme_44178__color_44178_custom_color_3\" data-ce-tag=\"paragraph\">Product Manager at Halo Connect</p>\n</div>\n</div>\n</div>\n</div>\n<hr class=\"stk-theme_44178__separator_basic_divider stk-theme_44178__mb_2 stk-reset\" />\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Right now, JavaScript (JS) is easily one of the most popular programming languages. It&rsquo;s particularly appropriate for rich text editors, because they're mostly integrated into websites and web apps &ndash; where JavaScript is the weapon of choice for developers.</p>\n<p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">However, if you go beyond the surface of JavaScript, you quickly find a host of complications that may make it a less than perfect choice:</p>\n<ul class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">Easy to learn but hard to master</strong>. JavaScript has a low barrier to entry, but also a lot of unintuitive quirks and pitfalls (<a class=\"stk-reset\" href=\"https://www.w3schools.com/js/js_function_closures.asp\" target=\"_blank\" rel=\"noopener\">function closures</a>, anyone?).</li>\n</ul>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">&rarr; </strong>Learning these quirks can take a while, and handling them during development adds both time and lines of code to a project.</p>\n</div>\n</div>\n<ul class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">Even bad code gets interpreted. </strong>JavaScript always tries its best to interpret your code &ndash; even if it makes no sense. <a class=\"stk-reset\" href=\"https://www.destroyallsoftware.com/talks/wat\" target=\"_blank\" rel=\"noopener\">The Wat talk by Gary Bernhardt</a> gives some hilarious examples that highlight just how weird JavaScript can get.</li>\n</ul>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">&rarr; </strong>Sadly JavaScript doesn&rsquo;t have a safety net, so you&rsquo;re on your own when it comes to ensuring your code does what it&rsquo;s meant to.</p>\n</div>\n</div>\n<ul class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">Readability requires documentation.</strong> Between the lack of types and <a class=\"stk-reset\" href=\"https://dmitripavlutin.com/unlearn-javascript-bad-coding-habits/\" target=\"_blank\" rel=\"noopener\">how easy it is to write confusing code in JavaScript</a>, making your code readable often requires extra steps.</li>\n</ul>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">&rarr; Code comments, good naming conventions, and internal documentation are your friend when it comes to large JavaScript code bases &ndash; but they all require extra work.</p>\n</div>\n</div>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-stk-css=\"stkdQPoe\" data-anim-m=\"false\" data-ce-tag=\"grid\">\n<div class=\"stk-theme_44178__pad_round_1 stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628517714937 stk-reset stk-theme_44178__color_44178_custom_color_1 stk-theme_44178__mb_0\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">TABLE OF&nbsp;CONTENTS</strong></p>\n<hr class=\"stk-theme_44178__separator_basic_divider stk-theme_44178__mb_05 stk-reset\" />\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__color_44178_custom_color_3 stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"#stk-4\">JavaScript and technical debt</a></p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"#stk-1\">TypeScript vs JavaScript</a></p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__color_44178_custom_color_3 stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"#stk-2\">Benefits of switching to TypeScript for WYSIWYG tech debt</a></p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__color_44178_custom_color_3 stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"#stk-3\">TypeScript&rsquo;s great but WYSIWYG editors are best left to experts</a></p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_2 stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset stk-theme_44178__mb_2\" data-ce-tag=\"paragraph\">Complications like these can cause any number of problems, which is why there are so many articles about JavaScript being a &lsquo;bad&rsquo; programming language. However, there&rsquo;s one danger that isn&rsquo;t talked about nearly enough: technical debt.</p>\n<h2 id=\"stk-4\" class=\"stk-theme_44178__style_large_header stk-reset\" data-ce-tag=\"paragraph\">JavaScript and technical debt</h2>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">First up, it has to be said that Javascript and tech debt have a symbiotic relationship.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Flexibility may be one of Javascript&rsquo;s strengths, but it also makes it easy for errors to creep into the code, unless significant precautions are taken.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">A rich text editor is already a breeding ground for tech debt, due to the scale and complexity of its features and codebase. So it goes without saying that developing a product that&rsquo;s <em class=\"stk-reset\">already</em> prone to tech debt, in a language that&rsquo;s <em class=\"stk-reset\">also</em> prone to tech debt, isn&rsquo;t a great idea. But it's a mistake that's often made.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">JavaScript&rsquo;s really easy to learn, it&rsquo;s quick to hire dev talent, and runs almost anywhere. So how do you leverage those benefits, without risking the ongoing accumulation of technical debt that negatively impacts your developer velocity and product quality?</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Enter, TypeScript.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-theme_44178__mb_2 stk-grid\" data-stk-css=\"stk0SEJm\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim-zoom=\"100\" data-anim-shift=\"60\" data-anim-rotation=\"0\" data-anim-opacity=\"100\" data-anim-direction=\"left\" data-anim-duration=\"0.6000000000000001\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\" data-anim-trigger=\"scroll\" data-anim-sticky-direction=\"top\" data-anim-sticky-offset=\"20\" data-anim-name=\"ajYYkX\" data-anim=\"true\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-theme_44178__mb_05 stk-grid\" data-stk-css=\"stk9V8Fp\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-stk-css=\"stkNYpue\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628517714937 stk-reset stk-theme_44178__color_44178_custom_color_4\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Insights on the complexities of RICH TEXT EDITORS and technical debt</strong></p>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_05 stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-stk-css=\"stkEkeMK\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/reduce-technical-debt/\" target=\"_blank\" rel=\"noopener\">Reduce technical debt with the right rich text editor</a></p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/manage-technical-debt/\" target=\"_blank\" rel=\"noopener\">Managing technical debt is difficult in rich text editors</a></p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/technical-debt-examples/\" target=\"_blank\" rel=\"noopener\">Dangerous examples of technical debt in rich text editors</a></p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/developer-velocity-and-technical-debt/\" target=\"_blank\" rel=\"noopener\">Are developer velocity and technical debt impacted by a rich text editor?</a></p>\n</div>\n</div>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_15 stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h2 id=\"stk-1\" class=\"stk-theme_44178__style_large_header stk-reset\" data-ce-tag=\"paragraph\">TypeScript vs JavaScript</h2>\n<p class=\"stk-theme_44178__mb_15 stk-reset\" data-ce-tag=\"paragraph\">JavaScript (JS) may be the undisputed &lsquo;most popular&rsquo; programming language of HTML and the web, but in 2022, TypeScript (TS) joined the world&rsquo;s <a class=\"stk-reset\" href=\"https://survey.stackoverflow.co/2022/#technology-most-popular-technologies\" target=\"_blank\" rel=\"noopener\" data-gtm-vis-has-fired-10171822_255=\"1\">top 5 most used languages</a>.</p>\n<h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">What is TypeScript?</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">TypeScript is a free, open source programming language built on top of JavaScript, that adds strong types, tooling, and guide rails for better development. It compiles to JavaScript, which means it can run anywhere that JS runs and it maintains much of JavaScript&rsquo;s feature set.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Best of all TypeScript answers all the prior concerns noted, plus some.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Getting into the weeds, although JavaScript is considered the primary scripting language for apps and web pages, it was never designed for that purpose. Nor was it designed for creating large and complex web apps &ndash; it&rsquo;s better suited for small-scale applications.</p>\n<p class=\"stk-theme_44178__mb_15 stk-reset\" data-ce-tag=\"paragraph\">For this very reason, in 2012, Microsoft developed TypeScript with the specific goal of a scripting language that better handles large-scale complicated applications.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"valign-middle stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-stk-css=\"stkK5Fn-\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-slideInRight\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\">\n<div class=\"stk-theme_44178__pad_round_1 stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Definitions</strong></p>\n<p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">Statically typed:</strong><br data-gtm-vis-has-fired-10171822_255=\"1\" />Types must be defined in the code and are checked at compile time</p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">Dynamically typed:</strong><br data-gtm-vis-has-fired-10171822_255=\"1\" />Types are assigned and checked at run time</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-grid stk-theme_44178__mb_2\" data-stk-css=\"stk-AL3u\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-jackInTheBox\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\" data-ce-tag=\"grid\">\n<div class=\"stk-theme_44178__pad_ver_2 stk-grid-col stk-grid-col_last\" data-col-width=\"12\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628585803915 align-center stk-reset\" data-stk-css=\"stkks_bG\" data-ce-tag=\"paragraph\">Get more insights in our<br />Technical Debt White Paper</p>\n<a class=\"stk-theme_44178__stk-btn_1628586253530 stk-theme_44178__style_font_style-1628586133109 align-center stk-reset\" href=\"https://www.tiny.cloud/technical-debt-whitepaper\" target=\"_blank\" rel=\"noopener\" data-stk-button=\"1\" data-ce-tag=\"button\">READ THE WHITE PAPER</a></div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">Why is TypeScript better than Javascript?</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Importantly, TypeScript isn&rsquo;t a completely different programming language &ndash; it&rsquo;s JavaScript but better.</p>\n<ul class=\"stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">TypeScript simplifies, handles, or restricts many of JavaScript&rsquo;s weirder features</strong>, both inherently and via the extra functionality it offers to developers, to reduce the risk of falling into the common pitfalls of JS.</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">It adds type checking and better errors</strong>, to increase the chance that bad code is caught during development.</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">Adding types adds inline documentation with minimal extra work</strong>, and allows you to define not just variables and functions, but also concepts and APIs.</li>\n</ul>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">For a rich text editor, this means you get the easy interoperability (of Javascript) with web applications and technologies, and also gain (with TypeScript) the functionality and tooling that&rsquo;s invaluable for maintaining the quality of your code &ndash; all with minimal overhead.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">That&rsquo;s a massive long-term gain in terms of reduced bugs and work impediments. But what&rsquo;s the cost of conversion?</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Developing a brand new rich text editor from scratch, in TypeScript, is the easiest route. But what if, like TinyMCE, you already have an editor written in JavaScript? You don&rsquo;t want to throw that code away. No.</p>\n<p class=\"stk-theme_44178__mb_15 stk-reset\" data-ce-tag=\"paragraph\">So, how hard was it to convert TinyMCE from JavaScript to TypeScript? Well&hellip;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"valign-middle stk-grid-col stk-grid-col_empty\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-grid stk-theme_44178__mb_15\" data-ce-tag=\"grid\" data-stk-css=\"stk88Gw7\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\" data-stk-css-m=\"\" data-stk-css=\"\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last stk-theme_44178__pad_ver_1\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset stk-theme_44178__mb_05 stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__color_44178_custom_color_4\" data-stk-css=\"stk-Ux0k\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">EXPERT TIP</strong></p>\n<h4 class=\"stk-theme_44178__style_small_header stk-reset\" data-ce-tag=\"paragraph\" data-stk-css=\"stkoGM_l\"><strong class=\"stk-reset\">Runtime errors vs compilation errors</strong></h4>\n<p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stkTCIxf\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Runtime errors</strong> occur when a program is running &ndash; AKA when it&rsquo;s being used. By comparison, <strong class=\"stk-reset\">compilation errors</strong> happen during development when the code is being compiled. Because of this, compilation errors catch problems <em class=\"stk-reset\">before</em> the code goes out to customers.</p>\n<p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stkCh6NE\" data-ce-tag=\"paragraph\">&rarr; JavaScript <em class=\"stk-reset\">isn&rsquo;t</em> compiled, so it&rsquo;s easier for issues to sneak into the product and cause runtime errors that may be found by users.</p>\n<p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stkouXru\" data-ce-tag=\"paragraph\">&rarr; TypeScript <em class=\"stk-reset\">is</em> compiled, and its inbuilt error reporting, during development, means issues are more likely to be caught, and developers can fix them before the code goes live. This results in cleaner code overall, but the faster and clearer feedback loop also helps devs write and type code faster.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">Converting JavaScript TinyMCE to TypeScript TinyMCE</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">The initial kickoff work on the mammoth task of <a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/modern-javascript-refactoring-tinymce/\" target=\"_blank\" rel=\"noopener\">converting TinyMCE to TypeScript, began in late 2017</a> and took about six weeks. It&rsquo;s worth noting that was only the &lsquo;start&rsquo; &ndash; because<strong class=\"stk-reset\"> the key to converting an existing JavaScript codebase to TypeScript is gradual typing.</strong></p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Since then, TinyMCE has had more underlying restructuring work done on it, than ever before in its history.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Thanks to the mountain of technical debt the open source core carried, it wasn&rsquo;t until late 2022 that the team finished migrating it to &ldquo;strict&rdquo; TypeScript. Some of our internal libraries are so complex, that those migrations are still incomplete. In addition, over the same period there&rsquo;s been a slow expansion of the way TypeScript is being leveraged &ndash; mainly in the Premium plugins &ndash; and it can now be said that TinyMCE is a TypeScript editor.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">In a previous article we gave a lot more detail about <a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/benefits-of-gradual-strong-typing-in-javascript\" target=\"_blank\" rel=\"noopener\" data-gtm-vis-has-fired-10171822_255=\"1\">the conversion to TypeScript</a>, but if you&rsquo;re considering converting your codebase from JS to TypeScript, the most notable takeaway is:</p>\n<p class=\"stk-theme_44178__style_font_style-1628517294418 stk-theme_44178__color_44178_custom_color_4 stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">TypeScript accepts various levels of &ldquo;typed&rdquo; code. Plain JavaScript can become valid TypeScript with very minimal changes using the &ldquo;any&rdquo; escape hatch. This means the initial conversion is easy, and improvements can be scheduled over the following months or years.</strong></p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">That's the exact route TinyMCE took, to typing: a protracted one.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">However, be aware that using &ldquo;any&rdquo; <em class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">does</em> mean you miss out on a lot of TypeScript&rsquo;s features. If you want all of TypeScript&rsquo;s functionality you need to type the code properly.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">That said, even if your whole codebase uses &ldquo;any&rdquo;, you still get value thanks to TypeScript pointing out compilation issues during development, instead of at runtime (which is what JavaScript does). Here&rsquo;s an example: TypeScript can check that functions are passed the right <em class=\"stk-reset\">number</em> of arguments, even if it can&rsquo;t yet check they&rsquo;re the right <em class=\"stk-reset\">type</em>.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">So, while using &ldquo;any&rdquo; may not provide the ultimate value that you <em class=\"stk-reset\">could </em>gain, it&rsquo;s a start &ndash; especially when you have a mammoth code base where you need to detect and decrease your tech debt.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Another benefit of using &ldquo;any&rdquo; is that it opens the door to slowly increasing how much code is typed &ndash; and therefore how much benefit you get from TypeScript. Once the initial conversion was done, our developers would slip types into pieces of code they were writing or updating with minimal extra effort, increasing the chance of errors being pointed out by TypeScript.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Time and again this caught errors early, and saved them from going into the code and creating tech debt we would have had to fix later.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"4\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_15 stk-grid\" data-stk-css=\"stkpp0f_\" data-ce-tag=\"grid\">\n<div class=\"stk-theme_44178__pad_ver_2 stk-grid-col stk-grid-col_last\" data-col-width=\"12\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h4 class=\"stk-reset stk-theme_44178__style_small_header align-center\" data-ce-tag=\"paragraph\">Want to see one of the silliest bugs TypeScript detected in TinyMCE?</h4>\n<p class=\"align-center stk-reset\" data-ce-tag=\"paragraph\">It&rsquo;s called &lsquo;The Case of the Mysterious Double Argument Error&hellip;.&rsquo;</p>\n<p class=\"align-center stk-reset\" data-ce-tag=\"paragraph\">To find out what happened, read the article&nbsp;<a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/benefits-of-gradual-strong-typing-in-javascript/\" target=\"_blank\" rel=\"noopener\">Benefits of gradual strong typing in JavaScript</a></p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-grid stk-theme_44178__mb_2\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h3 class=\"stk-reset stk-theme_44178__style_medium_header stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\">How TypeScript helps with technical debt</h3>\n<p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">When it comes to comparing TypeScript vs JavaScript, TS actively helps with tech debt &ndash; by making it easier to implement three principles needed to avoid and manage it:</p>\n<ul class=\"stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Clean code</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Good tests</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Good tooling</li>\n</ul>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Yes, most developers acknowledge that the best kind of technical debt to have, is <strong class=\"stk-reset\">intentional tech debt</strong> &ndash; a shortcut that was <em class=\"stk-reset\">chosen</em> during planning or development to speed up the release of a project. But <em class=\"stk-reset\">why</em>? Because this kind of <a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/technical-debt-tracking/\" target=\"_blank\" rel=\"noopener\">tech debt can be recorded, tracked and planned</a>.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">However, tech debt isn&rsquo;t always intentional.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Unintentional tech debt</strong> sneaks in when developers are in a rush, or don&rsquo;t have all the information they need to make the best decisions. Meanwhile <strong class=\"stk-reset\">environmental tech debt</strong> is caused by forces outside your control &ndash; changes to dependencies, to browsers or operating systems, or to code in other parts of the product.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">The hidden danger of both these kinds of technical debt is the inability to detect them <em class=\"stk-reset\">before</em> they cause trouble.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">As you can see by the time it&rsquo;s taken to pay down the tech debt found in the TinyMCE Core editor, hidden debt is particularly hard work in a large codebase, like a rich text editor. And the challenge never ends. Tech debt endlessly grows in our Core editor (especially environmental and functional tech debt), and needs constant work.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">With so many moving parts, dependencies, demands for updates and new feature releases, rich text editors wage a constant battle with the tech debt demon. Switching to TypeScript, helped the TinyMCE development team to identify, prioritise and overcome the debt that had accumulated from many years of choices, accidents, or outside forces and influences.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">There&rsquo;s four key ways that TypeScript helped to clean up the TinyMCE code base.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-ce-tag=\"grid-col\" data-stk-css=\"\" data-stk-css-m=\"\">&nbsp;</div>\n</div>\n<div class=\"stk-layout__overhangs_both stk-grid\" data-stk-css=\"stkPpP_E\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last stk-theme_44178__pad_ver_3\" data-col-width=\"12\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n</div>\n</div>","childMarkdownRemark":{"html":"<div class=\"stk-grid stk-theme_44178__mb_2\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"12\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"10\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset stk-theme_44178__color_44178_custom_color_2 ce-element--empty stk-element_no-text\" data-ce-tag=\"paragraph\">&nbsp;</p>\n<p class=\"stk-reset stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__color_44178_custom_color_2 stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\"><strong class=\"stk-reset\">developer insights</strong></strong></p>\n<h1 class=\"stk-reset stk-theme_44178__color_44178_custom_color_1 stk-theme_44178__style_font_style-1635835947787\" data-ce-tag=\"paragraph\">Technical debt and types: The benefits of TypeScript vs JavaScript</h1>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"3\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__color_44178_custom_color_3\" data-ce-tag=\"paragraph\">Published {{setkaPost.lastUpdated}}</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"9\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__color_44178_custom_color_3\" data-ce-tag=\"paragraph\"><img class=\"stk-reset stk-theme_44178__symbol_custom_image_3740221 stk-icon\" src=\"https://ceditor.setka.io/clients/D3SuW9_Vtk6NhYeFXfduUy55A4Dromkt/css/assets/44178/img/icon_clock-2022112504394454.svg\" alt=\"\" />&nbsp;{{setkaPost.readTime}}</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-grid stk-theme_44178__mb_15\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"9\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628517294418 stk-reset stk-theme_44178__color_44178_custom_color_1\" data-ce-tag=\"paragraph\">Changing programming languages is always a torturous decision. But with a product as complex as a rich text editor, that&rsquo;s so prone to technical debt, the right programming language is vital to its longevity. Thankfully, for TinyMCE, converting from JavaScript to TypeScript was easy &ndash; and carried with it a lot of benefits for an editor with heavy technical debt burdens.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid stk-grid__layout_columns\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">&nbsp;</div>\n<div class=\"stk-grid-col stk-grid-col_last valign-middle\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset stk-theme_44178__style_font_style-1628517714937 stk-theme_44178__mb_0 stk-theme_44178__color_44178_custom_color_1\" data-ce-tag=\"paragraph\">Millie Macdonald</p>\n<p class=\"stk-reset stk-theme_44178__style_small_text stk-theme_44178__color_44178_custom_color_3\" data-ce-tag=\"paragraph\">Product Manager at Halo Connect</p>\n</div>\n</div>\n</div>\n</div>\n<hr class=\"stk-theme_44178__separator_basic_divider stk-theme_44178__mb_2 stk-reset\" />\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Right now, JavaScript (JS) is easily one of the most popular programming languages. It&rsquo;s particularly appropriate for rich text editors, because they're mostly integrated into websites and web apps &ndash; where JavaScript is the weapon of choice for developers.</p>\n<p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">However, if you go beyond the surface of JavaScript, you quickly find a host of complications that may make it a less than perfect choice:</p>\n<ul class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">Easy to learn but hard to master</strong>. JavaScript has a low barrier to entry, but also a lot of unintuitive quirks and pitfalls (<a class=\"stk-reset\" href=\"https://www.w3schools.com/js/js_function_closures.asp\" target=\"_blank\" rel=\"noopener\">function closures</a>, anyone?).</li>\n</ul>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">&rarr; </strong>Learning these quirks can take a while, and handling them during development adds both time and lines of code to a project.</p>\n</div>\n</div>\n<ul class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">Even bad code gets interpreted. </strong>JavaScript always tries its best to interpret your code &ndash; even if it makes no sense. <a class=\"stk-reset\" href=\"https://www.destroyallsoftware.com/talks/wat\" target=\"_blank\" rel=\"noopener\">The Wat talk by Gary Bernhardt</a> gives some hilarious examples that highlight just how weird JavaScript can get.</li>\n</ul>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">&rarr; </strong>Sadly JavaScript doesn&rsquo;t have a safety net, so you&rsquo;re on your own when it comes to ensuring your code does what it&rsquo;s meant to.</p>\n</div>\n</div>\n<ul class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">Readability requires documentation.</strong> Between the lack of types and <a class=\"stk-reset\" href=\"https://dmitripavlutin.com/unlearn-javascript-bad-coding-habits/\" target=\"_blank\" rel=\"noopener\">how easy it is to write confusing code in JavaScript</a>, making your code readable often requires extra steps.</li>\n</ul>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">&rarr; Code comments, good naming conventions, and internal documentation are your friend when it comes to large JavaScript code bases &ndash; but they all require extra work.</p>\n</div>\n</div>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-stk-css=\"stkdQPoe\" data-anim-m=\"false\" data-ce-tag=\"grid\">\n<div class=\"stk-theme_44178__pad_round_1 stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628517714937 stk-reset stk-theme_44178__color_44178_custom_color_1 stk-theme_44178__mb_0\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">TABLE OF&nbsp;CONTENTS</strong></p>\n<hr class=\"stk-theme_44178__separator_basic_divider stk-theme_44178__mb_05 stk-reset\" />\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__color_44178_custom_color_3 stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"#stk-4\">JavaScript and technical debt</a></p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"#stk-1\">TypeScript vs JavaScript</a></p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__color_44178_custom_color_3 stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"#stk-2\">Benefits of switching to TypeScript for WYSIWYG tech debt</a></p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__color_44178_custom_color_3 stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"#stk-3\">TypeScript&rsquo;s great but WYSIWYG editors are best left to experts</a></p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_2 stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset stk-theme_44178__mb_2\" data-ce-tag=\"paragraph\">Complications like these can cause any number of problems, which is why there are so many articles about JavaScript being a &lsquo;bad&rsquo; programming language. However, there&rsquo;s one danger that isn&rsquo;t talked about nearly enough: technical debt.</p>\n<h2 id=\"stk-4\" class=\"stk-theme_44178__style_large_header stk-reset\" data-ce-tag=\"paragraph\">JavaScript and technical debt</h2>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">First up, it has to be said that Javascript and tech debt have a symbiotic relationship.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Flexibility may be one of Javascript&rsquo;s strengths, but it also makes it easy for errors to creep into the code, unless significant precautions are taken.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">A rich text editor is already a breeding ground for tech debt, due to the scale and complexity of its features and codebase. So it goes without saying that developing a product that&rsquo;s <em class=\"stk-reset\">already</em> prone to tech debt, in a language that&rsquo;s <em class=\"stk-reset\">also</em> prone to tech debt, isn&rsquo;t a great idea. But it's a mistake that's often made.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">JavaScript&rsquo;s really easy to learn, it&rsquo;s quick to hire dev talent, and runs almost anywhere. So how do you leverage those benefits, without risking the ongoing accumulation of technical debt that negatively impacts your developer velocity and product quality?</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Enter, TypeScript.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-theme_44178__mb_2 stk-grid\" data-stk-css=\"stk0SEJm\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim-zoom=\"100\" data-anim-shift=\"60\" data-anim-rotation=\"0\" data-anim-opacity=\"100\" data-anim-direction=\"left\" data-anim-duration=\"0.6000000000000001\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\" data-anim-trigger=\"scroll\" data-anim-sticky-direction=\"top\" data-anim-sticky-offset=\"20\" data-anim-name=\"ajYYkX\" data-anim=\"true\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-theme_44178__mb_05 stk-grid\" data-stk-css=\"stk9V8Fp\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-stk-css=\"stkNYpue\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628517714937 stk-reset stk-theme_44178__color_44178_custom_color_4\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Insights on the complexities of RICH TEXT EDITORS and technical debt</strong></p>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_05 stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-stk-css=\"stkEkeMK\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/reduce-technical-debt/\" target=\"_blank\" rel=\"noopener\">Reduce technical debt with the right rich text editor</a></p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/manage-technical-debt/\" target=\"_blank\" rel=\"noopener\">Managing technical debt is difficult in rich text editors</a></p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/technical-debt-examples/\" target=\"_blank\" rel=\"noopener\">Dangerous examples of technical debt in rich text editors</a></p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/developer-velocity-and-technical-debt/\" target=\"_blank\" rel=\"noopener\">Are developer velocity and technical debt impacted by a rich text editor?</a></p>\n</div>\n</div>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_15 stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h2 id=\"stk-1\" class=\"stk-theme_44178__style_large_header stk-reset\" data-ce-tag=\"paragraph\">TypeScript vs JavaScript</h2>\n<p class=\"stk-theme_44178__mb_15 stk-reset\" data-ce-tag=\"paragraph\">JavaScript (JS) may be the undisputed &lsquo;most popular&rsquo; programming language of HTML and the web, but in 2022, TypeScript (TS) joined the world&rsquo;s <a class=\"stk-reset\" href=\"https://survey.stackoverflow.co/2022/#technology-most-popular-technologies\" target=\"_blank\" rel=\"noopener\" data-gtm-vis-has-fired-10171822_255=\"1\">top 5 most used languages</a>.</p>\n<h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">What is TypeScript?</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">TypeScript is a free, open source programming language built on top of JavaScript, that adds strong types, tooling, and guide rails for better development. It compiles to JavaScript, which means it can run anywhere that JS runs and it maintains much of JavaScript&rsquo;s feature set.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Best of all TypeScript answers all the prior concerns noted, plus some.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Getting into the weeds, although JavaScript is considered the primary scripting language for apps and web pages, it was never designed for that purpose. Nor was it designed for creating large and complex web apps &ndash; it&rsquo;s better suited for small-scale applications.</p>\n<p class=\"stk-theme_44178__mb_15 stk-reset\" data-ce-tag=\"paragraph\">For this very reason, in 2012, Microsoft developed TypeScript with the specific goal of a scripting language that better handles large-scale complicated applications.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"valign-middle stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-stk-css=\"stkK5Fn-\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-slideInRight\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\">\n<div class=\"stk-theme_44178__pad_round_1 stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Definitions</strong></p>\n<p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">Statically typed:</strong><br data-gtm-vis-has-fired-10171822_255=\"1\" />Types must be defined in the code and are checked at compile time</p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">Dynamically typed:</strong><br data-gtm-vis-has-fired-10171822_255=\"1\" />Types are assigned and checked at run time</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-grid stk-theme_44178__mb_2\" data-stk-css=\"stk-AL3u\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-jackInTheBox\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\" data-ce-tag=\"grid\">\n<div class=\"stk-theme_44178__pad_ver_2 stk-grid-col stk-grid-col_last\" data-col-width=\"12\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628585803915 align-center stk-reset\" data-stk-css=\"stkks_bG\" data-ce-tag=\"paragraph\">Get more insights in our<br />Technical Debt White Paper</p>\n<a class=\"stk-theme_44178__stk-btn_1628586253530 stk-theme_44178__style_font_style-1628586133109 align-center stk-reset\" href=\"https://www.tiny.cloud/technical-debt-whitepaper\" target=\"_blank\" rel=\"noopener\" data-stk-button=\"1\" data-ce-tag=\"button\">READ THE WHITE PAPER</a></div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">Why is TypeScript better than Javascript?</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Importantly, TypeScript isn&rsquo;t a completely different programming language &ndash; it&rsquo;s JavaScript but better.</p>\n<ul class=\"stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">TypeScript simplifies, handles, or restricts many of JavaScript&rsquo;s weirder features</strong>, both inherently and via the extra functionality it offers to developers, to reduce the risk of falling into the common pitfalls of JS.</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">It adds type checking and better errors</strong>, to increase the chance that bad code is caught during development.</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">Adding types adds inline documentation with minimal extra work</strong>, and allows you to define not just variables and functions, but also concepts and APIs.</li>\n</ul>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">For a rich text editor, this means you get the easy interoperability (of Javascript) with web applications and technologies, and also gain (with TypeScript) the functionality and tooling that&rsquo;s invaluable for maintaining the quality of your code &ndash; all with minimal overhead.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">That&rsquo;s a massive long-term gain in terms of reduced bugs and work impediments. But what&rsquo;s the cost of conversion?</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Developing a brand new rich text editor from scratch, in TypeScript, is the easiest route. But what if, like TinyMCE, you already have an editor written in JavaScript? You don&rsquo;t want to throw that code away. No.</p>\n<p class=\"stk-theme_44178__mb_15 stk-reset\" data-ce-tag=\"paragraph\">So, how hard was it to convert TinyMCE from JavaScript to TypeScript? Well&hellip;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"valign-middle stk-grid-col stk-grid-col_empty\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-grid stk-theme_44178__mb_15\" data-ce-tag=\"grid\" data-stk-css=\"stk88Gw7\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\" data-stk-css-m=\"\" data-stk-css=\"\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last stk-theme_44178__pad_ver_1\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset stk-theme_44178__mb_05 stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__color_44178_custom_color_4\" data-stk-css=\"stk-Ux0k\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">EXPERT TIP</strong></p>\n<h4 class=\"stk-theme_44178__style_small_header stk-reset\" data-ce-tag=\"paragraph\" data-stk-css=\"stkoGM_l\"><strong class=\"stk-reset\">Runtime errors vs compilation errors</strong></h4>\n<p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stkTCIxf\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Runtime errors</strong> occur when a program is running &ndash; AKA when it&rsquo;s being used. By comparison, <strong class=\"stk-reset\">compilation errors</strong> happen during development when the code is being compiled. Because of this, compilation errors catch problems <em class=\"stk-reset\">before</em> the code goes out to customers.</p>\n<p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stkCh6NE\" data-ce-tag=\"paragraph\">&rarr; JavaScript <em class=\"stk-reset\">isn&rsquo;t</em> compiled, so it&rsquo;s easier for issues to sneak into the product and cause runtime errors that may be found by users.</p>\n<p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stkouXru\" data-ce-tag=\"paragraph\">&rarr; TypeScript <em class=\"stk-reset\">is</em> compiled, and its inbuilt error reporting, during development, means issues are more likely to be caught, and developers can fix them before the code goes live. This results in cleaner code overall, but the faster and clearer feedback loop also helps devs write and type code faster.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">Converting JavaScript TinyMCE to TypeScript TinyMCE</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">The initial kickoff work on the mammoth task of <a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/modern-javascript-refactoring-tinymce/\" target=\"_blank\" rel=\"noopener\">converting TinyMCE to TypeScript, began in late 2017</a> and took about six weeks. It&rsquo;s worth noting that was only the &lsquo;start&rsquo; &ndash; because<strong class=\"stk-reset\"> the key to converting an existing JavaScript codebase to TypeScript is gradual typing.</strong></p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Since then, TinyMCE has had more underlying restructuring work done on it, than ever before in its history.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Thanks to the mountain of technical debt the open source core carried, it wasn&rsquo;t until late 2022 that the team finished migrating it to &ldquo;strict&rdquo; TypeScript. Some of our internal libraries are so complex, that those migrations are still incomplete. In addition, over the same period there&rsquo;s been a slow expansion of the way TypeScript is being leveraged &ndash; mainly in the Premium plugins &ndash; and it can now be said that TinyMCE is a TypeScript editor.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">In a previous article we gave a lot more detail about <a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/benefits-of-gradual-strong-typing-in-javascript\" target=\"_blank\" rel=\"noopener\" data-gtm-vis-has-fired-10171822_255=\"1\">the conversion to TypeScript</a>, but if you&rsquo;re considering converting your codebase from JS to TypeScript, the most notable takeaway is:</p>\n<p class=\"stk-theme_44178__style_font_style-1628517294418 stk-theme_44178__color_44178_custom_color_4 stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">TypeScript accepts various levels of &ldquo;typed&rdquo; code. Plain JavaScript can become valid TypeScript with very minimal changes using the &ldquo;any&rdquo; escape hatch. This means the initial conversion is easy, and improvements can be scheduled over the following months or years.</strong></p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">That's the exact route TinyMCE took, to typing: a protracted one.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">However, be aware that using &ldquo;any&rdquo; <em class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">does</em> mean you miss out on a lot of TypeScript&rsquo;s features. If you want all of TypeScript&rsquo;s functionality you need to type the code properly.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">That said, even if your whole codebase uses &ldquo;any&rdquo;, you still get value thanks to TypeScript pointing out compilation issues during development, instead of at runtime (which is what JavaScript does). Here&rsquo;s an example: TypeScript can check that functions are passed the right <em class=\"stk-reset\">number</em> of arguments, even if it can&rsquo;t yet check they&rsquo;re the right <em class=\"stk-reset\">type</em>.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">So, while using &ldquo;any&rdquo; may not provide the ultimate value that you <em class=\"stk-reset\">could </em>gain, it&rsquo;s a start &ndash; especially when you have a mammoth code base where you need to detect and decrease your tech debt.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Another benefit of using &ldquo;any&rdquo; is that it opens the door to slowly increasing how much code is typed &ndash; and therefore how much benefit you get from TypeScript. Once the initial conversion was done, our developers would slip types into pieces of code they were writing or updating with minimal extra effort, increasing the chance of errors being pointed out by TypeScript.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Time and again this caught errors early, and saved them from going into the code and creating tech debt we would have had to fix later.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"4\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_15 stk-grid\" data-stk-css=\"stkpp0f_\" data-ce-tag=\"grid\">\n<div class=\"stk-theme_44178__pad_ver_2 stk-grid-col stk-grid-col_last\" data-col-width=\"12\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h4 class=\"stk-reset stk-theme_44178__style_small_header align-center\" data-ce-tag=\"paragraph\">Want to see one of the silliest bugs TypeScript detected in TinyMCE?</h4>\n<p class=\"align-center stk-reset\" data-ce-tag=\"paragraph\">It&rsquo;s called &lsquo;The Case of the Mysterious Double Argument Error&hellip;.&rsquo;</p>\n<p class=\"align-center stk-reset\" data-ce-tag=\"paragraph\">To find out what happened, read the article&nbsp;<a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/benefits-of-gradual-strong-typing-in-javascript/\" target=\"_blank\" rel=\"noopener\">Benefits of gradual strong typing in JavaScript</a></p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-grid stk-theme_44178__mb_2\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h3 class=\"stk-reset stk-theme_44178__style_medium_header stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\">How TypeScript helps with technical debt</h3>\n<p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">When it comes to comparing TypeScript vs JavaScript, TS actively helps with tech debt &ndash; by making it easier to implement three principles needed to avoid and manage it:</p>\n<ul class=\"stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Clean code</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Good tests</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Good tooling</li>\n</ul>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Yes, most developers acknowledge that the best kind of technical debt to have, is <strong class=\"stk-reset\">intentional tech debt</strong> &ndash; a shortcut that was <em class=\"stk-reset\">chosen</em> during planning or development to speed up the release of a project. But <em class=\"stk-reset\">why</em>? Because this kind of <a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/technical-debt-tracking/\" target=\"_blank\" rel=\"noopener\">tech debt can be recorded, tracked and planned</a>.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">However, tech debt isn&rsquo;t always intentional.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Unintentional tech debt</strong> sneaks in when developers are in a rush, or don&rsquo;t have all the information they need to make the best decisions. Meanwhile <strong class=\"stk-reset\">environmental tech debt</strong> is caused by forces outside your control &ndash; changes to dependencies, to browsers or operating systems, or to code in other parts of the product.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">The hidden danger of both these kinds of technical debt is the inability to detect them <em class=\"stk-reset\">before</em> they cause trouble.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">As you can see by the time it&rsquo;s taken to pay down the tech debt found in the TinyMCE Core editor, hidden debt is particularly hard work in a large codebase, like a rich text editor. And the challenge never ends. Tech debt endlessly grows in our Core editor (especially environmental and functional tech debt), and needs constant work.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">With so many moving parts, dependencies, demands for updates and new feature releases, rich text editors wage a constant battle with the tech debt demon. Switching to TypeScript, helped the TinyMCE development team to identify, prioritise and overcome the debt that had accumulated from many years of choices, accidents, or outside forces and influences.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">There&rsquo;s four key ways that TypeScript helped to clean up the TinyMCE code base.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-ce-tag=\"grid-col\" data-stk-css=\"\" data-stk-css-m=\"\">&nbsp;</div>\n</div>\n<div class=\"stk-layout__overhangs_both stk-grid\" data-stk-css=\"stkPpP_E\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last stk-theme_44178__pad_ver_3\" data-col-width=\"12\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n</div>\n</div>","htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{"className":["stk-grid","stk-theme_44178__mb_2"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"12","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"10","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset","stk-theme_44178__color_44178_custom_color_2","ce-element--empty","stk-element_no-text"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset","stk-theme_44178__style_font_style-1628517328397","stk-theme_44178__color_44178_custom_color_2","stk-theme_44178__mb_05"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"developer insights"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h1","properties":{"className":["stk-reset","stk-theme_44178__color_44178_custom_color_1","stk-theme_44178__style_font_style-1635835947787"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Technical debt and types: The benefits of TypeScript vs JavaScript"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"2","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col"],"dataColWidth":"3","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-reset","stk-theme_44178__color_44178_custom_color_3"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Published {{setkaPost.lastUpdated}}"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"9","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-reset","stk-theme_44178__color_44178_custom_color_3"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"img","properties":{"className":["stk-reset","stk-theme_44178__symbol_custom_image_3740221","stk-icon"],"src":"https://ceditor.setka.io/clients/D3SuW9_Vtk6NhYeFXfduUy55A4Dromkt/css/assets/44178/img/icon_clock-2022112504394454.svg","alt":""},"children":[]},{"type":"text","value":" {{setkaPost.readTime}}"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid","stk-theme_44178__mb_15"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col"],"dataColWidth":"9","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_font_style-1628517294418","stk-reset","stk-theme_44178__color_44178_custom_color_1"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Changing programming languages is always a torturous decision. But with a product as complex as a rich text editor, that’s so prone to technical debt, the right programming language is vital to its longevity. Thankfully, for TinyMCE, converting from JavaScript to TypeScript was easy – and carried with it a lot of benefits for an editor with heavy technical debt burdens."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid","stk-grid__layout_columns"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col"],"dataColWidth":"1","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last","valign-middle"],"dataColWidth":"2","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset","stk-theme_44178__style_font_style-1628517714937","stk-theme_44178__mb_0","stk-theme_44178__color_44178_custom_color_1"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Millie Macdonald"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset","stk-theme_44178__style_small_text","stk-theme_44178__color_44178_custom_color_3"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Product Manager at Halo Connect"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"hr","properties":{"className":["stk-theme_44178__separator_basic_divider","stk-theme_44178__mb_2","stk-reset"]},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Right now, JavaScript (JS) is easily one of the most popular programming languages. It’s particularly appropriate for rich text editors, because they're mostly integrated into websites and web apps – where JavaScript is the weapon of choice for developers."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"However, if you go beyond the surface of JavaScript, you quickly find a host of complications that may make it a less than perfect choice:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{"className":["stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"list"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"Easy to learn but hard to master"}]},{"type":"text","value":". JavaScript has a low barrier to entry, but also a lot of unintuitive quirks and pitfalls ("},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.w3schools.com/js/js_function_closures.asp","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"function closures"}]},{"type":"text","value":", anyone?)."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"8","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"→ "}]},{"type":"text","value":"Learning these quirks can take a while, and handling them during development adds both time and lines of code to a project."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{"className":["stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"list"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"Even bad code gets interpreted. "}]},{"type":"text","value":"JavaScript always tries its best to interpret your code – even if it makes no sense. "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.destroyallsoftware.com/talks/wat","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"The Wat talk by Gary Bernhardt"}]},{"type":"text","value":" gives some hilarious examples that highlight just how weird JavaScript can get."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"8","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"→ "}]},{"type":"text","value":"Sadly JavaScript doesn’t have a safety net, so you’re on your own when it comes to ensuring your code does what it’s meant to."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{"className":["stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"list"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"Readability requires documentation."}]},{"type":"text","value":" Between the lack of types and "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://dmitripavlutin.com/unlearn-javascript-bad-coding-habits/","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"how easy it is to write confusing code in JavaScript"}]},{"type":"text","value":", making your code readable often requires extra steps."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"8","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"→ Code comments, good naming conventions, and internal documentation are your friend when it comes to large JavaScript code bases – but they all require extra work."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"1","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataStkCss":"stkdQPoe","dataAnimM":"false","dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__pad_round_1","stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_font_style-1628517714937","stk-reset","stk-theme_44178__color_44178_custom_color_1","stk-theme_44178__mb_0"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"TABLE OF CONTENTS"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"hr","properties":{"className":["stk-theme_44178__separator_basic_divider","stk-theme_44178__mb_05","stk-reset"]},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-theme_44178__color_44178_custom_color_3","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"#stk-4"},"children":[{"type":"text","value":"JavaScript and technical debt"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"#stk-1"},"children":[{"type":"text","value":"TypeScript vs JavaScript"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-theme_44178__color_44178_custom_color_3","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"#stk-2"},"children":[{"type":"text","value":"Benefits of switching to TypeScript for WYSIWYG tech debt"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-theme_44178__color_44178_custom_color_3","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"#stk-3"},"children":[{"type":"text","value":"TypeScript’s great but WYSIWYG editors are best left to experts"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__mb_2","stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset","stk-theme_44178__mb_2"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Complications like these can cause any number of problems, which is why there are so many articles about JavaScript being a ‘bad’ programming language. However, there’s one danger that isn’t talked about nearly enough: technical debt."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"stk-4","className":["stk-theme_44178__style_large_header","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"JavaScript and technical debt"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"First up, it has to be said that Javascript and tech debt have a symbiotic relationship."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Flexibility may be one of Javascript’s strengths, but it also makes it easy for errors to creep into the code, unless significant precautions are taken."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"A rich text editor is already a breeding ground for tech debt, due to the scale and complexity of its features and codebase. So it goes without saying that developing a product that’s "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"already"}]},{"type":"text","value":" prone to tech debt, in a language that’s "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"also"}]},{"type":"text","value":" prone to tech debt, isn’t a great idea. But it's a mistake that's often made."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"JavaScript’s really easy to learn, it’s quick to hire dev talent, and runs almost anywhere. So how do you leverage those benefits, without risking the ongoing accumulation of technical debt that negatively impacts your developer velocity and product quality?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Enter, TypeScript."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"1","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__mb_2","stk-grid"],"dataStkCss":"stk0SEJm","dataCeTag":"grid","dataAnimM":"false","dataAnimZoom":"100","dataAnimShift":"60","dataAnimRotation":"0","dataAnimOpacity":"100","dataAnimDirection":"left","dataAnimDuration":"0.6000000000000001","dataAnimDelay":"0","dataAnimScrollStart":"10","dataAnimScrollFinish":"90","dataAnimTrigger":"scroll","dataAnimStickyDirection":"top","dataAnimStickyOffset":"20","dataAnimName":"ajYYkX","dataAnim":"true"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__mb_05","stk-grid"],"dataStkCss":"stk9V8Fp","dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataStkCss":"stkNYpue","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_font_style-1628517714937","stk-reset","stk-theme_44178__color_44178_custom_color_4"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"Insights on the complexities of RICH TEXT EDITORS and technical debt"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__mb_05","stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataStkCss":"stkEkeMK","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-reset","stk-theme_44178__mb_05"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.tiny.cloud/blog/reduce-technical-debt/","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"Reduce technical debt with the right rich text editor"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.tiny.cloud/blog/manage-technical-debt/","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"Managing technical debt is difficult in rich text editors"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.tiny.cloud/blog/technical-debt-examples/","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"Dangerous examples of technical debt in rich text editors"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.tiny.cloud/blog/developer-velocity-and-technical-debt/","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"Are developer velocity and technical debt impacted by a rich text editor?"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__mb_15","stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"stk-1","className":["stk-theme_44178__style_large_header","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"TypeScript vs JavaScript"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_15","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"JavaScript (JS) may be the undisputed ‘most popular’ programming language of HTML and the web, but in 2022, TypeScript (TS) joined the world’s "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://survey.stackoverflow.co/2022/#technology-most-popular-technologies","target":"_blank","rel":["noopener"],"dataGtmVisHasFired-10171822_255":"1"},"children":[{"type":"text","value":"top 5 most used languages"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"className":["stk-theme_44178__style_medium_header","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"What is TypeScript?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"TypeScript is a free, open source programming language built on top of JavaScript, that adds strong types, tooling, and guide rails for better development. It compiles to JavaScript, which means it can run anywhere that JS runs and it maintains much of JavaScript’s feature set."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Best of all TypeScript answers all the prior concerns noted, plus some."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Getting into the weeds, although JavaScript is considered the primary scripting language for apps and web pages, it was never designed for that purpose. Nor was it designed for creating large and complex web apps – it’s better suited for small-scale applications."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_15","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"For this very reason, in 2012, Microsoft developed TypeScript with the specific goal of a scripting language that better handles large-scale complicated applications."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"1","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["valign-middle","stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataStkCss":"stkK5Fn-","dataCeTag":"grid","dataAnimM":"false","dataAnim":"true","dataAnimName":"preset-slideInRight","dataAnimTrigger":"scroll","dataAnimDuration":"1","dataAnimDelay":"0","dataAnimScrollStart":"10","dataAnimScrollFinish":"90"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__pad_round_1","stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset","stk-theme_44178__style_font_style-1628517328397","stk-theme_44178__mb_05"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"Definitions"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-reset","stk-theme_44178__mb_05"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"],"dataGtmVisHasFired-10171822_255":"1"},"children":[{"type":"text","value":"Statically typed:"}]},{"type":"element","tagName":"br","properties":{"dataGtmVisHasFired-10171822_255":"1"},"children":[]},{"type":"text","value":"Types must be defined in the code and are checked at compile time"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"],"dataGtmVisHasFired-10171822_255":"1"},"children":[{"type":"text","value":"Dynamically typed:"}]},{"type":"element","tagName":"br","properties":{"dataGtmVisHasFired-10171822_255":"1"},"children":[]},{"type":"text","value":"Types are assigned and checked at run time"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid","stk-theme_44178__mb_2"],"dataStkCss":"stk-AL3u","dataAnimM":"false","dataAnim":"true","dataAnimName":"preset-jackInTheBox","dataAnimTrigger":"scroll","dataAnimDuration":"1","dataAnimDelay":"0","dataAnimScrollStart":"10","dataAnimScrollFinish":"90","dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__pad_ver_2","stk-grid-col","stk-grid-col_last"],"dataColWidth":"12","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"2","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_font_style-1628585803915","align-center","stk-reset"],"dataStkCss":"stkks_bG","dataCeTag":"paragraph"},"children":[{"type":"text","value":"Get more insights in our"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"Technical Debt White Paper"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"a","properties":{"className":["stk-theme_44178__stk-btn_1628586253530","stk-theme_44178__style_font_style-1628586133109","align-center","stk-reset"],"href":"https://www.tiny.cloud/technical-debt-whitepaper","target":"_blank","rel":["noopener"],"dataStkButton":"1","dataCeTag":"button"},"children":[{"type":"text","value":"READ THE WHITE PAPER"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"2","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"className":["stk-theme_44178__style_medium_header","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Why is TypeScript better than Javascript?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Importantly, TypeScript isn’t a completely different programming language – it’s JavaScript but better."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{"className":["stk-reset"],"dataCeTag":"list"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"TypeScript simplifies, handles, or restricts many of JavaScript’s weirder features"}]},{"type":"text","value":", both inherently and via the extra functionality it offers to developers, to reduce the risk of falling into the common pitfalls of JS."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"It adds type checking and better errors"}]},{"type":"text","value":", to increase the chance that bad code is caught during development."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"Adding types adds inline documentation with minimal extra work"}]},{"type":"text","value":", and allows you to define not just variables and functions, but also concepts and APIs."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"For a rich text editor, this means you get the easy interoperability (of Javascript) with web applications and technologies, and also gain (with TypeScript) the functionality and tooling that’s invaluable for maintaining the quality of your code – all with minimal overhead."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"That’s a massive long-term gain in terms of reduced bugs and work impediments. But what’s the cost of conversion?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Developing a brand new rich text editor from scratch, in TypeScript, is the easiest route. But what if, like TinyMCE, you already have an editor written in JavaScript? You don’t want to throw that code away. No."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_15","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"So, how hard was it to convert TinyMCE from JavaScript to TypeScript? Well…"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"1","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["valign-middle","stk-grid-col","stk-grid-col_empty"],"dataColWidth":"3","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid","stk-theme_44178__mb_15"],"dataCeTag":"grid","dataStkCss":"stk88Gw7"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"2","dataCeTag":"grid-col","dataStkCssM":"","dataStkCss":""},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last","stk-theme_44178__pad_ver_1"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset","stk-theme_44178__mb_05","stk-theme_44178__style_font_style-1628517328397","stk-theme_44178__color_44178_custom_color_4"],"dataStkCss":"stk-Ux0k","dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"EXPERT TIP"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"className":["stk-theme_44178__style_small_header","stk-reset"],"dataCeTag":"paragraph","dataStkCss":"stkoGM_l"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"Runtime errors vs compilation errors"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_05","stk-theme_44178__color_44178_custom_color_1","stk-reset"],"dataStkCss":"stkTCIxf","dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"Runtime errors"}]},{"type":"text","value":" occur when a program is running – AKA when it’s being used. By comparison, "},{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"compilation errors"}]},{"type":"text","value":" happen during development when the code is being compiled. Because of this, compilation errors catch problems "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"before"}]},{"type":"text","value":" the code goes out to customers."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_05","stk-theme_44178__color_44178_custom_color_1","stk-reset"],"dataStkCss":"stkCh6NE","dataCeTag":"paragraph"},"children":[{"type":"text","value":"→ JavaScript "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"isn’t"}]},{"type":"text","value":" compiled, so it’s easier for issues to sneak into the product and cause runtime errors that may be found by users."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_05","stk-theme_44178__color_44178_custom_color_1","stk-reset"],"dataStkCss":"stkouXru","dataCeTag":"paragraph"},"children":[{"type":"text","value":"→ TypeScript "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" compiled, and its inbuilt error reporting, during development, means issues are more likely to be caught, and developers can fix them before the code goes live. This results in cleaner code overall, but the faster and clearer feedback loop also helps devs write and type code faster."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"2","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"className":["stk-theme_44178__style_medium_header","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Converting JavaScript TinyMCE to TypeScript TinyMCE"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"The initial kickoff work on the mammoth task of "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.tiny.cloud/blog/modern-javascript-refactoring-tinymce/","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"converting TinyMCE to TypeScript, began in late 2017"}]},{"type":"text","value":" and took about six weeks. It’s worth noting that was only the ‘start’ – because"},{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":" the key to converting an existing JavaScript codebase to TypeScript is gradual typing."}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Since then, TinyMCE has had more underlying restructuring work done on it, than ever before in its history."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Thanks to the mountain of technical debt the open source core carried, it wasn’t until late 2022 that the team finished migrating it to “strict” TypeScript. Some of our internal libraries are so complex, that those migrations are still incomplete. In addition, over the same period there’s been a slow expansion of the way TypeScript is being leveraged – mainly in the Premium plugins – and it can now be said that TinyMCE is a TypeScript editor."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"In a previous article we gave a lot more detail about "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.tiny.cloud/blog/benefits-of-gradual-strong-typing-in-javascript","target":"_blank","rel":["noopener"],"dataGtmVisHasFired-10171822_255":"1"},"children":[{"type":"text","value":"the conversion to TypeScript"}]},{"type":"text","value":", but if you’re considering converting your codebase from JS to TypeScript, the most notable takeaway is:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_font_style-1628517294418","stk-theme_44178__color_44178_custom_color_4","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"TypeScript accepts various levels of “typed” code. Plain JavaScript can become valid TypeScript with very minimal changes using the “any” escape hatch. This means the initial conversion is easy, and improvements can be scheduled over the following months or years."}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"That's the exact route TinyMCE took, to typing: a protracted one."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"However, be aware that using “any” "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"],"dataGtmVisHasFired-10171822_255":"1"},"children":[{"type":"text","value":"does"}]},{"type":"text","value":" mean you miss out on a lot of TypeScript’s features. If you want all of TypeScript’s functionality you need to type the code properly."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"That said, even if your whole codebase uses “any”, you still get value thanks to TypeScript pointing out compilation issues during development, instead of at runtime (which is what JavaScript does). Here’s an example: TypeScript can check that functions are passed the right "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"number"}]},{"type":"text","value":" of arguments, even if it can’t yet check they’re the right "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"So, while using “any” may not provide the ultimate value that you "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"could "}]},{"type":"text","value":"gain, it’s a start – especially when you have a mammoth code base where you need to detect and decrease your tech debt."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Another benefit of using “any” is that it opens the door to slowly increasing how much code is typed – and therefore how much benefit you get from TypeScript. Once the initial conversion was done, our developers would slip types into pieces of code they were writing or updating with minimal extra effort, increasing the chance of errors being pointed out by TypeScript."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Time and again this caught errors early, and saved them from going into the code and creating tech debt we would have had to fix later."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"4","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__mb_15","stk-grid"],"dataStkCss":"stkpp0f_","dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__pad_ver_2","stk-grid-col","stk-grid-col_last"],"dataColWidth":"12","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"2","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"className":["stk-reset","stk-theme_44178__style_small_header","align-center"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Want to see one of the silliest bugs TypeScript detected in TinyMCE?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["align-center","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"It’s called ‘The Case of the Mysterious Double Argument Error….’"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["align-center","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"To find out what happened, read the article "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.tiny.cloud/blog/benefits-of-gradual-strong-typing-in-javascript/","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"Benefits of gradual strong typing in JavaScript"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"2","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid","stk-theme_44178__mb_2"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"className":["stk-reset","stk-theme_44178__style_medium_header","stk-theme_44178__mb_05"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"How TypeScript helps with technical debt"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"When it comes to comparing TypeScript vs JavaScript, TS actively helps with tech debt – by making it easier to implement three principles needed to avoid and manage it:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{"className":["stk-reset"],"dataCeTag":"list"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"text","value":"Clean code"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"text","value":"Good tests"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"text","value":"Good tooling"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Yes, most developers acknowledge that the best kind of technical debt to have, is "},{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"intentional tech debt"}]},{"type":"text","value":" – a shortcut that was "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"chosen"}]},{"type":"text","value":" during planning or development to speed up the release of a project. But "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"why"}]},{"type":"text","value":"? Because this kind of "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.tiny.cloud/blog/technical-debt-tracking/","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"tech debt can be recorded, tracked and planned"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"However, tech debt isn’t always intentional."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"Unintentional tech debt"}]},{"type":"text","value":" sneaks in when developers are in a rush, or don’t have all the information they need to make the best decisions. Meanwhile "},{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"environmental tech debt"}]},{"type":"text","value":" is caused by forces outside your control – changes to dependencies, to browsers or operating systems, or to code in other parts of the product."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"The hidden danger of both these kinds of technical debt is the inability to detect them "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"before"}]},{"type":"text","value":" they cause trouble."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"As you can see by the time it’s taken to pay down the tech debt found in the TinyMCE Core editor, hidden debt is particularly hard work in a large codebase, like a rich text editor. And the challenge never ends. Tech debt endlessly grows in our Core editor (especially environmental and functional tech debt), and needs constant work."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"With so many moving parts, dependencies, demands for updates and new feature releases, rich text editors wage a constant battle with the tech debt demon. Switching to TypeScript, helped the TinyMCE development team to identify, prioritise and overcome the debt that had accumulated from many years of choices, accidents, or outside forces and influences."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"There’s four key ways that TypeScript helped to clean up the TinyMCE code base."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"1","dataCeTag":"grid-col","dataStkCss":"","dataStkCssM":""},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-layout__overhangs_both","stk-grid"],"dataStkCss":"stkPpP_E","dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last","stk-theme_44178__pad_ver_3"],"dataColWidth":"12","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"1","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]}],"data":{"quirksMode":false}}}},"body2":{"body2":"<div class=\"stk-grid stk-theme_44178__mb_2\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-ce-tag=\"grid-col\" data-stk-css=\"\" data-stk-css-m=\"\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col valign-middle stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-stk-css=\"stkCpDkq\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-slideInRight\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\">\n<div class=\"stk-theme_44178__pad_round_1 stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">What is Functional Debt?</strong></p>\n<p class=\"stk-theme_44178__style_small_text stk-reset\" data-ce-tag=\"paragraph\">Wondering where functional debt fits into the technical debt puzzle? Find out more by reading <a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog//technical-vs-functional-debt/\" target=\"_blank\" rel=\"noopener\">Functional debt vs Technical debt: What's the difference in a rich text editor?</a></p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-grid stk-theme_44178__mb_2\" data-stk-css=\"stk5B9SR\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-jackInTheBox\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\" data-ce-tag=\"grid\">\n<div class=\"stk-theme_44178__pad_ver_2 stk-grid-col stk-grid-col_last\" data-col-width=\"12\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628585803915 align-center stk-reset\" data-stk-css=\"stkdNg1j\" data-ce-tag=\"paragraph\">Get more insights in our<br />Technical Debt White Paper</p>\n<a class=\"stk-theme_44178__stk-btn_1628586253530 stk-theme_44178__style_font_style-1628586133109 align-center stk-reset\" href=\"https://www.tiny.cloud/technical-debt-whitepaper\" target=\"_blank\" rel=\"noopener\" data-stk-button=\"1\" data-ce-tag=\"button\">READ THE WHITE PAPER</a></div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h2 id=\"stk-2\" class=\"stk-theme_44178__style_large_header stk-reset\" data-ce-tag=\"paragraph\">Benefits of switching to TypeScript for WYSIWYG tech debt</h2>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Using TypeScript has plenty of benefits &ndash; no matter what stage of development you begin using it. However, there are extra benefits from <em class=\"stk-reset\">switching</em> <em class=\"stk-reset\">to</em> TypeScript, like TinyMCE did, and some of those are especially favourable to rich text editors.</p>\n<h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">1. Porting catches old tech debt</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Two bonuses from porting TinyMCE&rsquo;s JavaScript to TypeScript &ndash; compared to starting fresh with TypeScript &ndash; were:</p>\n<h4 class=\"stk-theme_44178__style_small_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">a. Porting the codebase forces reviews of old code</h4>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">To add types to an existing code base, a developer has to work through the code to figure out what types should be used. Some of that process can be automated, but the results should still be manually checked.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">It&rsquo;s time-consuming, and sometimes hard to justify scheduling the manual review work when there are features to be developed. But it's <em class=\"stk-reset\">so</em> worthwhile.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">If your codebase is anywhere near as large, complex and old as TinyMCE, peering into the untouched corners can unearth all kinds of interesting things. <a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/rte-code-half-life/\" target=\"_blank\" rel=\"noopener\">Bugs, cruft, tech debt, old to-dos</a> &ndash; you name it, you&rsquo;ll probably find it.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">For example, <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/pull/7083#discussion_r684619815\" target=\"_blank\" rel=\"noopener\">typing TinyMCE&rsquo;s Image plugin</a> found a potential <em class=\"stk-reset\">memory leak</em>.</p>\n<h4 class=\"stk-theme_44178__style_small_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">b. Reviewing code can prompt discussions</h4>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Converting TinyMCE to TypeScript also prompted discussions amongst our engineering team &ndash; on everything from individual variables to entire editor concepts.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">A <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/pull/7925\" target=\"_blank\" rel=\"noopener\">pull request that was made &ndash; for improving some types in TinyMCE&rsquo;s core engine</a> &ndash; is a great example. It had <em class=\"stk-reset\">forty-two</em> comments from multiple developers discussing the changes. It also prompted further changes, including the addition of test cases and some minor changes to functionality.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"4\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-grid\" data-ce-tag=\"grid\" data-stk-css=\"stkkZM_3\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\" data-stk-css-m=\"\" data-stk-css=\"\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last stk-theme_44178__pad_ver_1\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset stk-theme_44178__mb_05 stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__color_44178_custom_color_4\" data-stk-css=\"stkmTz6v\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">EXPERT TIP</strong></p>\n<h4 class=\"stk-theme_44178__style_small_header stk-reset\" data-ce-tag=\"paragraph\" data-stk-css=\"stkitN7O\"><strong class=\"stk-reset\">Type key dependencies first</strong></h4>\n<p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stkfO8Fi\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">If your codebase has more than one library, type key dependencies first.</strong></p>\n<p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stkR2np-\" data-ce-tag=\"paragraph\">It&rsquo;s more efficient to type your lowest-level libraries first &ndash; the ones that are the foundation of your application. Then work your way up, carrying changes from previously-typed libraries up to the higher-level libraries.</p>\n<p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stk78XJT\" data-ce-tag=\"paragraph\">If you type libraries in the wrong order, it can result in double handling the higher-level libraries. As an example, <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/pull/6073\" target=\"_blank\" rel=\"noopener\">this pull request</a> fixed some incorrect types in one part of TinyMCE&rsquo;s API &ndash; which resulted in the need to change <em class=\"stk-reset\">fifty-two</em> other files across various modules.</p>\n<p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stk_m4Av\" data-ce-tag=\"paragraph\">This &lsquo;key dependencies first&rsquo; approach, can also catch fun errors where two libraries don&rsquo;t agree. TinyMCE had plenty of these, thanks to the sheer number of libraries it uses.</p>\n<p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stk3R3eF\" data-ce-tag=\"paragraph\">Depending on the scale of your WYSIWYG editor, there may be a lot of libraries you need to type. Managing it all, and remembering all the changes you need to carry through, can be hard. Thankfully, TypeScript&rsquo;s tooling helps.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">2. TypeScript in-built tooling aids a transition from JS to TypeScript</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">JavaScript is distinctly lacking in good, in-built tooling. Why&rsquo;s that? Some of the very same features that make it popular, make it difficult to develop tools for JS.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Because it&rsquo;s dynamically-typed, there&rsquo;s a <em class=\"stk-reset\">lack</em> of rules that JS code should follow, and therefore a lack of rules tooling can check. A lot of JavaScript libraries and frameworks have created their own rules to work around this handicap, but they don&rsquo;t necessarily match between different libraries.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">This adds an additional layer of difficulty when developing a reliable, high quality rich text editor in JavaScript. If you&rsquo;re considering building one in JS, and want to avoid bugs and tech debt, your code may need to be quite defensive.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">By contrast, TypeScript&rsquo;s strong types opens all kinds of opportunities for better tooling &ndash; adding rules inherent to the language, plus devs can add their own rules (AKA &lsquo;types&rsquo;).</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Plus, of course, TypeScript comes with its own in-built type checking. According to a 2017 research paper &ldquo;To Type or Not to Type: Quantifying Detectable Bugs in JavaScript&ldquo;, <a class=\"stk-reset\" href=\"https://earlbarr.com/publications/typestudy.pdf\" target=\"_blank\" rel=\"noopener\">TypeScript&rsquo;s static type system alone can prevent 15% of common bugs</a>:</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-stk-css=\"stko4UIM\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-slideInRight\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\">\n<div class=\"stk-theme_44178__pad_round_1 stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Is Typescript dynamic-typed or static-typed?</strong></p>\n<p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\">Although Typescript is a superset of JavaScript, TypeScript is statically-typed &ndash; JavaScript is not, it&rsquo;s dynamically typed.</p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">But because TS transpiles &lsquo;to&rsquo; JS, it technically does &lsquo;both&rsquo;.</p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">It&rsquo;s the combination of TS's static typing being <em class=\"stk-reset\">optional</em> (thanks to \"any\") and JS being dynamic, that allows you to do gradual typing. If TS wasn't optional, gradual typing wouldn't be possible.</p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">Here&rsquo;s a great article on the topic <a class=\"stk-reset\" href=\"https://www.scaler.com/topics/typescript/static-typing-vs-dynamic-typing/\" target=\"_blank\" rel=\"noopener\">Static Typing vs Dynamic Typing</a></p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_15 stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628517294418 stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">In this paper, we evaluated the code quality benefits that static type systems provide to JavaScript codebases. The results are encouraging; we found that using Flow or TypeScript could have prevented 15% of the public bugs for public projects on GitHub.</strong></p>\n</div>\n</div>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Beyond TypeScript itself, other organisations have created or extended tooling to work with TypeScript.</p>\n<ul class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">The popular JavaScript linting tool</strong> <a class=\"stk-reset\" href=\"https://typescript-eslint.io/\" target=\"_blank\" rel=\"noopener\"><strong class=\"stk-reset\">ESLint, has a TypeScript variant</strong></a><strong class=\"stk-reset\">.</strong></li>\n</ul>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">&rarr;&nbsp;</strong>And typescript-eslint isn&rsquo;t just ESLint made to work with TypeScript &ndash; it taps into the TypeScript type system in order to offer <em class=\"stk-reset\">additional</em> linting functionality to help make your code extra clean and safe.</p>\n<ul class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">Another category of TypeScript tools is IDE integrations.</strong></li>\n</ul>\n<p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">&rarr;&nbsp;</strong>For example, <a class=\"stk-reset\" href=\"https://code.visualstudio.com/docs/languages/typescript\" target=\"_blank\" rel=\"noopener\">Visual Studio Code&rsquo;s integration with TypeScript</a> adds a whole host of functionality, such as:</p>\n<ul class=\"stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Code completion</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Type information on hover</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Errors and warnings in the IDE</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Code navigation and formatting shortcuts</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Refactoring and debugging assistance</li>\n</ul>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Typescript tooling not only helps developers avoid mistakes &ndash; it helps them code faster.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Due to its complexity, refactoring anything in TinyMCE is full of hurdles &ndash; both seen and unseen. Historically, it&rsquo;s proven itself to be <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/pull/5736\" target=\"_blank\" rel=\"noopener\">difficult</a>, <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/pull/6894\" target=\"_blank\" rel=\"noopener\">wide-scale</a>, and/or <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/pull/8272\" target=\"_blank\" rel=\"noopener\">dangerous</a>. But switching to TypeScript with its IDE refactoring and linting tools significantly reduced the work and risk of bad refactorings.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">But all those TypeScript benefits are reliant on all your code being typed.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last valign-middle\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-stk-css=\"stkE3TKA\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-slideInRight\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\">\n<div class=\"stk-theme_44178__pad_round_1 stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">What is defensive coding?</strong></p>\n<p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\">Red Hat has a <a class=\"stk-reset\" href=\"https://developers.redhat.com/articles/defensive-coding-guide\" target=\"_blank\" rel=\"noopener\">great Defensive Coding Guide</a></p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">It provides guidelines for improving software security through secure coding and gives you concrete recommendations.</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-grid stk-theme_44178__mb_15\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">3. TypeScript types increase code readability</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Types aren&rsquo;t just helpful to the computer &ndash; their usefulness goes way beyond simply defining individual variables as numbers or strings.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">There&rsquo;s an extensive type system within TypeScript, which you can use to represent almost anything &ndash; from function signatures to library APIs. But why bother putting the time into typing anything more complex than variables and functions?</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Types increase readability, which in turn increases development velocity and code quality.</strong></p>\n<h3 class=\"stk-theme_44178__mb_05 stk-reset stk-theme_44178__style_medium_header\" data-ce-tag=\"paragraph\">a. Use types to define your functions and variables</h3>\n<p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">What do you think this function does?</p>\n<figure class=\"stk-reset stk-embed_rendered\" data-ce-tag=\"embed\">\n<pre class=\"hljs\" style=\"display: block; overflow-x: auto; background: #002451; color: #ffffff; padding: 0.5em;\"><span class=\"hljs-function\"><span class=\"hljs-keyword\" style=\"color: #ebbbff;\">function</span></span> <span class=\"hljs-built_in\" style=\"color: #ffc58f;\">size</span>(a, b)\n</pre>\n<figcaption class=\"stk-reset stk-description\" data-ce-tag=\"description\"></figcaption>\n</figure>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">The likely assumption is that a and b are numbers, and the function does some calculation and returns a number.</p>\n<p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">What if it was written like this instead?</p>\n<figure class=\"stk-reset stk-embed_rendered\" data-ce-tag=\"embed\">\n<pre class=\"hljs\" style=\"display: block; overflow-x: auto; background: #002451; color: #ffffff; padding: 0.5em;\"><span class=\"hljs-function\"><span class=\"hljs-keyword\" style=\"color: #ebbbff;\">function</span></span> <span class=\"hljs-built_in\" style=\"color: #ffc58f;\">size</span>(a: <span class=\"hljs-keyword\" style=\"color: #ebbbff;\">number</span>, b: <span class=\"hljs-keyword\" style=\"color: #ebbbff;\">number</span>): string</pre>\n<figcaption class=\"stk-reset stk-description\" data-ce-tag=\"description\"></figcaption>\n</figure>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">It returns a string. Or maybe it does a calculation, then converts the result to a string? Or does it do something completely different? The question can&rsquo;t be answered from just the types &ndash; but you now know you need to look deeper.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Being able to make better assumptions about a function, at a glance, can be a vital step towards avoiding technical debt. </strong></p>\n<p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">It&rsquo;s so easy for tech debt to slip into a complicated piece of code, all because it was misread or misunderstood. By taking active steps to increase the readability of code, you decrease:</p>\n<ul class=\"stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Time to understand it</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Time to fix it</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Time to improve it</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Risk of bugs happening</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Risk of tech debt being accidentally introduced.</li>\n</ul>\n<p class=\"stk-reset stk-theme_44178__mb_15\" data-ce-tag=\"paragraph\">And this goes far beyond just functions.</p>\n<h3 class=\"stk-theme_44178__mb_05 stk-reset stk-theme_44178__style_medium_header\" data-ce-tag=\"paragraph\">b. Use types to clarify concepts as interfaces</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Rich text editors rely on dozens of domain concepts: DOM ranges, HTML structures, and formatting models. When you&rsquo;re a specialist developer working on a rich text editor, It&rsquo;s impossible to remember how each concept works. And trying to keep external documentation in sync with code changes is always a nightmare.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">The quickest way to clarify concepts is to use TypeScript interfaces. </strong></p>\n<p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">For example, this is <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/blob/develop/modules/tinymce/src/core/main/ts/api/Shortcuts.ts#L47\" target=\"_blank\" rel=\"noopener\">TinyMCE&rsquo;s concept of a keyboard shortcut represented as a TypeScript interface</a>:</p>\n<figure class=\"stk-reset stk-embed_rendered\" data-ce-tag=\"embed\">\n<pre class=\"hljs\" style=\"display: block; overflow-x: auto; background: #002451; color: #ffffff; padding: 0.5em;\"><span class=\"hljs-selector-tag\" style=\"color: #ebbbff;\">interface</span> <span class=\"hljs-selector-tag\" style=\"color: #ebbbff;\">Shortcut</span> {\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">id</span>: string;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">access</span>: boolean;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">ctrl</span>: boolean;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">shift</span>: boolean;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">meta</span>: boolean;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">alt</span>: boolean;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">keyCode</span>: number;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">charCode</span>: number;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">subpatterns</span>: Shortcut[];\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">desc</span>: string;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">func</span>: () =&gt; void;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">scope</span>: any;\n}</pre>\n<figcaption class=\"stk-reset stk-description\" data-ce-tag=\"description\"></figcaption>\n</figure>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Our developers no longer need to remember what a keyboard shortcut requires &ndash; it&rsquo;s right there for them. And because every keyboard shortcut implemented in TinyMCE is typed using this interface, TypeScript&rsquo;s type checking ensures any new or changed shortcuts don&rsquo;t have errors. This also helps to prevent bugs or tech debt that could have arisen due to a shortcut being incorrectly defined.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Of course though, interfaces can be <em class=\"stk-reset\">a lot</em> bigger than this little example.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"valign-middle stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-theme_44178__mb_2 stk-grid\" data-stk-css=\"stkkn77i\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-slideInRight\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid stk-theme_44178__mb_0\" data-stk-css=\"stkvE7T3\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-stk-css=\"stklovHI\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628517714937 stk-reset stk-theme_44178__color_44178_custom_color_4\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">FURTHER INSIGHTS</strong></p>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_05 stk-grid\" data-ce-tag=\"grid\" data-stk-css=\"stk9cBCY\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-stk-css=\"stk92B4-\" data-ce-tag=\"grid-col\">&nbsp;</div>\n</div>\n<p class=\"stk-theme_44178__style_font_style-1628517714937 stk-reset\" data-stk-css=\"stkGKxb8\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"https://www.tiny.cloud/technical-debt-whitepaper\" target=\"_blank\" rel=\"noopener\">Download and read Technical Debt in Rich Text Editors White Paper &rarr;</a></p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_15 stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h3 class=\"stk-theme_44178__mb_05 stk-reset stk-theme_44178__style_medium_header\" data-ce-tag=\"paragraph\">c. Use types to clarify your module boundaries</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">TinyMCE is a very modular product, composed of hundreds of distinct pieces &ndash; libraries, modules, plugins, and more. And one of the key principles of TinyMCE development is that each of those pieces must have a single entry point: an API that defines what functionality other pieces of the code base can access.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">The <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/tree/develop/modules/tinymce/src/core/main/ts/api\" target=\"_blank\" rel=\"noopener\">API for TinyMCE&rsquo;s Core editor</a> spans <em class=\"stk-reset\">dozens </em>of files, full of interfaces defining how each part of the engine works. And those interfaces form the backbone of every part of TinyMCE that builds on top of the engine &ndash; they ensure every other piece maintains the same concepts and principles as the core.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Defined APIs prevent misunderstandings and conflicts across libraries &ndash; </strong><strong class=\"stk-reset\">particularly</strong><strong class=\"stk-reset\"> the kinds of problems that could result in tech debt cascading through the editor.</strong></p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">It isn&rsquo;t the perfect solution. How an API functions could be changed without the API&rsquo;s type definition changing. But it&rsquo;s another layer of assurance than what&rsquo;s provided by using JavaScript, and sometimes that can make all the difference.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"4\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_2 stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">4. TypeScript helps to future-proof against tech debt</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Gradual typing is an ideal approach for managing the time invested in your TypeScript conversion. However, it&rsquo;s all too easy to do the initial conversion, then leave further improvements&hellip; for quite a while.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">After all, you&rsquo;ve started using TypeScript. You&rsquo;re getting <em class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">some</em> of the benefits. Is it really worth the time and effort to add <em class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">more</em> types?</p>\n<p class=\"stk-reset stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\">Think of it this way:</p>\n<p class=\"stk-reset stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_4 stk-theme_44178__style_font_style-1628517294418\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">The more types you add to your code base, the more benefits gained from TypeScript. The more benefits gained, the more in-built protection from tech debt.</strong></p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">If you&rsquo;re stuck trying to prioritise the improvement of certain parts of code, use your <a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/tag/roadmap\" target=\"_blank\" rel=\"noopener\">product roadmap</a> as a guide. Type improvements can be planned into projects, or sections of the code base can be typed ahead of a new project &ndash; to get maximum benefits for minimum work.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">The goal of typing is to find existing tech debt &ndash; shore up your foundation &ndash; and help prevent any new technical debt. So any kind of ongoing investment in paying down tech debt has a long term payoff, and converting to TypeScript has certainly helped curtail TinyMCE&rsquo;s debt burden.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"4\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_2 stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h2 id=\"stk-3\" class=\"stk-theme_44178__style_large_header stk-reset\" data-ce-tag=\"paragraph\">TypeScript&rsquo;s great, but WYSIWYG editors are best left to experts</h2>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Yes, TypeScript endows your code with a multitude of benefits, particularly if you&rsquo;re developing a rich text editor from scratch. But ask yourself, why take that on, when <em class=\"stk-reset\">the experts</em> struggle with WYSIWYG maintenance and tech debt burdens?</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Repeat these three statements: <a class=\"stk-reset\" href=\"https://www.tiny.cloud/buy-vs-build-whitepaper/\" target=\"_blank\" rel=\"noopener\" data-gtm-vis-has-fired-10171822_255=\"1\">Rich text editors are complex</a>. <a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/cost-of-building-rich-text-editor/\" target=\"_blank\" rel=\"noopener\" data-gtm-vis-has-fired-10171822_255=\"1\">Rich text editors are expensive</a>. <a class=\"stk-reset\" href=\"https://www.tiny.cloud/developer-survey-results/\" target=\"_blank\" rel=\"noopener\" data-gtm-vis-has-fired-10171822_255=\"1\">Rich text editors accumulate technical debt</a>.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">While gradual typing solves some issues, it doesn't absolve you of the ongoing investment.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">If you need a TypeScript rich text editor, use an open source <a class=\"stk-reset\" href=\"https://www.tiny.cloud/\" target=\"_blank\" rel=\"noopener\">WYSIWYG like TinyMCE</a>. It has components your dev team can use as a framework for customization and <a class=\"stk-reset\" href=\"https://unpkg.com/tinymce@6/tinymce.d.ts\" target=\"_blank\" rel=\"noopener\">a public TypeScript declaration file</a> for integration with a TypeScript app &ndash; and it&rsquo;s supported by our professional dev team and advanced features. You&rsquo;ll get the best of both worlds.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Because technical debt is always unfinished business.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"4\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-layout__overhangs_both stk-theme_44178__mb_0 stk-grid\" data-stk-css=\"stkqbmi2\" data-ce-tag=\"grid\">\n<div class=\"stk-theme_44178__pad_ver_2 stk-grid-col stk-grid-col_last\" data-col-width=\"12\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<p class=\"align-center stk-theme_44178__style_font_style-1652351628236 stk-reset stk-theme_44178__color_44178_custom_color_3\" data-ce-tag=\"paragraph\">Download the white paper</p>\n<p class=\"stk-theme_44178__style_font_style-1628585803915 align-center stk-reset stk-theme_44178__color_44178_custom_color_1\" data-ce-tag=\"paragraph\">Opportunity Cost of Technical Debt: Minimize Your Rich Text Editor Development</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<figure class=\"stk-reset stk-embed_rendered\" data-ce-tag=\"embed\"><code class=\"stk-code\"><iframe style=\"border: 0px;\" src=\"https://www2.ephox.com/l/2202/2022-09-29/d9d458\" width=\"100%\" height=\"500\" frameborder=\"0\" data-mce-fragment=\"1\"></iframe></code>\n<figcaption class=\"stk-reset stk-description\" data-ce-tag=\"description\"></figcaption>\n</figure>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-layout__overhangs_both stk-grid\" data-stk-css=\"stkPpP_E\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last stk-theme_44178__pad_ver_3\" data-col-width=\"12\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"valign-middle stk-grid-col stk-grid-col_last stk-theme_44178__pad_round_1-m\" data-col-width=\"6\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_3 stk-reset\" data-ce-tag=\"paragraph\">author</p>\n<h4 class=\"stk-theme_44178__style_small_header stk-theme_44178__color_44178_custom_color_0 stk-theme_44178__mb_0 stk-reset\" data-ce-tag=\"paragraph\">Millie Macdonald</h4>\n<p class=\"stk-theme_44178__style_font_style-1628517714937 stk-theme_44178__color_44178_custom_color_2 stk-reset\" data-ce-tag=\"paragraph\">Product Manager at Halo Connect</p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__color_44178_custom_color_0 stk-reset\" data-ce-tag=\"paragraph\">Millie is a Product Manager at Halo Connect who dabbles in writing. Previously, she worked at Tiny as a Product Owner, dev, and QA engineer. She loves learning above all else, whether it's about people, tech, or leadership.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n</div>\n</div>","childMarkdownRemark":{"html":"<div class=\"stk-grid stk-theme_44178__mb_2\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-ce-tag=\"grid-col\" data-stk-css=\"\" data-stk-css-m=\"\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col valign-middle stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-stk-css=\"stkCpDkq\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-slideInRight\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\">\n<div class=\"stk-theme_44178__pad_round_1 stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">What is Functional Debt?</strong></p>\n<p class=\"stk-theme_44178__style_small_text stk-reset\" data-ce-tag=\"paragraph\">Wondering where functional debt fits into the technical debt puzzle? Find out more by reading <a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog//technical-vs-functional-debt/\" target=\"_blank\" rel=\"noopener\">Functional debt vs Technical debt: What's the difference in a rich text editor?</a></p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-grid stk-theme_44178__mb_2\" data-stk-css=\"stk5B9SR\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-jackInTheBox\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\" data-ce-tag=\"grid\">\n<div class=\"stk-theme_44178__pad_ver_2 stk-grid-col stk-grid-col_last\" data-col-width=\"12\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628585803915 align-center stk-reset\" data-stk-css=\"stkdNg1j\" data-ce-tag=\"paragraph\">Get more insights in our<br />Technical Debt White Paper</p>\n<a class=\"stk-theme_44178__stk-btn_1628586253530 stk-theme_44178__style_font_style-1628586133109 align-center stk-reset\" href=\"https://www.tiny.cloud/technical-debt-whitepaper\" target=\"_blank\" rel=\"noopener\" data-stk-button=\"1\" data-ce-tag=\"button\">READ THE WHITE PAPER</a></div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h2 id=\"stk-2\" class=\"stk-theme_44178__style_large_header stk-reset\" data-ce-tag=\"paragraph\">Benefits of switching to TypeScript for WYSIWYG tech debt</h2>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Using TypeScript has plenty of benefits &ndash; no matter what stage of development you begin using it. However, there are extra benefits from <em class=\"stk-reset\">switching</em> <em class=\"stk-reset\">to</em> TypeScript, like TinyMCE did, and some of those are especially favourable to rich text editors.</p>\n<h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">1. Porting catches old tech debt</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Two bonuses from porting TinyMCE&rsquo;s JavaScript to TypeScript &ndash; compared to starting fresh with TypeScript &ndash; were:</p>\n<h4 class=\"stk-theme_44178__style_small_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">a. Porting the codebase forces reviews of old code</h4>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">To add types to an existing code base, a developer has to work through the code to figure out what types should be used. Some of that process can be automated, but the results should still be manually checked.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">It&rsquo;s time-consuming, and sometimes hard to justify scheduling the manual review work when there are features to be developed. But it's <em class=\"stk-reset\">so</em> worthwhile.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">If your codebase is anywhere near as large, complex and old as TinyMCE, peering into the untouched corners can unearth all kinds of interesting things. <a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/rte-code-half-life/\" target=\"_blank\" rel=\"noopener\">Bugs, cruft, tech debt, old to-dos</a> &ndash; you name it, you&rsquo;ll probably find it.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">For example, <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/pull/7083#discussion_r684619815\" target=\"_blank\" rel=\"noopener\">typing TinyMCE&rsquo;s Image plugin</a> found a potential <em class=\"stk-reset\">memory leak</em>.</p>\n<h4 class=\"stk-theme_44178__style_small_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">b. Reviewing code can prompt discussions</h4>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Converting TinyMCE to TypeScript also prompted discussions amongst our engineering team &ndash; on everything from individual variables to entire editor concepts.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">A <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/pull/7925\" target=\"_blank\" rel=\"noopener\">pull request that was made &ndash; for improving some types in TinyMCE&rsquo;s core engine</a> &ndash; is a great example. It had <em class=\"stk-reset\">forty-two</em> comments from multiple developers discussing the changes. It also prompted further changes, including the addition of test cases and some minor changes to functionality.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"4\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-grid\" data-ce-tag=\"grid\" data-stk-css=\"stkkZM_3\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\" data-stk-css-m=\"\" data-stk-css=\"\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last stk-theme_44178__pad_ver_1\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset stk-theme_44178__mb_05 stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__color_44178_custom_color_4\" data-stk-css=\"stkmTz6v\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">EXPERT TIP</strong></p>\n<h4 class=\"stk-theme_44178__style_small_header stk-reset\" data-ce-tag=\"paragraph\" data-stk-css=\"stkitN7O\"><strong class=\"stk-reset\">Type key dependencies first</strong></h4>\n<p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stkfO8Fi\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">If your codebase has more than one library, type key dependencies first.</strong></p>\n<p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stkR2np-\" data-ce-tag=\"paragraph\">It&rsquo;s more efficient to type your lowest-level libraries first &ndash; the ones that are the foundation of your application. Then work your way up, carrying changes from previously-typed libraries up to the higher-level libraries.</p>\n<p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stk78XJT\" data-ce-tag=\"paragraph\">If you type libraries in the wrong order, it can result in double handling the higher-level libraries. As an example, <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/pull/6073\" target=\"_blank\" rel=\"noopener\">this pull request</a> fixed some incorrect types in one part of TinyMCE&rsquo;s API &ndash; which resulted in the need to change <em class=\"stk-reset\">fifty-two</em> other files across various modules.</p>\n<p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stk_m4Av\" data-ce-tag=\"paragraph\">This &lsquo;key dependencies first&rsquo; approach, can also catch fun errors where two libraries don&rsquo;t agree. TinyMCE had plenty of these, thanks to the sheer number of libraries it uses.</p>\n<p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stk3R3eF\" data-ce-tag=\"paragraph\">Depending on the scale of your WYSIWYG editor, there may be a lot of libraries you need to type. Managing it all, and remembering all the changes you need to carry through, can be hard. Thankfully, TypeScript&rsquo;s tooling helps.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">2. TypeScript in-built tooling aids a transition from JS to TypeScript</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">JavaScript is distinctly lacking in good, in-built tooling. Why&rsquo;s that? Some of the very same features that make it popular, make it difficult to develop tools for JS.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Because it&rsquo;s dynamically-typed, there&rsquo;s a <em class=\"stk-reset\">lack</em> of rules that JS code should follow, and therefore a lack of rules tooling can check. A lot of JavaScript libraries and frameworks have created their own rules to work around this handicap, but they don&rsquo;t necessarily match between different libraries.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">This adds an additional layer of difficulty when developing a reliable, high quality rich text editor in JavaScript. If you&rsquo;re considering building one in JS, and want to avoid bugs and tech debt, your code may need to be quite defensive.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">By contrast, TypeScript&rsquo;s strong types opens all kinds of opportunities for better tooling &ndash; adding rules inherent to the language, plus devs can add their own rules (AKA &lsquo;types&rsquo;).</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Plus, of course, TypeScript comes with its own in-built type checking. According to a 2017 research paper &ldquo;To Type or Not to Type: Quantifying Detectable Bugs in JavaScript&ldquo;, <a class=\"stk-reset\" href=\"https://earlbarr.com/publications/typestudy.pdf\" target=\"_blank\" rel=\"noopener\">TypeScript&rsquo;s static type system alone can prevent 15% of common bugs</a>:</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-stk-css=\"stko4UIM\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-slideInRight\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\">\n<div class=\"stk-theme_44178__pad_round_1 stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Is Typescript dynamic-typed or static-typed?</strong></p>\n<p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\">Although Typescript is a superset of JavaScript, TypeScript is statically-typed &ndash; JavaScript is not, it&rsquo;s dynamically typed.</p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">But because TS transpiles &lsquo;to&rsquo; JS, it technically does &lsquo;both&rsquo;.</p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">It&rsquo;s the combination of TS's static typing being <em class=\"stk-reset\">optional</em> (thanks to \"any\") and JS being dynamic, that allows you to do gradual typing. If TS wasn't optional, gradual typing wouldn't be possible.</p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">Here&rsquo;s a great article on the topic <a class=\"stk-reset\" href=\"https://www.scaler.com/topics/typescript/static-typing-vs-dynamic-typing/\" target=\"_blank\" rel=\"noopener\">Static Typing vs Dynamic Typing</a></p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_15 stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628517294418 stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">In this paper, we evaluated the code quality benefits that static type systems provide to JavaScript codebases. The results are encouraging; we found that using Flow or TypeScript could have prevented 15% of the public bugs for public projects on GitHub.</strong></p>\n</div>\n</div>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Beyond TypeScript itself, other organisations have created or extended tooling to work with TypeScript.</p>\n<ul class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">The popular JavaScript linting tool</strong> <a class=\"stk-reset\" href=\"https://typescript-eslint.io/\" target=\"_blank\" rel=\"noopener\"><strong class=\"stk-reset\">ESLint, has a TypeScript variant</strong></a><strong class=\"stk-reset\">.</strong></li>\n</ul>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">&rarr;&nbsp;</strong>And typescript-eslint isn&rsquo;t just ESLint made to work with TypeScript &ndash; it taps into the TypeScript type system in order to offer <em class=\"stk-reset\">additional</em> linting functionality to help make your code extra clean and safe.</p>\n<ul class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">Another category of TypeScript tools is IDE integrations.</strong></li>\n</ul>\n<p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">&rarr;&nbsp;</strong>For example, <a class=\"stk-reset\" href=\"https://code.visualstudio.com/docs/languages/typescript\" target=\"_blank\" rel=\"noopener\">Visual Studio Code&rsquo;s integration with TypeScript</a> adds a whole host of functionality, such as:</p>\n<ul class=\"stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Code completion</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Type information on hover</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Errors and warnings in the IDE</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Code navigation and formatting shortcuts</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Refactoring and debugging assistance</li>\n</ul>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Typescript tooling not only helps developers avoid mistakes &ndash; it helps them code faster.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Due to its complexity, refactoring anything in TinyMCE is full of hurdles &ndash; both seen and unseen. Historically, it&rsquo;s proven itself to be <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/pull/5736\" target=\"_blank\" rel=\"noopener\">difficult</a>, <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/pull/6894\" target=\"_blank\" rel=\"noopener\">wide-scale</a>, and/or <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/pull/8272\" target=\"_blank\" rel=\"noopener\">dangerous</a>. But switching to TypeScript with its IDE refactoring and linting tools significantly reduced the work and risk of bad refactorings.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">But all those TypeScript benefits are reliant on all your code being typed.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last valign-middle\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-stk-css=\"stkE3TKA\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-slideInRight\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\">\n<div class=\"stk-theme_44178__pad_round_1 stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<p class=\"stk-reset stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">What is defensive coding?</strong></p>\n<p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\">Red Hat has a <a class=\"stk-reset\" href=\"https://developers.redhat.com/articles/defensive-coding-guide\" target=\"_blank\" rel=\"noopener\">great Defensive Coding Guide</a></p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">It provides guidelines for improving software security through secure coding and gives you concrete recommendations.</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-grid stk-theme_44178__mb_15\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">3. TypeScript types increase code readability</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Types aren&rsquo;t just helpful to the computer &ndash; their usefulness goes way beyond simply defining individual variables as numbers or strings.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">There&rsquo;s an extensive type system within TypeScript, which you can use to represent almost anything &ndash; from function signatures to library APIs. But why bother putting the time into typing anything more complex than variables and functions?</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Types increase readability, which in turn increases development velocity and code quality.</strong></p>\n<h3 class=\"stk-theme_44178__mb_05 stk-reset stk-theme_44178__style_medium_header\" data-ce-tag=\"paragraph\">a. Use types to define your functions and variables</h3>\n<p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">What do you think this function does?</p>\n<figure class=\"stk-reset stk-embed_rendered\" data-ce-tag=\"embed\">\n<pre class=\"hljs\" style=\"display: block; overflow-x: auto; background: #002451; color: #ffffff; padding: 0.5em;\"><span class=\"hljs-function\"><span class=\"hljs-keyword\" style=\"color: #ebbbff;\">function</span></span> <span class=\"hljs-built_in\" style=\"color: #ffc58f;\">size</span>(a, b)\n</pre>\n<figcaption class=\"stk-reset stk-description\" data-ce-tag=\"description\"></figcaption>\n</figure>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">The likely assumption is that a and b are numbers, and the function does some calculation and returns a number.</p>\n<p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">What if it was written like this instead?</p>\n<figure class=\"stk-reset stk-embed_rendered\" data-ce-tag=\"embed\">\n<pre class=\"hljs\" style=\"display: block; overflow-x: auto; background: #002451; color: #ffffff; padding: 0.5em;\"><span class=\"hljs-function\"><span class=\"hljs-keyword\" style=\"color: #ebbbff;\">function</span></span> <span class=\"hljs-built_in\" style=\"color: #ffc58f;\">size</span>(a: <span class=\"hljs-keyword\" style=\"color: #ebbbff;\">number</span>, b: <span class=\"hljs-keyword\" style=\"color: #ebbbff;\">number</span>): string</pre>\n<figcaption class=\"stk-reset stk-description\" data-ce-tag=\"description\"></figcaption>\n</figure>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">It returns a string. Or maybe it does a calculation, then converts the result to a string? Or does it do something completely different? The question can&rsquo;t be answered from just the types &ndash; but you now know you need to look deeper.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Being able to make better assumptions about a function, at a glance, can be a vital step towards avoiding technical debt. </strong></p>\n<p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">It&rsquo;s so easy for tech debt to slip into a complicated piece of code, all because it was misread or misunderstood. By taking active steps to increase the readability of code, you decrease:</p>\n<ul class=\"stk-reset\" data-ce-tag=\"list\">\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Time to understand it</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Time to fix it</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Time to improve it</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Risk of bugs happening</li>\n<li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Risk of tech debt being accidentally introduced.</li>\n</ul>\n<p class=\"stk-reset stk-theme_44178__mb_15\" data-ce-tag=\"paragraph\">And this goes far beyond just functions.</p>\n<h3 class=\"stk-theme_44178__mb_05 stk-reset stk-theme_44178__style_medium_header\" data-ce-tag=\"paragraph\">b. Use types to clarify concepts as interfaces</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Rich text editors rely on dozens of domain concepts: DOM ranges, HTML structures, and formatting models. When you&rsquo;re a specialist developer working on a rich text editor, It&rsquo;s impossible to remember how each concept works. And trying to keep external documentation in sync with code changes is always a nightmare.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">The quickest way to clarify concepts is to use TypeScript interfaces. </strong></p>\n<p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">For example, this is <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/blob/develop/modules/tinymce/src/core/main/ts/api/Shortcuts.ts#L47\" target=\"_blank\" rel=\"noopener\">TinyMCE&rsquo;s concept of a keyboard shortcut represented as a TypeScript interface</a>:</p>\n<figure class=\"stk-reset stk-embed_rendered\" data-ce-tag=\"embed\">\n<pre class=\"hljs\" style=\"display: block; overflow-x: auto; background: #002451; color: #ffffff; padding: 0.5em;\"><span class=\"hljs-selector-tag\" style=\"color: #ebbbff;\">interface</span> <span class=\"hljs-selector-tag\" style=\"color: #ebbbff;\">Shortcut</span> {\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">id</span>: string;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">access</span>: boolean;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">ctrl</span>: boolean;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">shift</span>: boolean;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">meta</span>: boolean;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">alt</span>: boolean;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">keyCode</span>: number;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">charCode</span>: number;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">subpatterns</span>: Shortcut[];\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">desc</span>: string;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">func</span>: () =&gt; void;\n  <span class=\"hljs-attribute\" style=\"color: #ffeead;\">scope</span>: any;\n}</pre>\n<figcaption class=\"stk-reset stk-description\" data-ce-tag=\"description\"></figcaption>\n</figure>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Our developers no longer need to remember what a keyboard shortcut requires &ndash; it&rsquo;s right there for them. And because every keyboard shortcut implemented in TinyMCE is typed using this interface, TypeScript&rsquo;s type checking ensures any new or changed shortcuts don&rsquo;t have errors. This also helps to prevent bugs or tech debt that could have arisen due to a shortcut being incorrectly defined.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Of course though, interfaces can be <em class=\"stk-reset\">a lot</em> bigger than this little example.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"valign-middle stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-theme_44178__mb_2 stk-grid\" data-stk-css=\"stkkn77i\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-slideInRight\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid stk-theme_44178__mb_0\" data-stk-css=\"stkvE7T3\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-stk-css=\"stklovHI\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628517714937 stk-reset stk-theme_44178__color_44178_custom_color_4\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">FURTHER INSIGHTS</strong></p>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_05 stk-grid\" data-ce-tag=\"grid\" data-stk-css=\"stk9cBCY\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"3\" data-stk-css=\"stk92B4-\" data-ce-tag=\"grid-col\">&nbsp;</div>\n</div>\n<p class=\"stk-theme_44178__style_font_style-1628517714937 stk-reset\" data-stk-css=\"stkGKxb8\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"https://www.tiny.cloud/technical-debt-whitepaper\" target=\"_blank\" rel=\"noopener\">Download and read Technical Debt in Rich Text Editors White Paper &rarr;</a></p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_15 stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h3 class=\"stk-theme_44178__mb_05 stk-reset stk-theme_44178__style_medium_header\" data-ce-tag=\"paragraph\">c. Use types to clarify your module boundaries</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">TinyMCE is a very modular product, composed of hundreds of distinct pieces &ndash; libraries, modules, plugins, and more. And one of the key principles of TinyMCE development is that each of those pieces must have a single entry point: an API that defines what functionality other pieces of the code base can access.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">The <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/tree/develop/modules/tinymce/src/core/main/ts/api\" target=\"_blank\" rel=\"noopener\">API for TinyMCE&rsquo;s Core editor</a> spans <em class=\"stk-reset\">dozens </em>of files, full of interfaces defining how each part of the engine works. And those interfaces form the backbone of every part of TinyMCE that builds on top of the engine &ndash; they ensure every other piece maintains the same concepts and principles as the core.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Defined APIs prevent misunderstandings and conflicts across libraries &ndash; </strong><strong class=\"stk-reset\">particularly</strong><strong class=\"stk-reset\"> the kinds of problems that could result in tech debt cascading through the editor.</strong></p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">It isn&rsquo;t the perfect solution. How an API functions could be changed without the API&rsquo;s type definition changing. But it&rsquo;s another layer of assurance than what&rsquo;s provided by using JavaScript, and sometimes that can make all the difference.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"4\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_2 stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">4. TypeScript helps to future-proof against tech debt</h3>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Gradual typing is an ideal approach for managing the time invested in your TypeScript conversion. However, it&rsquo;s all too easy to do the initial conversion, then leave further improvements&hellip; for quite a while.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">After all, you&rsquo;ve started using TypeScript. You&rsquo;re getting <em class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">some</em> of the benefits. Is it really worth the time and effort to add <em class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">more</em> types?</p>\n<p class=\"stk-reset stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\">Think of it this way:</p>\n<p class=\"stk-reset stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_4 stk-theme_44178__style_font_style-1628517294418\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">The more types you add to your code base, the more benefits gained from TypeScript. The more benefits gained, the more in-built protection from tech debt.</strong></p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">If you&rsquo;re stuck trying to prioritise the improvement of certain parts of code, use your <a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/tag/roadmap\" target=\"_blank\" rel=\"noopener\">product roadmap</a> as a guide. Type improvements can be planned into projects, or sections of the code base can be typed ahead of a new project &ndash; to get maximum benefits for minimum work.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">The goal of typing is to find existing tech debt &ndash; shore up your foundation &ndash; and help prevent any new technical debt. So any kind of ongoing investment in paying down tech debt has a long term payoff, and converting to TypeScript has certainly helped curtail TinyMCE&rsquo;s debt burden.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"4\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-theme_44178__mb_2 stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<h2 id=\"stk-3\" class=\"stk-theme_44178__style_large_header stk-reset\" data-ce-tag=\"paragraph\">TypeScript&rsquo;s great, but WYSIWYG editors are best left to experts</h2>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Yes, TypeScript endows your code with a multitude of benefits, particularly if you&rsquo;re developing a rich text editor from scratch. But ask yourself, why take that on, when <em class=\"stk-reset\">the experts</em> struggle with WYSIWYG maintenance and tech debt burdens?</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Repeat these three statements: <a class=\"stk-reset\" href=\"https://www.tiny.cloud/buy-vs-build-whitepaper/\" target=\"_blank\" rel=\"noopener\" data-gtm-vis-has-fired-10171822_255=\"1\">Rich text editors are complex</a>. <a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/cost-of-building-rich-text-editor/\" target=\"_blank\" rel=\"noopener\" data-gtm-vis-has-fired-10171822_255=\"1\">Rich text editors are expensive</a>. <a class=\"stk-reset\" href=\"https://www.tiny.cloud/developer-survey-results/\" target=\"_blank\" rel=\"noopener\" data-gtm-vis-has-fired-10171822_255=\"1\">Rich text editors accumulate technical debt</a>.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">While gradual typing solves some issues, it doesn't absolve you of the ongoing investment.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">If you need a TypeScript rich text editor, use an open source <a class=\"stk-reset\" href=\"https://www.tiny.cloud/\" target=\"_blank\" rel=\"noopener\">WYSIWYG like TinyMCE</a>. It has components your dev team can use as a framework for customization and <a class=\"stk-reset\" href=\"https://unpkg.com/tinymce@6/tinymce.d.ts\" target=\"_blank\" rel=\"noopener\">a public TypeScript declaration file</a> for integration with a TypeScript app &ndash; and it&rsquo;s supported by our professional dev team and advanced features. You&rsquo;ll get the best of both worlds.</p>\n<p class=\"stk-reset\" data-ce-tag=\"paragraph\">Because technical debt is always unfinished business.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"4\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-layout__overhangs_both stk-theme_44178__mb_0 stk-grid\" data-stk-css=\"stkqbmi2\" data-ce-tag=\"grid\">\n<div class=\"stk-theme_44178__pad_ver_2 stk-grid-col stk-grid-col_last\" data-col-width=\"12\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<p class=\"align-center stk-theme_44178__style_font_style-1652351628236 stk-reset stk-theme_44178__color_44178_custom_color_3\" data-ce-tag=\"paragraph\">Download the white paper</p>\n<p class=\"stk-theme_44178__style_font_style-1628585803915 align-center stk-reset stk-theme_44178__color_44178_custom_color_1\" data-ce-tag=\"paragraph\">Opportunity Cost of Technical Debt: Minimize Your Rich Text Editor Development</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_last\" data-col-width=\"8\" data-ce-tag=\"grid-col\">\n<figure class=\"stk-reset stk-embed_rendered\" data-ce-tag=\"embed\"><code class=\"stk-code\"><iframe style=\"border: 0px;\" src=\"https://www2.ephox.com/l/2202/2022-09-29/d9d458\" width=\"100%\" height=\"500\" frameborder=\"0\" data-mce-fragment=\"1\"></iframe></code>\n<figcaption class=\"stk-reset stk-description\" data-ce-tag=\"description\"></figcaption>\n</figure>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"2\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"stk-layout__overhangs_both stk-grid\" data-stk-css=\"stkPpP_E\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_last stk-theme_44178__pad_ver_3\" data-col-width=\"12\" data-ce-tag=\"grid-col\">\n<div class=\"stk-grid\" data-ce-tag=\"grid\">\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n<div class=\"valign-middle stk-grid-col stk-grid-col_last stk-theme_44178__pad_round_1-m\" data-col-width=\"6\" data-ce-tag=\"grid-col\">\n<p class=\"stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_3 stk-reset\" data-ce-tag=\"paragraph\">author</p>\n<h4 class=\"stk-theme_44178__style_small_header stk-theme_44178__color_44178_custom_color_0 stk-theme_44178__mb_0 stk-reset\" data-ce-tag=\"paragraph\">Millie Macdonald</h4>\n<p class=\"stk-theme_44178__style_font_style-1628517714937 stk-theme_44178__color_44178_custom_color_2 stk-reset\" data-ce-tag=\"paragraph\">Product Manager at Halo Connect</p>\n<p class=\"stk-theme_44178__style_small_text stk-theme_44178__color_44178_custom_color_0 stk-reset\" data-ce-tag=\"paragraph\">Millie is a Product Manager at Halo Connect who dabbles in writing. Previously, she worked at Tiny as a Product Owner, dev, and QA engineer. She loves learning above all else, whether it's about people, tech, or leadership.</p>\n</div>\n<div class=\"stk-grid-col stk-grid-col_empty\" data-col-width=\"1\" data-ce-tag=\"grid-col\">\n<p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\">&nbsp;</p>\n</div>\n</div>\n</div>\n</div>","htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{"className":["stk-grid","stk-theme_44178__mb_2"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"1","dataCeTag":"grid-col","dataStkCss":"","dataStkCssM":""},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","valign-middle","stk-grid-col_last"],"dataColWidth":"3","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataStkCss":"stkCpDkq","dataCeTag":"grid","dataAnimM":"false","dataAnim":"true","dataAnimName":"preset-slideInRight","dataAnimTrigger":"scroll","dataAnimDuration":"1","dataAnimDelay":"0","dataAnimScrollStart":"10","dataAnimScrollFinish":"90"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__pad_round_1","stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_font_style-1628517328397","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"What is Functional Debt?"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Wondering where functional debt fits into the technical debt puzzle? Find out more by reading "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.tiny.cloud/blog//technical-vs-functional-debt/","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"Functional debt vs Technical debt: What's the difference in a rich text editor?"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid","stk-theme_44178__mb_2"],"dataStkCss":"stk5B9SR","dataAnimM":"false","dataAnim":"true","dataAnimName":"preset-jackInTheBox","dataAnimTrigger":"scroll","dataAnimDuration":"1","dataAnimDelay":"0","dataAnimScrollStart":"10","dataAnimScrollFinish":"90","dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__pad_ver_2","stk-grid-col","stk-grid-col_last"],"dataColWidth":"12","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"2","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_font_style-1628585803915","align-center","stk-reset"],"dataStkCss":"stkdNg1j","dataCeTag":"paragraph"},"children":[{"type":"text","value":"Get more insights in our"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"Technical Debt White Paper"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"a","properties":{"className":["stk-theme_44178__stk-btn_1628586253530","stk-theme_44178__style_font_style-1628586133109","align-center","stk-reset"],"href":"https://www.tiny.cloud/technical-debt-whitepaper","target":"_blank","rel":["noopener"],"dataStkButton":"1","dataCeTag":"button"},"children":[{"type":"text","value":"READ THE WHITE PAPER"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"2","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"stk-2","className":["stk-theme_44178__style_large_header","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Benefits of switching to TypeScript for WYSIWYG tech debt"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Using TypeScript has plenty of benefits – no matter what stage of development you begin using it. However, there are extra benefits from "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"switching"}]},{"type":"text","value":" "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"to"}]},{"type":"text","value":" TypeScript, like TinyMCE did, and some of those are especially favourable to rich text editors."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"className":["stk-theme_44178__style_medium_header","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"1. Porting catches old tech debt"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Two bonuses from porting TinyMCE’s JavaScript to TypeScript – compared to starting fresh with TypeScript – were:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"className":["stk-theme_44178__style_small_header","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"a. Porting the codebase forces reviews of old code"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"To add types to an existing code base, a developer has to work through the code to figure out what types should be used. Some of that process can be automated, but the results should still be manually checked."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"It’s time-consuming, and sometimes hard to justify scheduling the manual review work when there are features to be developed. But it's "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"so"}]},{"type":"text","value":" worthwhile."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"If your codebase is anywhere near as large, complex and old as TinyMCE, peering into the untouched corners can unearth all kinds of interesting things. "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.tiny.cloud/blog/rte-code-half-life/","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"Bugs, cruft, tech debt, old to-dos"}]},{"type":"text","value":" – you name it, you’ll probably find it."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"For example, "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://github.com/tinymce/tinymce/pull/7083#discussion_r684619815","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"typing TinyMCE’s Image plugin"}]},{"type":"text","value":" found a potential "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"memory leak"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"className":["stk-theme_44178__style_small_header","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"b. Reviewing code can prompt discussions"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Converting TinyMCE to TypeScript also prompted discussions amongst our engineering team – on everything from individual variables to entire editor concepts."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"A "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://github.com/tinymce/tinymce/pull/7925","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"pull request that was made – for improving some types in TinyMCE’s core engine"}]},{"type":"text","value":" – is a great example. It had "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"forty-two"}]},{"type":"text","value":" comments from multiple developers discussing the changes. It also prompted further changes, including the addition of test cases and some minor changes to functionality."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"4","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid","dataStkCss":"stkkZM_3"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"2","dataCeTag":"grid-col","dataStkCssM":"","dataStkCss":""},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last","stk-theme_44178__pad_ver_1"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset","stk-theme_44178__mb_05","stk-theme_44178__style_font_style-1628517328397","stk-theme_44178__color_44178_custom_color_4"],"dataStkCss":"stkmTz6v","dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"EXPERT TIP"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"className":["stk-theme_44178__style_small_header","stk-reset"],"dataCeTag":"paragraph","dataStkCss":"stkitN7O"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"Type key dependencies first"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_05","stk-theme_44178__color_44178_custom_color_1","stk-reset"],"dataStkCss":"stkfO8Fi","dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"If your codebase has more than one library, type key dependencies first."}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_05","stk-theme_44178__color_44178_custom_color_1","stk-reset"],"dataStkCss":"stkR2np-","dataCeTag":"paragraph"},"children":[{"type":"text","value":"It’s more efficient to type your lowest-level libraries first – the ones that are the foundation of your application. Then work your way up, carrying changes from previously-typed libraries up to the higher-level libraries."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_05","stk-theme_44178__color_44178_custom_color_1","stk-reset"],"dataStkCss":"stk78XJT","dataCeTag":"paragraph"},"children":[{"type":"text","value":"If you type libraries in the wrong order, it can result in double handling the higher-level libraries. As an example, "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://github.com/tinymce/tinymce/pull/6073","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"this pull request"}]},{"type":"text","value":" fixed some incorrect types in one part of TinyMCE’s API – which resulted in the need to change "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"fifty-two"}]},{"type":"text","value":" other files across various modules."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_05","stk-theme_44178__color_44178_custom_color_1","stk-reset"],"dataStkCss":"stk_m4Av","dataCeTag":"paragraph"},"children":[{"type":"text","value":"This ‘key dependencies first’ approach, can also catch fun errors where two libraries don’t agree. TinyMCE had plenty of these, thanks to the sheer number of libraries it uses."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_05","stk-theme_44178__color_44178_custom_color_1","stk-reset"],"dataStkCss":"stk3R3eF","dataCeTag":"paragraph"},"children":[{"type":"text","value":"Depending on the scale of your WYSIWYG editor, there may be a lot of libraries you need to type. Managing it all, and remembering all the changes you need to carry through, can be hard. Thankfully, TypeScript’s tooling helps."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"2","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"className":["stk-theme_44178__style_medium_header","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"2. TypeScript in-built tooling aids a transition from JS to TypeScript"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"JavaScript is distinctly lacking in good, in-built tooling. Why’s that? Some of the very same features that make it popular, make it difficult to develop tools for JS."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Because it’s dynamically-typed, there’s a "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"lack"}]},{"type":"text","value":" of rules that JS code should follow, and therefore a lack of rules tooling can check. A lot of JavaScript libraries and frameworks have created their own rules to work around this handicap, but they don’t necessarily match between different libraries."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"This adds an additional layer of difficulty when developing a reliable, high quality rich text editor in JavaScript. If you’re considering building one in JS, and want to avoid bugs and tech debt, your code may need to be quite defensive."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"By contrast, TypeScript’s strong types opens all kinds of opportunities for better tooling – adding rules inherent to the language, plus devs can add their own rules (AKA ‘types’)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Plus, of course, TypeScript comes with its own in-built type checking. According to a 2017 research paper “To Type or Not to Type: Quantifying Detectable Bugs in JavaScript“, "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://earlbarr.com/publications/typestudy.pdf","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"TypeScript’s static type system alone can prevent 15% of common bugs"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"1","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataStkCss":"stko4UIM","dataCeTag":"grid","dataAnimM":"false","dataAnim":"true","dataAnimName":"preset-slideInRight","dataAnimTrigger":"scroll","dataAnimDuration":"1","dataAnimDelay":"0","dataAnimScrollStart":"10","dataAnimScrollFinish":"90"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__pad_round_1","stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset","stk-theme_44178__style_font_style-1628517328397","stk-theme_44178__mb_05"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"Is Typescript dynamic-typed or static-typed?"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-reset","stk-theme_44178__mb_05"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Although Typescript is a superset of JavaScript, TypeScript is statically-typed – JavaScript is not, it’s dynamically typed."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"But because TS transpiles ‘to’ JS, it technically does ‘both’."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"It’s the combination of TS's static typing being "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"optional"}]},{"type":"text","value":" (thanks to \"any\") and JS being dynamic, that allows you to do gradual typing. If TS wasn't optional, gradual typing wouldn't be possible."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Here’s a great article on the topic "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.scaler.com/topics/typescript/static-typing-vs-dynamic-typing/","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"Static Typing vs Dynamic Typing"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__mb_15","stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_font_style-1628517294418","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"In this paper, we evaluated the code quality benefits that static type systems provide to JavaScript codebases. The results are encouraging; we found that using Flow or TypeScript could have prevented 15% of the public bugs for public projects on GitHub."}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Beyond TypeScript itself, other organisations have created or extended tooling to work with TypeScript."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{"className":["stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"list"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"The popular JavaScript linting tool"}]},{"type":"text","value":" "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://typescript-eslint.io/","target":"_blank","rel":["noopener"]},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"ESLint, has a TypeScript variant"}]}]},{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"."}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"→ "}]},{"type":"text","value":"And typescript-eslint isn’t just ESLint made to work with TypeScript – it taps into the TypeScript type system in order to offer "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"additional"}]},{"type":"text","value":" linting functionality to help make your code extra clean and safe."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{"className":["stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"list"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"Another category of TypeScript tools is IDE integrations."}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"→ "}]},{"type":"text","value":"For example, "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://code.visualstudio.com/docs/languages/typescript","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"Visual Studio Code’s integration with TypeScript"}]},{"type":"text","value":" adds a whole host of functionality, such as:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{"className":["stk-reset"],"dataCeTag":"list"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"text","value":"Code completion"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"text","value":"Type information on hover"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"text","value":"Errors and warnings in the IDE"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"text","value":"Code navigation and formatting shortcuts"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"text","value":"Refactoring and debugging assistance"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Typescript tooling not only helps developers avoid mistakes – it helps them code faster."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Due to its complexity, refactoring anything in TinyMCE is full of hurdles – both seen and unseen. Historically, it’s proven itself to be "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://github.com/tinymce/tinymce/pull/5736","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"difficult"}]},{"type":"text","value":", "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://github.com/tinymce/tinymce/pull/6894","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"wide-scale"}]},{"type":"text","value":", and/or "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://github.com/tinymce/tinymce/pull/8272","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"dangerous"}]},{"type":"text","value":". But switching to TypeScript with its IDE refactoring and linting tools significantly reduced the work and risk of bad refactorings."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"But all those TypeScript benefits are reliant on all your code being typed."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"1","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last","valign-middle"],"dataColWidth":"3","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataStkCss":"stkE3TKA","dataCeTag":"grid","dataAnimM":"false","dataAnim":"true","dataAnimName":"preset-slideInRight","dataAnimTrigger":"scroll","dataAnimDuration":"1","dataAnimDelay":"0","dataAnimScrollStart":"10","dataAnimScrollFinish":"90"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__pad_round_1","stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset","stk-theme_44178__style_font_style-1628517328397","stk-theme_44178__mb_05"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"What is defensive coding?"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-reset","stk-theme_44178__mb_05"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Red Hat has a "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://developers.redhat.com/articles/defensive-coding-guide","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"great Defensive Coding Guide"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"It provides guidelines for improving software security through secure coding and gives you concrete recommendations."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid","stk-theme_44178__mb_15"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"className":["stk-theme_44178__style_medium_header","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"3. TypeScript types increase code readability"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Types aren’t just helpful to the computer – their usefulness goes way beyond simply defining individual variables as numbers or strings."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"There’s an extensive type system within TypeScript, which you can use to represent almost anything – from function signatures to library APIs. But why bother putting the time into typing anything more complex than variables and functions?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"Types increase readability, which in turn increases development velocity and code quality."}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"className":["stk-theme_44178__mb_05","stk-reset","stk-theme_44178__style_medium_header"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"a. Use types to define your functions and variables"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"What do you think this function does?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"figure","properties":{"className":["stk-reset","stk-embed_rendered"],"dataCeTag":"embed"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"pre","properties":{"className":["hljs"],"style":"display: block; overflow-x: auto; background: #002451; color: #ffffff; padding: 0.5em;"},"children":[{"type":"element","tagName":"span","properties":{"className":["hljs-function"]},"children":[{"type":"element","tagName":"span","properties":{"className":["hljs-keyword"],"style":"color: #ebbbff;"},"children":[{"type":"text","value":"function"}]}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["hljs-built_in"],"style":"color: #ffc58f;"},"children":[{"type":"text","value":"size"}]},{"type":"text","value":"(a, b)\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"figcaption","properties":{"className":["stk-reset","stk-description"],"dataCeTag":"description"},"children":[]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"The likely assumption is that a and b are numbers, and the function does some calculation and returns a number."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"What if it was written like this instead?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"figure","properties":{"className":["stk-reset","stk-embed_rendered"],"dataCeTag":"embed"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"pre","properties":{"className":["hljs"],"style":"display: block; overflow-x: auto; background: #002451; color: #ffffff; padding: 0.5em;"},"children":[{"type":"element","tagName":"span","properties":{"className":["hljs-function"]},"children":[{"type":"element","tagName":"span","properties":{"className":["hljs-keyword"],"style":"color: #ebbbff;"},"children":[{"type":"text","value":"function"}]}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["hljs-built_in"],"style":"color: #ffc58f;"},"children":[{"type":"text","value":"size"}]},{"type":"text","value":"(a: "},{"type":"element","tagName":"span","properties":{"className":["hljs-keyword"],"style":"color: #ebbbff;"},"children":[{"type":"text","value":"number"}]},{"type":"text","value":", b: "},{"type":"element","tagName":"span","properties":{"className":["hljs-keyword"],"style":"color: #ebbbff;"},"children":[{"type":"text","value":"number"}]},{"type":"text","value":"): string"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"figcaption","properties":{"className":["stk-reset","stk-description"],"dataCeTag":"description"},"children":[]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"It returns a string. Or maybe it does a calculation, then converts the result to a string? Or does it do something completely different? The question can’t be answered from just the types – but you now know you need to look deeper."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"Being able to make better assumptions about a function, at a glance, can be a vital step towards avoiding technical debt. "}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"It’s so easy for tech debt to slip into a complicated piece of code, all because it was misread or misunderstood. By taking active steps to increase the readability of code, you decrease:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{"className":["stk-reset"],"dataCeTag":"list"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"text","value":"Time to understand it"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"text","value":"Time to fix it"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"text","value":"Time to improve it"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"text","value":"Risk of bugs happening"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{"className":["stk-reset","stk-list-item"],"dataCeTag":"list-item"},"children":[{"type":"text","value":"Risk of tech debt being accidentally introduced."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset","stk-theme_44178__mb_15"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"And this goes far beyond just functions."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"className":["stk-theme_44178__mb_05","stk-reset","stk-theme_44178__style_medium_header"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"b. Use types to clarify concepts as interfaces"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Rich text editors rely on dozens of domain concepts: DOM ranges, HTML structures, and formatting models. When you’re a specialist developer working on a rich text editor, It’s impossible to remember how each concept works. And trying to keep external documentation in sync with code changes is always a nightmare."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"The quickest way to clarify concepts is to use TypeScript interfaces. "}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"For example, this is "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://github.com/tinymce/tinymce/blob/develop/modules/tinymce/src/core/main/ts/api/Shortcuts.ts#L47","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"TinyMCE’s concept of a keyboard shortcut represented as a TypeScript interface"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"figure","properties":{"className":["stk-reset","stk-embed_rendered"],"dataCeTag":"embed"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"pre","properties":{"className":["hljs"],"style":"display: block; overflow-x: auto; background: #002451; color: #ffffff; padding: 0.5em;"},"children":[{"type":"element","tagName":"span","properties":{"className":["hljs-selector-tag"],"style":"color: #ebbbff;"},"children":[{"type":"text","value":"interface"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["hljs-selector-tag"],"style":"color: #ebbbff;"},"children":[{"type":"text","value":"Shortcut"}]},{"type":"text","value":" {\n  "},{"type":"element","tagName":"span","properties":{"className":["hljs-attribute"],"style":"color: #ffeead;"},"children":[{"type":"text","value":"id"}]},{"type":"text","value":": string;\n  "},{"type":"element","tagName":"span","properties":{"className":["hljs-attribute"],"style":"color: #ffeead;"},"children":[{"type":"text","value":"access"}]},{"type":"text","value":": boolean;\n  "},{"type":"element","tagName":"span","properties":{"className":["hljs-attribute"],"style":"color: #ffeead;"},"children":[{"type":"text","value":"ctrl"}]},{"type":"text","value":": boolean;\n  "},{"type":"element","tagName":"span","properties":{"className":["hljs-attribute"],"style":"color: #ffeead;"},"children":[{"type":"text","value":"shift"}]},{"type":"text","value":": boolean;\n  "},{"type":"element","tagName":"span","properties":{"className":["hljs-attribute"],"style":"color: #ffeead;"},"children":[{"type":"text","value":"meta"}]},{"type":"text","value":": boolean;\n  "},{"type":"element","tagName":"span","properties":{"className":["hljs-attribute"],"style":"color: #ffeead;"},"children":[{"type":"text","value":"alt"}]},{"type":"text","value":": boolean;\n  "},{"type":"element","tagName":"span","properties":{"className":["hljs-attribute"],"style":"color: #ffeead;"},"children":[{"type":"text","value":"keyCode"}]},{"type":"text","value":": number;\n  "},{"type":"element","tagName":"span","properties":{"className":["hljs-attribute"],"style":"color: #ffeead;"},"children":[{"type":"text","value":"charCode"}]},{"type":"text","value":": number;\n  "},{"type":"element","tagName":"span","properties":{"className":["hljs-attribute"],"style":"color: #ffeead;"},"children":[{"type":"text","value":"subpatterns"}]},{"type":"text","value":": Shortcut[];\n  "},{"type":"element","tagName":"span","properties":{"className":["hljs-attribute"],"style":"color: #ffeead;"},"children":[{"type":"text","value":"desc"}]},{"type":"text","value":": string;\n  "},{"type":"element","tagName":"span","properties":{"className":["hljs-attribute"],"style":"color: #ffeead;"},"children":[{"type":"text","value":"func"}]},{"type":"text","value":": () => void;\n  "},{"type":"element","tagName":"span","properties":{"className":["hljs-attribute"],"style":"color: #ffeead;"},"children":[{"type":"text","value":"scope"}]},{"type":"text","value":": any;\n}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"figcaption","properties":{"className":["stk-reset","stk-description"],"dataCeTag":"description"},"children":[]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Our developers no longer need to remember what a keyboard shortcut requires – it’s right there for them. And because every keyboard shortcut implemented in TinyMCE is typed using this interface, TypeScript’s type checking ensures any new or changed shortcuts don’t have errors. This also helps to prevent bugs or tech debt that could have arisen due to a shortcut being incorrectly defined."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Of course though, interfaces can be "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"a lot"}]},{"type":"text","value":" bigger than this little example."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"1","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["valign-middle","stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__mb_2","stk-grid"],"dataStkCss":"stkkn77i","dataCeTag":"grid","dataAnimM":"false","dataAnim":"true","dataAnimName":"preset-slideInRight","dataAnimTrigger":"scroll","dataAnimDuration":"1","dataAnimDelay":"0","dataAnimScrollStart":"10","dataAnimScrollFinish":"90"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid","stk-theme_44178__mb_0"],"dataStkCss":"stkvE7T3","dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataStkCss":"stklovHI","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_font_style-1628517714937","stk-reset","stk-theme_44178__color_44178_custom_color_4"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"FURTHER INSIGHTS"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__mb_05","stk-grid"],"dataCeTag":"grid","dataStkCss":"stk9cBCY"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"3","dataStkCss":"stk92B4-","dataCeTag":"grid-col"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_font_style-1628517714937","stk-reset"],"dataStkCss":"stkGKxb8","dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.tiny.cloud/technical-debt-whitepaper","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"Download and read Technical Debt in Rich Text Editors White Paper →"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__mb_15","stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"className":["stk-theme_44178__mb_05","stk-reset","stk-theme_44178__style_medium_header"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"c. Use types to clarify your module boundaries"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"TinyMCE is a very modular product, composed of hundreds of distinct pieces – libraries, modules, plugins, and more. And one of the key principles of TinyMCE development is that each of those pieces must have a single entry point: an API that defines what functionality other pieces of the code base can access."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"The "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://github.com/tinymce/tinymce/tree/develop/modules/tinymce/src/core/main/ts/api","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"API for TinyMCE’s Core editor"}]},{"type":"text","value":" spans "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"dozens "}]},{"type":"text","value":"of files, full of interfaces defining how each part of the engine works. And those interfaces form the backbone of every part of TinyMCE that builds on top of the engine – they ensure every other piece maintains the same concepts and principles as the core."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"Defined APIs prevent misunderstandings and conflicts across libraries – "}]},{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"particularly"}]},{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":" the kinds of problems that could result in tech debt cascading through the editor."}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"It isn’t the perfect solution. How an API functions could be changed without the API’s type definition changing. But it’s another layer of assurance than what’s provided by using JavaScript, and sometimes that can make all the difference."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"4","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__mb_2","stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"className":["stk-theme_44178__style_medium_header","stk-theme_44178__mb_05","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"4. TypeScript helps to future-proof against tech debt"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Gradual typing is an ideal approach for managing the time invested in your TypeScript conversion. However, it’s all too easy to do the initial conversion, then leave further improvements… for quite a while."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"After all, you’ve started using TypeScript. You’re getting "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"],"dataGtmVisHasFired-10171822_255":"1"},"children":[{"type":"text","value":"some"}]},{"type":"text","value":" of the benefits. Is it really worth the time and effort to add "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"],"dataGtmVisHasFired-10171822_255":"1"},"children":[{"type":"text","value":"more"}]},{"type":"text","value":" types?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset","stk-theme_44178__mb_05"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Think of it this way:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset","stk-theme_44178__mb_05","stk-theme_44178__color_44178_custom_color_4","stk-theme_44178__style_font_style-1628517294418"],"dataCeTag":"paragraph"},"children":[{"type":"element","tagName":"strong","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"The more types you add to your code base, the more benefits gained from TypeScript. The more benefits gained, the more in-built protection from tech debt."}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"If you’re stuck trying to prioritise the improvement of certain parts of code, use your "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.tiny.cloud/blog/tag/roadmap","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"product roadmap"}]},{"type":"text","value":" as a guide. Type improvements can be planned into projects, or sections of the code base can be typed ahead of a new project – to get maximum benefits for minimum work."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"The goal of typing is to find existing tech debt – shore up your foundation – and help prevent any new technical debt. So any kind of ongoing investment in paying down tech debt has a long term payoff, and converting to TypeScript has certainly helped curtail TinyMCE’s debt burden."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"4","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__mb_2","stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"stk-3","className":["stk-theme_44178__style_large_header","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"TypeScript’s great, but WYSIWYG editors are best left to experts"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Yes, TypeScript endows your code with a multitude of benefits, particularly if you’re developing a rich text editor from scratch. But ask yourself, why take that on, when "},{"type":"element","tagName":"em","properties":{"className":["stk-reset"]},"children":[{"type":"text","value":"the experts"}]},{"type":"text","value":" struggle with WYSIWYG maintenance and tech debt burdens?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Repeat these three statements: "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.tiny.cloud/buy-vs-build-whitepaper/","target":"_blank","rel":["noopener"],"dataGtmVisHasFired-10171822_255":"1"},"children":[{"type":"text","value":"Rich text editors are complex"}]},{"type":"text","value":". "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.tiny.cloud/blog/cost-of-building-rich-text-editor/","target":"_blank","rel":["noopener"],"dataGtmVisHasFired-10171822_255":"1"},"children":[{"type":"text","value":"Rich text editors are expensive"}]},{"type":"text","value":". "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.tiny.cloud/developer-survey-results/","target":"_blank","rel":["noopener"],"dataGtmVisHasFired-10171822_255":"1"},"children":[{"type":"text","value":"Rich text editors accumulate technical debt"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"While gradual typing solves some issues, it doesn't absolve you of the ongoing investment."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"If you need a TypeScript rich text editor, use an open source "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://www.tiny.cloud/","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"WYSIWYG like TinyMCE"}]},{"type":"text","value":". It has components your dev team can use as a framework for customization and "},{"type":"element","tagName":"a","properties":{"className":["stk-reset"],"href":"https://unpkg.com/tinymce@6/tinymce.d.ts","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"a public TypeScript declaration file"}]},{"type":"text","value":" for integration with a TypeScript app – and it’s supported by our professional dev team and advanced features. You’ll get the best of both worlds."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Because technical debt is always unfinished business."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"4","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-layout__overhangs_both","stk-theme_44178__mb_0","stk-grid"],"dataStkCss":"stkqbmi2","dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-theme_44178__pad_ver_2","stk-grid-col","stk-grid-col_last"],"dataColWidth":"12","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"2","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["align-center","stk-theme_44178__style_font_style-1652351628236","stk-reset","stk-theme_44178__color_44178_custom_color_3"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Download the white paper"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_font_style-1628585803915","align-center","stk-reset","stk-theme_44178__color_44178_custom_color_1"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Opportunity Cost of Technical Debt: Minimize Your Rich Text Editor Development"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"2","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"2","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last"],"dataColWidth":"8","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"figure","properties":{"className":["stk-reset","stk-embed_rendered"],"dataCeTag":"embed"},"children":[{"type":"element","tagName":"code","properties":{"className":["stk-code"]},"children":[{"type":"element","tagName":"iframe","properties":{"style":"border: 0px;","src":"https://www2.ephox.com/l/2202/2022-09-29/d9d458","width":"100%","height":500,"frameBorder":"0","dataMceFragment":"1"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"figcaption","properties":{"className":["stk-reset","stk-description"],"dataCeTag":"description"},"children":[]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"2","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-layout__overhangs_both","stk-grid"],"dataStkCss":"stkPpP_E","dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_last","stk-theme_44178__pad_ver_3"],"dataColWidth":"12","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid"],"dataCeTag":"grid"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"1","dataStkCss":"","dataStkCssM":"","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["valign-middle","stk-grid-col","stk-grid-col_last","stk-theme_44178__pad_round_1-m"],"dataColWidth":"6","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_font_style-1628517328397","stk-theme_44178__mb_05","stk-theme_44178__color_44178_custom_color_3","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"author"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"className":["stk-theme_44178__style_small_header","stk-theme_44178__color_44178_custom_color_0","stk-theme_44178__mb_0","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Millie Macdonald"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_font_style-1628517714937","stk-theme_44178__color_44178_custom_color_2","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Product Manager at Halo Connect"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["stk-theme_44178__style_small_text","stk-theme_44178__color_44178_custom_color_0","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":"Millie is a Product Manager at Halo Connect who dabbles in writing. Previously, she worked at Tiny as a Product Owner, dev, and QA engineer. She loves learning above all else, whether it's about people, tech, or leadership."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["stk-grid-col","stk-grid-col_empty"],"dataColWidth":"1","dataCeTag":"grid-col"},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{"className":["ce-element--empty","stk-element_no-text","stk-reset"],"dataCeTag":"paragraph"},"children":[{"type":"text","value":" "}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]}],"data":{"quirksMode":false}}}},"codepens":null,"heroImage":{"image":{"fluid":{"base64":"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAMAAABI111xAAAA4VBMVEX+ov/+ov/+of/+ov/+ov//ov//o//+of//of/0nv2ikfzHk/v/n/7+o/z8p/H9of7/oP/1qvrlqu79oP7ql/ugoP3Gofn8nPz4usP12nz6p/D5of3xp/fnsPH/n//6rvX2rfTyufnzu/r4ut/20cj6rPbzsPj5wfr7wvv6svr+oP/9tP758/T18Or69vn59vny9vnt9fj36fr2vvbs1Ozr1uvtu+7+n//8tf358vb48vT4+Pj4+fj6+/v6/fv38/j3rPj6mfv8nf39n/7+pf/+uP/+t///uf//uv/+s///nv8Vl2KaAAAABHRSTlP9/v78RvGEPgAAAGtJREFUCB0FwbttAlEUQME5+64jixSJBojovwKX4MwSEikhKZ/1TANhB+g5CATYtYE2LNYiBqymquqBIeu7qqoeaLQ+p6qq6s9rcDxUVVVh4FBVVf1gcD9H1e26v0VfWMcL/N7f4JVA7ADbP7fqExxdbHuwAAAAAElFTkSuQmCC","aspectRatio":1.7816836262719704,"src":"//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=2560&q=80&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=640&h=359&q=80&fit=scale 640w,\n//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=1280&h=718&q=80&fit=scale 1280w,\n//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=1926&h=1081&q=80&fit=scale 1926w","srcWebp":"//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=2560&q=80&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=640&h=359&q=80&fm=webp&fit=scale 640w,\n//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=1280&h=718&q=80&fm=webp&fit=scale 1280w,\n//images.ctfassets.net/s600jj41gsex/2xiNigXJElGz4ouNTELxiO/d4d4fe5378e2be8bc1921dad842d168a/Technical_debt_and_types__The_benefits_of_TypeScript_vs_JavaScript.png?w=1926&h=1081&q=80&fm=webp&fit=scale 1926w","sizes":"(max-width: 2560px) 100vw, 2560px"}},"alt":"The rich text editor represented as a document symbol with TypeScript and JavaScript logos above it","artistName":null,"artistUrl":null},"author":{"slug":"millie-macdonald","name":"Millie Macdonald","image":{"fluid":{"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAUABQDAREAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAABgcICf/EACYQAAEDAwMEAwEBAAAAAAAAAAECAwQFBhEAEiEHCBNBFCIxYZH/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8Ay8bhKahGaJTDS23UJQySryrzk7kjGCBjnn2NBQ3Ta37Wm9L6Nctcup9+qvVZyG9Rai5mM0nBLb4BICc7SnODlRxxoHI7YEFCgENhCMDASBg/5oFIm8ug9wdE7gi3JEkRbxbqzCKIaDFKXkQBs8u4rSG88r4JycDkegFbsi0Brt1tByg1KVPnSqrOZkQZQZStttKDsUUI3KGSvKSVfpX/AAgDFHcg3QYkGBUFoflsRGELcaSrClBtOf33nOgKk0C2Lh7Kuu9yizbfplco9yU6kQ50CHtdaYEhG7ClFRBVn7bSAcDjQSNBnyE/Bjh1fx0OpcDWfqVbhyRoKh6LUS3L9s5dRuS1aVWqgiW7HEmR5grxpxtT9HEjjJ9aD//Z","aspectRatio":1,"src":"//images.ctfassets.net/s600jj41gsex/1WjKPKyRtd0IepFyXQBiHt/46d51b0fc7ee0c7700a2d3a835d20735/seYCjfJw_400x400.jpg?w=48&q=50&fit=scale","srcSet":"//images.ctfassets.net/s600jj41gsex/1WjKPKyRtd0IepFyXQBiHt/46d51b0fc7ee0c7700a2d3a835d20735/seYCjfJw_400x400.jpg?w=12&h=12&q=50&fit=scale 12w,\n//images.ctfassets.net/s600jj41gsex/1WjKPKyRtd0IepFyXQBiHt/46d51b0fc7ee0c7700a2d3a835d20735/seYCjfJw_400x400.jpg?w=24&h=24&q=50&fit=scale 24w,\n//images.ctfassets.net/s600jj41gsex/1WjKPKyRtd0IepFyXQBiHt/46d51b0fc7ee0c7700a2d3a835d20735/seYCjfJw_400x400.jpg?w=48&h=48&q=50&fit=scale 48w,\n//images.ctfassets.net/s600jj41gsex/1WjKPKyRtd0IepFyXQBiHt/46d51b0fc7ee0c7700a2d3a835d20735/seYCjfJw_400x400.jpg?w=72&h=72&q=50&fit=scale 72w,\n//images.ctfassets.net/s600jj41gsex/1WjKPKyRtd0IepFyXQBiHt/46d51b0fc7ee0c7700a2d3a835d20735/seYCjfJw_400x400.jpg?w=96&h=96&q=50&fit=scale 96w,\n//images.ctfassets.net/s600jj41gsex/1WjKPKyRtd0IepFyXQBiHt/46d51b0fc7ee0c7700a2d3a835d20735/seYCjfJw_400x400.jpg?w=144&h=144&q=50&fit=scale 144w,\n//images.ctfassets.net/s600jj41gsex/1WjKPKyRtd0IepFyXQBiHt/46d51b0fc7ee0c7700a2d3a835d20735/seYCjfJw_400x400.jpg?w=400&h=400&q=50&fit=scale 400w","srcWebp":"//images.ctfassets.net/s600jj41gsex/1WjKPKyRtd0IepFyXQBiHt/46d51b0fc7ee0c7700a2d3a835d20735/seYCjfJw_400x400.jpg?w=48&q=50&fm=webp&fit=scale","srcSetWebp":"//images.ctfassets.net/s600jj41gsex/1WjKPKyRtd0IepFyXQBiHt/46d51b0fc7ee0c7700a2d3a835d20735/seYCjfJw_400x400.jpg?w=12&h=12&q=50&fm=webp&fit=scale 12w,\n//images.ctfassets.net/s600jj41gsex/1WjKPKyRtd0IepFyXQBiHt/46d51b0fc7ee0c7700a2d3a835d20735/seYCjfJw_400x400.jpg?w=24&h=24&q=50&fm=webp&fit=scale 24w,\n//images.ctfassets.net/s600jj41gsex/1WjKPKyRtd0IepFyXQBiHt/46d51b0fc7ee0c7700a2d3a835d20735/seYCjfJw_400x400.jpg?w=48&h=48&q=50&fm=webp&fit=scale 48w,\n//images.ctfassets.net/s600jj41gsex/1WjKPKyRtd0IepFyXQBiHt/46d51b0fc7ee0c7700a2d3a835d20735/seYCjfJw_400x400.jpg?w=72&h=72&q=50&fm=webp&fit=scale 72w,\n//images.ctfassets.net/s600jj41gsex/1WjKPKyRtd0IepFyXQBiHt/46d51b0fc7ee0c7700a2d3a835d20735/seYCjfJw_400x400.jpg?w=96&h=96&q=50&fm=webp&fit=scale 96w,\n//images.ctfassets.net/s600jj41gsex/1WjKPKyRtd0IepFyXQBiHt/46d51b0fc7ee0c7700a2d3a835d20735/seYCjfJw_400x400.jpg?w=144&h=144&q=50&fm=webp&fit=scale 144w,\n//images.ctfassets.net/s600jj41gsex/1WjKPKyRtd0IepFyXQBiHt/46d51b0fc7ee0c7700a2d3a835d20735/seYCjfJw_400x400.jpg?w=400&h=400&q=50&fm=webp&fit=scale 400w","sizes":"(max-width: 48px) 100vw, 48px"}},"shortBio":{"shortBio":"Millie is a JS developer and leads the core editor team at Tiny. She specialises in crazy things like copy and paste, image handling, and tables, and occasionally gets to play with ReasonML. She's also an esports community manager and tournament organiser in her spare time."}},"metaTitle":{"metaTitle":"Benefits of TypeScript over JavaScript: tech debt and types | TinyMCE"},"metaDescription":{"metaDescription":"Giving a preference to TypeScript vs JavaScript can have long term benefits in terms of dealing with technical debt."},"setkaCss":["https://www.tiny.cloud/blog/setka/common_css_1634572086.css","https://www.tiny.cloud/blog/setka/T-MqHt4_cRRlImdGVfupaQ.css","https://www.tiny.cloud/blog/setka/UnEeJJ5vn9rZGngAji4oNg.css"],"setkaHtml":{"body_html":"<div class=\"stk-post stk-layout_12col_36009 stk-theme_44178\" data-stk=\"{&quot;images&quot;:[{&quot;id&quot;:297031,&quot;alt&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;},{&quot;id&quot;:283330,&quot;alt&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;},{&quot;id&quot;:283315,&quot;alt&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;},{&quot;id&quot;:283314,&quot;alt&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;}]}\" data-ui-id=\"post\" data-ce-tag=\"post\" data-reset-type=\"class\" data-layout-type=\"limited\" data-editor-version=\"3.2.5\"><div class=\"stk-grid stk-theme_44178__mb_2\" data-ce-tag=\"grid\"><div data-col-width=\"12\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"10\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><p class=\"stk-reset stk-theme_44178__color_44178_custom_color_2 ce-element--empty stk-element_no-text\" data-ce-tag=\"paragraph\"></p><p class=\"stk-reset stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__color_44178_custom_color_2 stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><b class=\"stk-reset\"><strong class=\"stk-reset\">developer insights</strong></b></p><h1 class=\"stk-reset stk-theme_44178__color_44178_custom_color_1 stk-theme_44178__style_font_style-1635835947787\" data-ce-tag=\"paragraph\">Technical debt and types: The benefits of TypeScript vs JavaScript</h1></div><div data-col-width=\"2\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div></div><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"3\" class=\"stk-grid-col\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__color_44178_custom_color_3\" data-ce-tag=\"paragraph\">Published {{setkaPost.lastUpdated}}<br></p></div><div data-col-width=\"9\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__color_44178_custom_color_3\" data-ce-tag=\"paragraph\"><img alt=\"\" class=\"stk-reset stk-theme_44178__symbol_custom_image_3740221 stk-icon\" src=\"https://ucarecdn.com/ff75d5fb-c11f-4155-b153-3eb9441ed072/\">&nbsp;{{setkaPost.readTime}} </p></div></div><figure class=\"stk-reset stk-image-figure\" data-ce-tag=\"image-figure\"><div class=\"stk-mask\" data-ce-tag=\"mask\"><img class=\"stk-image stk-reset\" data-image-id=\"297031\" src=\"https://ucarecdn.com/a6d30645-ede5-4bdf-b669-e59a8e1445d9/\" loading=\"lazy\"/></div></figure></div></div><div class=\"stk-grid stk-theme_44178__mb_15\" data-ce-tag=\"grid\"><div data-col-width=\"9\" class=\"stk-grid-col\" data-ce-tag=\"grid-col\"><p class=\"stk-theme_44178__style_font_style-1628517294418 stk-reset stk-theme_44178__color_44178_custom_color_1\" data-ce-tag=\"paragraph\">Changing programming languages is always a torturous decision. But with a product as complex as a rich text editor, that’s so prone to technical debt, the right programming language is vital to its longevity. Thankfully, for TinyMCE, converting from JavaScript to TypeScript was easy – and carried with it a lot of benefits for an editor with heavy technical debt burdens.</p></div><div data-col-width=\"3\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><div class=\"stk-grid stk-grid__layout_columns\" data-ce-tag=\"grid\"><div data-col-width=\"1\" class=\"stk-grid-col\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><figure class=\"stk-reset stk-image-figure\" data-ce-tag=\"image-figure\"><div class=\"stk-mask\" data-ce-tag=\"mask\"><img src=\"https://ucarecdn.com/f4f978a8-138d-4000-8d66-48ab76705afb/\" data-image-id=\"221201\" data-image-name=\"millie.png\" class=\"stk-image stk-reset\" width=\"942\" height=\"942\" loading=\"lazy\"/></div></figure></div><div data-col-width=\"2\" class=\"stk-grid-col stk-grid-col_last valign-middle\" data-ce-tag=\"grid-col\"><p class=\"stk-reset stk-theme_44178__style_font_style-1628517714937 stk-theme_44178__mb_0 stk-theme_44178__color_44178_custom_color_1\" data-ce-tag=\"paragraph\">Millie Macdonald</p><p class=\"stk-reset stk-theme_44178__style_small_text stk-theme_44178__color_44178_custom_color_3\" data-ce-tag=\"paragraph\">Product Manager at Halo Connect</p></div></div></div></div><hr class=\"stk-theme_44178__separator_basic_divider stk-theme_44178__mb_2 stk-reset\"/><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col\" data-ce-tag=\"grid-col\"><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Right now, JavaScript (JS) is easily one of the most popular programming languages. It’s particularly appropriate for rich text editors, because they're mostly integrated into websites and web apps – where JavaScript is the weapon of choice for developers.</p><p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">However, if you go beyond the surface of JavaScript, you quickly find a host of complications that may make it a less than perfect choice: </p><ul class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"list\"><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">Easy to learn but hard to master</strong>. JavaScript has a low barrier to entry, but also a lot of unintuitive quirks and pitfalls (<a href=\"https://www.w3schools.com/js/js_function_closures.asp\" target=\"_blank\" class=\"stk-reset\">function closures</a>, anyone?). </li></ul><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">→ </strong>Learning these quirks can take a while, and handling them during development adds both time and lines of code to a project.</p></div></div><ul class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"list\"><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">Even bad code gets interpreted. </strong>JavaScript always tries its best to interpret your code – even if it makes no sense. <a href=\"https://www.destroyallsoftware.com/talks/wat\" target=\"_blank\" class=\"stk-reset\">The Wat talk by Gary Bernhardt</a> gives some hilarious examples that highlight just how weird JavaScript can get.</li></ul><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">→ </strong>Sadly JavaScript doesn’t have a safety net, so you’re on your own when it comes to ensuring your code does what it’s meant to.</p></div></div><ul class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"list\"><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">Readability requires documentation.</strong> Between the lack of types and <a class=\"stk-reset\" href=\"https://dmitripavlutin.com/unlearn-javascript-bad-coding-habits/\" target=\"_blank\">how easy it is to write confusing code in JavaScript</a>, making your code readable often requires extra steps.</li></ul><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"stk-reset\" data-ce-tag=\"paragraph\">→ Code comments, good naming conventions, and internal documentation are your friend when it comes to large JavaScript code bases – but they all require extra work.</p></div></div></div><div data-col-width=\"1\" class=\"stk-grid-col stk-grid-col_empty\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div><div data-col-width=\"3\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><div class=\"stk-grid\" data-stk-css=\"stkdQPoe\" data-anim-m=\"false\" data-ce-tag=\"grid\"><div data-col-width=\"3\" class=\"stk-theme_44178__pad_round_1 stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><p class=\"stk-theme_44178__style_font_style-1628517714937 stk-reset stk-theme_44178__color_44178_custom_color_1 stk-theme_44178__mb_0\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">TABLE OF&nbsp;CONTENTS</strong></p><hr class=\"stk-theme_44178__separator_basic_divider stk-theme_44178__mb_05 stk-reset\"/><p class=\"stk-theme_44178__style_small_text stk-theme_44178__color_44178_custom_color_3 stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"#stk-4\">JavaScript and technical debt</a></p><p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"#stk-1\">TypeScript vs JavaScript</a></p><p class=\"stk-theme_44178__style_small_text stk-theme_44178__color_44178_custom_color_3 stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"#stk-2\">Benefits of switching to TypeScript for WYSIWYG tech debt</a></p><p class=\"stk-theme_44178__style_small_text stk-theme_44178__color_44178_custom_color_3 stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"#stk-3\">TypeScript’s great but WYSIWYG editors are best left to experts</a></p></div></div></div></div><div class=\"stk-theme_44178__mb_2 stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col\" data-ce-tag=\"grid-col\"><p class=\"stk-reset stk-theme_44178__mb_2\" data-ce-tag=\"paragraph\">Complications like these can cause any number of problems, which is why there are so many articles about JavaScript being a ‘bad’ programming language. However, there’s one danger that isn’t talked about nearly enough: technical debt.</p><h2 class=\"stk-theme_44178__style_large_header stk-reset\" data-ce-tag=\"paragraph\" id=\"stk-4\">JavaScript and technical debt</h2><p class=\"stk-reset\" data-ce-tag=\"paragraph\">First up, it has to be said that Javascript and tech debt have a symbiotic relationship.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Flexibility may be one of Javascript’s strengths, but it also makes it easy for errors to creep into the code, unless significant precautions are taken. </p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">A rich text editor is already a breeding ground for tech debt, due to the scale and complexity of its features and codebase. So it goes without saying that developing a product that’s <em class=\"stk-reset\">already</em> prone to tech debt, in a language that’s <em class=\"stk-reset\">also</em> prone to tech debt, isn’t a great idea. But it's a mistake that's often made.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">JavaScript’s really easy to learn, it’s quick to hire dev talent, and runs almost anywhere. So how do you leverage those benefits, without risking the ongoing accumulation of technical debt that negatively impacts your developer velocity and product quality?</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Enter, TypeScript.</p></div><div data-col-width=\"1\" class=\"stk-grid-col stk-grid-col_empty\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div><div data-col-width=\"3\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><div class=\"stk-theme_44178__mb_2 stk-grid\" data-stk-css=\"stk0SEJm\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim-zoom=\"100\" data-anim-shift=\"60\" data-anim-rotation=\"0\" data-anim-opacity=\"100\" data-anim-direction=\"left\" data-anim-duration=\"0.6000000000000001\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\" data-anim-trigger=\"scroll\" data-anim-sticky-direction=\"top\" data-anim-sticky-offset=\"20\" data-anim-name=\"ajYYkX\" data-anim=\"true\"><div data-col-width=\"3\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><div class=\"stk-theme_44178__mb_05 stk-grid\" data-stk-css=\"stk9V8Fp\" data-ce-tag=\"grid\"><div data-col-width=\"3\" class=\"stk-grid-col stk-grid-col_last\" data-stk-css=\"stkNYpue\" data-ce-tag=\"grid-col\"><p class=\"stk-theme_44178__style_font_style-1628517714937 stk-reset stk-theme_44178__color_44178_custom_color_4\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Insights on the complexities of RICH TEXT EDITORS and technical debt</strong></p></div></div><div class=\"stk-theme_44178__mb_05 stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"3\" class=\"stk-grid-col stk-grid-col_last\" data-stk-css=\"stkEkeMK\" data-ce-tag=\"grid-col\"><p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><a href=\"https://www.tiny.cloud/blog/reduce-technical-debt/\" target=\"_blank\" class=\"stk-reset\">Reduce technical debt with the right rich text editor</a></p><p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a href=\"https://www.tiny.cloud/blog/manage-technical-debt/\" target=\"_blank\" class=\"stk-reset\">Managing technical debt is difficult in rich text editors</a></p><p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a href=\"https://www.tiny.cloud/blog/technical-debt-examples/\" target=\"_blank\" class=\"stk-reset\">Dangerous examples of technical debt in rich text editors</a></p><p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><a href=\"https://www.tiny.cloud/blog/developer-velocity-and-technical-debt/\" target=\"_blank\" class=\"stk-reset\">Are developer velocity and technical debt impacted by a rich text editor?</a></p></div></div></div></div></div></div><div class=\"stk-theme_44178__mb_15 stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col\" data-ce-tag=\"grid-col\"><h2 class=\"stk-theme_44178__style_large_header stk-reset\" data-ce-tag=\"paragraph\" id=\"stk-1\">TypeScript vs JavaScript</h2><p class=\"stk-theme_44178__mb_15 stk-reset\" data-ce-tag=\"paragraph\">JavaScript (JS) may be the undisputed ‘most popular’ programming language of HTML and the web, but in 2022, TypeScript (TS) joined the world’s <a class=\"stk-reset\" href=\"https://survey.stackoverflow.co/2022/#technology-most-popular-technologies\" target=\"_blank\" data-gtm-vis-has-fired-10171822_255=\"1\">top 5 most used languages</a>.</p><h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">What is TypeScript?</h3><p class=\"stk-reset\" data-ce-tag=\"paragraph\">TypeScript is a free, open source programming language built on top of JavaScript, that adds strong types, tooling, and guide rails for better development. It compiles to JavaScript, which means it can run anywhere that JS runs and it maintains much of JavaScript’s feature set.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Best of all TypeScript answers all the prior concerns noted, plus some.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Getting into the weeds, although JavaScript is considered the primary scripting language for apps and web pages, it was never designed for that purpose. Nor was it designed for creating large and complex web apps – it’s better suited for small-scale applications. </p><p class=\"stk-theme_44178__mb_15 stk-reset\" data-ce-tag=\"paragraph\">For this very reason, in 2012, Microsoft developed TypeScript with the specific goal of a scripting language that better handles large-scale complicated applications.</p></div><div data-col-width=\"1\" class=\"stk-grid-col stk-grid-col_empty\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div><div data-col-width=\"3\" class=\"valign-middle stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><div class=\"stk-grid\" data-stk-css=\"stkK5Fn-\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-slideInRight\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\"><div data-col-width=\"3\" class=\"stk-theme_44178__pad_round_1 stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><p class=\"stk-reset stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Definitions</strong></p><p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">Statically typed:</strong><br data-gtm-vis-has-fired-10171822_255=\"1\">Types must be defined in the code and are checked at compile time</p><p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">Dynamically typed:</strong><br data-gtm-vis-has-fired-10171822_255=\"1\">Types are assigned and checked at run time</p></div></div></div></div><div class=\"stk-grid stk-theme_44178__mb_2\" data-stk-css=\"stk-AL3u\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-jackInTheBox\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\" data-ce-tag=\"grid\"><div data-col-width=\"12\" class=\"stk-theme_44178__pad_ver_2 stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"2\" class=\"stk-grid-col stk-grid-col_empty\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><p class=\"stk-theme_44178__style_font_style-1628585803915 align-center stk-reset\" data-stk-css=\"stkks_bG\" data-ce-tag=\"paragraph\">Get more insights in our<br>Technical Debt White Paper</p><a class=\"stk-theme_44178__stk-btn_1628586253530 stk-theme_44178__style_font_style-1628586133109 align-center stk-reset\" href=\"https://www.tiny.cloud/technical-debt-whitepaper\" target=\"_blank\" data-stk-button=\"1\" data-ce-tag=\"button\">READ THE WHITE PAPER</a></div><div data-col-width=\"2\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div></div></div></div><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">Why is TypeScript better than Javascript?</h3><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Importantly, TypeScript isn’t a completely different programming language – it’s JavaScript but better. </p><ul class=\"stk-reset\" data-ce-tag=\"list\"><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">TypeScript simplifies, handles, or restricts many of JavaScript’s weirder features</strong>, both inherently and via the extra functionality it offers to developers, to reduce the risk of falling into the common pitfalls of JS.</li><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">It adds type checking and better errors</strong>, to increase the chance that bad code is caught during development.</li><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">Adding types adds inline documentation with minimal extra work</strong>, and allows you to define not just variables and functions, but also concepts and APIs.</li></ul><p class=\"stk-reset\" data-ce-tag=\"paragraph\">For a rich text editor, this means you get the easy interoperability (of Javascript) with web applications and technologies, and also gain (with TypeScript) the functionality and tooling that’s invaluable for maintaining the quality of your code – all with minimal overhead. </p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">That’s a massive long-term gain in terms of reduced bugs and work impediments. But what’s the cost of conversion?</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Developing a brand new rich text editor from scratch, in TypeScript, is the easiest route. But what if, like TinyMCE, you already have an editor written in JavaScript? You don’t want to throw that code away. No.</p><p class=\"stk-theme_44178__mb_15 stk-reset\" data-ce-tag=\"paragraph\">So, how hard was it to convert TinyMCE from JavaScript to TypeScript? Well…</p></div><div data-col-width=\"1\" class=\"stk-grid-col stk-grid-col_empty\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div><div data-col-width=\"3\" class=\"valign-middle stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div></div><div class=\"stk-grid stk-theme_44178__mb_15\" data-ce-tag=\"grid\" data-stk-css=\"stk88Gw7\"><div data-col-width=\"2\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\" data-stk-css-m=\"\" data-stk-css=\"\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last stk-theme_44178__pad_ver_1\" data-ce-tag=\"grid-col\"><p class=\"stk-reset stk-theme_44178__mb_05 stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__color_44178_custom_color_4\" data-stk-css=\"stk-Ux0k\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">EXPERT TIP</strong></p><h4 class=\"stk-theme_44178__style_small_header stk-reset\" data-ce-tag=\"paragraph\" data-stk-css=\"stkoGM_l\"><strong class=\"stk-reset\">Runtime errors vs compilation errors</strong></h4><p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stkTCIxf\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Runtime errors</strong> occur when a program is running – AKA when it’s being used. By comparison, <strong class=\"stk-reset\">compilation errors</strong> happen during development when the code is being compiled. Because of this, compilation errors catch problems <em class=\"stk-reset\">before</em> the code goes out to customers.</p><p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stkCh6NE\" data-ce-tag=\"paragraph\">→ JavaScript <em class=\"stk-reset\">isn’t</em> compiled, so it’s easier for issues to sneak into the product and cause runtime errors that may be found by users.</p><p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stkouXru\" data-ce-tag=\"paragraph\">→ TypeScript <em class=\"stk-reset\">is</em> compiled, and its inbuilt error reporting, during development, means issues are more likely to be caught, and developers can fix them before the code goes live. This results in cleaner code overall, but the faster and clearer feedback loop also helps devs write and type code faster.</p></div><div data-col-width=\"2\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div></div><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">Converting JavaScript TinyMCE to TypeScript TinyMCE</h3><p class=\"stk-reset\" data-ce-tag=\"paragraph\">The initial kickoff work on the mammoth task of <a href=\"https://www.tiny.cloud/blog/modern-javascript-refactoring-tinymce/\" target=\"_blank\" class=\"stk-reset\">converting TinyMCE to TypeScript, began in late 2017</a> and took about six weeks. It’s worth noting that was only the ‘start’ – because<strong class=\"stk-reset\"> the key to converting an existing JavaScript codebase to TypeScript is gradual typing.</strong></p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Since then, TinyMCE has had more underlying restructuring work done on it, than ever before in its history.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Thanks to the mountain of technical debt the open source core carried, it wasn’t until late 2022 that the team finished migrating it to “strict” TypeScript. Some of our internal libraries are so complex, that those migrations are still incomplete. In addition, over the same period there’s been a slow expansion of the way TypeScript is being leveraged – mainly in the Premium plugins – and it can now be said that TinyMCE is a TypeScript editor.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">In a previous article we gave a lot more detail about <a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/benefits-of-gradual-strong-typing-in-javascript\" target=\"_blank\" data-gtm-vis-has-fired-10171822_255=\"1\">the conversion to TypeScript</a>, but if you’re considering converting your codebase from JS to TypeScript, the most notable takeaway is:</p><p class=\"stk-theme_44178__style_font_style-1628517294418 stk-theme_44178__color_44178_custom_color_4 stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">TypeScript accepts various levels of “typed” code. Plain JavaScript can become valid TypeScript with very minimal changes using the “any” escape hatch. This means the initial conversion is easy, and improvements can be scheduled over the following months or years.</strong></p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">That's the exact route TinyMCE took, to typing: a protracted one.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">However, be aware that using “any” <em class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">does</em> mean you miss out on a lot of TypeScript’s features. If you want all of TypeScript’s functionality you need to type the code properly.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">That said, even if your whole codebase uses “any”, you still get value thanks to TypeScript pointing out compilation issues during development, instead of at runtime (which is what JavaScript does). Here’s an example: TypeScript can check that functions are passed the right <em class=\"stk-reset\">number</em> of arguments, even if it can’t yet check they’re the right <em class=\"stk-reset\">type</em>.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">So, while using “any” may not provide the ultimate value that you <em class=\"stk-reset\">could </em>gain, it’s a start – especially when you have a mammoth code base where you need to detect and decrease your tech debt.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Another benefit of using “any” is that it opens the door to slowly increasing how much code is typed – and therefore how much benefit you get from TypeScript. Once the initial conversion was done, our developers would slip types into pieces of code they were writing or updating with minimal extra effort, increasing the chance of errors being pointed out by TypeScript. </p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Time and again this caught errors early, and saved them from going into the code and creating tech debt we would have had to fix later.</p></div><div data-col-width=\"4\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div></div><div class=\"stk-theme_44178__mb_15 stk-grid\" data-stk-css=\"stkpp0f_\" data-ce-tag=\"grid\"><div data-col-width=\"12\" class=\"stk-theme_44178__pad_ver_2 stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"2\" class=\"stk-grid-col stk-grid-col_empty\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><h4 class=\"stk-reset stk-theme_44178__style_small_header align-center\" data-ce-tag=\"paragraph\">Want to see one of the silliest bugs TypeScript detected in TinyMCE?</h4><p class=\"align-center stk-reset\" data-ce-tag=\"paragraph\">It’s called ‘The Case of the Mysterious Double Argument Error….’</p><figure class=\"stk-reset stk-image-figure\" data-stk-css=\"stkmPzAj\" data-ce-tag=\"image-figure\"><div class=\"stk-mask\" data-ce-tag=\"mask\"><img src=\"https://ucarecdn.com/2c51d8ff-6e39-49a8-ae2d-9daa8ee5b8ce/\" data-image-id=\"283315\" data-image-name=\"ioioi.png\" class=\"stk-image stk-reset\" width=\"1312\" height=\"578\" loading=\"lazy\"/></div></figure><p class=\"align-center stk-reset\" data-ce-tag=\"paragraph\">To find out what happened, read the article&nbsp;<a class=\"stk-reset\" href=\"https://www.tiny.cloud/blog/benefits-of-gradual-strong-typing-in-javascript/\" target=\"_blank\">Benefits of gradual strong typing in JavaScript</a> </p></div><div data-col-width=\"2\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div></div></div></div><div class=\"stk-grid stk-theme_44178__mb_2\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col\" data-ce-tag=\"grid-col\"><h3 class=\"stk-reset stk-theme_44178__style_medium_header stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\">How TypeScript helps with technical debt</h3><p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">When it comes to comparing TypeScript vs JavaScript, TS actively helps with tech debt – by making it easier to implement three principles needed to avoid and manage it:</p><ul class=\"stk-reset\" data-ce-tag=\"list\"><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Clean code </li><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Good tests </li><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Good tooling</li></ul><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Yes, most developers acknowledge that the best kind of technical debt to have, is <strong class=\"stk-reset\">intentional tech debt</strong> – a shortcut that was <em class=\"stk-reset\">chosen</em> during planning or development to speed up the release of a project. But <em class=\"stk-reset\">why</em>? Because this kind of <a href=\"https://www.tiny.cloud/blog/technical-debt-tracking/\" target=\"_blank\" class=\"stk-reset\">tech debt can be recorded, tracked and planned</a>.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">However, tech debt isn’t always intentional. </p><p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Unintentional tech debt</strong> sneaks in when developers are in a rush, or don’t have all the information they need to make the best decisions. Meanwhile <strong class=\"stk-reset\">environmental tech debt</strong> is caused by forces outside your control – changes to dependencies, to browsers or operating systems, or to code in other parts of the product.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">The hidden danger of both these kinds of technical debt is the inability to detect them <em class=\"stk-reset\">before</em> they cause trouble. </p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">As you can see by the time it’s taken to pay down the tech debt found in the TinyMCE Core editor, hidden debt is particularly hard work in a large codebase, like a rich text editor. And the challenge never ends. Tech debt endlessly grows in our Core editor (especially environmental and functional tech debt), and needs constant work. </p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">With so many moving parts, dependencies, demands for updates and new feature releases, rich text editors wage a constant battle with the tech debt demon. Switching to TypeScript, helped the TinyMCE development team to identify, prioritise and overcome the debt that had accumulated from many years of choices, accidents, or outside forces and influences.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">There’s four key ways that TypeScript helped to clean up the TinyMCE code base.</p></div><div data-col-width=\"1\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\" data-stk-css=\"\" data-stk-css-m=\"\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div><div data-col-width=\"3\" class=\"stk-grid-col valign-middle stk-grid-col_last\" data-ce-tag=\"grid-col\"><div class=\"stk-grid\" data-stk-css=\"stkCpDkq\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-slideInRight\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\"><div data-col-width=\"3\" class=\"stk-theme_44178__pad_round_1 stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><p class=\"stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">What is Functional Debt?</strong></p><p class=\"stk-theme_44178__style_small_text stk-reset\" data-ce-tag=\"paragraph\">Wondering where functional debt fits into the technical debt puzzle? Find out more by reading <a href=\"https://www.tiny.cloud/blog//technical-vs-functional-debt/\" target=\"_blank\" class=\"stk-reset\">Functional debt vs Technical debt: What's the difference in a rich text editor?</a></p></div></div></div></div><div class=\"stk-grid stk-theme_44178__mb_2\" data-stk-css=\"stk5B9SR\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-jackInTheBox\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\" data-ce-tag=\"grid\"><div data-col-width=\"12\" class=\"stk-theme_44178__pad_ver_2 stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"2\" class=\"stk-grid-col stk-grid-col_empty\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><p class=\"stk-theme_44178__style_font_style-1628585803915 align-center stk-reset\" data-stk-css=\"stkdNg1j\" data-ce-tag=\"paragraph\">Get more insights in our<br>Technical Debt White Paper</p><a class=\"stk-theme_44178__stk-btn_1628586253530 stk-theme_44178__style_font_style-1628586133109 align-center stk-reset\" href=\"https://www.tiny.cloud/technical-debt-whitepaper\" target=\"_blank\" data-stk-button=\"1\" data-ce-tag=\"button\">READ THE WHITE PAPER</a></div><div data-col-width=\"2\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div></div></div></div><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><h2 class=\"stk-theme_44178__style_large_header stk-reset\" id=\"stk-2\" data-ce-tag=\"paragraph\">Benefits of switching to TypeScript for WYSIWYG tech debt</h2><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Using TypeScript has plenty of benefits – no matter what stage of development you begin using it. However, there are extra benefits from <em class=\"stk-reset\">switching</em> <em class=\"stk-reset\">to</em> TypeScript, like TinyMCE did, and some of those are especially favourable to rich text editors.</p><h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">1. Porting catches old tech debt</h3><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Two bonuses from porting TinyMCE’s JavaScript to TypeScript – compared to starting fresh with TypeScript – were: </p><h4 class=\"stk-theme_44178__style_small_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">a. Porting the codebase forces reviews of old code</h4><p class=\"stk-reset\" data-ce-tag=\"paragraph\">To add types to an existing code base, a developer has to work through the code to figure out what types should be used. Some of that process can be automated, but the results should still be manually checked. </p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">It’s time-consuming, and sometimes hard to justify scheduling the manual review work when there are features to be developed. But it's <em class=\"stk-reset\">so</em> worthwhile.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">If your codebase is anywhere near as large, complex and old as TinyMCE, peering into the untouched corners can unearth all kinds of interesting things. <a href=\"https://www.tiny.cloud/blog/rte-code-half-life/\" target=\"_blank\" class=\"stk-reset\">Bugs, cruft, tech debt, old to-dos</a> – you name it, you’ll probably find it. </p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">For example, <a href=\"https://github.com/tinymce/tinymce/pull/7083#discussion_r684619815\" target=\"_blank\" class=\"stk-reset\">typing TinyMCE’s Image plugin</a> found a potential <em class=\"stk-reset\">memory leak</em>.</p><h4 class=\"stk-theme_44178__style_small_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">b. Reviewing code can prompt discussions</h4><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Converting TinyMCE to TypeScript also prompted discussions amongst our engineering team – on everything from individual variables to entire editor concepts. </p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">A <a href=\"https://github.com/tinymce/tinymce/pull/7925\" target=\"_blank\" class=\"stk-reset\">pull request that was made – for improving some types in TinyMCE’s core engine</a> – is a great example. It had <em class=\"stk-reset\">forty-two</em> comments from multiple developers discussing the changes. It also prompted further changes, including the addition of test cases and some minor changes to functionality.</p></div><div data-col-width=\"4\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div></div><div class=\"stk-grid\" data-ce-tag=\"grid\" data-stk-css=\"stkkZM_3\"><div data-col-width=\"2\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\" data-stk-css-m=\"\" data-stk-css=\"\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last stk-theme_44178__pad_ver_1\" data-ce-tag=\"grid-col\"><p class=\"stk-reset stk-theme_44178__mb_05 stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__color_44178_custom_color_4\" data-stk-css=\"stkmTz6v\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">EXPERT TIP</strong></p><h4 class=\"stk-theme_44178__style_small_header stk-reset\" data-ce-tag=\"paragraph\" data-stk-css=\"stkitN7O\"><strong class=\"stk-reset\">Type key dependencies first</strong></h4><p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stkfO8Fi\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">If your codebase has more than one library, type key dependencies first.</strong></p><p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stkR2np-\" data-ce-tag=\"paragraph\">It’s more efficient to type your lowest-level libraries first – the ones that are the foundation of your application. Then work your way up, carrying changes from previously-typed libraries up to the higher-level libraries.</p><figure class=\"stk-reset stk-image-figure\" data-stk-css=\"stk2ZNpn\" data-ce-tag=\"image-figure\"><div class=\"stk-mask\" data-ce-tag=\"mask\"><img src=\"https://ucarecdn.com/3f54bdef-a0d1-40c2-b939-bd75d90ba494/\" data-image-id=\"283330\" data-image-name=\"tech-debt.png\" width=\"1136\" height=\"1070\" loading=\"lazy\" class=\"stk-image stk-reset\"/></div><figcaption style=\"display:block\" class=\"align-center stk-reset stk-description\" data-ce-tag=\"description\">An example dependency tree. When typing libraries, work from the lowest dependencies up to the highest.</figcaption></figure><p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stk78XJT\" data-ce-tag=\"paragraph\">If you type libraries in the wrong order, it can result in double handling the higher-level libraries. As an example, <a href=\"https://github.com/tinymce/tinymce/pull/6073\" target=\"_blank\" class=\"stk-reset\">this pull request</a> fixed some incorrect types in one part of TinyMCE’s API – which resulted in the need to change <em class=\"stk-reset\">fifty-two</em> other files across various modules.</p><p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stk_m4Av\" data-ce-tag=\"paragraph\">This ‘key dependencies first’ approach, can also catch fun errors where two libraries don’t agree. TinyMCE had plenty of these, thanks to the sheer number of libraries it uses.</p><p class=\"stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_1 stk-reset\" data-stk-css=\"stk3R3eF\" data-ce-tag=\"paragraph\">Depending on the scale of your WYSIWYG editor, there may be a lot of libraries you need to type. Managing it all, and remembering all the changes you need to carry through, can be hard. Thankfully, TypeScript’s tooling helps.</p></div><div data-col-width=\"2\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div></div><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col\" data-ce-tag=\"grid-col\"><h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">2. TypeScript in-built tooling aids a transition from JS to TypeScript</h3><p class=\"stk-reset\" data-ce-tag=\"paragraph\">JavaScript is distinctly lacking in good, in-built tooling. Why’s that? Some of the very same features that make it popular, make it difficult to develop tools for JS.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Because it’s dynamically-typed, there’s a <em class=\"stk-reset\">lack</em> of rules that JS code should follow, and therefore a lack of rules tooling can check. A lot of JavaScript libraries and frameworks have created their own rules to work around this handicap, but they don’t necessarily match between different libraries.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">This adds an additional layer of difficulty when developing a reliable, high quality rich text editor in JavaScript. If you’re considering building one in JS, and want to avoid bugs and tech debt, your code may need to be quite defensive.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">By contrast, TypeScript’s strong types opens all kinds of opportunities for better tooling – adding rules inherent to the language, plus devs can add their own rules (AKA ‘types’).</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Plus, of course, TypeScript comes with its own in-built type checking. According to a 2017 research paper “To Type or Not to Type: Quantifying Detectable Bugs in JavaScript“, <a class=\"stk-reset\" href=\"https://earlbarr.com/publications/typestudy.pdf\" target=\"_blank\">TypeScript’s static type system alone can prevent 15% of common bugs</a>:</p></div><div data-col-width=\"1\" class=\"stk-grid-col stk-grid-col_empty\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div><div data-col-width=\"3\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><div class=\"stk-grid\" data-stk-css=\"stko4UIM\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-slideInRight\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\"><div data-col-width=\"3\" class=\"stk-theme_44178__pad_round_1 stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><p class=\"stk-reset stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Is Typescript dynamic-typed or static-typed?</strong></p><p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\">Although Typescript is a superset of JavaScript, TypeScript is statically-typed – JavaScript is not, it’s dynamically typed.</p><p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">But because TS transpiles ‘to’ JS, it technically does ‘both’. </p><p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">It’s the combination of TS's static typing being <em class=\"stk-reset\">optional</em> (thanks to \"any\") and JS being dynamic, that allows you to do gradual typing. If TS wasn't optional, gradual typing wouldn't be possible. </p><p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">Here’s a great article on the topic <a href=\"https://www.scaler.com/topics/typescript/static-typing-vs-dynamic-typing/\" target=\"_blank\" class=\"stk-reset\">Static Typing vs Dynamic Typing</a></p></div></div></div></div><div class=\"stk-theme_44178__mb_15 stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col\" data-ce-tag=\"grid-col\"><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><figure class=\"stk-reset stk-image-figure\" data-ce-tag=\"image-figure\"><div class=\"stk-mask\" data-ce-tag=\"mask\"><img src=\"https://ucarecdn.com/c3bf637c-4d44-404d-9b8a-e9414cafe5eb/\" data-image-id=\"118540\" data-image-name=\"quote-mark-1.svg\" width=\"27\" height=\"21\" class=\"stk-image stk-reset\" loading=\"lazy\"/></div></figure><p class=\"stk-theme_44178__style_font_style-1628517294418 stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">In this paper, we evaluated the code quality benefits that static type systems provide to JavaScript codebases. The results are encouraging; we found that using Flow or TypeScript could have prevented 15% of the public bugs for public projects on GitHub.</strong></p></div></div><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Beyond TypeScript itself, other organisations have created or extended tooling to work with TypeScript.</p><ul class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"list\"><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">The popular JavaScript linting tool</strong> <a href=\"https://typescript-eslint.io/\" target=\"_blank\" class=\"stk-reset\"><strong class=\"stk-reset\">ESLint, has a TypeScript variant</strong></a><strong class=\"stk-reset\">.</strong></li></ul><p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">→&nbsp;</strong>And typescript-eslint isn’t just ESLint made to work with TypeScript – it taps into the TypeScript type system in order to offer <em class=\"stk-reset\">additional</em> linting functionality to help make your code extra clean and safe.</p><ul class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"list\"><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\"><strong class=\"stk-reset\">Another category of TypeScript tools is IDE integrations.</strong> </li></ul><p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">→&nbsp;</strong>For example, <a class=\"stk-reset\" href=\"https://code.visualstudio.com/docs/languages/typescript\" target=\"_blank\">Visual Studio Code’s integration with TypeScript</a> adds a whole host of functionality, such as:</p><ul class=\"stk-reset\" data-ce-tag=\"list\"><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Code completion</li><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Type information on hover</li><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Errors and warnings in the IDE</li><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Code navigation and formatting shortcuts</li><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Refactoring and debugging assistance</li></ul><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Typescript tooling not only helps developers avoid mistakes – it helps them code faster. </p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Due to its complexity, refactoring anything in TinyMCE is full of hurdles – both seen and unseen. Historically, it’s proven itself to be <a href=\"https://github.com/tinymce/tinymce/pull/5736\" target=\"_blank\" class=\"stk-reset\">difficult</a>, <a href=\"https://github.com/tinymce/tinymce/pull/6894\" target=\"_blank\" class=\"stk-reset\">wide-scale</a>, and/or <a href=\"https://github.com/tinymce/tinymce/pull/8272\" target=\"_blank\" class=\"stk-reset\">dangerous</a>. But switching to TypeScript with its IDE refactoring and linting tools significantly reduced the work and risk of bad refactorings.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">But all those TypeScript benefits are reliant on all your code being typed.</p></div><div data-col-width=\"1\" class=\"stk-grid-col stk-grid-col_empty\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div><div data-col-width=\"3\" class=\"stk-grid-col stk-grid-col_last valign-middle\" data-ce-tag=\"grid-col\"><div class=\"stk-grid\" data-stk-css=\"stkE3TKA\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-slideInRight\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\"><div data-col-width=\"3\" class=\"stk-theme_44178__pad_round_1 stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><p class=\"stk-reset stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">What is defensive coding?</strong></p><p class=\"stk-theme_44178__style_small_text stk-reset stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\">Red Hat has a <a href=\"https://developers.redhat.com/articles/defensive-coding-guide\" target=\"_blank\" class=\"stk-reset\">great Defensive Coding Guide</a></p><p class=\"stk-theme_44178__style_small_text stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">It provides guidelines for improving software security through secure coding and gives you concrete recommendations.</p></div></div></div></div><div class=\"stk-grid stk-theme_44178__mb_15\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col\" data-ce-tag=\"grid-col\"><h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">3. TypeScript types increase code readability</h3><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Types aren’t just helpful to the computer – their usefulness goes way beyond simply defining individual variables as numbers or strings. </p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">There’s an extensive type system within TypeScript, which you can use to represent almost anything – from function signatures to library APIs. But why bother putting the time into typing anything more complex than variables and functions?</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Types increase readability, which in turn increases development velocity and code quality.</strong></p><h3 class=\"stk-theme_44178__mb_05 stk-reset stk-theme_44178__style_medium_header\" data-ce-tag=\"paragraph\">a. Use types to define your functions and variables</h3><p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">What do you think this function does?</p><figure class=\"stk-reset stk-embed_rendered\" data-ce-tag=\"embed\"><code class=\"stk-code\"><pre class=\"hljs\" style=\"display: block; overflow-x: auto; background: rgb(0, 36, 81); color: rgb(255, 255, 255); padding: 0.5em;\"><span class=\"hljs-function\"><span class=\"hljs-keyword\" style=\"color: rgb(235, 187, 255);\">function</span></span> <span class=\"hljs-built_in\" style=\"color: rgb(255, 197, 143);\">size</span>(a, b)\n</pre></code><figcaption class=\"stk-reset stk-description\" data-ce-tag=\"description\"></figcaption></figure><p class=\"stk-reset\" data-ce-tag=\"paragraph\">The likely assumption is that a and b are numbers, and the function does some calculation and returns a number.</p><p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">What if it was written like this instead?</p><figure class=\"stk-reset stk-embed_rendered\" data-ce-tag=\"embed\"><code class=\"stk-code\"><pre class=\"hljs\" style=\"display: block; overflow-x: auto; background: rgb(0, 36, 81); color: rgb(255, 255, 255); padding: 0.5em;\"><span class=\"hljs-function\"><span class=\"hljs-keyword\" style=\"color: rgb(235, 187, 255);\">function</span></span> <span class=\"hljs-built_in\" style=\"color: rgb(255, 197, 143);\">size</span>(a: <span class=\"hljs-keyword\" style=\"color: rgb(235, 187, 255);\">number</span>, b: <span class=\"hljs-keyword\" style=\"color: rgb(235, 187, 255);\">number</span>): string</pre></code><figcaption class=\"stk-reset stk-description\" data-ce-tag=\"description\"></figcaption></figure><p class=\"stk-reset\" data-ce-tag=\"paragraph\">It returns a string. Or maybe it does a calculation, then converts the result to a string? Or does it do something completely different? The question can’t be answered from just the types – but you now know you need to look deeper.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Being able to make better assumptions about a function, at a glance, can be a vital step towards avoiding technical debt. </strong></p><p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">It’s so easy for tech debt to slip into a complicated piece of code, all because it was misread or misunderstood. By taking active steps to increase the readability of code, you decrease:</p><ul class=\"stk-reset\" data-ce-tag=\"list\"><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Time to understand it </li><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Time to fix it </li><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Time to improve it</li><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Risk of bugs happening</li><li class=\"stk-reset stk-list-item\" data-ce-tag=\"list-item\">Risk of tech debt being accidentally introduced.</li></ul><p class=\"stk-reset stk-theme_44178__mb_15\" data-ce-tag=\"paragraph\">And this goes far beyond just functions.</p><h3 class=\"stk-theme_44178__mb_05 stk-reset stk-theme_44178__style_medium_header\" data-ce-tag=\"paragraph\">b. Use types to clarify concepts as interfaces</h3><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Rich text editors rely on dozens of domain concepts: DOM ranges, HTML structures, and formatting models. When you’re a specialist developer working on a rich text editor, It’s impossible to remember how each concept works. And trying to keep external documentation in sync with code changes is always a nightmare.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">The quickest way to clarify concepts is to use TypeScript interfaces. </strong></p><p class=\"stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">For example, this is <a class=\"stk-reset\" href=\"https://github.com/tinymce/tinymce/blob/develop/modules/tinymce/src/core/main/ts/api/Shortcuts.ts#L47\" target=\"_blank\">TinyMCE’s concept of a keyboard shortcut represented as a TypeScript interface</a>:</p><figure class=\"stk-reset stk-embed_rendered\" data-ce-tag=\"embed\"><code class=\"stk-code\"><pre class=\"hljs\" style=\"display: block; overflow-x: auto; background: rgb(0, 36, 81); color: rgb(255, 255, 255); padding: 0.5em;\"><span class=\"hljs-selector-tag\" style=\"color: rgb(235, 187, 255);\">interface</span> <span class=\"hljs-selector-tag\" style=\"color: rgb(235, 187, 255);\">Shortcut</span> {\n  <span class=\"hljs-attribute\" style=\"color: rgb(255, 238, 173);\">id</span>: string;\n  <span class=\"hljs-attribute\" style=\"color: rgb(255, 238, 173);\">access</span>: boolean;\n  <span class=\"hljs-attribute\" style=\"color: rgb(255, 238, 173);\">ctrl</span>: boolean;\n  <span class=\"hljs-attribute\" style=\"color: rgb(255, 238, 173);\">shift</span>: boolean;\n  <span class=\"hljs-attribute\" style=\"color: rgb(255, 238, 173);\">meta</span>: boolean;\n  <span class=\"hljs-attribute\" style=\"color: rgb(255, 238, 173);\">alt</span>: boolean;\n  <span class=\"hljs-attribute\" style=\"color: rgb(255, 238, 173);\">keyCode</span>: number;\n  <span class=\"hljs-attribute\" style=\"color: rgb(255, 238, 173);\">charCode</span>: number;\n  <span class=\"hljs-attribute\" style=\"color: rgb(255, 238, 173);\">subpatterns</span>: Shortcut[];\n  <span class=\"hljs-attribute\" style=\"color: rgb(255, 238, 173);\">desc</span>: string;\n  <span class=\"hljs-attribute\" style=\"color: rgb(255, 238, 173);\">func</span>: () =&gt; void;\n  <span class=\"hljs-attribute\" style=\"color: rgb(255, 238, 173);\">scope</span>: any;\n}</pre></code><figcaption class=\"stk-reset stk-description\" data-ce-tag=\"description\"></figcaption></figure><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Our developers no longer need to remember what a keyboard shortcut requires – it’s right there for them. And because every keyboard shortcut implemented in TinyMCE is typed using this interface, TypeScript’s type checking ensures any new or changed shortcuts don’t have errors. This also helps to prevent bugs or tech debt that could have arisen due to a shortcut being incorrectly defined.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Of course though, interfaces can be <em class=\"stk-reset\">a lot</em> bigger than this little example.</p></div><div data-col-width=\"1\" class=\"stk-grid-col stk-grid-col_empty\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div><div data-col-width=\"3\" class=\"valign-middle stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><div class=\"stk-theme_44178__mb_2 stk-grid\" data-stk-css=\"stkkn77i\" data-ce-tag=\"grid\" data-anim-m=\"false\" data-anim=\"true\" data-anim-name=\"preset-slideInRight\" data-anim-trigger=\"scroll\" data-anim-duration=\"1\" data-anim-delay=\"0\" data-anim-scroll-start=\"10\" data-anim-scroll-finish=\"90\"><div data-col-width=\"3\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><div class=\"stk-grid stk-theme_44178__mb_0\" data-stk-css=\"stkvE7T3\" data-ce-tag=\"grid\"><div data-col-width=\"3\" class=\"stk-grid-col stk-grid-col_last\" data-stk-css=\"stklovHI\" data-ce-tag=\"grid-col\"><p class=\"stk-theme_44178__style_font_style-1628517714937 stk-reset stk-theme_44178__color_44178_custom_color_4\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">FURTHER INSIGHTS</strong></p></div></div><div class=\"stk-theme_44178__mb_05 stk-grid\" data-ce-tag=\"grid\" data-stk-css=\"stk9cBCY\"><div data-col-width=\"3\" class=\"stk-grid-col stk-grid-col_last\" data-stk-css=\"stk92B4-\" data-ce-tag=\"grid-col\"><figure class=\"stk-reset stk-image-figure\" data-ce-tag=\"image-figure\"><div class=\"stk-mask\" data-ce-tag=\"mask\"><img src=\"https://ucarecdn.com/0a6e3096-31e2-4472-8631-4dbc1bb5d260/\" data-image-id=\"202975\" data-image-name=\"Tech Debt -2.png\" class=\"stk-image stk-reset\" width=\"640\" height=\"386\" loading=\"lazy\"/></div></figure></div></div><p class=\"stk-theme_44178__style_font_style-1628517714937 stk-reset\" data-stk-css=\"stkGKxb8\" data-ce-tag=\"paragraph\"><a class=\"stk-reset\" href=\"https://www.tiny.cloud/technical-debt-whitepaper\" target=\"_blank\">Download and read Technical Debt in Rich Text Editors White Paper →</a></p></div></div></div></div><div class=\"stk-theme_44178__mb_15 stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><h3 class=\"stk-theme_44178__mb_05 stk-reset stk-theme_44178__style_medium_header\" data-ce-tag=\"paragraph\">c. Use types to clarify your module boundaries</h3><p class=\"stk-reset\" data-ce-tag=\"paragraph\">TinyMCE is a very modular product, composed of hundreds of distinct pieces – libraries, modules, plugins, and more. And one of the key principles of TinyMCE development is that each of those pieces must have a single entry point: an API that defines what functionality other pieces of the code base can access.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">The <a href=\"https://github.com/tinymce/tinymce/tree/develop/modules/tinymce/src/core/main/ts/api\" target=\"_blank\" class=\"stk-reset\">API for TinyMCE’s Core editor</a> spans <em class=\"stk-reset\">dozens </em>of files, full of interfaces defining how each part of the engine works. And those interfaces form the backbone of every part of TinyMCE that builds on top of the engine – they ensure every other piece maintains the same concepts and principles as the core. </p><p class=\"stk-reset\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">Defined APIs prevent misunderstandings and conflicts across libraries – </strong><strong class=\"stk-reset\">particularly</strong><strong class=\"stk-reset\"> the kinds of problems that could result in tech debt cascading through the editor.</strong></p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">It isn’t the perfect solution. How an API functions could be changed without the API’s type definition changing. But it’s another layer of assurance than what’s provided by using JavaScript, and sometimes that can make all the difference.</p></div><div data-col-width=\"4\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div></div><div class=\"stk-theme_44178__mb_2 stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><h3 class=\"stk-theme_44178__style_medium_header stk-theme_44178__mb_05 stk-reset\" data-ce-tag=\"paragraph\">4. TypeScript helps to future-proof against tech debt</h3><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Gradual typing is an ideal approach for managing the time invested in your TypeScript conversion. However, it’s all too easy to do the initial conversion, then leave further improvements… for quite a while. </p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">After all, you’ve started using TypeScript. You’re getting <em class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">some</em> of the benefits. Is it really worth the time and effort to add <em class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">more</em> types?</p><p class=\"stk-reset stk-theme_44178__mb_05\" data-ce-tag=\"paragraph\">Think of it this way:</p><p class=\"stk-reset stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_4 stk-theme_44178__style_font_style-1628517294418\" data-ce-tag=\"paragraph\"><strong class=\"stk-reset\">The more types you add to your code base, the more benefits gained from TypeScript. The more benefits gained, the more in-built protection from tech debt.</strong></p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">If you’re stuck trying to prioritise the improvement of certain parts of code, use your <a href=\"https://www.tiny.cloud/blog/tag/roadmap\" target=\"_blank\" class=\"stk-reset\">product roadmap</a> as a guide. Type improvements can be planned into projects, or sections of the code base can be typed ahead of a new project – to get maximum benefits for minimum work.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">The goal of typing is to find existing tech debt – shore up your foundation – and help prevent any new technical debt. So any kind of ongoing investment in paying down tech debt has a long term payoff, and converting to TypeScript has certainly helped curtail TinyMCE’s debt burden.</p></div><div data-col-width=\"4\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div></div><div class=\"stk-theme_44178__mb_2 stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><h2 class=\"stk-theme_44178__style_large_header stk-reset\" id=\"stk-3\" data-ce-tag=\"paragraph\">TypeScript’s great, but WYSIWYG editors are best left to experts</h2><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Yes, TypeScript endows your code with a multitude of benefits, particularly if you’re developing a rich text editor from scratch. But ask yourself, why take that on, when <em class=\"stk-reset\">the experts</em> struggle with WYSIWYG maintenance and tech debt burdens?</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Repeat these three statements: <a href=\"https://www.tiny.cloud/buy-vs-build-whitepaper/\" target=\"_blank\" class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">Rich text editors are complex</a>. <a href=\"https://www.tiny.cloud/blog/cost-of-building-rich-text-editor/\" target=\"_blank\" class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">Rich text editors are expensive</a>. <a href=\"https://www.tiny.cloud/developer-survey-results/\" target=\"_blank\" class=\"stk-reset\" data-gtm-vis-has-fired-10171822_255=\"1\">Rich text editors accumulate technical debt</a>. </p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">While gradual typing solves some issues, it doesn't absolve you of the ongoing investment. </p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">If you need a TypeScript rich text editor, use an open source <a href=\"https://www.tiny.cloud/\" target=\"_blank\" class=\"stk-reset\">WYSIWYG like TinyMCE</a>. It has components your dev team can use as a framework for customization and <a href=\"https://unpkg.com/tinymce@6/tinymce.d.ts\" target=\"_blank\" class=\"stk-reset\">a public TypeScript declaration file</a> for integration with a TypeScript app – and it’s supported by our professional dev team and advanced features. You’ll get the best of both worlds.</p><p class=\"stk-reset\" data-ce-tag=\"paragraph\">Because technical debt is always unfinished business.</p></div><div data-col-width=\"4\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div></div><div class=\"stk-layout__overhangs_both stk-theme_44178__mb_0 stk-grid\" data-stk-css=\"stkqbmi2\" data-ce-tag=\"grid\"><div data-col-width=\"12\" class=\"stk-theme_44178__pad_ver_2 stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"2\" class=\"stk-grid-col stk-grid-col_empty\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><p class=\"align-center stk-theme_44178__style_font_style-1652351628236 stk-reset stk-theme_44178__color_44178_custom_color_3\" data-ce-tag=\"paragraph\">Download the white paper</p><p class=\"stk-theme_44178__style_font_style-1628585803915 align-center stk-reset stk-theme_44178__color_44178_custom_color_1\" data-ce-tag=\"paragraph\">Opportunity Cost of Technical Debt: Minimize Your Rich Text Editor Development</p></div><div data-col-width=\"2\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div></div><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"2\" class=\"stk-grid-col stk-grid-col_empty\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div><div data-col-width=\"8\" class=\"stk-grid-col stk-grid-col_last\" data-ce-tag=\"grid-col\"><figure class=\"stk-reset stk-embed_rendered\" data-ce-tag=\"embed\"><code class=\"stk-code\"><iframe src=\"https://www2.ephox.com/l/2202/2022-09-29/d9d458\" width=\"100%\" height=\"500\" type=\"text/html\" frameborder=\"0\" allowtransparency=\"true\" style=\"border: 0\"></iframe></code><figcaption class=\"stk-reset stk-description\" data-ce-tag=\"description\"></figcaption></figure></div><div data-col-width=\"2\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div></div></div></div><div class=\"stk-layout__overhangs_both stk-grid\" data-stk-css=\"stkPpP_E\" data-ce-tag=\"grid\"><div data-col-width=\"12\" class=\"stk-grid-col stk-grid-col_last stk-theme_44178__pad_ver_3\" data-ce-tag=\"grid-col\"><div class=\"stk-grid\" data-ce-tag=\"grid\"><div data-col-width=\"1\" class=\"stk-grid-col stk-grid-col_empty\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div><div data-col-width=\"4\" class=\"stk-grid-col\" data-stk-css=\"\" data-stk-css-m=\"\" data-ce-tag=\"grid-col\"><figure class=\"stk-blueprint--avatar stk-reset stk-image-figure\" data-stk-css=\"stkiHHF4\" data-ce-tag=\"image-figure\"><div class=\"stk-mask\" data-ce-tag=\"mask\"><img src=\"https://ucarecdn.com/1a5df2bb-82ec-41ae-ba94-e2c4cdaff4bd/\" data-image-id=\"221200\" data-image-name=\"1548508487603.jpeg\" class=\"stk-image stk-reset\" width=\"471\" height=\"471\" loading=\"lazy\"/></div></figure></div><div data-col-width=\"6\" class=\"valign-middle stk-grid-col stk-grid-col_last stk-theme_44178__pad_round_1-m\" data-ce-tag=\"grid-col\"><p class=\"stk-theme_44178__style_font_style-1628517328397 stk-theme_44178__mb_05 stk-theme_44178__color_44178_custom_color_3 stk-reset\" data-ce-tag=\"paragraph\">author</p><h4 class=\"stk-theme_44178__style_small_header stk-theme_44178__color_44178_custom_color_0 stk-theme_44178__mb_0 stk-reset\" data-ce-tag=\"paragraph\">Millie Macdonald</h4><p class=\"stk-theme_44178__style_font_style-1628517714937 stk-theme_44178__color_44178_custom_color_2 stk-reset\" data-ce-tag=\"paragraph\">Product Manager at Halo Connect</p><p class=\"stk-theme_44178__style_small_text stk-theme_44178__color_44178_custom_color_0 stk-reset\" data-ce-tag=\"paragraph\">Millie is a Product Manager at Halo Connect who dabbles in writing. Previously, she worked at Tiny as a Product Owner, dev, and QA engineer. She loves learning above all else, whether it's about people, tech, or leadership.</p></div><div data-col-width=\"1\" class=\"stk-grid-col stk-grid-col_empty\" data-ce-tag=\"grid-col\"><p class=\"ce-element--empty stk-element_no-text stk-reset\" data-ce-tag=\"paragraph\"></p></div></div></div></div><style data-stk-css=\"stk5B9SR\" class=\"\" media=\"all\">[data-stk-css=\"stk5B9SR\"]:not(#stk):not(#stk):not(style){background: #CFE3E6}</style><style data-stk-css=\"stkdNg1j\" class=\"\" media=\"all\">[data-stk-css=\"stkdNg1j\"]:not(#stk):not(#stk):not(style){color: #000}</style><style data-stk-css=\"stk88Gw7\" class=\"\" media=\"all\">[data-stk-css=\"stk88Gw7\"]:not(#stk):not(#stk):not(style){border: 1px solid #4D66CB; border-radius: 4px; background-color: rgba(249, 250, 251, 1)}</style><style data-stk-css=\"stk-Ux0k\" class=\"\" media=\"all\">[data-stk-css=\"stk-Ux0k\"]:not(#stk):not(#stk):not(style){padding: 0px 10px}</style><style data-stk-css=\"stkoGM_l\" class=\"\" media=\"all\">[data-stk-css=\"stkoGM_l\"]:not(#stk):not(#stk):not(style){padding: 0px 10px}</style><style data-stk-css=\"stkTCIxf\" class=\"\" media=\"all\">[data-stk-css=\"stkTCIxf\"]:not(#stk):not(#stk):not(style){padding: 0px 10px}</style><style data-stk-css=\"stkCh6NE\" class=\"\" media=\"all\">[data-stk-css=\"stkCh6NE\"]:not(#stk):not(#stk):not(style){padding: 0px 10px}</style><style data-stk-css=\"stkouXru\" class=\"\" media=\"all\">[data-stk-css=\"stkouXru\"]:not(#stk):not(#stk):not(style){padding: 0px 10px}</style><style data-stk-css=\"stkmTz6v\" class=\"\" media=\"all\">[data-stk-css=\"stkmTz6v\"]:not(#stk):not(#stk):not(style){padding: 0px 10px}</style><style data-stk-css=\"stkfO8Fi\" class=\"\" media=\"all\">[data-stk-css=\"stkfO8Fi\"]:not(#stk):not(#stk):not(style){padding: 0px 10px}</style><style data-stk-css=\"stk78XJT\" class=\"\" media=\"all\">[data-stk-css=\"stk78XJT\"]:not(#stk):not(#stk):not(style){padding: 0px 10px}</style><style data-stk-css=\"stkPpP_E\" class=\"\" media=\"all\">\n  [data-stk-css=\"stkPpP_E\"]:not(#stk):not(#stk):not(style) {\n    background-color: rgba(16, 24, 55, 1)\n  }\n</style><style data-stk-css=\"stkiHHF4\" class=\"\" media=\"all\">\n  [data-stk-css=\"stkiHHF4\"]:not(#stk):not(#stk):not(style) {\n    --avatar-size: 180px;\n    align-self: center\n  }\n</style><style data-stk-css=\"stkqbmi2\" class=\"\" media=\"all\">[data-stk-css=\"stkqbmi2\"]:not(#stk):not(#stk):not(style){background-color: rgba(249, 250, 251, 1)}</style><style data-stk-css=\"stkkn77i\" class=\"\" media=\"all\">[data-stk-css=\"stkkn77i\"]:not(#stk):not(#stk):not(style){border: 1px solid #4D66CB; border-radius: 4px; box-shadow: 10px 10px 0 -1px #fff, 10px 10px #4D66CB; background-color: rgba(255, 255, 255, 1)}</style><style data-stk-css=\"stkvE7T3\" class=\"\" media=\"all\">[data-stk-css=\"stkvE7T3\"]:not(#stk):not(#stk):not(style){border-bottom: 1px solid #4D66CB; background-color: rgba(255, 255, 255, 1)}</style><style data-stk-css=\"stklovHI\" class=\"\" media=\"all\">\n  [data-stk-css=\"stklovHI\"]:not(#stk):not(#stk):not(style) {\n    padding: 5px 10px\n  }\n</style><style data-stk-css=\"stk9cBCY\" class=\"\" media=\"all\">[data-stk-css=\"stk9cBCY\"]:not(#stk):not(#stk):not(style){background: #D3E1E6}</style><style data-stk-css=\"stk92B4-\" class=\"\" media=\"all\">\n  [data-stk-css=\"stk92B4-\"]:not(#stk):not(#stk):not(style) {\n    padding: 5px 10px\n  }\n</style><style data-stk-css=\"stkGKxb8\" class=\"\" media=\"all\">\n  [data-stk-css=\"stkGKxb8\"]:not(#stk):not(#stk):not(style) {\n    padding: 0px 10px 10px\n  }\n</style><style data-stk-css=\"stk-AL3u\" class=\"\" media=\"all\">[data-stk-css=\"stk-AL3u\"]:not(#stk):not(#stk):not(style){background: #CFE3E6}</style><style data-stk-css=\"stkks_bG\" class=\"\" media=\"all\">[data-stk-css=\"stkks_bG\"]:not(#stk):not(#stk):not(style){color: #000}</style><style data-stk-css=\"stkE3TKA\" class=\"\" media=\"all\">[data-stk-css=\"stkE3TKA\"]:not(#stk):not(#stk):not(style){background-color: #F9FAFB; border-radius: 4px}</style><style data-stk-css=\"stko4UIM\" class=\"\" media=\"all\">[data-stk-css=\"stko4UIM\"]:not(#stk):not(#stk):not(style){background-color: #F9FAFB; border-radius: 4px}</style><style data-stk-css=\"stkCpDkq\" class=\"\" media=\"all\">[data-stk-css=\"stkCpDkq\"]:not(#stk):not(#stk):not(style){background-color: #F9FAFB; border-radius: 4px}</style><style data-stk-css=\"stkK5Fn-\" class=\"\" media=\"all\">[data-stk-css=\"stkK5Fn-\"]:not(#stk):not(#stk):not(style){background-color: #F9FAFB; border-radius: 4px}</style><style data-stk-css=\"stk0SEJm\" class=\"\" media=\"all\">\n  [data-stk-css=\"stk0SEJm\"]:not(#stk):not(#stk):not(style) {\n    border: 1px solid #4D66CB;\n    border-radius: 4px;\n    box-shadow: 10px 10px 0 -1px #fff, 10px 10px #4D66CB\n  }\n</style><style data-stk-css=\"stk9V8Fp\" class=\"\" media=\"all\">\n  [data-stk-css=\"stk9V8Fp\"]:not(#stk):not(#stk):not(style) {\n    border-bottom: 1px solid #4D66CB\n  }\n</style><style data-stk-css=\"stkNYpue\" class=\"\" media=\"all\">\n  [data-stk-css=\"stkNYpue\"]:not(#stk):not(#stk):not(style) {\n    padding: 5px 10px\n  }\n</style><style data-stk-css=\"stkEkeMK\" class=\"\" media=\"all\">\n  [data-stk-css=\"stkEkeMK\"]:not(#stk):not(#stk):not(style) {\n    padding: 5px 10px\n  }\n</style><style data-stk-css=\"stkdQPoe\" class=\"\" media=\"all\">\n  [data-stk-css=\"stkdQPoe\"]:not(#stk):not(#stk):not(style) {\n    border: 1px solid #4D66CB;\n    border-radius: 4px;\n    box-shadow: 10px 10px 0 -1px #fff, 10px 10px #4D66CB\n  }\n</style><style data-stk-css=\"stkmPzAj\" class=\"\" media=\"all\">[data-stk-css=\"stkmPzAj\"]:not(#stk):not(#stk):not(style){border: 1px solid #A3AEC2; border-radius: 2px}</style><style data-stk-css=\"stkpp0f_\" class=\"\" media=\"all\">[data-stk-css=\"stkpp0f_\"]:not(#stk):not(#stk):not(style){background-color: rgba(249, 250, 251, 1)}</style><style data-stk-css=\"stkR2np-\" class=\"\" media=\"all\">[data-stk-css=\"stkR2np-\"]:not(#stk):not(#stk):not(style){padding: 0px 10px}</style><style data-stk-css=\"stk3R3eF\" class=\"\" media=\"all\">[data-stk-css=\"stk3R3eF\"]:not(#stk):not(#stk):not(style){padding: 0px 10px; padding-bottom: 15px}</style><style data-stk-css=\"stk_m4Av\" class=\"\" media=\"all\">[data-stk-css=\"stk_m4Av\"]:not(#stk):not(#stk):not(style){padding: 0px 10px}</style><style data-stk-css=\"stk2ZNpn\" class=\"\" media=\"all\">[data-stk-css=\"stk2ZNpn\"]:not(#stk):not(#stk):not(style){padding: 0px 10px}</style><style data-stk-css=\"stkkZM_3\" class=\"\" media=\"all\">[data-stk-css=\"stkkZM_3\"]:not(#stk):not(#stk):not(style){border: 1px solid #4D66CB; border-radius: 4px; background-color: rgba(249, 250, 251, 1)}</style><style data-stk-css=\"stkitN7O\" class=\"\" media=\"all\">[data-stk-css=\"stkitN7O\"]:not(#stk):not(#stk):not(style){padding: 0px 10px}</style></div>","id":"38fa53af-c6bb-56fc-9cf5-040be8631ffe"},"resourceFiles":null,"canonicalUrl":null}},"pageContext":{"slug":"benefits-of-typescript","setkaPostId":27320}},"staticQueryHashes":["2492987505","740350947"]}